コード例 #1
0
        public async Task SaveChanges_DryRun_NoStackChangesMade()
        {
            // arrange
            var alarm = Alarm();

            SetupListStacksToReturnStackNames();

            var sut = new CloudFormationAlarmCreator(
                new CloudformationStackDeployer(
                    new ConsoleAlarmLogger(false),
                    _cloudFormationMock.Object,
                    _s3Mock.Object,
                    null));

            sut.AddAlarm(alarm);

            // act
            await sut.SaveChanges(true);

            // assert
            _cloudFormationMock
            .Verify(x => x.CreateStackAsync(
                        It.IsAny <CreateStackRequest>(),
                        It.IsAny <CancellationToken>()), Times.Never());
        }
コード例 #2
0
        public async Task SaveChanges_StackDoesNotExist_StackIsCreated()
        {
            // arrange
            var alarm     = Alarm();
            var stackName = ExpectedStackName(alarm.AlertingGroup);

            SetupListStacksToReturnStackNames();
            SetStatusForStackName(stackName, "CREATE_COMPLETE");

            var sut = new CloudFormationAlarmCreator(
                new CloudformationStackDeployer(
                    new ConsoleAlarmLogger(false),
                    _cloudFormationMock.Object,
                    _s3Mock.Object,
                    null,
                    TimeSpan.FromMilliseconds(5),
                    TimeSpan.FromMilliseconds(5)
                    ));

            sut.AddAlarm(alarm);

            // act
            await sut.SaveChanges(false);

            // assert
            _cloudFormationMock
            .Verify(x => x.CreateStackAsync(
                        It.Is <CreateStackRequest>(s => s.StackName == stackName),
                        It.IsAny <CancellationToken>()));
        }
コード例 #3
0
        public async Task SaveChanges_SmallTemplate_SubmitsDirectly()
        {
            // arrange
            var alarm     = Alarm();
            var stackName = ExpectedStackName(alarm.AlertingGroup);

            SetupListStacksToReturnStackNames();
            SetupStackStatusSequence(stackName, new List <string> {
                "CREATE_COMPLETE"
            });

            var s3Location = new S3Location("bucket", "s3/path");

            var deployer = MakeDeployer(s3Location, TimeSpan.Zero, TimeSpan.FromMinutes(1));

            var sut = new CloudFormationAlarmCreator(deployer, new ConsoleAlarmLogger(false));

            sut.AddAlarm(alarm);

            // act
            await sut.SaveChanges(false);

            // assert
            _s3Mock
            .Verify(x => x.PutObjectAsync(
                        It.IsAny <PutObjectRequest>(),
                        It.IsAny <CancellationToken>()), Times.Never);

            _cloudFormationMock
            .Verify(x => x.CreateStackAsync(
                        It.Is <CreateStackRequest>(s => s.StackName == stackName &&
                                                   s.TemplateURL == null &&
                                                   !string.IsNullOrWhiteSpace(s.TemplateBody)),
                        It.IsAny <CancellationToken>()), Times.Exactly(1));
        }
コード例 #4
0
        public async Task SaveChanges_LargeTemplate_SubmitsViaS3()
        {
            // arrange

            var alarms = Enumerable.Range(0, 120)
                         .Select(x => Alarm($"alarm-{x}"))
                         .ToList();

            var stackName = ExpectedStackName(alarms.First().AlertingGroup);

            SetupListStacksToReturnStackNames();
            SetupStackStatusSequence(stackName, new List <string> {
                "CREATE_COMPLETE"
            });

            var s3Location = new S3Location("bucket", "s3/path");

            var sut = new CloudFormationAlarmCreator(
                new CloudformationStackDeployer(
                    new ConsoleAlarmLogger(false),
                    _cloudFormationMock.Object,
                    _s3Mock.Object,
                    s3Location,
                    TimeSpan.Zero,
                    TimeSpan.FromMinutes(1)
                    ));

            foreach (var alarm in alarms)
            {
                sut.AddAlarm(alarm);
            }

            // act
            await sut.SaveChanges(false);

            // assert
            var s3Path = $"{s3Location.Path}/{stackName}.json";

            _s3Mock
            .Verify(x => x.PutObjectAsync(
                        It.Is <PutObjectRequest>(r => r.BucketName == s3Location.BucketName && r.Key == s3Path),
                        It.IsAny <CancellationToken>()));

            var expectedStackUrl = $"https://s3.amazonaws.com/{s3Location.BucketName}/{s3Path}";

            _cloudFormationMock
            .Verify(x => x.CreateStackAsync(
                        It.Is <CreateStackRequest>(s => s.StackName == stackName &&
                                                   s.TemplateURL == expectedStackUrl &&
                                                   s.TemplateBody == null),
                        It.IsAny <CancellationToken>()), Times.Exactly(1));
        }
コード例 #5
0
        public async Task SaveChanges_ChangesToStackSubmitted_WaitsForTargetStatus()
        {
            // arrange
            var alarm     = Alarm();
            var stackName = ExpectedStackName(alarm.AlertingGroup);

            SetupListStacksToReturnStackNames();

            SetupStackStatusSequence(stackName, new List <string> {
                "CREATE_IN_PROGRESS", "CREATE_IN_PROGRESS", "CREATE_COMPLETE"
            });

            var statusCheckDelay = TimeSpan.FromMilliseconds(200);
            var sut = new CloudFormationAlarmCreator(
                new CloudformationStackDeployer(
                    new ConsoleAlarmLogger(false),
                    _cloudFormationMock.Object,
                    _s3Mock.Object,
                    null,
                    statusCheckDelay,
                    TimeSpan.FromMinutes(5)));

            sut.AddAlarm(alarm);

            var start = DateTime.UtcNow;

            // act
            await sut.SaveChanges(false);

            // assert

            var actualWaitMillis    = (DateTime.UtcNow - start).TotalMilliseconds;
            var expectedDelayMillis = statusCheckDelay.TotalMilliseconds * 3;

            Assert.That(actualWaitMillis, Is.GreaterThanOrEqualTo(expectedDelayMillis));

            // this is pretty rough because other parts of the method takes a while, just want to check the time isn't stupidly long
            var maxDelayMillis = expectedDelayMillis * 4;

            Assert.That(actualWaitMillis, Is.LessThanOrEqualTo(maxDelayMillis));

            _cloudFormationMock
            .Verify(x => x.DescribeStacksAsync(
                        It.Is <DescribeStacksRequest>(s => s.StackName == stackName),
                        It.IsAny <CancellationToken>()), Times.Exactly(3));
        }
コード例 #6
0
        public void SaveChanges_CloudformationFails_Throws()
        {
            // arrange
            var alarm = Alarm();

            SetupListStacksToReturnStackNames();
            SetupCreateStackAsyncToFail();

            var deployer = MakeDeployer();

            var sut = new CloudFormationAlarmCreator(deployer, new ConsoleAlarmLogger(false));

            sut.AddAlarm(alarm);

            // act
            var ex = Assert.ThrowsAsync <WatchmanException>(() => sut.SaveChanges(false));

            Assert.That(ex.Message, Is.EqualTo("1 stacks failed to deploy"));
        }