diff --git a/aws-rds-cfn-common/pom.xml b/aws-rds-cfn-common/pom.xml index 7e3c63d95..790cbf719 100644 --- a/aws-rds-cfn-common/pom.xml +++ b/aws-rds-cfn-common/pom.xml @@ -28,12 +28,12 @@ software.amazon.awssdk utils - 2.28.14 + 2.29.16 software.amazon.awssdk rds - 2.28.14 + 2.29.16 software.amazon.cloudformation diff --git a/aws-rds-customdbengineversion/pom.xml b/aws-rds-customdbengineversion/pom.xml index 0ed1cb39c..d4e2fb991 100644 --- a/aws-rds-customdbengineversion/pom.xml +++ b/aws-rds-customdbengineversion/pom.xml @@ -23,7 +23,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 software.amazon.rds.common @@ -54,7 +54,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 diff --git a/aws-rds-dbcluster/aws-rds-dbcluster.json b/aws-rds-dbcluster/aws-rds-dbcluster.json index f3c5086c4..cd479cad9 100644 --- a/aws-rds-dbcluster/aws-rds-dbcluster.json +++ b/aws-rds-dbcluster/aws-rds-dbcluster.json @@ -338,6 +338,9 @@ "MaxCapacity": { "description": "The maximum number of Aurora capacity units (ACUs) for a DB instance in an Aurora Serverless v2 cluster. You can specify ACU values in half-step increments, such as 40, 40.5, 41, and so on. The largest value that you can use is 128.", "type": "number" + }, + "SecondsUntilAutoPause": { + "type": "integer" } } }, diff --git a/aws-rds-dbcluster/pom.xml b/aws-rds-dbcluster/pom.xml index 80fad90dd..fff8f8678 100644 --- a/aws-rds-dbcluster/pom.xml +++ b/aws-rds-dbcluster/pom.xml @@ -30,18 +30,18 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 software.amazon.awssdk ec2 - 2.28.14 + 2.29.16 software.amazon.awssdk aws-query-protocol - 2.28.14 + 2.29.16 diff --git a/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/Translator.java b/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/Translator.java index 059f7423a..a79530ec5 100644 --- a/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/Translator.java +++ b/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/Translator.java @@ -468,6 +468,7 @@ static software.amazon.awssdk.services.rds.model.ServerlessV2ScalingConfiguratio return software.amazon.awssdk.services.rds.model.ServerlessV2ScalingConfiguration.builder() .maxCapacity(serverlessV2ScalingConfiguration.getMaxCapacity()) .minCapacity(serverlessV2ScalingConfiguration.getMinCapacity()) + .secondsUntilAutoPause(serverlessV2ScalingConfiguration.getSecondsUntilAutoPause()) .build(); } diff --git a/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/UpdateHandler.java b/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/UpdateHandler.java index 5370f3c9c..1612dfc12 100644 --- a/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/UpdateHandler.java +++ b/aws-rds-dbcluster/src/main/java/software/amazon/rds/dbcluster/UpdateHandler.java @@ -68,19 +68,37 @@ protected ProgressEvent handleRequest( "Resource is immutable" ); } + + if (!Objects.equals(request.getDesiredResourceState().getEngineLifecycleSupport(), + request.getPreviousResourceState().getEngineLifecycleSupport()) && + !request.getRollback()) { + throw new CfnInvalidRequestException("EngineLifecycleSupport cannot be modified."); + } + + // Validate SecondsUntilAutoPause to avoid false drift detection. + // Note: we take a different approach with Serverless V1 - see setDefaults. + + final var previousServerlessV2ScalingConfiguration = previousResourceState.getServerlessV2ScalingConfiguration(); + final var desiredServerlessV2ScalingConfiguration = desiredResourceState.getServerlessV2ScalingConfiguration(); + + final var isServerlessV2Previous = previousServerlessV2ScalingConfiguration != null; + final var isServerlessV2Desired = desiredServerlessV2ScalingConfiguration != null; + + if (isServerlessV2Previous && isServerlessV2Desired) { + final var isAutoPausePrevious = previousServerlessV2ScalingConfiguration.getMinCapacity() == 0; + final var isAutoPauseDesired = desiredServerlessV2ScalingConfiguration.getMinCapacity() == 0; + + if (isAutoPausePrevious && isAutoPauseDesired) { + // Only allow SecondsUntilAutoPause to be removed when disabling auto-pause. + if (previousServerlessV2ScalingConfiguration.getSecondsUntilAutoPause() != null + && desiredServerlessV2ScalingConfiguration.getSecondsUntilAutoPause() == null + && !request.getRollback()) { + throw new CfnInvalidRequestException("SecondsUntilAutoPause must be specified."); + } + } + } + return ProgressEvent.progress(desiredResourceState, callbackContext) - .then(progress -> { - try { - if(!Objects.equals(request.getDesiredResourceState().getEngineLifecycleSupport(), - request.getPreviousResourceState().getEngineLifecycleSupport()) && - !request.getRollback()) { - throw new CfnInvalidRequestException("EngineLifecycleSupport cannot be modified."); - } - } catch (CfnInvalidRequestException e) { - return Commons.handleException(progress, e, DEFAULT_DB_CLUSTER_ERROR_RULE_SET, requestLogger); - } - return progress; - }) .then(progress -> { if (shouldRemoveFromGlobalCluster(request.getPreviousResourceState(), request.getDesiredResourceState())) { progress.getCallbackContext().timestampOnce(RESOURCE_UPDATED_AT, Instant.now()); diff --git a/aws-rds-dbcluster/src/test/java/software/amazon/rds/dbcluster/UpdateHandlerTest.java b/aws-rds-dbcluster/src/test/java/software/amazon/rds/dbcluster/UpdateHandlerTest.java index ba14cd845..3b4c9a094 100644 --- a/aws-rds-dbcluster/src/test/java/software/amazon/rds/dbcluster/UpdateHandlerTest.java +++ b/aws-rds-dbcluster/src/test/java/software/amazon/rds/dbcluster/UpdateHandlerTest.java @@ -846,8 +846,9 @@ void handleRequest_ServerlessV2ScalingConfiguration_Success() { .build(); final ServerlessV2ScalingConfiguration desiredServerlessV2ScalingConfiguration = ServerlessV2ScalingConfiguration.builder() - .minCapacity(3.0) + .minCapacity(0.0) .maxCapacity(4.0) + .secondsUntilAutoPause(600) .build(); test_handleRequest_base( @@ -881,6 +882,7 @@ void handleRequest_ServerlessV2ScalingConfiguration_Success() { .isEqualTo(software.amazon.awssdk.services.rds.model.ServerlessV2ScalingConfiguration.builder() .maxCapacity(desiredServerlessV2ScalingConfiguration.getMaxCapacity()) .minCapacity(desiredServerlessV2ScalingConfiguration.getMinCapacity()) + .secondsUntilAutoPause(desiredServerlessV2ScalingConfiguration.getSecondsUntilAutoPause()) .build()); } @@ -997,7 +999,7 @@ void handleRequest_ModifyDBCluster_HandleException( } @Test - public void handleRequest_EngineLifecycleSupportShouldFail() { + void handleRequest_EngineLifecycleSupportShouldFail() { expectServiceInvocation = false; test_handleRequest_base( new CallbackContext(), @@ -1008,4 +1010,32 @@ public void handleRequest_EngineLifecycleSupportShouldFail() { expectFailed(HandlerErrorCode.InvalidRequest) ); } + + @Test + void handleRequest_ServerlessV2ScalingConfiguration_RejectRemoveSecondsUntilAutoPause() { + final ServerlessV2ScalingConfiguration previousServerlessV2ScalingConfiguration = ServerlessV2ScalingConfiguration.builder() + .minCapacity(0.0) + .maxCapacity(2.0) + .secondsUntilAutoPause(300) + .build(); + + final ServerlessV2ScalingConfiguration desiredServerlessV2ScalingConfiguration = ServerlessV2ScalingConfiguration.builder() + .minCapacity(0.0) + .maxCapacity(4.0) + .build(); + + expectServiceInvocation = false; + test_handleRequest_base( + new CallbackContext(), + ResourceHandlerRequest.builder().rollback(false), + null, + () -> RESOURCE_MODEL.toBuilder() + .serverlessV2ScalingConfiguration(previousServerlessV2ScalingConfiguration) + .build(), + () -> RESOURCE_MODEL.toBuilder() + .serverlessV2ScalingConfiguration(desiredServerlessV2ScalingConfiguration) + .build(), + expectFailed(HandlerErrorCode.InvalidRequest) + ); + } } diff --git a/aws-rds-dbclusterendpoint/pom.xml b/aws-rds-dbclusterendpoint/pom.xml index 6161cf303..936c0abe2 100644 --- a/aws-rds-dbclusterendpoint/pom.xml +++ b/aws-rds-dbclusterendpoint/pom.xml @@ -30,7 +30,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 @@ -78,7 +78,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.rds.common diff --git a/aws-rds-dbclusterparametergroup/pom.xml b/aws-rds-dbclusterparametergroup/pom.xml index c882f7965..ac0fd1f6d 100644 --- a/aws-rds-dbclusterparametergroup/pom.xml +++ b/aws-rds-dbclusterparametergroup/pom.xml @@ -30,7 +30,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 @@ -78,7 +78,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.rds.common diff --git a/aws-rds-dbinstance/pom.xml b/aws-rds-dbinstance/pom.xml index 883c7e291..524b43f53 100644 --- a/aws-rds-dbinstance/pom.xml +++ b/aws-rds-dbinstance/pom.xml @@ -34,12 +34,12 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 software.amazon.awssdk ec2 - 2.21.17 + 2.29.16 @@ -58,7 +58,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 diff --git a/aws-rds-dbparametergroup/pom.xml b/aws-rds-dbparametergroup/pom.xml index 6fc621f85..23c90e1c1 100644 --- a/aws-rds-dbparametergroup/pom.xml +++ b/aws-rds-dbparametergroup/pom.xml @@ -24,12 +24,12 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-dbshardgroup/pom.xml b/aws-rds-dbshardgroup/pom.xml index a04bd236a..aa34625cb 100644 --- a/aws-rds-dbshardgroup/pom.xml +++ b/aws-rds-dbshardgroup/pom.xml @@ -34,7 +34,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 @@ -53,7 +53,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 diff --git a/aws-rds-dbsubnetgroup/pom.xml b/aws-rds-dbsubnetgroup/pom.xml index 08e99d52c..c676f80b2 100644 --- a/aws-rds-dbsubnetgroup/pom.xml +++ b/aws-rds-dbsubnetgroup/pom.xml @@ -24,12 +24,12 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-eventsubscription/pom.xml b/aws-rds-eventsubscription/pom.xml index c258780c6..29b79f89d 100644 --- a/aws-rds-eventsubscription/pom.xml +++ b/aws-rds-eventsubscription/pom.xml @@ -24,7 +24,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.rds.common @@ -35,7 +35,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-globalcluster/pom.xml b/aws-rds-globalcluster/pom.xml index 963d85c95..4ad0be8ca 100644 --- a/aws-rds-globalcluster/pom.xml +++ b/aws-rds-globalcluster/pom.xml @@ -24,7 +24,7 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.rds.common @@ -35,7 +35,7 @@ software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-integration/pom.xml b/aws-rds-integration/pom.xml index f1c9fb3aa..827b0f1aa 100644 --- a/aws-rds-integration/pom.xml +++ b/aws-rds-integration/pom.xml @@ -23,12 +23,12 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-optiongroup/pom.xml b/aws-rds-optiongroup/pom.xml index dce9d0c62..ffe6fe473 100644 --- a/aws-rds-optiongroup/pom.xml +++ b/aws-rds-optiongroup/pom.xml @@ -24,12 +24,12 @@ software.amazon.awssdk aws-query-protocol - 2.20.138 + 2.29.16 software.amazon.awssdk rds - 2.28.14 + 2.29.16 diff --git a/aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/ClientBuilder.java b/aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/ClientBuilder.java index a8dd6eb56..af55228d0 100644 --- a/aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/ClientBuilder.java +++ b/aws-rds-optiongroup/src/main/java/software/amazon/rds/optiongroup/ClientBuilder.java @@ -3,8 +3,6 @@ import static software.amazon.awssdk.core.client.config.SdkAdvancedClientOption.USER_AGENT_PREFIX; import static software.amazon.awssdk.core.client.config.SdkAdvancedClientOption.USER_AGENT_SUFFIX; -import software.amazon.awssdk.core.retry.RetryPolicy; -import software.amazon.awssdk.core.retry.conditions.RetryCondition; import software.amazon.awssdk.services.rds.RdsClient; import software.amazon.awssdk.services.rds.RdsClientBuilder; import software.amazon.rds.common.client.BaseSdkClientProvider; @@ -12,18 +10,13 @@ public class ClientBuilder extends BaseSdkClientProvider { - private static final int MAX_RETRIES = 5; - - private static final RetryPolicy RETRY_POLICY = RetryPolicy.builder() - .numRetries(MAX_RETRIES) - .retryCondition(RetryCondition.defaultRetryCondition()) - .build(); + private static final int MAX_ATTEMPTS = 6; private RdsClientBuilder setUserAgentAndRetryPolicy(final RdsClientBuilder builder) { return builder.overrideConfiguration(cfg -> { cfg.putAdvancedOption(USER_AGENT_PREFIX, RdsUserAgentProvider.getUserAgentPrefix()) .putAdvancedOption(USER_AGENT_SUFFIX, RdsUserAgentProvider.getUserAgentSuffix()) - .retryPolicy(RETRY_POLICY); + .retryStrategy(b -> b.maxAttempts(MAX_ATTEMPTS)); }); }