41
41
import gyro .core .validation .Required ;
42
42
import gyro .core .validation .ValidStrings ;
43
43
import software .amazon .awssdk .services .rds .RdsClient ;
44
+ import software .amazon .awssdk .services .rds .model .CreateDbClusterRequest ;
44
45
import software .amazon .awssdk .services .rds .model .CreateDbClusterResponse ;
45
46
import software .amazon .awssdk .services .rds .model .DBCluster ;
46
47
import software .amazon .awssdk .services .rds .model .DbClusterNotFoundException ;
47
48
import software .amazon .awssdk .services .rds .model .DescribeDbClustersResponse ;
48
49
import software .amazon .awssdk .services .rds .model .InvalidDbClusterStateException ;
50
+ import software .amazon .awssdk .services .rds .model .LocalWriteForwardingStatus ;
51
+ import software .amazon .awssdk .services .rds .model .ModifyDbClusterRequest ;
49
52
import software .amazon .awssdk .services .rds .model .RestoreDbClusterFromS3Response ;
50
53
import software .amazon .awssdk .services .rds .model .RestoreDbClusterFromSnapshotResponse ;
51
54
@@ -145,6 +148,7 @@ public class DbClusterResource extends RdsTaggableResource implements Copyable<D
145
148
private Integer allocatedStorage ;
146
149
private Boolean autoMinorVersionUpgrade ;
147
150
private Boolean copyTagsToSnapshot ;
151
+ private Boolean enableLocalWriteForwarding ;
148
152
149
153
// Read-only
150
154
private String endpointAddress ;
@@ -186,6 +190,10 @@ public void setAvailabilityZones(List<String> availabilityZones) {
186
190
*/
187
191
@ Updatable
188
192
public Long getBackTrackWindow () {
193
+ if (backTrackWindow == null ) {
194
+ backTrackWindow = 0L ;
195
+ }
196
+
189
197
return backTrackWindow ;
190
198
}
191
199
@@ -659,6 +667,23 @@ public void setCopyTagsToSnapshot(Boolean copyTagsToSnapshot) {
659
667
this .copyTagsToSnapshot = copyTagsToSnapshot ;
660
668
}
661
669
670
+ /**
671
+ * When set to ``true``, read replicas can forward write operations to the writer DB instance in the DB cluster.
672
+ * By default, write operations aren't allowed on reader DB instances.
673
+ */
674
+ @ Updatable
675
+ public Boolean getEnableLocalWriteForwarding () {
676
+ if (enableGlobalWriteForwarding == null ) {
677
+ enableGlobalWriteForwarding = false ;
678
+ }
679
+
680
+ return enableLocalWriteForwarding ;
681
+ }
682
+
683
+ public void setEnableLocalWriteForwarding (Boolean enableLocalWriteForwarding ) {
684
+ this .enableLocalWriteForwarding = enableLocalWriteForwarding ;
685
+ }
686
+
662
687
/**
663
688
* DNS hostname to access the primary instance of the cluster.
664
689
*/
@@ -753,6 +778,12 @@ public void copyFrom(DBCluster cluster) {
753
778
config .copyFrom (cluster .serverlessV2ScalingConfiguration ());
754
779
setServerlessV2ScalingConfiguration (config );
755
780
}
781
+
782
+ setEnableLocalWriteForwarding (
783
+ LocalWriteForwardingStatus .REQUESTED .equals (cluster .localWriteForwardingStatus ()) ||
784
+ LocalWriteForwardingStatus .ENABLING .equals (cluster .localWriteForwardingStatus ()) ||
785
+ LocalWriteForwardingStatus .ENABLED .equals (cluster .localWriteForwardingStatus ())
786
+ );
756
787
}
757
788
758
789
@ Override
@@ -892,8 +923,13 @@ protected void doCreate(GyroUI ui, State state) {
892
923
}
893
924
894
925
} else {
926
+ CreateDbClusterRequest .Builder builder = CreateDbClusterRequest .builder ();
927
+ if (Boolean .TRUE .equals (getEnableGlobalWriteForwarding ())) {
928
+ builder .enableGlobalWriteForwarding (getEnableGlobalWriteForwarding ());
929
+ }
930
+
895
931
CreateDbClusterResponse response = client .createDBCluster (
896
- r -> r .availabilityZones (getAvailabilityZones ())
932
+ builder .availabilityZones (getAvailabilityZones ())
897
933
.backtrackWindow (getBackTrackWindow ())
898
934
.backupRetentionPeriod (getBackupRetentionPeriod ())
899
935
.characterSetName (getCharacterSetName ())
@@ -925,7 +961,6 @@ protected void doCreate(GyroUI ui, State state) {
925
961
.map (SecurityGroupResource ::getId )
926
962
.collect (Collectors .toList ()) : null )
927
963
.dbClusterInstanceClass (getDbClusterInstanceClass ())
928
- .enableGlobalWriteForwarding (getEnableGlobalWriteForwarding ())
929
964
.iops (getIops ())
930
965
.manageMasterUserPassword (getManageMasterUserPassword ())
931
966
.masterUserSecretKmsKeyId (getMasterUserSecretKmsKey ().getId ())
@@ -935,6 +970,8 @@ protected void doCreate(GyroUI ui, State state) {
935
970
.allocatedStorage (getAllocatedStorage ())
936
971
.autoMinorVersionUpgrade (getAutoMinorVersionUpgrade ())
937
972
.copyTagsToSnapshot (getCopyTagsToSnapshot ())
973
+ .enableLocalWriteForwarding (getEnableLocalWriteForwarding ())
974
+ .build ()
938
975
);
939
976
940
977
setArn (response .dbCluster ().dbClusterArn ());
@@ -981,8 +1018,13 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
981
1018
.collect (Collectors .toList ()) : null ;
982
1019
983
1020
try {
1021
+ ModifyDbClusterRequest .Builder builder = ModifyDbClusterRequest .builder ();
1022
+ if (!Objects .equals (getEnableGlobalWriteForwarding (), current .getEnableGlobalWriteForwarding ())) {
1023
+ builder .enableGlobalWriteForwarding (getEnableGlobalWriteForwarding ());
1024
+ }
1025
+
984
1026
client .modifyDBCluster (
985
- r -> r .applyImmediately (getApplyImmediately ())
1027
+ builder .applyImmediately (getApplyImmediately ())
986
1028
.backtrackWindow (Objects .equals (getBackTrackWindow (), current .getBackTrackWindow ())
987
1029
? null : getBackTrackWindow ())
988
1030
.backupRetentionPeriod (Objects .equals (
@@ -1015,7 +1057,6 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
1015
1057
.vpcSecurityGroupIds (Objects .equals (getVpcSecurityGroups (), current .getVpcSecurityGroups ())
1016
1058
? null : vpcSecurityGroupIds )
1017
1059
.dbClusterInstanceClass (getDbClusterInstanceClass ())
1018
- .enableGlobalWriteForwarding (getEnableGlobalWriteForwarding ())
1019
1060
.iops (getIops ())
1020
1061
.manageMasterUserPassword (getManageMasterUserPassword ())
1021
1062
.masterUserSecretKmsKeyId (getMasterUserSecretKmsKey ().getId ())
@@ -1025,6 +1066,9 @@ protected void doUpdate(Resource config, Set<String> changedProperties) {
1025
1066
.allocatedStorage (getAllocatedStorage ())
1026
1067
.autoMinorVersionUpgrade (getAutoMinorVersionUpgrade ())
1027
1068
.copyTagsToSnapshot (getCopyTagsToSnapshot ())
1069
+ .enableLocalWriteForwarding (Objects .equals (getEnableLocalWriteForwarding (),
1070
+ current .getEnableLocalWriteForwarding ()) ? null : getEnableLocalWriteForwarding ())
1071
+ .build ()
1028
1072
);
1029
1073
} catch (InvalidDbClusterStateException ex ) {
1030
1074
throw new GyroException (ex .getLocalizedMessage ());
0 commit comments