in aws-rds-dbproxy/src/main/java/software/amazon/rds/dbproxy/UpdateHandler.java [55:141]
private ProgressEvent<ResourceModel, CallbackContext> updateProxyAndUpdateProgress(ResourceModel newModel,
ResourceModel oldModel,
CallbackContext callbackContext) {
// This Lambda will continually be re-invoked with the current state of the proxy, finally succeeding when state stabilizes.
final DBProxy proxyStateSoFar = callbackContext.getProxy();
if (callbackContext.getStabilizationRetriesRemaining() == 0) {
throw new RuntimeException(TIMED_OUT_MESSAGE);
}
// Update proxy settings
if (proxyStateSoFar == null) {
try {
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(newModel)
.status(OperationStatus.IN_PROGRESS)
.callbackContext(CallbackContext.builder()
.proxy(updateProxySettings(oldModel, newModel))
.stabilizationRetriesRemaining(Constants.NUMBER_OF_STATE_POLL_RETRIES)
.build())
.build();
} catch (DBProxyNotFoundException e) {
return ProgressEvent.defaultFailureHandler(e, HandlerErrorCode.NotFound);
}
}
// Update tags
if (!callbackContext.isTagsDeregistered()) {
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(newModel)
.status(OperationStatus.IN_PROGRESS)
.callbackContext(CallbackContext.builder()
.proxy(proxyStateSoFar)
.tagsDeregistered(deregisterOldTags(oldModel, newModel, proxyStateSoFar))
.stabilizationRetriesRemaining(Constants.NUMBER_OF_STATE_POLL_RETRIES)
.build())
.build();
}
if (!callbackContext.isTagsRegistered()) {
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(newModel)
.status(OperationStatus.IN_PROGRESS)
.callbackContext(CallbackContext.builder()
.proxy(proxyStateSoFar)
.tagsDeregistered(callbackContext.isTagsDeregistered())
.tagsRegistered(registerNewTags(oldModel, newModel, proxyStateSoFar))
.stabilizationRetriesRemaining(Constants.NUMBER_OF_STATE_POLL_RETRIES)
.build())
.build();
}
if (proxyStateSoFar.getStatus().equals(Constants.AVAILABLE_PROXY_STATE)) {
newModel.setVpcId(proxyStateSoFar.getVpcId());
newModel.setDebugLogging(proxyStateSoFar.getDebugLogging());
newModel.setIdleClientTimeout(proxyStateSoFar.getIdleClientTimeout());
newModel.setRequireTLS(proxyStateSoFar.getRequireTLS());
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(newModel)
.status(OperationStatus.SUCCESS)
.build();
} else if (Constants.TERMINAL_FAILURE_STATES.contains(proxyStateSoFar.getStatus())) {
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.status(OperationStatus.FAILED)
.errorCode(HandlerErrorCode.NotFound)
.build();
} else {
try {
Thread.sleep(Constants.POLL_RETRY_DELAY_IN_MS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
DBProxy proxy = updatedProxyProgress(proxyStateSoFar.getDBProxyName());
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(newModel)
.status(OperationStatus.IN_PROGRESS)
.callbackContext(CallbackContext.builder()
.tagsDeregistered(callbackContext.isTagsDeregistered())
.tagsRegistered(callbackContext.isTagsRegistered())
.proxy(proxy)
.stabilizationRetriesRemaining(callbackContext.getStabilizationRetriesRemaining() - 1)
.build())
.build();
}
}