// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using AWS.Deploy.Common.Extensions; using AWS.Deploy.Common.IO; using AWS.Deploy.Orchestration.Utilities; namespace AWS.Deploy.Orchestration { public interface IDeployToolWorkspaceMetadata { /// /// Deployment tool workspace directory to create CDK app during the deployment. /// string DeployToolWorkspaceDirectoryRoot { get; } /// /// Directory that contains CDK projects /// string ProjectsDirectory { get; } /// /// The file path of the CDK bootstrap template to be used /// string CDKBootstrapTemplatePath { get; } } public class DeployToolWorkspaceMetadata : IDeployToolWorkspaceMetadata { private readonly IDirectoryManager _directoryManager; private readonly IFileManager _fileManager; private readonly IEnvironmentVariableManager _environmentVariableManager; public string DeployToolWorkspaceDirectoryRoot { get { var workspace = Helpers.GetDeployToolWorkspaceDirectoryRoot(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), _directoryManager, _environmentVariableManager); if (!_directoryManager.Exists(workspace)) _directoryManager.CreateDirectory(workspace); return workspace; } } public string ProjectsDirectory => Path.Combine(DeployToolWorkspaceDirectoryRoot, "Projects"); public string CDKBootstrapTemplatePath { get { var bootstrapTemplate = Path.Combine(DeployToolWorkspaceDirectoryRoot, "CDKBootstrapTemplate.yaml"); if (!_fileManager.Exists(bootstrapTemplate)) { // The CDK bootstrap template can be generated by running 'cdk bootstrap --show-template'. // We need to keep the template up to date while making sure that the 'Staging Bucket' retention policies are set to 'Delete'. var cdkBootstrapTemplate = typeof(CdkProjectHandler).Assembly.ReadEmbeddedFile(TemplateIdentifier); using var cdkBootstrapTemplateFile = new StreamWriter(bootstrapTemplate); cdkBootstrapTemplateFile.Write(cdkBootstrapTemplate); } return bootstrapTemplate; } } private const string TemplateIdentifier = "AWS.Deploy.Orchestration.CDK.CDKBootstrapTemplate.yaml"; public DeployToolWorkspaceMetadata(IDirectoryManager directoryManager, IEnvironmentVariableManager environmentVariableManager, IFileManager fileManager) { _directoryManager = directoryManager; _environmentVariableManager = environmentVariableManager; _fileManager = fileManager; } } }