Ejemplo n.º 1
0
        public override int Execute(string[] commandLineArguments)
        {
            Options.Parse(commandLineArguments);

            var environment      = AwsEnvironmentGeneration.Create(log, variables).GetAwaiter().GetResult();
            var stackEventLogger = new StackEventLogger(log);

            IAmazonCloudFormation ClientFactory() => ClientHelpers.CreateCloudFormationClient(environment);
            StackArn StackProvider(RunningDeployment x) => new StackArn(x.Variables.Get(AwsSpecialVariables.CloudFormation.StackName));
            ChangeSetArn ChangesetProvider(RunningDeployment x) => new ChangeSetArn(x.Variables[AwsSpecialVariables.CloudFormation.Changesets.Arn]);

            var conventions = new List <IConvention>
            {
                new LogAwsUserInfoConvention(environment),
                new ExecuteCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider, waitForComplete),
                new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider)
            };

            var deployment = new RunningDeployment(packageFile, variables);

            var conventionRunner = new ConventionProcessor(deployment, conventions, log);

            conventionRunner.RunConventions();
            return(0);
        }
        public DeployAwsCloudFormationConvention(
            Func <IAmazonCloudFormation> clientFactory,
            Func <CloudFormationTemplate> templateFactory,
            StackEventLogger logger,
            Func <RunningDeployment, StackArn> stackProvider,
            Func <RunningDeployment, string> roleArnProvider,
            bool waitForComplete,
            string stackName,
            string iamCapabilities,
            bool disableRollback,
            AwsEnvironmentGeneration awsEnvironmentGeneration) : base(logger)
        {
            this.clientFactory            = clientFactory;
            this.templateFactory          = templateFactory;
            this.stackProvider            = stackProvider;
            this.roleArnProvider          = roleArnProvider;
            this.waitForComplete          = waitForComplete;
            this.stackName                = stackName;
            this.awsEnvironmentGeneration = awsEnvironmentGeneration;
            this.disableRollback          = disableRollback;

            // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities
            if (iamCapabilities.IsKnownIamCapability())
            {
                capabilities.Add(iamCapabilities);
            }
        }
Ejemplo n.º 3
0
        public override int Execute(string[] commandLineArguments)
        {
            Options.Parse(commandLineArguments);

            if (variablesFile != null && !File.Exists(variablesFile))
            {
                throw new CommandException("Could not find variables file: " + variablesFile);
            }

            var variables        = new CalamariVariableDictionary(variablesFile, sensitiveVariablesFile, sensitiveVariablesPassword);
            var environment      = new AwsEnvironmentGeneration(variables);
            var stackEventLogger = new StackEventLogger(new LogWrapper());


            IAmazonCloudFormation ClientFactory() => ClientHelpers.CreateCloudFormationClient(environment);
            StackArn StackProvider(RunningDeployment x) => new StackArn(x.Variables.Get(AwsSpecialVariables.CloudFormation.StackName));

            var conventions = new List <IConvention>
            {
                new LogAwsUserInfoConvention(environment),
                new ContributeEnvironmentVariablesConvention(),
                new LogVariablesConvention(),
                new DeleteCloudFormationStackConvention(environment, stackEventLogger, ClientFactory, StackProvider, waitForComplete)
            };

            var deployment       = new RunningDeployment(packageFile, variables);
            var conventionRunner = new ConventionProcessor(deployment, conventions);

            conventionRunner.RunConventions();
            return(0);
        }
Ejemplo n.º 4
0
 public DescribeCloudFormationChangeSetConvention(Func <IAmazonCloudFormation> clientFactory,
                                                  StackEventLogger logger,
                                                  Func <RunningDeployment, StackArn> stackProvider,
                                                  Func <RunningDeployment, ChangeSetArn> changeSetProvider) : base(logger)
 {
     this.clientFactory     = clientFactory;
     this.stackProvider     = stackProvider;
     this.changeSetProvider = changeSetProvider;
 }
        public CloudFormationOutputsAsVariablesConvention(
            Func <IAmazonCloudFormation> clientFactory,
            StackEventLogger logger,
            Func <RunningDeployment, StackArn> stackProvider) : base(logger)
        {
            Guard.NotNull(clientFactory, "Client factory must not be null");
            Guard.NotNull(stackProvider, "Stack provider must not be null");

            this.clientFactory = clientFactory;
            this.stackProvider = stackProvider;
        }
Ejemplo n.º 6
0
        public CreateCloudFormationChangeSetConvention(Func <IAmazonCloudFormation> clientFactory,
                                                       StackEventLogger logger,
                                                       Func <RunningDeployment, StackArn> stackProvider,
                                                       Func <ICloudFormationRequestBuilder> templateFactory
                                                       ) : base(logger)
        {
            Guard.NotNull(stackProvider, "Stack provider should not be null");
            Guard.NotNull(clientFactory, "Client factory should not be null");
            Guard.NotNull(templateFactory, "Template factory should not be null");

            this.clientFactory   = clientFactory;
            this.stackProvider   = stackProvider;
            this.templateFactory = templateFactory;
        }
Ejemplo n.º 7
0
        public ExecuteCloudFormationChangeSetConvention(
            Func <IAmazonCloudFormation> clientFactory,
            StackEventLogger logger,
            Func <RunningDeployment, StackArn> stackProvider,
            Func <RunningDeployment, ChangeSetArn> changeSetProvider,
            bool waitForComplete) : base(logger)
        {
            Guard.NotNull(stackProvider, "Stack provider must not be null");
            Guard.NotNull(changeSetProvider, "Change set provider must nobe null");
            Guard.NotNull(clientFactory, "Client factory should not be null");

            this.clientFactory     = clientFactory;
            this.stackProvider     = stackProvider;
            this.changeSetProvider = changeSetProvider;
            this.waitForComplete   = waitForComplete;
        }
Ejemplo n.º 8
0
        public DeleteCloudFormationStackConvention(
            AwsEnvironmentGeneration environment,
            StackEventLogger logger,
            Func <IAmazonCloudFormation> clientFactory,
            Func <RunningDeployment, StackArn> stackProvider,
            bool waitForComplete
            ) : base(logger)
        {
            Guard.NotNull(clientFactory, "Client must not be null");
            Guard.NotNull(stackProvider, "Stack provider must not be null");
            Guard.NotNull(environment, "Aws environment generation may not be null");


            this.clientFactory   = clientFactory;
            this.stackProvider   = stackProvider;
            this.waitForComplete = waitForComplete;
            this.environment     = environment;
        }
 public DeployAwsCloudFormationConvention(
     Func <IAmazonCloudFormation> clientFactory,
     Func <ICloudFormationRequestBuilder> templateFactory,
     StackEventLogger logger,
     Func <RunningDeployment, StackArn> stackProvider,
     Func <RunningDeployment, string> roleArnProvider,
     bool waitForComplete,
     string stackName,
     AwsEnvironmentGeneration awsEnvironmentGeneration) : base(logger)
 {
     this.clientFactory            = clientFactory;
     this.templateFactory          = templateFactory;
     this.stackProvider            = stackProvider;
     this.roleArnProvider          = roleArnProvider;
     this.waitForComplete          = waitForComplete;
     this.stackName                = stackName;
     this.awsEnvironmentGeneration = awsEnvironmentGeneration;
 }
Ejemplo n.º 10
0
        public CreateCloudFormationChangeSetConvention(Func <IAmazonCloudFormation> clientFactory,
                                                       StackEventLogger logger,
                                                       Func <RunningDeployment, StackArn> stackProvider,
                                                       Func <RunningDeployment, string> roleArnProvider,
                                                       Func <CloudFormationTemplate> templateFactory,
                                                       IEnumerable <string> iamCapabilities
                                                       ) : base(logger)
        {
            Guard.NotNull(stackProvider, "Stack provider should not be null");
            Guard.NotNull(clientFactory, "Client factory should not be null");
            Guard.NotNull(roleArnProvider, "Role ARN provide should not be null");
            Guard.NotNull(templateFactory, "Template factory should not be null");

            this.clientFactory        = clientFactory;
            this.stackProvider        = stackProvider;
            this.roleArnProvider      = roleArnProvider;
            this.templateFactory      = templateFactory;
            var(validCapabilities, _) = ExcludeAndLogUnknownIamCapabilities(iamCapabilities);

            Capabilities.AddRange(validCapabilities);
        }
Ejemplo n.º 11
0
        public CreateCloudFormationChangeSetConvention(Func <IAmazonCloudFormation> clientFactory,
                                                       StackEventLogger logger,
                                                       Func <RunningDeployment, StackArn> stackProvider,
                                                       Func <RunningDeployment, string> roleArnProvider,
                                                       Func <CloudFormationTemplate> templateFactory,
                                                       string iamCapabilities
                                                       ) : base(logger)
        {
            Guard.NotNull(stackProvider, "Stack provider should not be null");
            Guard.NotNull(clientFactory, "Client factory should not be null");
            Guard.NotNull(roleArnProvider, "Role ARN provide should not be null");
            Guard.NotNull(templateFactory, "Template factory should not be null");

            this.clientFactory   = clientFactory;
            this.stackProvider   = stackProvider;
            this.roleArnProvider = roleArnProvider;
            this.templateFactory = templateFactory;
            if (iamCapabilities.IsKnownIamCapability())
            {
                Capabilities.Add(iamCapabilities);
            }
        }
Ejemplo n.º 12
0
        public override int Execute(string[] commandLineArguments)
        {
            Options.Parse(commandLineArguments);

            var filesInPackage   = !string.IsNullOrWhiteSpace(pathToPackage);
            var environment      = AwsEnvironmentGeneration.Create(log, variables).GetAwaiter().GetResult();
            var templateResolver = new TemplateResolver(fileSystem);

            IAmazonCloudFormation ClientFactory() => ClientHelpers.CreateCloudFormationClient(environment);
            StackArn StackProvider(RunningDeployment x) => new StackArn(stackName);
            ChangeSetArn ChangesetProvider(RunningDeployment x) => new ChangeSetArn(x.Variables[AwsSpecialVariables.CloudFormation.Changesets.Arn]);
            string RoleArnProvider(RunningDeployment x) => x.Variables[AwsSpecialVariables.CloudFormation.RoleArn];

            var iamCapabilities = JsonConvert.DeserializeObject <List <string> >(variables.Get(AwsSpecialVariables.IamCapabilities, "[]"));

            CloudFormationTemplate TemplateFactory()
            {
                var resolvedTemplate   = templateResolver.Resolve(templateFile, filesInPackage, variables);
                var resolvedParameters = templateResolver.MaybeResolve(templateParameterFile, filesInPackage, variables);

                if (templateParameterFile != null && !resolvedParameters.Some())
                {
                    throw new CommandException("Could not find template parameters file: " + templateParameterFile);
                }

                var parameters = CloudFormationParametersFile.Create(resolvedParameters, fileSystem, variables);

                return(CloudFormationTemplate.Create(resolvedTemplate, parameters, fileSystem, variables));
            }

            var stackEventLogger = new StackEventLogger(log);

            var conventions = new List <IConvention>
            {
                new LogAwsUserInfoConvention(environment),
                new DelegateInstallConvention(d => extractPackage.ExtractToStagingDirectory(pathToPackage)),

                //Create or Update the stack using changesets
                new AggregateInstallationConvention(
                    new GenerateCloudFormationChangesetNameConvention(log),
                    new CreateCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, RoleArnProvider, TemplateFactory, iamCapabilities),
                    new DescribeCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider),
                    new ExecuteCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider, waitForComplete)
                    .When(ImmediateChangesetExecution),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider, () => TemplateFactory().HasOutputs)
                    .When(ImmediateChangesetExecution)
                    ).When(ChangesetsEnabled),

                //Create or update stack using a template (no changesets)
                new AggregateInstallationConvention(
                    new  DeployAwsCloudFormationConvention(
                        ClientFactory,
                        TemplateFactory,
                        stackEventLogger,
                        StackProvider,
                        RoleArnProvider,
                        waitForComplete,
                        stackName,
                        iamCapabilities,
                        disableRollback,
                        environment),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider, () => TemplateFactory().HasOutputs)
                    )
                .When(ChangesetsDisabled)
            };

            var deployment       = new RunningDeployment(pathToPackage, variables);
            var conventionRunner = new ConventionProcessor(deployment, conventions, log);

            conventionRunner.RunConventions();
            return(0);
        }
Ejemplo n.º 13
0
 public CloudFormationInstallationConventionBase(StackEventLogger logger)
 {
     Logger = logger;
 }
        public override int Execute(string[] commandLineArguments)
        {
            Options.Parse(commandLineArguments);
            if (variablesFile != null && !File.Exists(variablesFile))
            {
                throw new CommandException("Could not find variables file: " + variablesFile);
            }

            var variables = new CalamariVariableDictionary(variablesFile, sensitiveVariablesFile,
                                                           sensitiveVariablesPassword);

            var fileSystem = CalamariPhysicalFileSystem.GetPhysicalFileSystem();

            var filesInPackage   = !string.IsNullOrWhiteSpace(packageFile);
            var environment      = new AwsEnvironmentGeneration(variables);
            var templateResolver = new TemplateResolver(fileSystem);

            IAmazonCloudFormation ClientFactory() => ClientHelpers.CreateCloudFormationClient(environment);
            StackArn StackProvider(RunningDeployment x) => new StackArn(stackName);
            ChangeSetArn ChangesetProvider(RunningDeployment x) => new ChangeSetArn(x.Variables[AwsSpecialVariables.CloudFormation.Changesets.Arn]);
            string RoleArnProvider(RunningDeployment x) => x.Variables[AwsSpecialVariables.CloudFormation.RoleArn];

            CloudFormationTemplate TemplateFactory()
            {
                var resolvedTemplate   = templateResolver.Resolve(templateFile, filesInPackage, variables);
                var resolvedParameters = templateResolver.MaybeResolve(templateParameterFile, filesInPackage, variables);

                if (templateParameterFile != null && !resolvedParameters.Some())
                {
                    throw new CommandException("Could not find template parameters file: " + templateParameterFile);
                }

                var parameters = CloudFormationParametersFile.Create(resolvedParameters, fileSystem, variables);

                return(CloudFormationTemplate.Create(resolvedTemplate, parameters, fileSystem, variables));
            }

            var stackEventLogger = new StackEventLogger(new LogWrapper());

            var conventions = new List <IConvention>
            {
                new LogAwsUserInfoConvention(environment),
                new ContributeEnvironmentVariablesConvention(),
                new LogVariablesConvention(),
                new ExtractPackageToStagingDirectoryConvention(new GenericPackageExtractorFactory().createStandardGenericPackageExtractor(), fileSystem),

                //Create or Update the stack using changesets
                new AggregateInstallationConvention(
                    new GenerateCloudFormationChangesetNameConvention(),
                    new CreateCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, RoleArnProvider, TemplateFactory, iamCapabilities),
                    new DescribeCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider),
                    new ExecuteCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider, waitForComplete)
                    .When(ImmediateChangesetExecution),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider, () => TemplateFactory().HasOutputs)
                    .When(ImmediateChangesetExecution)
                    ).When(ChangesetsEnabled),

                //Create or update stack using a template (no changesets)
                new AggregateInstallationConvention(
                    new  DeployAwsCloudFormationConvention(
                        ClientFactory,
                        TemplateFactory,
                        stackEventLogger,
                        StackProvider,
                        RoleArnProvider,
                        waitForComplete,
                        stackName,
                        iamCapabilities,
                        disableRollback,
                        environment),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider, () => TemplateFactory().HasOutputs)
                    )
                .When(ChangesetsDisabled)
            };

            var deployment       = new RunningDeployment(packageFile, variables);
            var conventionRunner = new ConventionProcessor(deployment, conventions);

            conventionRunner.RunConventions();
            return(0);
        }
Ejemplo n.º 15
0
        public override int Execute(string[] commandLineArguments)
        {
            Options.Parse(commandLineArguments);

            var filesInPackage   = !string.IsNullOrWhiteSpace(pathToPackage);
            var environment      = AwsEnvironmentGeneration.Create(log, variables).GetAwaiter().GetResult();
            var templateResolver = new TemplateResolver(fileSystem);

            IAmazonCloudFormation ClientFactory() => ClientHelpers.CreateCloudFormationClient(environment);
            StackArn StackProvider(RunningDeployment x) => new StackArn(stackName);
            ChangeSetArn ChangesetProvider(RunningDeployment x) => new ChangeSetArn(x.Variables[AwsSpecialVariables.CloudFormation.Changesets.Arn]);
            string RoleArnProvider(RunningDeployment x) => x.Variables[AwsSpecialVariables.CloudFormation.RoleArn];

            var iamCapabilities = JsonConvert.DeserializeObject <List <string> >(variables.Get(AwsSpecialVariables.IamCapabilities, "[]"));
            var tags            = JsonConvert.DeserializeObject <List <KeyValuePair <string, string> > >(variables.Get(AwsSpecialVariables.CloudFormation.Tags, "[]"));
            var deployment      = new RunningDeployment(pathToPackage, variables);

            ICloudFormationRequestBuilder TemplateFactory() => string.IsNullOrWhiteSpace(templateS3Url)
                ? CloudFormationTemplate.Create(templateResolver,
                                                templateFile,
                                                templateParameterFile,
                                                filesInPackage,
                                                fileSystem,
                                                variables,
                                                stackName,
                                                iamCapabilities,
                                                disableRollback,
                                                RoleArnProvider(deployment),
                                                tags,
                                                StackProvider(deployment),
                                                ClientFactory)
                : CloudFormationS3Template.Create(templateS3Url,
                                                  templateParameterS3Url,
                                                  fileSystem,
                                                  variables,
                                                  log,
                                                  stackName,
                                                  iamCapabilities,
                                                  disableRollback,
                                                  RoleArnProvider(deployment),
                                                  tags,
                                                  StackProvider(deployment),
                                                  ClientFactory);

            var stackEventLogger = new StackEventLogger(log);

            var conventions = new List <IConvention>
            {
                new LogAwsUserInfoConvention(environment),
                new DelegateInstallConvention(d => extractPackage.ExtractToStagingDirectory(pathToPackage)),
                new StructuredConfigurationVariablesConvention(new StructuredConfigurationVariablesBehaviour(structuredConfigVariablesService)),

                //Create or Update the stack using changesets
                new AggregateInstallationConvention(
                    new GenerateCloudFormationChangesetNameConvention(log),
                    new CreateCloudFormationChangeSetConvention(ClientFactory,
                                                                stackEventLogger,
                                                                StackProvider,
                                                                TemplateFactory),
                    new DescribeCloudFormationChangeSetConvention(ClientFactory, stackEventLogger, StackProvider, ChangesetProvider),
                    new ExecuteCloudFormationChangeSetConvention(ClientFactory,
                                                                 stackEventLogger,
                                                                 StackProvider,
                                                                 ChangesetProvider,
                                                                 waitForComplete)
                    .When(ImmediateChangesetExecution),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider)
                    .When(ImmediateChangesetExecution)
                    ).When(ChangesetsEnabled),

                //Create or update stack using a template (no changesets)
                new AggregateInstallationConvention(
                    new DeployAwsCloudFormationConvention(
                        ClientFactory,
                        TemplateFactory,
                        stackEventLogger,
                        StackProvider,
                        RoleArnProvider,
                        waitForComplete,
                        stackName,
                        environment),
                    new CloudFormationOutputsAsVariablesConvention(ClientFactory, stackEventLogger, StackProvider)
                    )
                .When(ChangesetsDisabled)
            };

            var conventionRunner = new ConventionProcessor(deployment, conventions, log);

            conventionRunner.RunConventions();
            return(0);
        }