Skip to content

Commit

Permalink
fix(DBCluster): fix local write forwarding error on cluster update (c…
Browse files Browse the repository at this point in the history
…ontinuation for PR #552)
  • Loading branch information
kylenie-aws committed Aug 6, 2024
1 parent 440766b commit 7add608
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,6 @@ static ModifyDbClusterRequest modifyDbClusterRequest(
.domainIAMRoleName(desiredModel.getDomainIAMRoleName())
.enableGlobalWriteForwarding(desiredModel.getEnableGlobalWriteForwarding())
.enableIAMDatabaseAuthentication(diff(previousModel.getEnableIAMDatabaseAuthentication(), desiredModel.getEnableIAMDatabaseAuthentication()))
.enableLocalWriteForwarding(diff(previousModel.getEnableLocalWriteForwarding(), desiredModel.getEnableLocalWriteForwarding()))
.enablePerformanceInsights(desiredModel.getPerformanceInsightsEnabled())
.iops(desiredModel.getIops())
.masterUserPassword(diff(previousModel.getMasterUserPassword(), desiredModel.getMasterUserPassword()))
Expand All @@ -296,6 +295,18 @@ static ModifyDbClusterRequest modifyDbClusterRequest(
)
.storageType(desiredModel.getStorageType());

if (previousModel.getEnableLocalWriteForwarding() == null && desiredModel.getEnableLocalWriteForwarding() == Boolean.FALSE) {
// RDS disables LocalWriteForwarding by default. Therefore, if the previous model is null and the desired model is false,
// do not set the value in the modify request to maintain the status as false.
builder.enableLocalWriteForwarding(null);
} else if (previousModel.getEnableLocalWriteForwarding() == Boolean.TRUE && desiredModel.getEnableLocalWriteForwarding() == null) {
// By default, RDS disables LocalWriteForwarding when the property is null. Therefore, if the previous model is true and the desired model is null,
// need to explicitly set the value in the modify request to update the status to false.
builder.enableLocalWriteForwarding(false);
} else {
builder.enableLocalWriteForwarding(diff(previousModel.getEnableLocalWriteForwarding(), desiredModel.getEnableLocalWriteForwarding()));
}

if (!(isRollback || Objects.equals(previousModel.getEngineVersion(), desiredModel.getEngineVersion()))) {
builder.engineVersion(desiredModel.getEngineVersion());
builder.allowMajorVersionUpgrade(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,23 +244,53 @@ public void modifyDbClusterRequest_sameServerlessV2ScalingConfiguration() {
assertThat(request.serverlessV2ScalingConfiguration()).isEqualTo(null);
}

/*
* The test case verifies the following truth table:
* | previousModel | desiredModel | LWF in the request|
* | null | null | null |
* | true | null | false |
* | false | null | null |
* | null | true | true |
* | true | true | null |
* | false | true | true |
* | null | false | null |
* | true | false | false |
* | false | false | null |
*/
@Test
public void modifyDbClusterRequest_enableLocalWriteForwarding() {
final var previousModel = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(null).build();
final var modelNull = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(null).build();
final var modelTrue = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(true).build();
final var modelFalse = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(false).build();

final var desiredModel = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(true).build();
var request = Translator.modifyDbClusterRequest(modelNull, modelNull, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isNull();

request = Translator.modifyDbClusterRequest(modelTrue, modelNull, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isEqualTo(false);

request = Translator.modifyDbClusterRequest(modelFalse, modelNull, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isNull();

final var request = Translator.modifyDbClusterRequest(previousModel, desiredModel, IS_NOT_ROLLBACK);
request = Translator.modifyDbClusterRequest(modelNull, modelTrue, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isEqualTo(true);
}

@Test
public void modifyDbClusterRequest_sameLocalWriteForwarding() {
final var previousModel = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(false).build();
final var desiredModel = RESOURCE_MODEL.toBuilder().enableLocalWriteForwarding(false).build();
request = Translator.modifyDbClusterRequest(modelTrue, modelTrue, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isNull();

final var request = Translator.modifyDbClusterRequest(previousModel, desiredModel, IS_NOT_ROLLBACK);
request = Translator.modifyDbClusterRequest(modelFalse, modelTrue, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isEqualTo(true);


request = Translator.modifyDbClusterRequest(modelNull, modelFalse, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isNull();

request = Translator.modifyDbClusterRequest(modelTrue, modelFalse, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isEqualTo(false);

request = Translator.modifyDbClusterRequest(modelFalse, modelFalse, IS_NOT_ROLLBACK);
assertThat(request.enableLocalWriteForwarding()).isNull();

}

@Test
Expand Down

0 comments on commit 7add608

Please sign in to comment.