public ProgressEvent handleRequest()

in aws-iot-provisioningtemplate/src/main/java/com/amazonaws/iot/provisioningtemplate/UpdateHandler.java [65:146]


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

        final ResourceModel newModel = request.getDesiredResourceState();
        final ResourceModel prevModel = request.getPreviousResourceState();
        final String templateName = newModel.getTemplateName();
        IotRequest currentRequest = null;

        try {
            // Now we can create a new version if we need one, compare to the current default version (the most recent).
            if (!prevModel.getTemplateBody().equals(newModel.getTemplateBody())) {
                CreateProvisioningTemplateVersionRequest createVersionRequest = CreateProvisioningTemplateVersionRequest.builder()
                        .templateName(templateName)
                        .templateBody(newModel.getTemplateBody())
                        .setAsDefault(true)
                        .build();

                // Attempt to create the version first
                try {
                    proxy.injectCredentialsAndInvokeV2(createVersionRequest, iotClient::createProvisioningTemplateVersion);
                } catch (LimitExceededException e) {
                    // Find a version to delete (the oldest)
                    ListProvisioningTemplateVersionsRequest listVersionRequest = ListProvisioningTemplateVersionsRequest.builder()
                            .templateName(templateName)
                            .build();
                    currentRequest = listVersionRequest;
                    final ListProvisioningTemplateVersionsResponse listVersionResult = proxy.injectCredentialsAndInvokeV2(
                            listVersionRequest,
                            iotClient::listProvisioningTemplateVersions);

                    final List<ProvisioningTemplateVersionSummary> versions = listVersionResult.versions().stream()
                            .sorted(Comparator.comparing(ProvisioningTemplateVersionSummary::versionId))
                            .collect(Collectors.toList());

                    // For consistency we always delete the oldest version, so check now if that is the default currently
                    if (versions.get(0).isDefaultVersion()) {
                        UpdateProvisioningTemplateRequest updateRequest = UpdateProvisioningTemplateRequest.builder()
                                .defaultVersionId(versions.get(versions.size() - 1).versionId())
                                .build();
                        currentRequest = updateRequest;
                        proxy.injectCredentialsAndInvokeV2(updateRequest, iotClient::updateProvisioningTemplate);
                    }

                    DeleteProvisioningTemplateVersionRequest deleteVersionRequest = DeleteProvisioningTemplateVersionRequest.builder()
                            .templateName(templateName)
                            .versionId(versions.get(0).versionId())
                            .build();
                    currentRequest = deleteVersionRequest;
                    proxy.injectCredentialsAndInvokeV2(deleteVersionRequest, iotClient::deleteProvisioningTemplateVersion);
                    currentRequest = createVersionRequest;
                    proxy.injectCredentialsAndInvokeV2(createVersionRequest, iotClient::createProvisioningTemplateVersion);
                }
            }

            UpdateProvisioningTemplateRequest updateRequest = UpdateProvisioningTemplateRequest.builder()
                    .templateName(templateName)
                    .description(newModel.getDescription())
                    .enabled(newModel.getEnabled())
                    .provisioningRoleArn(newModel.getProvisioningRoleArn())
                    .preProvisioningHook(getPreProvisioningHook(newModel))
                    .build();
            currentRequest = updateRequest;
            proxy.injectCredentialsAndInvokeV2(updateRequest, iotClient::updateProvisioningTemplate);
        } catch (final ResourceNotFoundException e) {
            throw new CfnNotFoundException(ResourceModel.TYPE_NAME, templateName);
        } catch (final InvalidRequestException e) {
            throw new CfnInvalidRequestException(e.getMessage(), e);
        } catch (final InternalException e) {
            throw new CfnServiceInternalErrorException(OPERATION, e);
        } catch (final ThrottlingException e) {
            throw new CfnThrottlingException(OPERATION, e);
        } catch (final ServiceUnavailableException e) {
            throw new CfnGeneralServiceException(OPERATION, e);
        } catch (final UnauthorizedException e) {
            throw new CfnAccessDeniedException(OPERATION, e);
        }

        return ProgressEvent.defaultSuccessHandler(newModel);
    }