Skip to content

Commit 2e94dd2

Browse files
authored
Merge pull request #1816 from wotolom/optiongroupname-isuptodate-fix
2 parents 4417392 + 6894828 commit 2e94dd2

3 files changed

Lines changed: 64 additions & 3 deletions

File tree

examples/database/rdsinstance.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ spec:
66
forProvider:
77
region: us-east-1
88
allocatedStorage: 20
9+
applyModificationsImmediately: true # default is false
910
autoMinorVersionUpgrade: true
1011
backupRetentionPeriod: 0
1112
caCertificateIdentifier: rds-ca-2019
@@ -15,7 +16,7 @@ spec:
1516
enableIAMDatabaseAuthentication: false
1617
enablePerformanceInsights: false
1718
engine: mysql
18-
engineVersion: 8.0.28
19+
engineVersion: "8.0.28"
1920
finalDBSnapshotIdentifier: muvaf-test
2021
licenseModel: general-public-license
2122
masterUsername: admin

pkg/clients/database/rds.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,11 +677,14 @@ func IsUpToDate(ctx context.Context, kube client.Client, r *v1beta1.RDSInstance,
677677
cmpopts.IgnoreFields(v1beta1.RDSInstanceParameters{}, "ApplyModificationsImmediately"),
678678
cmpopts.IgnoreFields(v1beta1.RDSInstanceParameters{}, "AllowMajorVersionUpgrade"),
679679
cmpopts.IgnoreFields(v1beta1.RDSInstanceParameters{}, "MasterPasswordSecretRef"),
680+
cmpopts.IgnoreFields(v1beta1.RDSInstanceParameters{}, "OptionGroupName"),
680681
)
681682

682683
engineVersionChanged := !isEngineVersionUpToDate(r, db)
683684

684-
if diff == "" && !pwdChanged && !engineVersionChanged {
685+
optionGroupChanged := !isOptionGroupUpToDate(r, db)
686+
687+
if diff == "" && !pwdChanged && !engineVersionChanged && !optionGroupChanged {
685688
return true, "", nil
686689
}
687690

@@ -706,6 +709,33 @@ func isEngineVersionUpToDate(cr *v1beta1.RDSInstance, db rdstypes.DBInstance) bo
706709
return true
707710
}
708711

712+
func isOptionGroupUpToDate(cr *v1beta1.RDSInstance, db rdstypes.DBInstance) bool {
713+
// If OptionGroupName is not set, AWS sets a default OptionGroup,
714+
// so we do not try to update in this case
715+
if cr.Spec.ForProvider.OptionGroupName != nil {
716+
for _, group := range db.OptionGroupMemberships {
717+
if group.OptionGroupName != nil && (awsclients.StringValue(group.OptionGroupName) == awsclients.StringValue(cr.Spec.ForProvider.OptionGroupName)) {
718+
719+
switch awsclients.StringValue(group.Status) {
720+
case "pending-maintenance-apply":
721+
// If ApplyModificationsImmediately was turned on after the OptionGroup change was requested,
722+
// we can make a new Modify request
723+
if awsclients.BoolValue(cr.Spec.ForProvider.ApplyModificationsImmediately) {
724+
return false
725+
}
726+
return true
727+
case "pending-maintenance-removal":
728+
return false
729+
default: // "in-sync", "applying", "pending-apply", "pending-removal", "removing", "failed"
730+
return true
731+
}
732+
}
733+
}
734+
return false
735+
}
736+
return true
737+
}
738+
709739
// GetPassword fetches the referenced input password for an RDSInstance CRD and determines whether it has changed or not
710740
func GetPassword(ctx context.Context, kube client.Client, in *xpv1.SecretKeySelector, out *xpv1.SecretReference) (newPwd string, changed bool, err error) {
711741
if in == nil {

pkg/controller/rds/dbinstance/setup.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,8 @@ func (e *custom) isUpToDate(cr *svcapitypes.DBInstance, out *svcsdk.DescribeDBIn
381381

382382
dbParameterGroupChanged := !isDBParameterGroupNameUpToDate(cr, db)
383383

384+
optionGroupChanged := !isOptionGroupUpToDate(cr, db)
385+
384386
diff := cmp.Diff(&svcapitypes.DBInstanceParameters{}, patch, cmpopts.EquateEmpty(),
385387
cmpopts.IgnoreTypes(&xpv1.Reference{}, &xpv1.Selector{}, []xpv1.Reference{}),
386388
cmpopts.IgnoreFields(svcapitypes.DBInstanceParameters{}, "Region"),
@@ -394,13 +396,14 @@ func (e *custom) isUpToDate(cr *svcapitypes.DBInstance, out *svcsdk.DescribeDBIn
394396
cmpopts.IgnoreFields(svcapitypes.DBInstanceParameters{}, "AutogeneratePassword"),
395397
cmpopts.IgnoreFields(svcapitypes.DBInstanceParameters{}, "PreferredMaintenanceWindow"),
396398
cmpopts.IgnoreFields(svcapitypes.DBInstanceParameters{}, "PreferredBackupWindow"),
399+
cmpopts.IgnoreFields(svcapitypes.DBInstanceParameters{}, "OptionGroupName"),
397400
cmpopts.IgnoreFields(svcapitypes.CustomDBInstanceParameters{}, "ApplyImmediately"),
398401
cmpopts.IgnoreFields(svcapitypes.CustomDBInstanceParameters{}, "RestoreFrom"),
399402
cmpopts.IgnoreFields(svcapitypes.CustomDBInstanceParameters{}, "VPCSecurityGroupIDs"),
400403
cmpopts.IgnoreFields(svcapitypes.CustomDBInstanceParameters{}, "DeleteAutomatedBackups"),
401404
)
402405

403-
if diff == "" && !maintenanceWindowChanged && !backupWindowChanged && !pwChanged && !versionChanged && !vpcSGsChanged && !dbParameterGroupChanged {
406+
if diff == "" && !maintenanceWindowChanged && !backupWindowChanged && !pwChanged && !versionChanged && !vpcSGsChanged && !dbParameterGroupChanged && !optionGroupChanged {
404407
return true, nil
405408
}
406409

@@ -439,6 +442,33 @@ func isEngineVersionUpToDate(cr *svcapitypes.DBInstance, out *svcsdk.DescribeDBI
439442
return true
440443
}
441444

445+
func isOptionGroupUpToDate(cr *svcapitypes.DBInstance, out *svcsdk.DBInstance) bool {
446+
// If OptionGroupName is not set, AWS sets a default OptionGroup,
447+
// so we do not try to update in this case
448+
if cr.Spec.ForProvider.OptionGroupName != nil {
449+
for _, group := range out.OptionGroupMemberships {
450+
if group.OptionGroupName != nil && (aws.StringValue(group.OptionGroupName) == aws.StringValue(cr.Spec.ForProvider.OptionGroupName)) {
451+
452+
switch aws.StringValue(group.Status) {
453+
case "pending-maintenance-apply":
454+
// If ApplyImmediately was turned on after the OptionGroup change was requested,
455+
// we can make a new Modify request
456+
if aws.BoolValue(cr.Spec.ForProvider.ApplyImmediately) {
457+
return false
458+
}
459+
return true
460+
case "pending-maintenance-removal":
461+
return false
462+
default: // "in-sync", "applying", "pending-apply", "pending-removal", "removing", "failed"
463+
return true
464+
}
465+
}
466+
}
467+
return false
468+
}
469+
return true
470+
}
471+
442472
func createPatch(out *svcsdk.DescribeDBInstancesOutput, target *svcapitypes.DBInstanceParameters) (*svcapitypes.DBInstanceParameters, error) {
443473
currentParams := &svcapitypes.DBInstanceParameters{}
444474
err := lateInitialize(currentParams, out)

0 commit comments

Comments
 (0)