public ProgressEvent handleRequest()

in aws-nimblestudio-launchprofile/src/main/java/software/amazon/nimblestudio/launchprofile/UpdateHandler.java [23:135]


    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::Update",
                    proxyClient,
                    progress.getResourceModel(),
                    progress.getCallbackContext())
                .translateToServiceRequest(model -> {
                    final UpdateLaunchProfileRequest.Builder updateLaunchProfileBuilder = UpdateLaunchProfileRequest.builder()
                        .studioId(model.getStudioId())
                        .launchProfileId(model.getLaunchProfileId())
                        .clientToken(request.getClientRequestToken());

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

                    if (!StringUtils.isEmpty(model.getName())) {
                        updateLaunchProfileBuilder.name(model.getName());
                    }

                    if (model.getStreamConfiguration() != null) {
                        updateLaunchProfileBuilder.streamConfiguration(
                            Translator.fromModelStreamConfiguration(model.getStreamConfiguration())
                        );
                    }

                    if (model.getLaunchProfileProtocolVersions() != null) {
                        updateLaunchProfileBuilder.launchProfileProtocolVersions(model.getLaunchProfileProtocolVersions());
                    }

                    if (model.getStudioComponentIds() != null) {
                        updateLaunchProfileBuilder.studioComponentIds(model.getStudioComponentIds());
                    }

                    return updateLaunchProfileBuilder.build();
                })
                .makeServiceCall((awsRequest, client) -> {
                    final String launchProfileId = awsRequest.launchProfileId();
                    try {
                        final GetLaunchProfileRequest getLaunchProfileRequest = GetLaunchProfileRequest.builder()
                            .launchProfileId(launchProfileId)
                            .studioId(awsRequest.studioId())
                            .build();
                        final GetLaunchProfileResponse getLaunchProfileResponse = client
                            .injectCredentialsAndInvokeV2(getLaunchProfileRequest, client.client()::getLaunchProfile);
                        final LaunchProfileState state = getLaunchProfileResponse.launchProfile().state();

                        if (LaunchProfileState.DELETED.equals(state) || LaunchProfileState.CREATE_FAILED.equals(state)) {
                            logger.log(String.format("%s [%s] is in state %s, update failed", ResourceModel.TYPE_NAME,
                                launchProfileId, state.toString()));
                            throw new CfnNotFoundException(ResourceModel.TYPE_NAME, launchProfileId);
                        }

                        final UpdateLaunchProfileResponse updateLaunchProfileResponse = client
                                .injectCredentialsAndInvokeV2(awsRequest, client.client()::updateLaunchProfile);
                        logger.log(String.format("%s [%s] update requested successfully", ResourceModel.TYPE_NAME,
                            launchProfileId));
                        return updateLaunchProfileResponse;
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during update", ResourceModel.TYPE_NAME,
                                launchProfileId));
                        throw Translator.translateToCfnException(e);
                    }
                })
                .stabilize((awsRequest, awsResponse, client, model, context) -> {
                    final String launchProfileId = awsRequest.launchProfileId();
                    final GetLaunchProfileRequest getLaunchProfileRequest = GetLaunchProfileRequest.builder()
                            .launchProfileId(launchProfileId)
                            .studioId(awsRequest.studioId())
                            .build();
                    GetLaunchProfileResponse getLaunchProfileResponse;

                    try {
                        getLaunchProfileResponse = client.injectCredentialsAndInvokeV2(
                                getLaunchProfileRequest, client.client()::getLaunchProfile);
                    } catch (final NimbleException e) {
                        logger.log(String.format("%s [%s] exception during update", ResourceModel.TYPE_NAME,
                                awsRequest.launchProfileId()));
                        throw Translator.translateToCfnException(e);
                    }

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

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

                    logger.log(String.format("%s [%s] is in error state %s, update 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));
    }