예제 #1
0
        /// <summary>
        /// Creates a response using a custom resource request
        /// </summary>
        /// <param name="status"></param>
        /// <param name="reason"></param>
        /// <param name="request"></param>
        /// <param name="noEcho"></param>
        /// <param name="data"></param>
        public CustomResourceResponse(
            RequestStatus status,
            string reason,
            CustomResourceRequest request,
            bool noEcho = false,
            IDictionary <string, object> data = null
            )
        {
            this.Status = status;

            if (this.Status == RequestStatus.FAILED)
            {
                this.Reason = NullEmptyCheck(reason, "reason");
            }
            else
            {
                this.Reason = reason;
            }

            this.PhysicalResourceId = request.PhysicalResourceId;
            this.StackId            = request.StackId;
            this.RequestId          = request.RequestId;
            this.LogicalResourceId  = request.LogicalResourceId;
            this.NoEcho             = noEcho;
            this.Data = data;
        }
예제 #2
0
 /// <summary>
 /// Creates a new custom resource result that assumes the request to S3 failed
 /// </summary>
 /// <param name="request"></param>
 /// <param name="response"></param>
 /// <param name="exception"></param>
 public CustomResourceResult(
     CustomResourceRequest request,
     CustomResourceResponse response,
     HttpResponseMessage s3response,
     Exception exception
     ) : this(request, response, s3response)
 {
     this.IsSuccess = false;
     this.Exception = exception ?? throw new ArgumentNullException("exception");
 }
예제 #3
0
 /// <summary>
 /// Creates a new custom resource result with the success being determined by the custom
 /// resource response status and http status code from S3.
 /// </summary>
 /// <param name="request"></param>
 /// <param name="response"></param>
 /// <param name="s3response"></param>
 public CustomResourceResult(
     CustomResourceRequest request,
     CustomResourceResponse response,
     HttpResponseMessage s3response
     )
 {
     this.Request    = request ?? throw new ArgumentNullException("request");
     this.Response   = response ?? throw new ArgumentNullException("response");
     this.S3Response = s3response ?? throw new ArgumentNullException("s3response");
     this.IsSuccess  = (response.Status == CustomResourceResponse.RequestStatus.SUCCESS && s3response.IsSuccessStatusCode);
     this.Exception  = null;
 }
예제 #4
0
 /// <summary>
 /// Creates a new custom resource result that assumes the request to S3 failed
 /// </summary>
 /// <param name="request"></param>
 /// <param name="response"></param>
 /// <param name="exception"></param>
 public CustomResourceResult(
     CustomResourceRequest request,
     CustomResourceResponse response,
     Exception exception
     )
 {
     this.Request    = request ?? throw new ArgumentNullException("request");
     this.Response   = response ?? throw new ArgumentNullException("response");
     this.S3Response = null;
     this.IsSuccess  = false;
     this.Exception  = exception ?? throw new ArgumentNullException("exception");
 }
예제 #5
0
        /// <summary>
        /// Uploads the custom resource action response to the pre-signed s3 url. Use this method if
        /// you want to use the default handling for generating the CustomResourceResult object. This
        /// is the method used by the ExecuteAsync method in the base CustomResourceHandler abstract class.
        /// </summary>
        /// <param name="response">The response generated from performing the action</param>
        /// <param name="request">The request to initiate the custom resource action</param>
        /// <returns>The default method for generating the CustomResourceResult is used in this method</returns>
        public async Task <CustomResourceResult> PutCustomResourceResponseAsync(CustomResourceRequest request, CustomResourceResponse response)
        {
            try
            {
                HttpResponseMessage responseMessage = await this.UploadResponseToS3Async(request, response);

                if ((int)responseMessage.StatusCode < 200 || (int)responseMessage.StatusCode > 299)
                {
                    string message = $"Failed to submit response successfully: {(int)responseMessage.StatusCode}\n{await responseMessage.Content.ReadAsStringAsync()}";

                    return(new CustomResourceResult(request, response, responseMessage, new HttpRequestException(message)));
                }
                else
                {
                    return(new CustomResourceResult(request, response, responseMessage));
                }
            }
            catch (Exception e)
            {
                return(new CustomResourceResult(request, response, e));
            }
        }
예제 #6
0
        /// <summary>
        /// Entrypoint for the Lambda function, calls the correct create, update, or delete function. While this method
        /// can be overridden, you will probably not need to.
        /// </summary>
        /// <param name="request">The custom resource request</param>
        /// <param name="context">The ILambdaContext object</param>
        /// <returns>A custom resource result with the included request, response, http respone, and any exception thrown</returns>
        public virtual async Task <CustomResourceResult> ExecuteAsync(CustomResourceRequest request, ILambdaContext context)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            CustomResourceResponse response = null;

            switch (request.RequestType)
            {
            case CustomResourceRequest.StackOperation.CREATE:
            {
                response = await this.CreateAsync(request, context);

                break;
            }

            case CustomResourceRequest.StackOperation.DELETE:
            {
                response = await this.DeleteAsync(request, context);

                break;
            }

            case CustomResourceRequest.StackOperation.UPDATE:
            {
                response = await this.UpdateAsync(request, context);

                break;
            }

            default:
            {
                throw new ArgumentException($"Unknown stack operation: {request.RequestType}.");
            }
            }

            CustomResourceResult result = await helper.PutCustomResourceResponseAsync(request, response);

            if (!result.IsSuccess)
            {
                context.LogError(JsonConvert.SerializeObject(result.Response));

                if (result.S3Response != null)
                {
                    context.LogError(JsonConvert.SerializeObject(result.S3Response));
                }

                if (result.Exception != null)
                {
                    context.LogError(result.Exception);
                }
            }

            return(result);
        }
예제 #7
0
 public abstract Task <CustomResourceResponse> DeleteAsync(CustomResourceRequest request, ILambdaContext context);
예제 #8
0
 /// <summary>
 /// Uploads the custom resource action response to the pre-signed s3 url. Use this method if
 /// you want to handle generating the CustomResourceResult object yourself.
 /// </summary>
 /// <param name="response">The response generated from performing the action</param>
 /// <param name="request">The request to initiate the custom resource action</param>
 /// <returns>The HttpResponseMessage from S3 which can be used with the request and response
 /// objects to generate the required CustomResourceResult.</returns>
 public async Task <HttpResponseMessage> UploadResponseToS3Async(CustomResourceRequest request, CustomResourceResponse response)
 {
     return(await StaticUploadResponseToS3Async(request.ResponseUrl, FixUpResponseJson(response, request.RequestType)));
 }
예제 #9
0
 public override async Task <CustomResourceResponse> DeleteAsync(CustomResourceRequest request, ILambdaContext context)
 {
     return(await _DeleteAsync(request, context));
 }