public ProgressEvent handleRequest()

in aws-timestream-table/src/main/java/software/amazon/timestream/table/UpdateHandler.java [47:119]


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

        timestreamClient = TimestreamClientFactory.get(proxy, logger);
        this.proxy = proxy;

        final ResourceModel model = request.getDesiredResourceState();
        final ResourceModel existingModel = request.getPreviousResourceState();

        final Map<String, String> desiredTags = TagHelper.getNewDesiredTags(model, request);
        final Map<String, String> previousTags = TagHelper.getPreviouslyAttachedTags(request);

        final Set<Tag> tagsToAdd = TagHelper.convertToSet(
                TagHelper.generateTagsToAdd(previousTags, desiredTags));
        final Set<String> tagsToRemove = TagHelper.generateTagsToRemove(previousTags, desiredTags);

        try {
            RetentionProperties retentionProperties;

            if (model.getRetentionProperties() == null) {
                // TODO there are cases when Uluru not keeping RetentionProperties in the existing model properly
                // here will fetch from TS directly for the current RetentionProperties if not defined in the CFN
                // template
                final DescribeTableRequest describeTableRequest =
                        new DescribeTableRequest()
                                .withDatabaseName(model.getDatabaseName())
                                .withTableName(model.getTableName());
                final DescribeTableResult describeTableResult = this.proxy.injectCredentialsAndInvoke(describeTableRequest, timestreamClient::describeTable);
                retentionProperties = describeTableResult.getTable().getRetentionProperties();
            } else {
                retentionProperties = RetentionPropertiesModelConverter.convert(model.getRetentionProperties());
            }

            MagneticStoreWriteProperties magneticStoreWriteProperties = MagneticStoreWritePropertiesModelConverter.convert(model.getMagneticStoreWriteProperties());

            final UpdateTableRequest updateTableRequest =
                    new UpdateTableRequest()
                            .withDatabaseName(model.getDatabaseName())
                            .withTableName(model.getTableName())
                            .withRetentionProperties(retentionProperties)
                            .withMagneticStoreWriteProperties(magneticStoreWriteProperties);

            final UpdateTableResult updateTableResult =
                    this.proxy.injectCredentialsAndInvoke(updateTableRequest, timestreamClient::updateTable);
            /*
             * Update tags
             *
             * Here we first remove the tags no long exist, this includes tags whose values are modified.
             * New tags are added afterwards, including tags with updated values.
             */
            removeTags(updateTableResult.getTable().getArn(), tagsToRemove);
            addTags(updateTableResult.getTable().getArn(), tagsToAdd);
        } catch (InternalServerException ex) {
            throw new CfnInternalFailureException(ex);
        } catch (ThrottlingException ex) {
            throw new CfnThrottlingException(UPDATE_TABLE, ex);
        } catch (ValidationException | InvalidEndpointException ex) {
            throw new CfnInvalidRequestException(request.toString(), ex);
        } catch (ResourceNotFoundException ex) {
            // could be either database does not exist or table does not exist.
            throw new CfnNotFoundException(ex);
        } catch (AccessDeniedException ex) {
            throw new CfnAccessDeniedException(UPDATE_TABLE, ex);
        }

        return ProgressEvent.<ResourceModel, CallbackContext>builder()
            .resourceModel(model)
            .status(OperationStatus.SUCCESS)
            .build();
    }