// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; using System.Threading.Tasks; using AWS.Deploy.Common.Data; namespace AWS.Deploy.Common.Recipes.Validation { /// /// Validates that the selected VPC must have at least two subnets in two different Availability Zones /// public class VPCSubnetsInDifferentAZsValidator : IOptionSettingItemValidator { private static readonly string defaultValidationFailedMessage = "Selected VPC must have at least two subnets in two different Availability Zones."; public string ValidationFailedMessage { get; set; } = defaultValidationFailedMessage; private readonly IAWSResourceQueryer _awsResourceQueryer; public VPCSubnetsInDifferentAZsValidator(IAWSResourceQueryer awsResourceQueryer) { _awsResourceQueryer = awsResourceQueryer; } public async Task Validate(object input, Recommendation recommendation, OptionSettingItem optionSettingItem) { var vpcId = input?.ToString(); if (string.IsNullOrEmpty(vpcId)) return ValidationResult.Failed("A VPC ID is not specified. Please select a valid VPC ID."); var subnets = await _awsResourceQueryer.DescribeSubnets(vpcId); var availabilityZones = new HashSet(); foreach (var subnet in subnets) availabilityZones.Add(subnet.AvailabilityZoneId); if (availabilityZones.Count >= 2) return ValidationResult.Valid(); else return ValidationResult.Failed(ValidationFailedMessage); } } }