Skip to content

Commit 3652f5d

Browse files
fix: remove Source=user filter from parameter group reconciliation (#271)
`getParameters()` filtered DescribeDB(Cluster)Parameters by Source="user", but RDS classifies some user-set parameters as "engine-default" or "system" (e.g shared_preload_libraries, ssl). This caused a perpetual diff between desired and latest, preventing ACK.ResourceSynced from reaching True. The fix removes the Source filter and uses a predicate: include if key is in desiredParams (handles misclassification and params set to default values), otherwise include only if modifiable with a non-nil cached default that differs from the current value (detects removed params needing reset). ParamMeta now caches DefaultValue from DescribeEngineDefault(Cluster)Parameters. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 710b131 commit 3652f5d

File tree

11 files changed

+311
-36
lines changed

11 files changed

+311
-36
lines changed

apis/v1alpha1/ack-generate-metadata.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
ack_generate_info:
2-
build_date: "2026-02-08T20:56:03Z"
3-
build_hash: e743d683160cf0f58a4864e052cdcb0927335ca7
4-
go_version: go1.25.5
5-
version: v0.57.0
2+
build_date: "2026-02-09T04:13:29Z"
3+
build_hash: a297e8e69efb57539e353961c1b33a93e31307bf
4+
go_version: go1.25.6
5+
version: v0.57.0-2-ga297e8e
66
api_directory_checksum: a35626c9dd4783afbee4b0991d2ed63ab37f7444
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.32.6

pkg/resource/db_cluster_parameter_group/hooks.go

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,14 @@ func (rm *resourceManager) syncParameters(
258258
return nil
259259
}
260260

261-
// getParameters retrieves the cluster parameter group's user-defined parameters
262-
// (overrides) and the "statuses" of those parameter overrides.
261+
// getParameters retrieves parameters that are either in the desired spec or
262+
// differ from engine defaults. We don't filter by Source="user" because RDS
263+
// may classify user-set parameters as "engine-default" or "system".
263264
func (rm *resourceManager) getParameters(
264265
ctx context.Context,
265266
groupName *string,
267+
family *string,
268+
desiredParams util.Parameters,
266269
) (
267270
params map[string]*string,
268271
paramStatuses []*svcapitypes.Parameter,
@@ -275,7 +278,6 @@ func (rm *resourceManager) getParameters(
275278
ctx,
276279
&svcsdk.DescribeDBClusterParametersInput{
277280
DBClusterParameterGroupName: groupName,
278-
Source: aws.String(sourceUser),
279281
Marker: marker,
280282
},
281283
)
@@ -284,7 +286,22 @@ func (rm *resourceManager) getParameters(
284286
return nil, nil, err
285287
}
286288
for _, param := range resp.Parameters {
287-
params[*param.ParameterName] = param.ParameterValue
289+
pName := *param.ParameterName
290+
291+
_, inDesired := desiredParams[pName]
292+
if !inDesired {
293+
if family == nil {
294+
continue
295+
}
296+
if param.IsModifiable == nil || !*param.IsModifiable {
297+
continue
298+
}
299+
if !rm.paramDiffersFromDefault(ctx, *family, pName, param.ParameterValue) {
300+
continue
301+
}
302+
}
303+
304+
params[pName] = param.ParameterValue
288305
p := svcapitypes.Parameter{
289306
ParameterName: param.ParameterName,
290307
ParameterValue: param.ParameterValue,
@@ -301,6 +318,29 @@ func (rm *resourceManager) getParameters(
301318
return params, paramStatuses, nil
302319
}
303320

321+
func (rm *resourceManager) paramDiffersFromDefault(
322+
ctx context.Context,
323+
family string,
324+
paramName string,
325+
currentValue *string,
326+
) bool {
327+
pMeta, err := rm.getParameterMeta(ctx, family, paramName)
328+
if err != nil || pMeta.DefaultValue == nil {
329+
return false
330+
}
331+
return !stringPtrEqual(currentValue, pMeta.DefaultValue)
332+
}
333+
334+
func stringPtrEqual(a, b *string) bool {
335+
if a == nil && b == nil {
336+
return true
337+
}
338+
if a == nil || b == nil {
339+
return false
340+
}
341+
return *a == *b
342+
}
343+
304344
// resetParameters calls the RDS ResetDBClusterParameterGroup API call
305345
func (rm *resourceManager) resetParameters(
306346
ctx context.Context,
@@ -431,6 +471,7 @@ func (rm *resourceManager) getFamilyParameters(
431471
familyMeta[pName] = util.ParamMeta{
432472
IsModifiable: *param.IsModifiable,
433473
IsDynamic: *param.ApplyType != applyTypeStatic,
474+
DefaultValue: param.ParameterValue,
434475
}
435476
}
436477
marker = resp.EngineDefaults.Marker
@@ -469,6 +510,7 @@ func (rm *resourceManager) getInstanceFamilyParameters(
469510
familyMeta[pName] = util.ParamMeta{
470511
IsModifiable: *param.IsModifiable,
471512
IsDynamic: *param.ApplyType != applyTypeStatic,
513+
DefaultValue: param.ParameterValue,
472514
}
473515
}
474516
marker = resp.EngineDefaults.Marker

pkg/resource/db_cluster_parameter_group/sdk.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/resource/db_parameter_group/hooks.go

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,11 +256,14 @@ func (rm *resourceManager) syncParameters(
256256
return nil
257257
}
258258

259-
// getParameters retrieves the parameter group's user-defined parameters
260-
// (overrides) and the "statuses" of those parameter overrides.
259+
// getParameters retrieves parameters that are either in the desired spec or
260+
// differ from engine defaults. We don't filter by Source="user" because RDS
261+
// may classify user-set parameters as "engine-default" or "system".
261262
func (rm *resourceManager) getParameters(
262263
ctx context.Context,
263264
groupName *string,
265+
family *string,
266+
desiredParams util.Parameters,
264267
) (
265268
params map[string]*string,
266269
paramStatuses []*svcapitypes.Parameter,
@@ -273,7 +276,6 @@ func (rm *resourceManager) getParameters(
273276
ctx,
274277
&svcsdk.DescribeDBParametersInput{
275278
DBParameterGroupName: groupName,
276-
Source: aws.String(sourceUser),
277279
Marker: marker,
278280
},
279281
)
@@ -282,7 +284,22 @@ func (rm *resourceManager) getParameters(
282284
return nil, nil, err
283285
}
284286
for _, param := range resp.Parameters {
285-
params[*param.ParameterName] = param.ParameterValue
287+
pName := *param.ParameterName
288+
289+
_, inDesired := desiredParams[pName]
290+
if !inDesired {
291+
if family == nil {
292+
continue
293+
}
294+
if param.IsModifiable == nil || !*param.IsModifiable {
295+
continue
296+
}
297+
if !rm.paramDiffersFromDefault(ctx, *family, pName, param.ParameterValue) {
298+
continue
299+
}
300+
}
301+
302+
params[pName] = param.ParameterValue
286303
p := svcapitypes.Parameter{
287304
ParameterName: param.ParameterName,
288305
ParameterValue: param.ParameterValue,
@@ -299,6 +316,31 @@ func (rm *resourceManager) getParameters(
299316
return params, paramStatuses, nil
300317
}
301318

319+
func (rm *resourceManager) paramDiffersFromDefault(
320+
ctx context.Context,
321+
family string,
322+
paramName string,
323+
currentValue *string,
324+
) bool {
325+
pMeta, err := cachedParamMeta.Get(
326+
ctx, family, paramName, rm.getFamilyParameters,
327+
)
328+
if err != nil || pMeta.DefaultValue == nil {
329+
return false
330+
}
331+
return !stringPtrEqual(currentValue, pMeta.DefaultValue)
332+
}
333+
334+
func stringPtrEqual(a, b *string) bool {
335+
if a == nil && b == nil {
336+
return true
337+
}
338+
if a == nil || b == nil {
339+
return false
340+
}
341+
return *a == *b
342+
}
343+
302344
// resetParameters calls the RDS ResetDBParameterGroup API call with a set of
303345
// no more than 20 parameters to reset.
304346
func (rm *resourceManager) resetParameters(
@@ -436,6 +478,7 @@ func (rm *resourceManager) getFamilyParameters(
436478
familyMeta[pName] = util.ParamMeta{
437479
IsModifiable: *param.IsModifiable,
438480
IsDynamic: *param.ApplyType != applyTypeStatic,
481+
DefaultValue: param.ParameterValue,
439482
}
440483
}
441484
marker = resp.EngineDefaults.Marker

pkg/resource/db_parameter_group/sdk.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/util/parameter_cache.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
type ParamMeta struct {
2323
IsModifiable bool
2424
IsDynamic bool
25+
DefaultValue *string
2526
}
2627

2728
// MetaFetcher is the functor we pass to the paramMetaCache that allows it to
Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
if ko.Status.ACKResourceMetadata != nil && ko.Status.ACKResourceMetadata.ARN != nil {
2-
resourceARN := (*string)(ko.Status.ACKResourceMetadata.ARN)
3-
tags, err := rm.getTags(ctx, *resourceARN)
4-
if err != nil {
5-
return nil, err
6-
}
7-
ko.Spec.Tags = tags
8-
}
9-
if ko.Spec.Name != nil {
10-
groupName := ko.Spec.Name
11-
params, paramStatuses, err := rm.getParameters(ctx, groupName)
12-
if err != nil {
13-
return nil, err
14-
}
15-
ko.Spec.ParameterOverrides = params
16-
ko.Status.ParameterOverrideStatuses = paramStatuses
17-
}
1+
if ko.Status.ACKResourceMetadata != nil && ko.Status.ACKResourceMetadata.ARN != nil {
2+
resourceARN := (*string)(ko.Status.ACKResourceMetadata.ARN)
3+
tags, err := rm.getTags(ctx, *resourceARN)
4+
if err != nil {
5+
return nil, err
6+
}
7+
ko.Spec.Tags = tags
8+
}
9+
if ko.Spec.Name != nil {
10+
groupName := ko.Spec.Name
11+
family := ko.Spec.Family
12+
desiredParams := ko.Spec.ParameterOverrides
13+
params, paramStatuses, err := rm.getParameters(
14+
ctx, groupName, family, desiredParams,
15+
)
16+
if err != nil {
17+
return nil, err
18+
}
19+
ko.Spec.ParameterOverrides = params
20+
ko.Status.ParameterOverrideStatuses = paramStatuses
21+
}

templates/hooks/db_parameter_group/sdk_read_many_post_set_output.go.tpl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88
}
99
if ko.Spec.Name != nil {
1010
groupName := ko.Spec.Name
11-
params, paramStatuses, err := rm.getParameters(ctx, groupName)
11+
family := ko.Spec.Family
12+
desiredParams := ko.Spec.ParameterOverrides
13+
params, paramStatuses, err := rm.getParameters(
14+
ctx, groupName, family, desiredParams,
15+
)
1216
if err != nil {
1317
return nil, err
1418
}

test/e2e/db_cluster_parameter_group.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,21 @@ def get_parameters(db_cluster_parameter_group_name):
8080
"""
8181
c = boto3.client('rds')
8282
try:
83-
resp = c.describe_db_cluster_parameters(
84-
DBClusterParameterGroupName=db_cluster_parameter_group_name,
85-
)
86-
return resp['Parameters']
83+
all_parameters = []
84+
marker = None
85+
while True:
86+
params = {
87+
'DBClusterParameterGroupName': db_cluster_parameter_group_name,
88+
}
89+
if marker:
90+
params['Marker'] = marker
91+
resp = c.describe_db_cluster_parameters(**params)
92+
all_parameters.extend(resp['Parameters'])
93+
if 'Marker' in resp:
94+
marker = resp['Marker']
95+
else:
96+
break
97+
return all_parameters
8798
except c.exceptions.DBParameterGroupNotFoundFault:
8899
return []
89100

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: rds.services.k8s.aws/v1alpha1
2+
kind: DBClusterParameterGroup
3+
metadata:
4+
name: $DB_CLUSTER_PARAMETER_GROUP_NAME
5+
spec:
6+
name: $DB_CLUSTER_PARAMETER_GROUP_NAME
7+
description: $DB_CLUSTER_PARAMETER_GROUP_DESC
8+
family: aurora-postgresql14
9+
parameterOverrides:
10+
log_min_duration_statement: "1000"
11+
pgaudit.log: "none"
12+
rds.force_ssl: "1"
13+
rds.log_retention_period: "10080"
14+
shared_preload_libraries: "pg_stat_statements"
15+
ssl: "1"
16+
ssl_min_protocol_version: "TLSv1.2"

0 commit comments

Comments
 (0)