package tw.com.acceptance;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.cloudformation.AmazonCloudFormationClient;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.Subnet;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.Vpc;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import org.apache.commons.io.FilenameUtils;
import org.junit.*;
import org.junit.rules.TestName;
import org.junit.rules.Timeout;
import tw.com.CLIArgBuilder;
import tw.com.DeletesStacks;
import tw.com.EnvironmentSetupForTests;
import tw.com.FilesForTesting;
import tw.com.commandline.Main;
import tw.com.entity.ProjectAndEnv;
import tw.com.providers.CloudClient;
import tw.com.repository.VpcRepository;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.*;
public class TestCommandLineS3Operations {
private static final Integer BUILD_NUMBER = 9987;
private static AmazonEC2Client ec2Client;
private static AmazonCloudFormationClient cfnClient;
private static AmazonS3Client s3Client;
@BeforeClass
public static void beforeAllTestsRun() {
DefaultAWSCredentialsProviderChain credentialsProvider = new DefaultAWSCredentialsProviderChain();
ec2Client = EnvironmentSetupForTests.createEC2Client(credentialsProvider);
s3Client = EnvironmentSetupForTests.createS3Client(credentialsProvider);
cfnClient = EnvironmentSetupForTests.createCFNClient(credentialsProvider);
}
private VpcRepository vpcRepository;
private DeletesStacks deletesStacks;
private ProjectAndEnv projectAndEnv;
private static String filenameA = FilenameUtils.getName(FilesForTesting.ACL);
private static String filenameB = FilenameUtils.getName(FilesForTesting.SUBNET_STACK);
private static final String KEY_A = BUILD_NUMBER+"/"+filenameA;
private static final String KEY_B = BUILD_NUMBER+"/"+filenameB;
@Before
public void beforeEveryTestRun() {
deleteTestKeysFromBucket();
vpcRepository = new VpcRepository(new CloudClient(ec2Client));
projectAndEnv = EnvironmentSetupForTests.getMainProjectAndEnv();
deletesStacks = new DeletesStacks(cfnClient);
deletesStacks.ifPresent(EnvironmentSetupForTests.TEMPORARY_STACK)
.ifPresent("CfnAssistTest01createSubnet")
.ifPresent("CfnAssistTest02createAcls")
.ifPresent("CfnAssistTestsimpleStack");
deletesStacks.act();
testName = test.getMethodName();
}
private void deleteTestKeysFromBucket() {
try {
s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, KEY_A);
s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, KEY_B);
}
catch(AmazonS3Exception exception) {
System.out.println(exception);
}
}
@After
public void afterEachTestIsRun() {
deletesStacks.act();
deleteTestKeysFromBucket();
}
@Rule public TestName test = new TestName();
String testName = "";
@Rule
public Timeout globalTimeout = new Timeout(100*1000);
@Test
public void testUploadArtifactsToS3AndAutopopulateAsParameters() {
Main main = new Main(CLIArgBuilder.createSubnetStackWithArtifactUpload(BUILD_NUMBER, testName));
int result = main.parse();
deletesStacks.ifPresent("CfnAssist9987TestsubnetWithS3Param");
assertEquals("deploy failed", 0, result);
Vpc vpcId = vpcRepository.getCopyOfVpc(projectAndEnv);
List<Subnet> subnets = EnvironmentSetupForTests.getSubnetFors(ec2Client, vpcId);
assertEquals(1, subnets.size());
List<Tag> tags = subnets.get(0).getTags();
List<Tag> expectedTags = new LinkedList<>();
expectedTags.add(new Tag().withKey("urlATag").withValue(EnvironmentSetupForTests.S3_PREFIX+"/"+KEY_A));
expectedTags.add(new Tag().withKey("urlBTag").withValue(EnvironmentSetupForTests.S3_PREFIX+"/"+KEY_B));
assertTrue(tags.containsAll(expectedTags));
}
@Test
public void testUploadAndDeleteFileArtifacts() {
Main main = new Main(CLIArgBuilder.uploadArtifacts(BUILD_NUMBER));
int result = main.parse();
assertEquals("create failed", 0, result);
List<S3ObjectSummary> objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client);
assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_A));
assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_B));
main = new Main(CLIArgBuilder.deleteArtifacts(BUILD_NUMBER, filenameA, filenameB));
result = main.parse();
assertEquals("delete failed", 0, result);
objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client);
assertFalse(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_A));
assertFalse(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_B));
}
@Test
public void testUploadAndDeleteFolderArtifact() {
String artifacts = String.format("folder=%s", FilesForTesting.ORDERED_SCRIPTS_FOLDER);
String[] argsS3create = {
"-env", EnvironmentSetupForTests.ENV,
"-project", EnvironmentSetupForTests.PROJECT,
"-region", EnvironmentSetupForTests.getRegion().toString(),
"-s3create",
"-artifacts", artifacts,
"-bucket", EnvironmentSetupForTests.BUCKET_NAME,
"-build", BUILD_NUMBER.toString()
};
Main main = new Main(argsS3create);
int result = main.parse();
assertEquals("create failed", 0, result);
List<S3ObjectSummary> objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client);
String key1 = BUILD_NUMBER+"/01createSubnet.json";
assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, key1));
String key2 = BUILD_NUMBER+"/02createAcls.json";
assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, key2));
artifacts = String.format("art1=%s;art2=%s", "01createSubnet.json", "02createAcls.json");
String[] argsS3Delete = {
"-env", EnvironmentSetupForTests.ENV,
"-project", EnvironmentSetupForTests.PROJECT,
"-region", EnvironmentSetupForTests.getRegion().toString(),
"-s3delete",
"-artifacts", artifacts,
"-bucket", EnvironmentSetupForTests.BUCKET_NAME,
"-build", BUILD_NUMBER.toString()
};
main = new Main(argsS3Delete);
result = main.parse();
assertEquals("delete failed", 0, result);
objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client);
assertFalse(EnvironmentSetupForTests.isContainedIn(objectSummaries, key1));
assertFalse(EnvironmentSetupForTests.isContainedIn(objectSummaries, key2));
}
}