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.Vpc; 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.exceptions.CannotFindVpcException; import tw.com.providers.CloudClient; import tw.com.repository.VpcRepository; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.Charset; import java.util.concurrent.TimeoutException; import static org.junit.Assert.assertEquals; public class TestCommandLineStackOperations { private Vpc altEnvVPC; private VpcRepository vpcRepository; private ProjectAndEnv altProjectAndEnv; private static AmazonEC2Client ec2Client; private static AmazonCloudFormationClient cfnClient; private DeletesStacks deletesStacks; @BeforeClass public static void beforeAllTestsRun() { DefaultAWSCredentialsProviderChain credentialsProvider = new DefaultAWSCredentialsProviderChain(); ec2Client = EnvironmentSetupForTests.createEC2Client(credentialsProvider); cfnClient = EnvironmentSetupForTests.createCFNClient(credentialsProvider); } @Rule public TestName test = new TestName(); String testName = ""; @Rule public Timeout globalTimeout = new Timeout(5*60*1000); @Before public void beforeEveryTestRun() { vpcRepository = new VpcRepository(new CloudClient(ec2Client)); altProjectAndEnv = EnvironmentSetupForTests.getAltProjectAndEnv(); EnvironmentSetupForTests.getMainProjectAndEnv(); altEnvVPC = EnvironmentSetupForTests.findAltVpc(vpcRepository); deletesStacks = new DeletesStacks(cfnClient); deletesStacks.ifPresent(EnvironmentSetupForTests.TEMPORARY_STACK) .ifPresent("CfnAssistTest01createSubnet") .ifPresent("CfnAssistTest02createAcls") .ifPresent("CfnAssistTestsimpleStack") .ifPresent("CfnAssistTestsubnet") .ifPresent("CfnAssist876TestelbAndInstance") .ifPresent("CfnAssistTestsimpleStackWithAZ"); deletesStacks.act(); testName = test.getMethodName(); } @After public void afterEachTestIsRun() { deletesStacks.act(); } @Test public void testInvokeViaCommandLineDeployWithFile() throws InterruptedException, TimeoutException { String[] args = CLIArgBuilder.createSimpleStack(testName); Main main = new Main(args); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); assertEquals(0, result); } @Test public void testInvokeViaCommandLineDeployWithFileAndBuildNumber() throws InterruptedException, TimeoutException { String[] args = CLIArgBuilder.createSimpleStackWithBuildNumber(testName, "876"); Main main = new Main(args); int result = main.parse(); deletesStacks.ifPresent("CfnAssist876TestsimpleStack"); assertEquals(0,result); } @Test public void testListStacks() throws InterruptedException, TimeoutException { PrintStream origStream = System.out; String[] create = CLIArgBuilder.createSimpleStack(testName); Main main = new Main(create); main.parse(); String[] list = CLIArgBuilder.listStacks(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); PrintStream output = new PrintStream(stream); System.setOut(output); main = new Main(list); int status = main.parse(); System.setOut(origStream); String outputText = new String(stream.toByteArray(), Charset.defaultCharset()); CLIArgBuilder.checkForExpectedLine("CfnAssistTestsimpleStack", "CfnAssist", "Test", outputText); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); assertEquals(0, status); } @Test public void testInvokeDiagramGenViaCLI() { String[] create = CLIArgBuilder.createDiagrams("./diagrams"); Main main = new Main(create); int status = main.parse(); assertEquals(0, status); } @Test public void testDeleteViaCommandLineDeployWithFileAndBuildNumber() throws InterruptedException, TimeoutException { String buildNumber = "0915"; String[] createArgs = CLIArgBuilder.createSimpleStackWithBuildNumber(testName, buildNumber); Main main = new Main(createArgs); int createResult = main.parse(); assertEquals(0,createResult); String[] deleteArgs = CLIArgBuilder.deleteSimpleStackWithBuildNumber(buildNumber); main = new Main(deleteArgs); int deleteResult = main.parse(); assertEquals(0,deleteResult); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); } @Test public void testDeleteViaCommandLineDeployWithFile() throws InterruptedException, TimeoutException { String[] createArgs = CLIArgBuilder.createSimpleStack(testName); Main main = new Main(createArgs); int createResult = main.parse(); assertEquals(0,createResult); String[] deleteArgs = CLIArgBuilder.deleteSimpleStack(); main = new Main(deleteArgs); int deleteResult = main.parse(); assertEquals(0,deleteResult); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); } @Test public void shouldDeleteViaCommandLineDeployWithName() throws InterruptedException, TimeoutException { String[] createArgs = CLIArgBuilder.createSimpleStack(testName); Main main = new Main(createArgs); int createResult = main.parse(); assertEquals(0,createResult); String[] deleteArgs = CLIArgBuilder.deleteByNameSimpleStack("simpleStack"); main = new Main(deleteArgs); int deleteResult = main.parse(); assertEquals(0,deleteResult); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); } @Test public void testInvokeViaCommandLineDeploySwitchELBInstancesAndWhitelistIP() throws InterruptedException, TimeoutException { Integer buildNumber = 876; String typeTag = "web"; String[] createELBAndInstance = { "-env", EnvironmentSetupForTests.ENV, "-project", EnvironmentSetupForTests.PROJECT, "-region", EnvironmentSetupForTests.getRegion().toString(), "-build", buildNumber.toString(), "-file", FilesForTesting.ELB_AND_INSTANCE, "-comment", testName }; Main main = new Main(createELBAndInstance); int result = main.parse(); deletesStacks.ifPresent("CfnAssist876TestelbAndInstance"); assertEquals(0,result); String[] updateELB = CLIArgBuilder.updateELB(typeTag, buildNumber); main = new Main(updateELB); result = main.parse(); assertEquals(0,result); Integer port = 8080; String[] whitelist = CLIArgBuilder.whitelistCurrentIP(typeTag, port); main = new Main(whitelist); result = main.parse(); assertEquals(0,result); String[] blacklist = CLIArgBuilder.blacklistCurrentIP(typeTag, port); main = new Main(blacklist); result = main.parse(); assertEquals(0,result); } @Test public void testInvokeViaCommandLineDeployWithFileAndSNS() throws InterruptedException, TimeoutException { String[] args = CLIArgBuilder.createSimpleStackWithSNS(testName); Main main = new Main(args); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); assertEquals(0,result); } @Test public void testInokeViaCommandLineWithAutoPopulatedAvailabilityZones() { String[] args = CLIArgBuilder.createSubnetStackWithZones(testName); Main main = new Main(args); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsimpleStackWithAZ"); assertEquals(0, result); } @Test public void testUpdateViaCommandLineDeployWithFileAndSNS() throws InterruptedException, TimeoutException { String[] create = CLIArgBuilder.createSubnetStack(testName); // no sns Main main = new Main(create); main.parse(); String[] update = CLIArgBuilder.updateSimpleStack(testName, "-sns"); main = new Main(update); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsubnet"); assertEquals(0,result); } @Test public void testInvokeViaCommandLineDeployWithFilePassedInParam() throws InterruptedException, TimeoutException { String[] args = CLIArgBuilder.createSubnetStackWithParams(testName); Main main = new Main(args); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsubnetWithParam"); assertEquals(0,result); } @Test public void shouldListInstances() { String[] args = CLIArgBuilder.listInstances(); Main main = new Main(args); int result = main.parse(); assertEquals(0,result); } @Test public void testInvokeViaCommandLineDeployWholeDirAndThenRollback() throws CannotFindVpcException, InterruptedException, TimeoutException { ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV); invokeForDirAndThenPurge(projAndEnv, "", FilesForTesting.ORDERED_SCRIPTS_FOLDER); } @Test public void testInvokeViaCommandLineDeployWholeDirAndThenRollbackWithSNS() throws CannotFindVpcException, InterruptedException, TimeoutException { ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV); invokeForDirAndThenPurge(projAndEnv, "-sns", FilesForTesting.ORDERED_SCRIPTS_FOLDER); } @Test public void testInvokeViaCommandLineDeployWholeDirDeltasAndThenRollback() throws CannotFindVpcException, InterruptedException, TimeoutException { ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV); invokeForDirAndThenPurge(projAndEnv, "", FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString()); } @Test public void testInvokeViaCommandLineDeployWholeDirDeltasAndThenRollbackWithSNS() throws CannotFindVpcException, InterruptedException, TimeoutException { ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV); invokeForDirAndThenPurge(projAndEnv, "-sns", FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString()); } @Test public void testInvokeViaCommandLineAndThenStepBackWithSNS() throws CannotFindVpcException { ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV); vpcRepository.setVpcIndexTag(projAndEnv, "0"); String[] argsDeploy = CLIArgBuilder.deployFromDir(FilesForTesting.ORDERED_SCRIPTS_FOLDER, "-sns", testName); Main main = new Main(argsDeploy); int result = main.parse(); assertEquals("deploy failed",0,result); String[] stepback = CLIArgBuilder.back("-sns"); // step back first stack main = new Main(stepback); int resultA = main.parse(); // step back second stack main = new Main(stepback); int resultB = main.parse(); vpcRepository.initAllTags(altEnvVPC.getVpcId(), altProjectAndEnv); assertEquals("first back failed",0,resultA); assertEquals("second back failed",0,resultB); } private void invokeForDirAndThenPurge(ProjectAndEnv projAndEnv, String sns, String orderedScriptsFolder) throws CannotFindVpcException { vpcRepository.setVpcIndexTag(projAndEnv, "0"); String[] argsDeploy = CLIArgBuilder.deployFromDir(orderedScriptsFolder, sns, testName); Main main = new Main(argsDeploy); int result = main.parse(); assertEquals("deploy failed",0,result); String[] rollbackDeploy = CLIArgBuilder.purge(sns); main = new Main(rollbackDeploy); result = main.parse(); //clean up as needed vpcRepository.initAllTags(altEnvVPC.getVpcId(), altProjectAndEnv); //cfnClient.setRegion(EnvironmentSetupForTests.getRegion()); // check assertEquals("purge failed",0,result); } @Ignore("cant find way to label at existing stack via apis") @Test public void testInvokeViaCommandLineTagExistingStack() throws IOException { EnvironmentSetupForTests.createTemporarySimpleStack(cfnClient, altEnvVPC.getVpcId(),""); String[] argslabelStack = { "-env", EnvironmentSetupForTests.ENV, "-project", EnvironmentSetupForTests.PROJECT, "-region", EnvironmentSetupForTests.getRegion().toString(), "-labelstack", "todoNotWorking" }; Main main = new Main(argslabelStack); int result = main.parse(); deletesStacks.ifPresent("CfnAssistTestsimpleStack"); assertEquals(0, result); } }