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.util.concurrent.TimeoutException;
import static org.junit.Assert.assertEquals;
public class TestCommandLineStackOperationsLegacy {
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 testInvokeViaCommandLineDeployWholeDirAndThenRollback() throws CannotFindVpcException, InterruptedException, TimeoutException {
ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV);
invokeForDirAndThenRollback(projAndEnv, "", FilesForTesting.ORDERED_SCRIPTS_FOLDER);
}
@Test
public void testInvokeViaCommandLineDeployWholeDirAndThenRollbackWithSNS() throws CannotFindVpcException, InterruptedException, TimeoutException {
ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV);
invokeForDirAndThenRollback(projAndEnv, "-sns", FilesForTesting.ORDERED_SCRIPTS_FOLDER);
}
@Test
public void testInvokeViaCommandLineDeployWholeDirDeltasAndThenRollback() throws CannotFindVpcException, InterruptedException, TimeoutException {
ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV);
invokeForDirAndThenRollback(projAndEnv, "", FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString());
}
@Test
public void testInvokeViaCommandLineDeployWholeDirDeltasAndThenRollbackWithSNS() throws CannotFindVpcException, InterruptedException, TimeoutException {
ProjectAndEnv projAndEnv = new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV);
invokeForDirAndThenRollback(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.stepback(FilesForTesting.ORDERED_SCRIPTS_FOLDER, "-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 stepback failed",0,resultA);
assertEquals("second stepback failed",0,resultB);
}
@Deprecated
private void invokeForDirAndThenRollback(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.rollbackFromDir(orderedScriptsFolder, sns);
main = new Main(rollbackDeploy);
result = main.parse();
//clean up as needed
vpcRepository.initAllTags(altEnvVPC.getVpcId(), altProjectAndEnv);
//cfnClient.setRegion(EnvironmentSetupForTests.getRegion());
// check
assertEquals("rollback failed",0,result);
}
}