Exemplo n.º 1
0
        /// <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();
        }
Exemplo n.º 3
0
        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);
        }