protected ProgressEvent handleRequest()

in aws-rds-dbclusterparametergroup/src/main/java/software/amazon/rds/dbclusterparametergroup/UpdateHandler.java [24:79]


    protected ProgressEvent<ResourceModel, CallbackContext> handleRequest(final AmazonWebServicesClientProxy proxy,
                                                                          final ResourceHandlerRequest<ResourceModel> request,
                                                                          final CallbackContext callbackContext,
                                                                          final ProxyClient<RdsClient> proxyClient,
                                                                          final Logger logger) {
        final ResourceModel model = request.getDesiredResourceState();
        final boolean parametersUpdated = !model.getParameters().equals(request.getPreviousResourceState().getParameters());
        return ProgressEvent.progress(model, callbackContext)
            .then(progress -> {
                if (!parametersUpdated) return progress; // if same params then skip update
                return proxy.initiate("rds::update-db-cluster-parameter-group", proxyClient, progress.getResourceModel(), progress.getCallbackContext())
                    .translateToServiceRequest(Translator::resetDbClusterParameterGroupRequest)
                    .backoffDelay(BACKOFF_STRATEGY)
                    .makeServiceCall((resetGroupRequest, proxyInvocation) -> proxyInvocation.injectCredentialsAndInvokeV2(resetGroupRequest, proxyInvocation.client()::resetDBClusterParameterGroup))
                    .done((resetGroupRequest, resetGroupResponse, proxyInvocation, resourceModel, context) -> applyParameters(proxy, proxyInvocation, resourceModel, context));
            })
            .then(progress -> {
                if (!parametersUpdated) return progress; // if same params then skip stabilization
                final ResourceModel resourceModel = progress.getResourceModel();
                final CallbackContext cxt = progress.getCallbackContext();
                try {
                    if (!cxt.isClusterStabilized()) { // if not stabilized then we keep describing clusters and memoizing into the set

                        final DescribeDbClustersResponse describeDbClustersResponse = proxyClient.injectCredentialsAndInvokeV2(Translator.describeDbClustersRequest(cxt.getMarker()), proxyClient.client()::describeDBClusters);

                        if(describeDbClustersResponse.dbClusters().stream()
                            .filter(dbCluster -> dbCluster.dbClusterParameterGroup().equals(resourceModel.getDBClusterParameterGroupName())) // all db clusters that use param group
                            .allMatch(dbCluster -> dbCluster.status().equals(AVAILABLE))) { // if all stabilized then move to the next page

                            if (describeDbClustersResponse.marker() != null) { // more pages left
                                cxt.setMarker(describeDbClustersResponse.marker());
                                progress.setCallbackDelaySeconds(30); // if there are more to describe
                            } else { // nothing left to stabilized
                                cxt.setClusterStabilized(true);
                            }
                        } else {
                            progress.setCallbackDelaySeconds(30); // if some still in transition status need some delay to describe
                        }
                    }
                } catch (RdsException exception) {
                    if (exception.awsErrorDetails() != null && StringUtils.equals(ACCESS_DENIED_ERROR_CODE, exception.awsErrorDetails().errorCode())) {
                        logger.log(STABILIZATION_PERMISSION_MESSAGE);
                    } else {
                        logger.log(String.format("Failed to stabilize %s,  \n request failed with error %s",
                                model.getPrimaryIdentifier(), Arrays.toString(exception.getStackTrace())));
                        throw new CfnGeneralServiceException(exception);
                    }
                }
                progress.setCallbackContext(cxt);
                return progress;
            })
            .then(progress ->
                describeDbClusterParameterGroup(proxy, proxyClient, progress.getResourceModel(), progress.getCallbackContext())
                    .done((paramGroupRequest, paramGroupResponse, rdsProxyClient, resourceModel, cxt) -> tagResource(paramGroupResponse, proxyClient, resourceModel, cxt, request.getDesiredResourceTags())))
            .then(progress -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
    }