package tw.com.unit;
import com.amazonaws.services.cloudformation.model.*;
import com.amazonaws.services.cloudformation.model.Stack;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.Vpc;
import com.amazonaws.services.identitymanagement.model.User;
import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.EasyMockSupport;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import tw.com.AwsFacade;
import tw.com.EnvironmentSetupForTests;
import tw.com.FilesForTesting;
import tw.com.MonitorStackEvents;
import tw.com.entity.CFNAssistNotification;
import tw.com.entity.ProjectAndEnv;
import tw.com.entity.StackNameAndId;
import tw.com.entity.Tagging;
import tw.com.exceptions.CfnAssistException;
import tw.com.exceptions.DuplicateStackException;
import tw.com.providers.IdentityProvider;
import tw.com.providers.NotificationSender;
import tw.com.repository.CloudFormRepository;
import tw.com.repository.CloudRepository;
import tw.com.repository.ELBRepository;
import tw.com.repository.VpcRepository;
import java.io.File;
import java.io.IOException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static tw.com.EnvironmentSetupForTests.getMainProjectAndEnv;
@RunWith(EasyMockRunner.class)
public class TestAwsFacadeCreatesStacks extends EasyMockSupport {
private static final String CREATE_COMP_STATUS = StackStatus.CREATE_COMPLETE.toString();
private static final String VPC_ID = "vpcId";
private AwsFacade aws;
private ProjectAndEnv projectAndEnv = getMainProjectAndEnv();
private CloudFormRepository cfnRepository;
private VpcRepository vpcRepository;
private MonitorStackEvents monitor;
private NotificationSender notificationSender;
private IdentityProvider identityProvider;
private CloudRepository cloudRepository;
private User user;
private String regionName;
@Before
public void beforeEachTestRuns() {
regionName = EnvironmentSetupForTests.getRegion().toString();
monitor = createMock(MonitorStackEvents.class);
cfnRepository = createMock(CloudFormRepository.class);
vpcRepository = createMock(VpcRepository.class);
ELBRepository elbRepository = createMock(ELBRepository.class);
cloudRepository = createStrictMock(CloudRepository.class);
notificationSender = createStrictMock(NotificationSender.class);
identityProvider = createStrictMock(IdentityProvider.class);
user = new User("path", "userName", "userId", "arn", new Date());
String regionName = EnvironmentSetupForTests.getRegion().getName();
aws = new AwsFacade(monitor, cfnRepository, vpcRepository, elbRepository, cloudRepository, notificationSender, identityProvider, regionName);
}
@Test
public void shouldApplySimpleTemplateNoParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
Collection<Parameter> creationParameters = new LinkedList<>();
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateParametersWithOutDescriptions() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("noDescription").withDefaultValue("defaultValue"));
Collection<Parameter> creationParameters = new LinkedList<>();
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateOutputParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
Collection<Parameter> creationParameters = new LinkedList<>();
Collection<Output> outputs = new LinkedList<>();
outputs.add(new Output().withDescription("::CFN_TAG").withOutputKey("outputKey").withOutputValue("outputValue"));
outputs.add(new Output().withDescription("something").withOutputKey("ignored").withOutputValue("noThanks"));
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, "", outputs, zones);
vpcRepository.setVpcTag(projectAndEnv, "outputKey", "outputValue");
EasyMock.expectLastCall();
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
private StackNameAndId SetCreateExpectations(String stackName,
String contents, List<TemplateParameter> templateParameters,
Collection<Parameter> creationParameters, Map<String, AvailabilityZone> zones) throws CfnAssistException, InterruptedException {
return SetCreateExpectations(stackName, contents, templateParameters, creationParameters,"", zones); // no comment
}
@Test
public void shouldApplySimpleTemplateNoParametersWithComment() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
Collection<Parameter> creationParameters = new LinkedList<>();
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, "aComment", zones);
projectAndEnv.setComment("aComment");
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldThrowOnCreateWhenStackExistsAndNotRolledBack() throws IOException, CfnAssistException, InterruptedException {
String stackName = "CfnAssistTestsimpleStack";
String filename = FilesForTesting.SIMPLE_STACK;
String contents = EnvironmentSetupForTests.loadFile(filename);
String stackId = "stackId";
StackNameAndId stackNameAndId = new StackNameAndId(stackName, stackId);
List<TemplateParameter> templateParameters = new LinkedList<>();
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
// stack in rolled back status so delete it
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(cfnRepository.getStackNameAndId(stackName)).andReturn(stackNameAndId);
replayAll();
try {
aws.applyTemplate(filename, projectAndEnv);
}
catch(DuplicateStackException expected) {
// expected
}
verifyAll();
}
@Test
public void shouldHandleCreateWhenStackInRolledBackStatus() throws IOException, CfnAssistException, InterruptedException {
String stackName = "CfnAssistTestsimpleStack";
String filename = FilesForTesting.SIMPLE_STACK;
String contents = EnvironmentSetupForTests.loadFile(filename);
String stackId = "stackId";
StackNameAndId stackNameAndId = new StackNameAndId(stackName, stackId);
Collection<Parameter> creationParameters = new LinkedList<>();
List<TemplateParameter> templateParameters = new LinkedList<>();
Stack stack = new Stack().withStackId(stackId);
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
// stack in rolled back status so delete it
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn(StackStatus.ROLLBACK_COMPLETE.toString());
EasyMock.expect(cfnRepository.getStackNameAndId(stackName)).andReturn(stackNameAndId);
cfnRepository.deleteStack(stackName);
EasyMock.expectLastCall();
// now proceed with creation
EasyMock.expect(cfnRepository.createStack(projectAndEnv, contents, stackName, creationParameters, monitor, new Tagging())).
andReturn(stackNameAndId);
Map<String, AvailabilityZone> zones = new HashMap<>();
EasyMock.expect(cloudRepository.getZones(regionName)).andReturn(zones);
EasyMock.expect(monitor.waitForCreateFinished(stackNameAndId)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(identityProvider.getUserId()).andReturn(user);
CFNAssistNotification notification = new CFNAssistNotification(stackName, CREATE_COMP_STATUS, user);
EasyMock.expect(notificationSender.sendNotification(notification)).andReturn("sendMessageId");
EasyMock.expect(cfnRepository.createSuccess(stackNameAndId)).andReturn(stack);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(stackNameAndId, result);
verifyAll();
}
@Test
public void shouldHandleCreateWhenStackRolledBackInProgressStatus() throws IOException, CfnAssistException, InterruptedException {
String stackName = "CfnAssistTestsimpleStack";
String filename = FilesForTesting.SIMPLE_STACK;
String contents = EnvironmentSetupForTests.loadFile(filename);
String stackId = "stackId";
StackNameAndId stackNameAndId = new StackNameAndId(stackName, stackId);
Collection<Parameter> creationParameters = new LinkedList<>();
List<TemplateParameter> templateParameters = new LinkedList<>();
Stack stack = new Stack().withStackId(stackId);
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
// stack in rolled back status so delete it
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn(StackStatus.ROLLBACK_IN_PROGRESS.toString());
EasyMock.expect(cfnRepository.getStackNameAndId(stackName)).andReturn(stackNameAndId);
EasyMock.expect(monitor.waitForRollbackComplete(stackNameAndId)).andReturn(StackStatus.ROLLBACK_COMPLETE.toString());
cfnRepository.deleteStack(stackName);
EasyMock.expectLastCall();
// now proceed with creation
EasyMock.expect(cfnRepository.createStack(projectAndEnv, contents, stackName, creationParameters, monitor, new Tagging())).
andReturn(stackNameAndId);
Map<String, AvailabilityZone> zones = new HashMap<>();
EasyMock.expect(cloudRepository.getZones(regionName)).andReturn(zones);
EasyMock.expect(monitor.waitForCreateFinished(stackNameAndId)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(identityProvider.getUserId()).andReturn(user);
CFNAssistNotification notification = new CFNAssistNotification(stackName, CREATE_COMP_STATUS, user);
EasyMock.expect(notificationSender.sendNotification(notification)).andReturn("sendMessageId");
EasyMock.expect(cfnRepository.createSuccess(stackNameAndId)).andReturn(stack);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(stackNameAndId, result);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateEnvAndVpcBuiltInParamsWithBuild() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssist43TestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("vpc"));
templateParameters.add(new TemplateParameter().withParameterKey("env"));
templateParameters.add(new TemplateParameter().withParameterKey("build"));
Collection<Parameter> creationParameters = new LinkedList<>();
projectAndEnv.addBuildNumber(43);
addParam(creationParameters, "env", projectAndEnv.getEnv());
addParam(creationParameters, "vpc", VPC_ID);
addParam(creationParameters, "build", "43");
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateEnvAndVpcBuiltInParamsWithBuildAndZones() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK_WITH_AZ;
String stackName = "CfnAssist43TestsimpleStackWithAZ";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("vpc"));
templateParameters.add(new TemplateParameter().withParameterKey("env"));
templateParameters.add(new TemplateParameter().withParameterKey("build"));
templateParameters.add(new TemplateParameter().withParameterKey("zoneA").withDescription("::CFN_ZONE_A"));
templateParameters.add(new TemplateParameter().withParameterKey("zoneB").withDescription("::CFN_ZONE_B"));
templateParameters.add(new TemplateParameter().withParameterKey("zoneC").withDescription("::CFN_ZONE_C"));
Collection<Parameter> creationParameters = new LinkedList<>();
projectAndEnv.addBuildNumber(43);
addParam(creationParameters, "env", projectAndEnv.getEnv());
addParam(creationParameters, "vpc", VPC_ID);
addParam(creationParameters, "build", "43");
addParam(creationParameters, "zoneA", "eu-west-1a");
addParam(creationParameters, "zoneB", "eu-west-1b");
addParam(creationParameters, "zoneC", "eu-west-1c");
Map<String, AvailabilityZone> zones = new HashMap<>();
zones.put("a", new AvailabilityZone().withRegionName("eu-west-1").withZoneName("eu-west-1a"));
zones.put("b", new AvailabilityZone().withRegionName("eu-west-1").withZoneName("eu-west-1b"));
zones.put("c", new AvailabilityZone().withRegionName("eu-west-1").withZoneName("eu-west-1c"));
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateInputParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "subnet", "subnetValue");
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
List<Parameter> userParams = new LinkedList<>();
addParam(userParams, "subnet", "subnetValue");
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
///////
// needs environmental variable set to testEnvVar set to testValue
///////
@Test
public void shouldApplySimpleTemplateEnvVarParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("testEnvVar").withDescription("::ENV"));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "testEnvVar", "testValue");
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
List<Parameter> userParams = new LinkedList<>();
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
///////
// needs environmental variable set to testEnvVar set to testValue
///////
@Test
public void shouldApplySimpleTemplateEnvVarParametersNoEchoSet() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("testEnvVar").
withDescription("::ENV").withNoEcho(true));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "testEnvVar", "testValue");
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
List<Parameter> userParams = new LinkedList<>();
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplyAutoDiscoveryTemplateInputParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("keyName").withDescription("::logicalIdToFind"));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "keyName", "foundPhysicalId");
StackNameAndId stackNameAndId = new StackNameAndId(stackName, "stackId");
Stack stack = new Stack().withStackId("stackId");
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn("");
// search for the logical id, return the found id
EasyMock.expect(cfnRepository.findPhysicalIdByLogicalId(projectAndEnv.getEnvTag(), "logicalIdToFind")).andReturn("foundPhysicalId");
EasyMock.expect(cfnRepository.createStack(projectAndEnv, contents, stackName, creationParameters, monitor, new Tagging())).
andReturn(stackNameAndId);
Map<String, AvailabilityZone> zones = new HashMap<>();
EasyMock.expect(cloudRepository.getZones(regionName)).andReturn(zones);
EasyMock.expect(monitor.waitForCreateFinished(stackNameAndId)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(identityProvider.getUserId()).andReturn(user);
CFNAssistNotification notification = new CFNAssistNotification(stackName, CREATE_COMP_STATUS, user);
EasyMock.expect(notificationSender.sendNotification(notification)).andReturn("sendMessageId");
EasyMock.expect(cfnRepository.createSuccess(stackNameAndId)).andReturn(stack);
replayAll();
List<Parameter> userParams = new LinkedList<>();
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplyAutoDiscoveryVPCTagParameters() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("vpcTagKey").withDescription("::CFN_TAG"));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "vpcTagKey", "foundVpcTagValue");
StackNameAndId stackNameAndId = new StackNameAndId(stackName, "stackId");
Stack stack = new Stack().withStackId("stackId");
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn("");
// get the tag from the VPC
EasyMock.expect(vpcRepository.getVpcTag("vpcTagKey", projectAndEnv)).andReturn("foundVpcTagValue");
EasyMock.expect(cfnRepository.createStack(projectAndEnv, contents, stackName, creationParameters, monitor, new Tagging())).
andReturn(stackNameAndId);
Map<String, AvailabilityZone> zones = new HashMap<>();
EasyMock.expect(cloudRepository.getZones(regionName)).andReturn(zones);
EasyMock.expect(monitor.waitForCreateFinished(stackNameAndId)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(identityProvider.getUserId()).andReturn(user);
CFNAssistNotification notification = new CFNAssistNotification(stackName, CREATE_COMP_STATUS, user);
EasyMock.expect(notificationSender.sendNotification(notification)).andReturn("sendMessageId");
EasyMock.expect(cfnRepository.createSuccess(stackNameAndId)).andReturn(stack);
replayAll();
List<Parameter> userParams = new LinkedList<>();
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateInputParametersNotPassBuild() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssist56TestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "subnet", "subnetValue");
projectAndEnv.addBuildNumber(56);
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
List<Parameter> userParams = new LinkedList<>();
addParam(userParams, "subnet", "subnetValue");
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateEnvAndVpcBuiltInAndUserParams() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("vpc"));
templateParameters.add(new TemplateParameter().withParameterKey("env"));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "subnet", "subnetValue");
addParam(creationParameters, "env", projectAndEnv.getEnv());
addParam(creationParameters, "vpc", VPC_ID);
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
List<Parameter> userParams = new LinkedList<>();
addParam(userParams, "subnet", "subnetValue");
replayAll();
StackNameAndId result = aws.applyTemplate(new File(filename), projectAndEnv, userParams);
assertEquals(result, stackNameAndId);
verifyAll();
}
@Test
public void shouldApplySimpleTemplateEnvAndVpcBuiltInParams() throws CfnAssistException, IOException, InterruptedException {
String filename = FilesForTesting.SIMPLE_STACK;
String stackName = "CfnAssistTestsimpleStack";
String contents = EnvironmentSetupForTests.loadFile(filename);
List<TemplateParameter> templateParameters = new LinkedList<>();
templateParameters.add(new TemplateParameter().withParameterKey("vpc"));
templateParameters.add(new TemplateParameter().withParameterKey("env"));
Collection<Parameter> creationParameters = new LinkedList<>();
addParam(creationParameters, "env", projectAndEnv.getEnv());
addParam(creationParameters, "vpc", VPC_ID);
Map<String, AvailabilityZone> zones = new HashMap<>();
StackNameAndId stackNameAndId = SetCreateExpectations(stackName, contents, templateParameters, creationParameters, zones);
replayAll();
StackNameAndId result = aws.applyTemplate(filename, projectAndEnv);
assertEquals(result, stackNameAndId);
verifyAll();
}
private StackNameAndId SetCreateExpectations(String stackName,
String contents, List<TemplateParameter> templateParameters,
Collection<Parameter> creationParameters, String comment, Map<String, AvailabilityZone> zones) throws CfnAssistException, InterruptedException {
return SetCreateExpectations(stackName, contents, templateParameters, creationParameters, comment, new LinkedList<>(), zones);
}
private StackNameAndId SetCreateExpectations(String stackName, String contents,
List<TemplateParameter> templateParameters,
Collection<Parameter> creationParameters, String comment, Collection<Output> outputs,
Map<String, AvailabilityZone> zones)
throws CfnAssistException, InterruptedException {
StackNameAndId stackNameAndId = new StackNameAndId(stackName, "stackId");
Stack stack = new Stack().withStackId("stackId");
if (outputs.size()>0) {
stack.setOutputs(outputs);
}
EasyMock.expect(vpcRepository.getCopyOfVpc(projectAndEnv)).andReturn(new Vpc().withVpcId(VPC_ID));
EasyMock.expect(cfnRepository.validateStackTemplate(contents)).andReturn(templateParameters);
EasyMock.expect(cfnRepository.getStackStatus(stackName)).andReturn("");
Tagging tagging = new Tagging();
tagging.setCommentTag(comment);
EasyMock.expect(cfnRepository.createStack(projectAndEnv, contents, stackName, creationParameters, monitor, tagging)).
andReturn(stackNameAndId);
EasyMock.expect(cloudRepository.getZones(regionName)).andReturn(zones);
EasyMock.expect(monitor.waitForCreateFinished(stackNameAndId)).andReturn(CREATE_COMP_STATUS);
EasyMock.expect(identityProvider.getUserId()).andReturn(user);
CFNAssistNotification notification = new CFNAssistNotification(stackName, CREATE_COMP_STATUS, user);
EasyMock.expect(notificationSender.sendNotification(notification)).andReturn("sendMessageID");
EasyMock.expect(cfnRepository.createSuccess(stackNameAndId)).andReturn(stack);
return stackNameAndId;
}
public static void addParam(Collection<Parameter> creationParameters, String key, String value) {
creationParameters.add(new Parameter().withParameterKey(key).withParameterValue(value));
}
}