@@ -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+
442472func createPatch (out * svcsdk.DescribeDBInstancesOutput , target * svcapitypes.DBInstanceParameters ) (* svcapitypes.DBInstanceParameters , error ) {
443473 currentParams := & svcapitypes.DBInstanceParameters {}
444474 err := lateInitialize (currentParams , out )
0 commit comments