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 }); }
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)); }
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 }); }
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}"); }
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; } } } }