public ProgressEvent handleRequest()

in aws-nimblestudio-launchprofile/src/main/java/software/amazon/nimblestudio/launchprofile/CreateHandler.java [21:107]


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

        return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
            .then(progress -> proxy
                .initiate(
                    "AWS-NimbleStudio-LaunchProfile::Create",
                    proxyClient,
                    progress.getResourceModel(),
                    progress.getCallbackContext()
                )
                .translateToServiceRequest(model -> {
                    final CreateLaunchProfileRequest.Builder createLaunchProfileRequestBuilder = CreateLaunchProfileRequest.builder()
                        .clientToken(request.getClientRequestToken())
                        .name(model.getName())
                        .ec2SubnetIds(model.getEc2SubnetIds())
                        .streamConfiguration(Translator.fromModelStreamConfiguration(model.getStreamConfiguration()))
                        .studioComponentIds(model.getStudioComponentIds())
                        .launchProfileProtocolVersions(model.getLaunchProfileProtocolVersions())
                        .studioId(model.getStudioId())
                        .tags(model.getTags());

                    if (!StringUtils.isEmpty(model.getDescription())) {
                        createLaunchProfileRequestBuilder.description(model.getDescription());
                    }

                    return createLaunchProfileRequestBuilder.build();
                })
                .makeServiceCall((awsRequest, client) -> {
                    try {
                        final CreateLaunchProfileResponse createLaunchProfileResponse = client
                                .injectCredentialsAndInvokeV2(awsRequest, client.client()::createLaunchProfile);

                        logger.log(String.format("%s [%s] creation requested successfully", ResourceModel.TYPE_NAME,
                                createLaunchProfileResponse.launchProfile().launchProfileId()));

                        return createLaunchProfileResponse;
                    } catch (final NimbleException e) {
                        logger.log(String.format("Exception during creation: %s", ResourceModel.TYPE_NAME));
                        throw Translator.translateToCfnException(e);
                    }
                })
                .stabilize((awsRequest, awsResponse, client, model, context) -> {
                    final String launchProfileId = awsResponse.launchProfile().launchProfileId();
                    model.setLaunchProfileId(launchProfileId);

                    GetLaunchProfileRequest getLaunchProfileRequest = GetLaunchProfileRequest.builder()
                        .studioId(awsRequest.studioId())
                        .launchProfileId(launchProfileId)
                        .build();
                    GetLaunchProfileResponse getLaunchProfileResponse;

                    try {
                        getLaunchProfileResponse = client.injectCredentialsAndInvokeV2(
                                getLaunchProfileRequest, client.client()::getLaunchProfile);
                    } catch (final NimbleException e) {
                        logger.log(String.format("Exception during creation: %s for id: %s.", ResourceModel.TYPE_NAME,
                            launchProfileId));
                        throw Translator.translateToCfnException(e);
                    }

                    if (LaunchProfileState.CREATE_IN_PROGRESS.equals(getLaunchProfileResponse.launchProfile().state())) {
                        logger.log(String.format("%s [%s] is in state CREATE_IN_PROGRESS, creation in progress",
                                ResourceModel.TYPE_NAME, launchProfileId));
                        return false;
                    }
                    if (LaunchProfileState.READY.equals(getLaunchProfileResponse.launchProfile().state())) {
                        logger.log(String.format("%s [%s] is in state READY, creation succeeded",
                                ResourceModel.TYPE_NAME, launchProfileId));
                        return true;
                    }

                    logger.log(String.format("%s [%s] is in error state %s, creation failed", ResourceModel.TYPE_NAME,
                            launchProfileId, getLaunchProfileResponse.launchProfile().state()));
                    throw new CfnGeneralServiceException(String.format("Unexpected state %s: %s - %s",
                            getLaunchProfileResponse.launchProfile().stateAsString(),
                            getLaunchProfileResponse.launchProfile().statusCodeAsString(),
                            getLaunchProfileResponse.launchProfile().statusMessage()));
                })
                .progress()
            )
            .then((r) -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
    }