Skip to content

Commit c377d22

Browse files
committed
parameters fix
1 parent bddf05b commit c377d22

File tree

1 file changed

+79
-7
lines changed
  • pkg/resource/db_cluster_parameter_group

1 file changed

+79
-7
lines changed

pkg/resource/db_cluster_parameter_group/hooks.go

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,17 @@ const (
3737
)
3838

3939
var (
40-
// cache of parameter defaults
40+
// cache of parameter defaults for cluster parameters
4141
cachedParamMeta = util.ParamMetaCache{
4242
Cache: map[string]map[string]util.ParamMeta{},
4343
}
4444

45+
// cache of parameter defaults for instance parameters
46+
// Used as fallback when cluster parameter validation fails
47+
instanceParamMeta = util.ParamMetaCache{
48+
Cache: map[string]map[string]util.ParamMeta{},
49+
}
50+
4551
errParameterGroupJustCreated = fmt.Errorf("parameter group just got created")
4652
requeueWaitWhileCreating = ackrequeue.NeededAfter(
4753
errParameterGroupJustCreated,
@@ -208,6 +214,11 @@ func sdkTagsFromResourceTags(
208214
// RDS does not have a DeleteParameter or DeleteParameterFromParameterGroup API
209215
// call. Instead, you need to call ResetDBClusterParameterGroup with a list of
210216
// DB Cluster Parameters that you want RDS to reset to a default value.
217+
//
218+
// Note: This function uses fallback parameter validation to work around an AWS API
219+
// limitation where DescribeEngineDefaultClusterParameters may not return all valid
220+
// cluster parameters (e.g., MySQL logging parameters like slow_query_log). See
221+
// getParameterMeta() for details on the fallback mechanism.
211222
func (rm *resourceManager) syncParameters(
212223
ctx context.Context,
213224
desired *resource,
@@ -307,9 +318,7 @@ func (rm *resourceManager) resetParameters(
307318
// default to this if something goes wrong looking up parameter
308319
// defaults
309320
applyMethod := svcsdktypes.ApplyMethodImmediate
310-
pMeta, err = cachedParamMeta.Get(
311-
ctx, *family, paramName, rm.getFamilyParameters,
312-
)
321+
pMeta, err = rm.getParameterMeta(ctx, *family, paramName)
313322
if err != nil {
314323
return err
315324
}
@@ -360,9 +369,7 @@ func (rm *resourceManager) modifyParameters(
360369
for paramName, paramValue := range toModify {
361370
// default to "immediate" if something goes wrong looking up defaults
362371
applyMethod := svcsdktypes.ApplyMethodImmediate
363-
pMeta, err = cachedParamMeta.Get(
364-
ctx, *family, paramName, rm.getFamilyParameters,
365-
)
372+
pMeta, err = rm.getParameterMeta(ctx, *family, paramName)
366373
if err != nil {
367374
return err
368375
}
@@ -433,3 +440,68 @@ func (rm *resourceManager) getFamilyParameters(
433440
}
434441
return familyMeta, nil
435442
}
443+
444+
// getInstanceFamilyParameters calls the RDS DescribeEngineDefaultParameters API to
445+
// retrieve the set of parameter information for a DB instance parameter group family.
446+
// This is used as a fallback when cluster parameter validation fails, as some valid
447+
// cluster parameters may only be listed in the instance parameter defaults.
448+
func (rm *resourceManager) getInstanceFamilyParameters(
449+
ctx context.Context,
450+
family string,
451+
) (map[string]util.ParamMeta, error) {
452+
var marker *string
453+
familyMeta := map[string]util.ParamMeta{}
454+
455+
for {
456+
resp, err := rm.sdkapi.DescribeEngineDefaultParameters(
457+
ctx,
458+
&svcsdk.DescribeEngineDefaultParametersInput{
459+
DBParameterGroupFamily: aws.String(family),
460+
Marker: marker,
461+
},
462+
)
463+
rm.metrics.RecordAPICall("GET", "DescribeEngineDefaultParameters", err)
464+
if err != nil {
465+
return nil, err
466+
}
467+
for _, param := range resp.EngineDefaults.Parameters {
468+
pName := *param.ParameterName
469+
familyMeta[pName] = util.ParamMeta{
470+
IsModifiable: *param.IsModifiable,
471+
IsDynamic: *param.ApplyType != applyTypeStatic,
472+
}
473+
}
474+
marker = resp.EngineDefaults.Marker
475+
if marker == nil {
476+
break
477+
}
478+
}
479+
return familyMeta, nil
480+
}
481+
482+
// getParameterMeta retrieves parameter metadata with fallback validation.
483+
// First tries cluster-level parameter validation, then falls back to instance-level
484+
// validation if the parameter is not found. This works around the AWS API limitation
485+
// where DescribeEngineDefaultClusterParameters may not return all valid cluster
486+
// parameters (e.g., MySQL logging parameters like slow_query_log).
487+
func (rm *resourceManager) getParameterMeta(
488+
ctx context.Context,
489+
family string,
490+
paramName string,
491+
) (*util.ParamMeta, error) {
492+
// Try cluster-level parameters first
493+
pMeta, err := cachedParamMeta.Get(ctx, family, paramName, rm.getFamilyParameters)
494+
if err == nil {
495+
return pMeta, nil
496+
}
497+
498+
// If not found in cluster parameters, try instance-level parameters
499+
// Some valid cluster parameters may only be listed in instance defaults
500+
instanceMeta, instanceErr := instanceParamMeta.Get(ctx, family, paramName, rm.getInstanceFamilyParameters)
501+
if instanceErr == nil {
502+
return instanceMeta, nil
503+
}
504+
505+
// Return original error if not found in either
506+
return nil, err
507+
}

0 commit comments

Comments
 (0)