in aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/UpdateHandler.java [35:91]
protected ProgressEvent<ResourceModel, CallbackContext> handleRequest(
final AmazonWebServicesClientProxy proxy,
final ResourceHandlerRequest<ResourceModel> request,
final CallbackContext callbackContext,
final ProxyClient<RdsClient> proxyClient,
final Logger logger) {
final ResourceModel previousModel = request.getPreviousResourceState();
final ResourceModel desiredModel = request.getDesiredResourceState();
final Collection<OptionConfiguration> previousOptions = Optional
.ofNullable(previousModel.getOptionConfigurations())
.orElse(Collections.emptyList());
final Collection<OptionConfiguration> desiredOptions = Optional
.ofNullable(desiredModel.getOptionConfigurations())
.orElse(Collections.emptyList());
final Collection<OptionConfiguration> optionsToInclude = getOptionsToInclude(previousOptions, desiredOptions);
final Collection<OptionConfiguration> optionsToRemove = getOptionsToRemove(previousOptions, desiredOptions);
final Map<String, String> previousTags = mergeMaps(
request.getPreviousSystemTags(),
request.getPreviousResourceTags()
);
final Map<String, String> desiredTags = mergeMaps(
request.getSystemTags(),
request.getDesiredResourceTags()
);
// Here we explicitly use some immutability properties of an OptionGroup resource.
// In fact, ModifyOptionGroupRequest only passes optionConfigurations, the rest is immutable.
// Therefore it is sufficient to check if there are any items in optionConfiguration include/remove lists.
final boolean shouldUpdateCoreResource = !(optionsToInclude.isEmpty() && optionsToRemove.isEmpty());
return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
.then(progress -> {
// Skip the step if the core resource was not changed: tags-only change
if (!shouldUpdateCoreResource) {
return progress;
}
return proxy.initiate("rds::update-option-group", proxyClient, progress.getResourceModel(), progress.getCallbackContext())
.translateToServiceRequest(model -> Translator.modifyOptionGroupRequest(model, optionsToInclude, optionsToRemove))
.backoffDelay(config.getBackoff())
.makeServiceCall((modifyRequest, proxyInvocation) -> proxyInvocation.injectCredentialsAndInvokeV2(
modifyRequest,
proxyInvocation.client()::modifyOptionGroup
))
.handleError((modifyRequest, exception, client, resourceModel, ctx) -> Commons.handleException(
ProgressEvent.progress(resourceModel, ctx),
exception,
DEFAULT_OPTION_GROUP_ERROR_RULE_SET
))
.progress();
})
.then(progress -> updateTags(proxy, proxyClient, progress, previousTags, desiredTags))
.then(progress -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
}