/*
* Copyright (c) 2011-2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service;
import java.io.IOException;
import java.net.URI;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import org.apache.commons.httpclient.HttpStatus;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.emc.storageos.api.ldap.exceptions.DirectoryOrFileNotFoundException;
import com.emc.storageos.api.ldap.exceptions.FileOperationFailedException;
import com.emc.storageos.db.client.model.FilePolicy;
import com.emc.storageos.db.client.model.FilePolicy.FilePolicyType;
import com.emc.storageos.db.client.model.FilePolicy.SnapshotExpireType;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.file.FilePolicyRestRep;
import com.emc.storageos.model.file.policy.FilePolicyCreateParam;
import com.emc.storageos.model.file.policy.FilePolicyCreateResp;
import com.emc.storageos.model.file.policy.FilePolicyListRestRep;
import com.emc.storageos.model.file.policy.FilePolicyScheduleParams;
import com.emc.storageos.model.file.policy.FileSnapshotPolicyExpireParam;
import com.emc.storageos.model.file.policy.FileSnapshotPolicyParam;
import com.emc.storageos.model.project.ProjectParam;
import com.emc.storageos.model.tenant.TenantCreateParam;
import com.emc.storageos.model.tenant.UserMappingParam;
import com.sun.jersey.api.client.ClientResponse;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldif.LDIFException;
/**
*
* FilePolicyTest class to exercise the core api functionality of File Policy Service.
*/
public class FilePolicyApiTest extends ApiTestBase {
private static final String FILE_POLICIES = "/file/file-policies";
private static final String FILE_POLICY = "/file/file-policies/%s";
private static final String DEFAULT_TEST_TENANT_LABEL = "TestTenant";
@SuppressWarnings("unused")
private static final String DEFAULT_TEST_TENANT_DESCRIPTION = "Tenant Provided by LDAP Authenticate Provider";
private static URI createdFileSnapshotPolicyURI = null;
private static String filePolicyName = "test file snapshot policy " + UUID.randomUUID().toString();
private List<CleanupResource> _cleanupResourceList = null;
private ApiTestAuthnProviderUtils apiTestAuthnProviderUtils = new ApiTestAuthnProviderUtils();
private static FilePolicyApiTest apiTestAuthnTenants = new FilePolicyApiTest();
private String getFilePolicyURI(URI id) {
return String.format(FILE_POLICY, id.toString());
}
@BeforeClass
public static void setupTestSuite() throws LDIFException,
LDAPException, IOException, FileOperationFailedException,
GeneralSecurityException, DirectoryOrFileNotFoundException, InterruptedException {
apiTestAuthnTenants.apiTestAuthnProviderUtils = new ApiTestAuthnProviderUtils();
apiTestAuthnTenants.apiTestAuthnProviderUtils.startLdapServer(FilePolicyApiTest.class.getSimpleName());
}
@AfterClass
public static void tearDownTestSuite() {
apiTestAuthnTenants.apiTestAuthnProviderUtils.stopLdapServer();
}
@Before
public void setUp() throws Exception {
initLoadBalancer(true);
setupLicenseAndInitialPasswords();
_cleanupResourceList = new LinkedList<CleanupResource>();
apiTestAuthnProviderUtils = new ApiTestAuthnProviderUtils();
}
private void registerResourceForCleanup(CleanupResource resource) {
if (_cleanupResourceList == null) {
_cleanupResourceList = new LinkedList<CleanupResource>();
}
_cleanupResourceList.add(resource);
}
private String getTestDomainName() {
return apiTestAuthnProviderUtils.getAuthnProviderDomain();
}
private UserMappingParam getDefaultUserMappingParam() {
UserMappingParam param = new UserMappingParam();
param.setDomain(getTestDomainName());
param.getGroups().add(apiTestAuthnProviderUtils.getLDAPGroup(2));
return param;
}
private List<UserMappingParam> getDefaultUserMappingParamList() {
List<UserMappingParam> paramList = new ArrayList<UserMappingParam>();
paramList.add(getDefaultUserMappingParam());
return paramList;
}
public TenantCreateParam getDefaultTenantCreateParam(String description) {
TenantCreateParam param = new TenantCreateParam();
param.setLabel(DEFAULT_TEST_TENANT_LABEL);
param.setDescription(description);
param.setUserMappings(getDefaultUserMappingParamList());
return param;
}
public ProjectParam getDefaultProjectParam(String projectName) {
ProjectParam param = new ProjectParam();
param.setName(projectName);
return param;
}
@Test
public void testFileSnapshotPolicyCreate() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
param.setPolicyName(filePolicyName);
param.setPolicyDescription(filePolicyName);
param.setPolicyType(FilePolicyType.file_snapshot.name());
param.setApplyAt(FilePolicy.FilePolicyApplyLevel.vpool.toString());
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
policySchedule.setScheduleFrequency("DAYS");
policySchedule.setScheduleRepeat(6L);
policySchedule.setScheduleTime("12:00");
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
snapshotPolicyParam.setSnapshotNamePattern("snapshot policy 1");
snapshotPolicyParam.setPolicySchedule(policySchedule);
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_OK, createFilePolicyResp.getStatus());
FilePolicyCreateResp createdFilePolicy = createFilePolicyResp.getEntity(FilePolicyCreateResp.class);
Assert.assertTrue(filePolicyName.equals(createdFilePolicy.getName()));
createdFileSnapshotPolicyURI = createdFilePolicy.getId();
System.out.println("New snapshot policy ID: " + createdFileSnapshotPolicyURI);
}
@Test
public void testCreatePolicyWithoutName() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidApplyAt() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
param.setPolicyName(filePolicyName);
param.setPolicyDescription(filePolicyName);
param.setPolicyType(FilePolicyType.file_snapshot.name());
param.setApplyAt("Some_invalid_string");
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyType() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
param.setPolicyName(filePolicyName);
param.setPolicyDescription(filePolicyName);
param.setApplyAt(FilePolicy.FilePolicyApplyLevel.vpool.toString());
param.setPolicyType("Some_invalid_string");
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyScheduleFrequency() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
policySchedule.setScheduleRepeat(6L);
policySchedule.setScheduleTime("12:00");
policySchedule.setScheduleFrequency("some_invalid_value");
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyScheduleRepeat() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
// Value less than 1
policySchedule.setScheduleRepeat(0L);
policySchedule.setScheduleTime("12:00");
policySchedule.setScheduleFrequency("DAYS");
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyScheduleTime() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
policySchedule.setScheduleRepeat(6L);
// Invalid TIME
policySchedule.setScheduleTime("67:00");
policySchedule.setScheduleFrequency("DAYS");
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyScheduleDayOfWeek() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
policySchedule.setScheduleRepeat(6L);
policySchedule.setScheduleTime("13:00");
policySchedule.setScheduleFrequency("WEEKS");
// Invalid day of month
policySchedule.setScheduleDayOfWeek("invalid day");
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreatePolicyWithInValidPolicyScheduleDayOfMonth() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType(SnapshotExpireType.NEVER.toString());
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
policySchedule.setScheduleRepeat(6L);
policySchedule.setScheduleTime("13:00");
policySchedule.setScheduleFrequency("MONTHS");
// Invalid day of month(not in range of 1-31)
policySchedule.setScheduleDayOfWeek("34");
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreateSnapshotPolicyInvalidExpireType() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
setFilePolicyScheduleParams(policySchedule);
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
// Invalid Expire Type
snapshotExpireParams.setExpireType("some_junk_value");
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreateSnapshotPolicyInvalidExpireValue() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
FileSnapshotPolicyParam snapshotPolicyParam = new FileSnapshotPolicyParam();
FilePolicyScheduleParams policySchedule = new FilePolicyScheduleParams();
setFilePolicyScheduleParams(policySchedule);
snapshotPolicyParam.setPolicySchedule(policySchedule);
param.setSnapshotPolicyPrams(snapshotPolicyParam);
FileSnapshotPolicyExpireParam snapshotExpireParams = new FileSnapshotPolicyExpireParam();
snapshotExpireParams.setExpireType("HOURS");
// Some invalid value less than 2 hours or greater than 2 years
snapshotExpireParams.setExpireValue(1);
snapshotPolicyParam.setSnapshotExpireParams(snapshotExpireParams);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreateSnapshotPolicyWithoutParams() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
setFilePolicyMandatoryParams(param);
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testCreateReplicationPolicyWithoutParams() {
FilePolicyCreateParam param = new FilePolicyCreateParam();
param.setPolicyName(filePolicyName);
param.setPolicyDescription(filePolicyName);
param.setPolicyType(FilePolicyType.file_replication.name());
param.setApplyAt(FilePolicy.FilePolicyApplyLevel.vpool.toString());
ClientResponse createFilePolicyResp = rSys.path(FILE_POLICIES).post(ClientResponse.class,
param);
Assert.assertEquals(createFilePolicyResp.toString(), HttpStatus.SC_BAD_REQUEST, createFilePolicyResp.getStatus());
}
@Test
public void testGetFileSnapshotPolicy() {
FilePolicyRestRep fileSnapshotPolicyResp = rSys.path(getFilePolicyURI(createdFileSnapshotPolicyURI)).get(FilePolicyRestRep.class);
Assert.assertNotNull(fileSnapshotPolicyResp);
Assert.assertTrue(createdFileSnapshotPolicyURI.equals(fileSnapshotPolicyResp.getId()));
}
@Test
public void testListFileSnapshotPolicies() {
FilePolicyListRestRep filePolicyListResp = rSys.path(FILE_POLICIES).get(FilePolicyListRestRep.class);
Assert.assertNotNull(filePolicyListResp);
List<NamedRelatedResourceRep> filePolicies = filePolicyListResp.getFilePolicies();
for (Iterator<NamedRelatedResourceRep> iterator = filePolicies.iterator(); iterator.hasNext();) {
NamedRelatedResourceRep namedRelatedResourceRep = iterator.next();
if (namedRelatedResourceRep.getId().equals(createdFileSnapshotPolicyURI)) {
Assert.assertTrue(true);
return;
}
}
Assert.assertTrue(false);
}
public void setFilePolicyMandatoryParams(FilePolicyCreateParam param) {
param.setPolicyName(filePolicyName);
param.setPolicyDescription(filePolicyName);
param.setPolicyType(FilePolicyType.file_snapshot.name());
param.setApplyAt(FilePolicy.FilePolicyApplyLevel.vpool.toString());
}
public void setFilePolicyScheduleParams(FilePolicyScheduleParams policySchedule) {
policySchedule.setScheduleRepeat(6L);
policySchedule.setScheduleTime("13:00");
policySchedule.setScheduleFrequency("DAYS");
}
@After
public void tearDown() {
CleanupResource.cleanUpTestResources(_cleanupResourceList);
}
}