package software.amazon.vpclattice.accesslogsubscription; import software.amazon.awssdk.services.vpclattice.VpcLatticeClient; import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy; import software.amazon.cloudformation.proxy.Logger; import software.amazon.cloudformation.proxy.ProgressEvent; import software.amazon.cloudformation.proxy.ProxyClient; import software.amazon.cloudformation.proxy.ResourceHandlerRequest; import software.amazon.vpclattice.common.ExceptionHandler; import software.amazon.vpclattice.common.TagHelper; import javax.annotation.Nonnull; import java.util.Objects; import java.util.function.Function; public class UpdateHandler extends BaseHandlerStd { @Override protected ProgressEvent handleRequest( @Nonnull final AmazonWebServicesClientProxy proxy, @Nonnull final ResourceHandlerRequest request, @Nonnull final CallbackContext callbackContext, @Nonnull final ProxyClient proxyClient, @Nonnull final Logger logger) { return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext) .then((progress) -> this.updateAccessLogSubscription(progress, proxy, request, proxyClient)) .then((progress) -> this.updateTags(progress, proxy, request, proxyClient)) .then((progress) -> new ReadHandler().handleRequest(proxy, request, null, logger)); } private ProgressEvent updateAccessLogSubscription( @Nonnull final ProgressEvent progress, @Nonnull final AmazonWebServicesClientProxy proxy, @Nonnull final ResourceHandlerRequest request, @Nonnull final ProxyClient proxyClient) { if (!this.shouldUpdateAccessLogSubscription(request.getPreviousResourceState(), request.getDesiredResourceState()) || progress.getCallbackContext().hasCalledUpdate) { return progress; } return proxy.initiate( "AWS::VpcLattice::AccessLogSubscription::UpdateAccessLogSubscription", proxyClient, progress.getResourceModel(), progress.getCallbackContext() ) .translateToServiceRequest(Translator::createUpdateAccessLogSubscriptionRequest) .makeServiceCall((updateAccessLogSubscriptionRequest, client) -> client.injectCredentialsAndInvokeV2(updateAccessLogSubscriptionRequest, client.client()::updateAccessLogSubscription)) .handleError(ExceptionHandler::handleError) .done((updateAccessLogSubscriptionResponse) -> { final var model = progress.getResourceModel(); progress.getCallbackContext().setHasCalledUpdate(true); return ProgressEvent.defaultInProgressHandler(progress.getCallbackContext(), 2, model); }); } private ProgressEvent updateTags( @Nonnull final ProgressEvent progress, @Nonnull final AmazonWebServicesClientProxy proxy, @Nonnull final ResourceHandlerRequest request, @Nonnull ProxyClient proxyClient) { return proxy.initiate("AWS::VpcLattice::AccessLogSubscription::UpdateTags", proxyClient, progress.getResourceModel(), progress.getCallbackContext()) .translateToServiceRequest(Function.identity()) .makeServiceCall(TagHelper.updateTagsServiceCall( TagHelper.UpdateTagsServiceCall.builder() .arnProvider(ResourceModel::getArn) .tagConstructor(Tag::new) .tagKeyProvider(Tag::getKey) .tagValueProvider(Tag::getValue) .request(request) .build())) .handleError(ExceptionHandler::handleError) .progress(); } private boolean shouldUpdateAccessLogSubscription( @Nonnull final ResourceModel previousModel, @Nonnull final ResourceModel model) { return !Objects.equals(previousModel.getDestinationArn(), model.getDestinationArn()); } }