public ProgressEvent handleRequest()

in aws-nimblestudio-studio/src/main/java/software/amazon/nimblestudio/studio/DeleteHandler.java [25:98]


    public ProgressEvent<ResourceModel, CallbackContext> handleRequest(
        final AmazonWebServicesClientProxy proxy,
        final ResourceHandlerRequest<ResourceModel> request,
        final CallbackContext callbackContext,
        final ProxyClient<NimbleClient> proxyClient,
        final Logger logger) {

        this.logger = logger;

        return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
            .then(progress -> proxy
                .initiate(
                    "AWS-NimbleStudio-Studio::Delete",
                    proxyClient,
                    progress.getResourceModel(),
                    progress.getCallbackContext())
                .translateToServiceRequest(model -> DeleteStudioRequest.builder()
                    .clientToken(request.getClientRequestToken())
                    .studioId(model.getStudioId())
                    .build())
                .makeServiceCall((awsRequest, client) -> {
                    final String studioId = awsRequest.studioId();
                    final Studio studio = GetStudio(studioId, client);
                    final StudioState studioState = studio.state();

                    // If the studio is already DELETING, don't send another DELETE request (which will fail)
                    if(StudioState.DELETE_IN_PROGRESS.equals(studioState)) {
                        return null;
                    }
                    if (StudioState.DELETED.equals(studioState) || StudioState.CREATE_FAILED.equals(studioState)) {
                        logger.log(String.format("%s [%s] is already in state %s, deletion failed",
                            ResourceModel.TYPE_NAME, studioId, studioState.toString()));
                        throw new CfnNotFoundException(ResourceModel.TYPE_NAME, studioId);
                    }

                    try {
                        final NimbleClient studioClient = client.client();
                        final DeleteStudioResponse deleteStudioResponse = client
                            .injectCredentialsAndInvokeV2(awsRequest, studioClient::deleteStudio);
                        logger.log(String.format("%s [%s] DELETE requested successfully", ResourceModel.TYPE_NAME, studioId));
                        return deleteStudioResponse;
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during deletion", ResourceModel.TYPE_NAME,
                            studioId));
                        throw Translator.translateToCfnException(e);
                    }
                })
                .stabilize((awsRequest, awsResponse, client, model, context) -> {
                    final String studioId = awsRequest.studioId();
                    final Studio studio = GetStudio(studioId, client);
                    final StudioState studioState = studio.state();

                    if (StudioState.DELETED.equals(studioState) || StudioState.CREATE_FAILED.equals(studioState)) {
                        logger.log(String.format("%s [%s] is in state %s, deletion succeeded",
                            ResourceModel.TYPE_NAME, studioId, studioState));
                        return true;
                    }
                    if (StudioState.DELETE_IN_PROGRESS.equals(studioState)) {
                        logger.log(String.format("%s [%s] is in state %s, deletion in progress",
                            ResourceModel.TYPE_NAME, studioId, studioState));
                        return false;
                    }

                    logger.log(String.format("%s [%s] is in unexpected state %s, deletion failed",
	                    ResourceModel.TYPE_NAME, studioId, studioState));

                    throw new CfnGeneralServiceException(String.format("Unexpected state %s: %s - %s",
                            studio.stateAsString(),
                            studio.statusCodeAsString(),
                            studio.statusMessage()));
                })
                .done(awsResponse ->
                    ProgressEvent.<ResourceModel, CallbackContext>builder().status(OperationStatus.SUCCESS).build()));
    }