Beispiel #1
0
        public async Task StacksAreNotListedMultipleTimes()
        {
            var config = ConfigHelper.CreateBasicConfiguration("test", "group-suffix",
                                                               new AlertingGroupServices()
            {
                AutoScaling = new AwsServiceAlarms <AutoScalingResourceConfig>()
                {
                    Resources = new List <ResourceThresholds <AutoScalingResourceConfig> >()
                    {
                        new ResourceThresholds <AutoScalingResourceConfig>()
                        {
                            Pattern = ".*"
                        }
                    }
                }
            },
                                                               numberOfCloudFormationStacks: 5);

            var cloudFormation = new FakeCloudFormation();

            var context = new TestingIocBootstrapper()
                          .WithCloudFormation(cloudFormation.Instance)
                          .WithConfig(config);

            context.GetMock <IAmazonAutoScaling>().HasAutoScalingGroups(new[]
            {
                new AutoScalingGroup()
                {
                    AutoScalingGroupName = $"group-asg",
                    DesiredCapacity      = 40
                }
            });

            await context.Get <AlarmLoaderAndGenerator>()
            .LoadAndGenerateAlarms(RunMode.GenerateAlarms);

            var stacks = cloudFormation.Stacks();

            Assert.That(stacks.Count, Is.GreaterThan(1));
            Assert.That(cloudFormation.CallsToListStacks, Is.EqualTo(1));
        }
Beispiel #2
0
        public async Task AlarmsAreDistributedEvenlyAcrossStacks()
        {
            const int numStacks = 10;
            const int numAsgs   = 100;

            var config = ConfigHelper.CreateBasicConfiguration("test", "group-suffix",
                                                               new AlertingGroupServices()
            {
                AutoScaling = new AwsServiceAlarms <AutoScalingResourceConfig>()
                {
                    Resources = new List <ResourceThresholds <AutoScalingResourceConfig> >()
                    {
                        new ResourceThresholds <AutoScalingResourceConfig>()
                        {
                            Pattern = ".*"
                        }
                    }
                }
            },
                                                               numberOfCloudFormationStacks: numStacks);

            var cloudFormation = new FakeCloudFormation();

            var context = new TestingIocBootstrapper()
                          .WithCloudFormation(cloudFormation.Instance)
                          .WithConfig(config);

            var lotsOfAsgs = Enumerable.Range(0, numAsgs).Select(r =>

                                                                 new AutoScalingGroup()
            {
                AutoScalingGroupName = $"group-{r}",
                DesiredCapacity      = 40
            }
                                                                 )
                             .ToArray();

            context.GetMock <IAmazonAutoScaling>().HasAutoScalingGroups(lotsOfAsgs);

            try
            {
                await context.Get <AlarmLoaderAndGenerator>()
                .LoadAndGenerateAlarms(RunMode.GenerateAlarms);
            }
            catch
            {
                // ignore
            }

            var stacks = cloudFormation.Stacks();

            Assert.That(stacks.Count, Is.EqualTo(numStacks));

            var resourceCountsByStack = stacks.Select(s => (s.name, s.template.Resources.Count)).ToArray();

            var totalResources = stacks.Sum(s => s.template.Resources.Count);

            var alarmCount = stacks
                             .Sum(s => s.template.Resources.Count(r => r.Value.Type == "AWS::CloudWatch::Alarm"));

            Assert.That(alarmCount, Is.EqualTo(Defaults.AutoScaling.Count * numAsgs));

            var approxExpectedPerStack = (float)totalResources / numStacks;

            foreach (var(_, count) in resourceCountsByStack)
            {
                Assert.That(count, Is.Not.GreaterThan(approxExpectedPerStack * 1.2));
                Assert.That(count, Is.Not.LessThan(approxExpectedPerStack * 0.8));
            }
        }
Beispiel #3
0
        public async Task CanSetCustomAlarmDescriptionForDifferentServices()
        {
            // arrange
            var config = ConfigHelper.CreateBasicConfiguration("test", "group-suffix",
                                                               new AlertingGroupServices()
            {
                DynamoDb = new AwsServiceAlarms <DynamoResourceConfig>()
                {
                    Resources = new List <ResourceThresholds <DynamoResourceConfig> >()
                    {
                        new ResourceThresholds <DynamoResourceConfig>()
                        {
                            Pattern     = ".*",
                            Description = "custom dynamo text"
                        }
                    }
                },
                Lambda = new AwsServiceAlarms <ResourceConfig>
                {
                    Resources = new List <ResourceThresholds <ResourceConfig> >()
                    {
                        new ResourceThresholds <ResourceConfig>()
                        {
                            Pattern     = ".*",
                            Description = "custom lambda text"
                        }
                    }
                },
                Sqs = new AwsServiceAlarms <SqsResourceConfig>()
                {
                    Resources = new List <ResourceThresholds <SqsResourceConfig> >()
                    {
                        new ResourceThresholds <SqsResourceConfig>()
                        {
                            Pattern     = ".*",
                            Description = "custom sqs text"
                        }
                    }
                }
            });

            var cloudFormation = new FakeCloudFormation();
            var ioc            = new TestingIocBootstrapper()
                                 .WithCloudFormation(cloudFormation.Instance)
                                 .WithConfig(config);

            ioc.GetMock <IAmazonDynamoDB>().HasDynamoTables(new[]
            {
                new TableDescription()
                {
                    TableName             = "first-dynamo-table",
                    ProvisionedThroughput = new ProvisionedThroughputDescription()
                    {
                        ReadCapacityUnits  = 10,
                        WriteCapacityUnits = 10
                    }
                }
            });

            ioc.GetMock <IAmazonCloudWatch>().HasSqsQueues(new[]
            {
                "first-sqs-queue",
                "first-sqs-queue_error"
            });

            ioc.GetMock <IAmazonLambda>().HasLambdaFunctions(new[]
            {
                new FunctionConfiguration  {
                    FunctionName = "first-lambda"
                }
            });

            var sut = ioc.Get <AlarmLoaderAndGenerator>();

            // act

            await sut.LoadAndGenerateAlarms(RunMode.GenerateAlarms);

            // assert

            Assert.That(cloudFormation.StacksDeployed, Is.EqualTo(1));

            var alarmsByNamespace = cloudFormation.Stacks()
                                    .Single()
                                    .template.AlarmsByNamespace();

            VerifyAlarmDescriptions(alarmsByNamespace[AwsNamespace.Lambda], "custom lambda text");
            VerifyAlarmDescriptions(alarmsByNamespace[AwsNamespace.DynamoDb], "custom dynamo text");
            VerifyAlarmDescriptions(alarmsByNamespace[AwsNamespace.Sqs], "custom sqs text");
        }