aws-memorydb-cluster/src/main/java/software/amazon/memorydb/cluster/UpdateHandler.java [171:219]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    protected ProgressEvent<ResourceModel, CallbackContext> tagResource(final AmazonWebServicesClientProxy proxy,
                                                                        final ProxyClient<MemoryDbClient> proxyClient,
                                                                        final ProgressEvent<ResourceModel, CallbackContext> progress,
                                                                        final ResourceHandlerRequest<ResourceModel> request,
                                                                        final Logger logger) {
        if (!isUpdateNeeded(request.getDesiredResourceTags(), request.getPreviousResourceTags()) || !isArnPresent(progress.getResourceModel())) {
            logger.log("No tags to update.");
            return listTags(proxy, progress, proxyClient);
        }

        return progress.then(o -> handleExceptions(() -> {
                            tagResource(proxy, proxyClient,  progress.getResourceModel(), progress.getCallbackContext(), request.getDesiredResourceTags());
                            return ProgressEvent.progress(o.getResourceModel(), o.getCallbackContext()); })
                );
    }

    private ProgressEvent<ResourceModel, CallbackContext> tagResource(final AmazonWebServicesClientProxy proxy,
                                                                      final ProxyClient<MemoryDbClient> proxyClient,
                                                                      final ResourceModel model,
                                                                      final CallbackContext callbackContext,
                                                                      final Map<String, String> tags) {
        final String arn = model.getARN();
        final Set<Tag> currentTags = mapToTags(tags);
        final Set<Tag> existingTags = listTags(proxy, proxyClient, model, callbackContext);
        final Set<Tag> tagsToRemove = Sets.difference(existingTags, currentTags);
        final Set<Tag> tagsToAdd = Sets.difference(currentTags, existingTags);

        if (CollectionUtils.isNotEmpty(tagsToRemove)) {
            UntagResourceResponse untagResourceResponse = proxy.injectCredentialsAndInvokeV2(Translator.translateToUntagResourceRequest(arn, tagsToRemove), proxyClient.client()::untagResource);
            model.setTags(translateTagsFromSdk(untagResourceResponse.tagList()));
        }

        if (CollectionUtils.isNotEmpty(tagsToAdd)) {
            TagResourceResponse tagResourceResponse = proxy.injectCredentialsAndInvokeV2(Translator.translateToTagResourceRequest(arn, tagsToAdd), proxyClient.client()::tagResource);
            model.setTags(translateTagsFromSdk(tagResourceResponse.tagList()));
        }

        return ProgressEvent.progress(model, callbackContext);
    }

    private Set<Tag> listTags(final AmazonWebServicesClientProxy proxy,
                              final ProxyClient<MemoryDbClient> proxyClient,
                              final ResourceModel model,
                              final CallbackContext callbackContext) {
        return Optional.ofNullable(ProgressEvent.progress(model, callbackContext)
                .then(progress -> listTags(proxy, progress, proxyClient))
                .getResourceModel()
                .getTags())
                .orElse(Collections.emptySet());
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



aws-memorydb-subnetgroup/src/main/java/software/amazon/memorydb/subnetgroup/UpdateHandler.java [84:132]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    protected ProgressEvent<ResourceModel, CallbackContext> tagResource(final AmazonWebServicesClientProxy proxy,
                                                                        final ProxyClient<MemoryDbClient> proxyClient,
                                                                        final ProgressEvent<ResourceModel, CallbackContext> progress,
                                                                        final ResourceHandlerRequest<ResourceModel> request,
                                                                        final Logger logger) {
        if (!isUpdateNeeded(request.getDesiredResourceTags(), request.getPreviousResourceTags()) || !isArnPresent(progress.getResourceModel())) {
            logger.log("No tags to update.");
            return listTags(proxy, progress, proxyClient);
        }

        return progress.then(o -> handleExceptions(() -> {
            tagResource(proxy, proxyClient,  progress.getResourceModel(), progress.getCallbackContext(), request.getDesiredResourceTags());
            return ProgressEvent.progress(o.getResourceModel(), o.getCallbackContext()); })
        );
    }

    private ProgressEvent<ResourceModel, CallbackContext> tagResource(final AmazonWebServicesClientProxy proxy,
                                                                      final ProxyClient<MemoryDbClient> proxyClient,
                                                                      final ResourceModel model,
                                                                      final CallbackContext callbackContext,
                                                                      final Map<String, String> tags) {
        final String arn = model.getARN();
        final Set<Tag> currentTags = mapToTags(tags);
        final Set<Tag> existingTags = listTags(proxy, proxyClient, model, callbackContext);
        final Set<Tag> tagsToRemove = Sets.difference(existingTags, currentTags);
        final Set<Tag> tagsToAdd = Sets.difference(currentTags, existingTags);

        if (CollectionUtils.isNotEmpty(tagsToRemove)) {
            UntagResourceResponse untagResourceResponse = proxy.injectCredentialsAndInvokeV2(Translator.translateToUntagResourceRequest(arn, tagsToRemove), proxyClient.client()::untagResource);
            model.setTags(translateTagsFromSdk(untagResourceResponse.tagList()));
        }

        if (CollectionUtils.isNotEmpty(tagsToAdd)) {
            TagResourceResponse tagResourceResponse = proxy.injectCredentialsAndInvokeV2(Translator.translateToTagResourceRequest(arn, tagsToAdd), proxyClient.client()::tagResource);
            model.setTags(translateTagsFromSdk(tagResourceResponse.tagList()));
        }

        return ProgressEvent.progress(model, callbackContext);
    }

    private Set<Tag> listTags(final AmazonWebServicesClientProxy proxy,
                              final ProxyClient<MemoryDbClient> proxyClient,
                              final ResourceModel model,
                              final CallbackContext callbackContext) {
        return Optional.ofNullable(ProgressEvent.progress(model, callbackContext)
                .then(progress -> listTags(proxy, progress, proxyClient))
                .getResourceModel()
                .getTags())
                .orElse(Collections.emptySet());
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



