// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Amazon.EC2;
using Amazon.EC2.Model;
using AWS.Deploy.Common.Data;
using AWS.Deploy.Common.Extensions;
namespace AWS.Deploy.Common.Recipes.Validation
{
///
/// Validates that the selected subnets are part of the selected VPC
///
public class SubnetsInVpcValidator : IOptionSettingItemValidator
{
private static readonly string defaultValidationFailedMessage = "The selected subnets are not part of the selected VPC.";
public string VpcId { get; set; } = "";
public string ValidationFailedMessage { get; set; } = defaultValidationFailedMessage;
private readonly IAWSResourceQueryer _awsResourceQueryer;
private readonly IOptionSettingHandler _optionSettingHandler;
public SubnetsInVpcValidator(IAWSResourceQueryer awsResourceQueryer, IOptionSettingHandler optionSettingHandler)
{
_awsResourceQueryer = awsResourceQueryer;
_optionSettingHandler = optionSettingHandler;
}
public async Task Validate(object input, Recommendation recommendation, OptionSettingItem optionSettingItem)
{
if (string.IsNullOrEmpty(VpcId))
return ValidationResult.Failed($"The '{nameof(SubnetsInVpcValidator)}' validator is missing the '{nameof(VpcId)}' configuration.");
var vpcIdSetting = _optionSettingHandler.GetOptionSetting(recommendation, VpcId);
var vpcId = _optionSettingHandler.GetOptionSettingValue(recommendation, vpcIdSetting);
if (string.IsNullOrEmpty(vpcId))
return ValidationResult.Failed("The VpcId setting is not set or is empty. Make sure to set the VPC Id first.");
var subnetIds = (await _awsResourceQueryer.DescribeSubnets(vpcId)).Select(x => x.SubnetId);
if (input?.TryDeserialize>(out var inputList) ?? false)
{
foreach (var subnet in inputList!)
{
if (!subnetIds.Contains(subnet))
return ValidationResult.Failed("The selected subnet(s) are invalid since they do not belong to the currently selected VPC.");
}
return ValidationResult.Valid();
}
return new ValidationResult
{
IsValid = subnetIds.Contains(input?.ToString()),
ValidationFailedMessage = ValidationFailedMessage
};
}
}
}