// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using AWS.Deploy.Common;
using AWS.Deploy.Common.Recipes;
using AWS.Deploy.Orchestration;
using AWS.Deploy.Orchestration.RecommendationEngine;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace AWS.Deploy.CLI.IntegrationTests.Helpers
{
public class ConfigFileHelper
{
///
/// Applies replacement tokens to a file
///
public static void ApplyReplacementTokens(Dictionary replacements, string filePath)
{
var content = File.ReadAllText(filePath);
foreach (var replacement in replacements)
{
content = content.Replace(replacement.Key, replacement.Value);
}
File.WriteAllText(filePath, content);
}
///
/// This method create a JSON config file from the specified recipeId and option setting values
///
/// The dependency injection container
/// The cloud application name used to uniquely identify the app within AWS. Ex - CloudFormation stack name
/// The recipeId for the deployment recommendation
/// This is a dictionary with FullyQualifiedId as key and their corresponsing option setting values
/// The path to the .NET application that will be deployed
/// The absolute JSON file path where the deployment settings are persisted
public static async Task CreateConfigFile(IServiceProvider serviceProvider, string applicationName, string recipeId, Dictionary optionSettings, string projectPath, string configFilePath, SaveSettingsType saveSettingsType)
{
var parser = serviceProvider.GetService();
var optionSettingHandler = serviceProvider.GetRequiredService();
var deploymentSettingHandler = serviceProvider.GetRequiredService();
var orchestratorSession = new OrchestratorSession(parser.Parse(projectPath).Result);
var cloudApplication = new CloudApplication(applicationName, "", CloudApplicationResourceType.CloudFormationStack, recipeId);
var recommendationEngine = new RecommendationEngine(orchestratorSession, serviceProvider.GetService());
var recommendations = await recommendationEngine.ComputeRecommendations();
var selectedRecommendation = recommendations.FirstOrDefault(x => string.Equals(x.Recipe.Id, recipeId));
foreach (var item in optionSettings)
{
await optionSettingHandler.SetOptionSettingValue(selectedRecommendation, item.Key, item.Value, skipValidation: true);
}
await deploymentSettingHandler.SaveSettings(new SaveSettingsConfiguration(saveSettingsType, configFilePath), selectedRecommendation, cloudApplication, orchestratorSession);
}
///
/// Verifies that the file contents are the same by accounting for os-specific new line delimiters.
///
/// true if the contents match, false otherwise
public static async Task VerifyConfigFileContents(string expectedContentPath, string actualContentPath)
{
var expectContent = await File.ReadAllTextAsync(expectedContentPath);
var actualContent = await File.ReadAllTextAsync(actualContentPath);
actualContent = SanitizeFileContents(actualContent);
expectContent = SanitizeFileContents(expectContent);
return string.Equals(expectContent, actualContent);
}
private static string SanitizeFileContents(string content)
{
return content.Replace("\r\n", Environment.NewLine)
.Replace("\n", Environment.NewLine)
.Replace("\r\r\n", Environment.NewLine)
.Trim();
}
}
}