/// <summary> /// Sets up the cloud formation operations for most tests. /// </summary> /// <param name="stackStatus">The stack status.</param> /// <returns>A <see cref="CloudFormationOperations"/> for the test</returns> private CloudFormationOperations SetupCloudFormationOperations(string stackStatus) { var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).ReturnsAsync( new DescribeStacksResponse { Stacks = new List <Stack> { new Stack() { StackName = StackName, StackStatus = StackStatus.FindValue(stackStatus) } } }); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); return(operations); }
public async Task ShouldExistWhenDescribeStacksReturnsTheStack() { var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).ReturnsAsync( new DescribeStacksResponse { Stacks = new List <Stack> { new Stack() { StackName = StackName } } }); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); (await operations.GetStackAsync(StackName)).Should().NotBeNull(); }
public async Task ShouldBeNotFoundWhenStackDoesNotExist() { var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).Throws( new AmazonCloudFormationException($"Stack with id {StackName} does not exist")); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); (await operations.GetStackOperationalStateAsync(StackName)).Should().Be(StackOperationalState.NotFound); }
public void ShoulPassOnExceptionWhenDescribeStacksThrowsUnexpectedException() { var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).Throws( new InvalidOperationException()); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); Func <Task <Stack> > action = async() => await operations.GetStackAsync(StackName); action.Should().Throw <InvalidOperationException>(); }
public void ShouldNotExistWhenDescribeStacksThrowsTheExpectedExceptionForStackNotFound() { var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).Throws( new AmazonCloudFormationException($"Stack with id {StackName} does not exist")); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); Func <Task <Stack> > action = async() => await operations.GetStackAsync(StackName); action.Should().Throw <StackOperationException>().And.OperationalState.Should() .Be(StackOperationalState.NotFound); }
public async Task ShouldReturnExpectedOutputs() { var expectedParameters = new Dictionary <string, string> { { "Output1", "Value1" }, { "Output2", "Value2" } }; var stackOutputs = expectedParameters .Select(kv => new Output { OutputKey = kv.Key, OutputValue = kv.Value }).ToList(); var logger = new TestLogger(this.output); var mockClientFactory = TestHelpers.GetClientFactoryMock(); var mockContext = TestHelpers.GetContextMock(logger); var mockCf = new Mock <IAmazonCloudFormation>(); mockCf.Setup(cf => cf.DescribeStacksAsync(It.IsAny <DescribeStacksRequest>(), default)).ReturnsAsync( new DescribeStacksResponse { Stacks = new List <Stack> { new Stack() { StackName = StackName, Outputs = stackOutputs } } }); mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object); var operations = new CloudFormationOperations(mockClientFactory.Object, mockContext.Object); var outputs = (await operations.GetStackOutputsAsync(StackName)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); outputs.SequenceEqual(expectedParameters).Should().BeTrue(); }
/// <summary> /// Gets the stack outputs /// </summary> /// <param name="context">The context.</param> /// <param name="clientFactory">The client factory.</param> /// <param name="parameterSetName">Name of the parameter set in force</param> /// <returns>Object containing outputs in selected format.</returns> internal async Task <object> GetStackOutputs( ICloudFormationContext context, IAwsClientFactory clientFactory, string parameterSetName) { var ops = new CloudFormationOperations(clientFactory, context); var stackOutputs = (await ops.GetStackAsync(this.StackName)).Outputs; if (this.AsHashTable) { return(new Hashtable(stackOutputs.ToDictionary(o => o.OutputKey, o => o.OutputValue))); } if (this.AsParameterBlock) { var parameters = new Dictionary <string, Dictionary <string, string> >(); foreach (var p in stackOutputs) { var parameterProps = new Dictionary <string, string> { { "Type", TemplateManager.GetParameterTypeFromStringValue(p.OutputValue) } }; if (!string.IsNullOrEmpty(p.Description)) { parameterProps.Add("Description", p.Description); } parameters.Add(p.OutputKey, parameterProps); } var block = new Dictionary <string, object> { { "Parameters", parameters } }; return(new SerializerBuilder().Build().Serialize(block)); } if (this.AsCrossStackReferences) { var ti = new CultureInfo("en-US"); var stackParam = string.Join( string.Empty, this.StackName.Split('-', '_').Select(s => ti.TextInfo.ToTitleCase(s))); return(new SerializerBuilder().Build().Serialize( stackOutputs.Where(o => !string.IsNullOrEmpty(o.ExportName)).Select( p => new Dictionary <string, Dictionary <string, string> > { { "Fn::ImportValue", new Dictionary <string, string> { { "Fn::Sub", p.ExportName.Replace(this.StackName, $"${{{stackParam}}}") } } } }).ToList())); } this.ThrowExecutionError($"Unsupported parameter set {this.ParameterSetName}", this, null); return(null); }