Пример #1
0
        public async Task <object> Handle(Request request, CancellationToken cancellationToken = default)
        {
            await githubStatusNotifier.NotifyPending(
                bucketName : request.DestinationBucket,
                envName : request.EnvironmentName,
                repoName : request.CommitInfo.GithubRepository,
                sha : request.CommitInfo.GithubRef
                );

            s3Client = await s3Factory.Create(request.RoleArn);

            try
            {
                await MarkExistingObjectsAsDirty(request.DestinationBucket);

                using (var stream = await s3GetObjectFacade.GetObjectStream(request.ZipLocation))
                    using (var zipStream = new ZipArchive(stream))
                    {
                        var bucket  = request.DestinationBucket;
                        var role    = request.RoleArn;
                        var entries = zipStream.Entries.ToList();

                        // zip archive operations not thread safe
                        foreach (var entry in entries)
                        {
                            await UploadEntry(entry, bucket, role);
                        }
                    }

                await githubStatusNotifier.NotifySuccess(
                    bucketName : request.DestinationBucket,
                    envName : request.EnvironmentName,
                    repoName : request.CommitInfo.GithubRepository,
                    sha : request.CommitInfo.GithubRef
                    );
            }
            catch (Exception e)
            {
                logger.LogError($"Got an error uploading files: {e.Message} {e.StackTrace}");

                await githubStatusNotifier.NotifyFailure(
                    bucketName : request.DestinationBucket,
                    envName : request.EnvironmentName,
                    repoName : request.CommitInfo.GithubRepository,
                    sha : request.CommitInfo.GithubRef
                    );

                throw new AggregateException(e);
            }

            return(new Response
            {
                Success = true
            });
        }
Пример #2
0
        private async Task <Dictionary <string, string> > GetStackOutputs(string stackId, string roleArn)
        {
            var client = await cloudformationFactory.Create(roleArn);

            var response = await client.DescribeStacksAsync(new DescribeStacksRequest
            {
                StackName = stackId
            });

            return(response.Stacks[0].Outputs.ToDictionary(entry => entry.OutputKey, entry => entry.OutputValue));
        }
Пример #3
0
        public void SetupS3()
        {
            s3Factory.ClearSubstitute();
            s3Client.ClearSubstitute();
            s3GetObjectFacade.ClearSubstitute();

            s3Factory.Create(Arg.Is(roleArn)).Returns(s3Client);

            s3GetObjectFacade.GetObjectStream(Arg.Any <string>()).Returns(TestZipFile.Stream);
            s3Client.ListObjectsV2Async(Arg.Any <ListObjectsV2Request>()).Returns(new ListObjectsV2Response
            {
                S3Objects = objects
            });
        }
Пример #4
0
        public async Task <string> Handle(Request request, CancellationToken cancellationToken = default)
        {
            s3Client = await s3Factory.Create(request.RoleArn, cancellationToken);

            await s3Client.PutObjectAsync(
                new PutObjectRequest
            {
                BucketName  = request.BucketName,
                Key         = request.FileName,
                ContentBody = request.Contents,
            },
                cancellationToken
                );

            return($"Successfully written to file {request.FileName} in bucket {request.BucketName}");
        }
Пример #5
0
        public virtual async Task Deploy(DeployStackContext context)
        {
            var cloudformationClient = await cloudformationFactory.Create(context.RoleArn);

            var notificationArns = GetNotificationArns(context);
            var stackExists      = await DoesStackExist(context, cloudformationClient);

            var parameters   = (List <Parameter>)context.Parameters ?? new List <Parameter> {
            };
            var capabilities = (List <string>)context.Capabilities ?? new List <string> {
            };
            var tags         = (List <Tag>)context.Tags ?? new List <Tag> {
            };


            if (!stackExists)
            {
                var createStackRequest = new CreateStackRequest
                {
                    StackName          = context.StackName,
                    TemplateBody       = context.Template,
                    Parameters         = parameters,
                    Capabilities       = capabilities,
                    Tags               = tags,
                    NotificationARNs   = notificationArns,
                    RoleARN            = context.PassRoleArn,
                    ClientRequestToken = context.ClientRequestToken,
                    OnFailure          = DELETE
                };

                var createStackResponse = await cloudformationClient.CreateStackAsync(createStackRequest);

                logger.LogInformation($"Got create stack response: {Serialize(createStackResponse)}");
            }
            else
            {
                var updateStackRequest = new UpdateStackRequest
                {
                    StackName          = context.StackName,
                    TemplateBody       = context.Template,
                    Parameters         = parameters,
                    Capabilities       = capabilities,
                    Tags               = tags,
                    NotificationARNs   = notificationArns,
                    ClientRequestToken = context.ClientRequestToken,
                    RoleARN            = context.PassRoleArn
                };

                try
                {
                    var updateStackResponse = await cloudformationClient.UpdateStackAsync(updateStackRequest);

                    logger.LogInformation($"Got update stack response: {Serialize(updateStackResponse)}");
                }
                catch (Exception e)
                {
                    if (e.Message == "No updates are to be performed.")
                    {
                        throw new NoUpdatesException(e.Message);
                    }
                    else
                    {
                        throw e;
                    }
                }
            }
        }