public async Task <Deployment> DeployAsync(DeployRequest request, ISecurityContext context) { Ensure.NotNull(request, nameof(request)); Ensure.NotNull(context, nameof(context)); var environment = request.Environment; var program = request.Program; var release = await releaseService.GetAsync(program.Id, program.Version); var hosts = await hostService.ListAsync(environment); var deployment = await StartAsync( environment : environment, release : release, creatorId : context.UserId.Value ); var targets = new DeploymentTarget[hosts.Count]; for (var i = 0; i < hosts.Count; i++) { targets[i] = new DeploymentTarget( deploymentId: deployment.Id, hostId: hosts[i].Id, status: DeploymentStatus.Pending ); } var results = await ActivateAsync(release, hosts); for (var i = 0; i < results.Length; i++) { var deployResult = results[i]; targets[i].Status = deployResult.Succeeded ? DeploymentStatus.Succeeded : DeploymentStatus.Failed; targets[i].Message = deployResult.Message; } // Complete the deployment & save the targets await CompleteAsync(deployment, targets, succceded : true); // Log the action await eventLog.CreateAsync(new Event( action : "deploy", resource : "program#" + release.Id + "@" + release.Version, userId : context.UserId )); return(deployment); }