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)); }
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)); } }
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"); }