Skip to content

Commit f96e3ac

Browse files
authored
Support updating all parameters at once (#75)
Issue #, if available: `update-parameter-group` API has a maximum limitation to parameters update. Only 20 parameters are allowed to update at once. Description of changes: Add `for` loop for calling `update-parameter-group` API to update up to 20 parameters each time. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent f8a8023 commit f96e3ac

File tree

8 files changed

+207
-233
lines changed

8 files changed

+207
-233
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
ack_generate_info:
2-
build_date: "2023-03-13T22:29:26Z"
2+
build_date: "2023-03-16T17:00:50Z"
33
build_hash: 910a8e0744a99c5c87d8c1615926985215a60d8c
44
go_version: go1.19
55
version: v0.24.3
66
api_directory_checksum: 863961569e4c45d940e482713a85bac302b37d66
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.44.93
99
generator_config_info:
10-
file_checksum: c6f69226d010aa15f4ed3ac9f2b619bbdcdf798b
10+
file_checksum: dac41922c947186d4f3c532d8c4ddafa933faa2b
1111
original_file_name: generator.yaml
1212
last_modification:
1313
reason: API generation

apis/v1alpha1/generator.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,13 @@ resources:
312312
from:
313313
operation: DescribeParameters
314314
path: Parameters
315+
update_operation:
316+
custom_method_name: customUpdate
315317
hooks:
316318
sdk_read_many_post_set_output:
317319
template_path: hooks/parametergroup/sdk_read_many_post_set_output.go.tpl
318320
sdk_create_post_set_output:
319321
template_path: hooks/parametergroup/sdk_create_post_set_output.go.tpl
320-
sdk_update_post_set_output:
321-
template_path: hooks/parametergroup/sdk_update_post_set_output.go.tpl
322-
sdk_update_pre_build_request:
323-
template_path: hooks/parametergroup/sdk_update_pre_build_request.go.tpl
324322
renames:
325323
operations:
326324
CreateParameterGroup:

generator.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,13 @@ resources:
312312
from:
313313
operation: DescribeParameters
314314
path: Parameters
315+
update_operation:
316+
custom_method_name: customUpdate
315317
hooks:
316318
sdk_read_many_post_set_output:
317319
template_path: hooks/parametergroup/sdk_read_many_post_set_output.go.tpl
318320
sdk_create_post_set_output:
319321
template_path: hooks/parametergroup/sdk_create_post_set_output.go.tpl
320-
sdk_update_post_set_output:
321-
template_path: hooks/parametergroup/sdk_update_post_set_output.go.tpl
322-
sdk_update_pre_build_request:
323-
template_path: hooks/parametergroup/sdk_update_pre_build_request.go.tpl
324322
renames:
325323
operations:
326324
CreateParameterGroup:

pkg/resource/parameter_group/hooks.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ import (
2121
ackerr "github.com/aws-controllers-k8s/runtime/pkg/errors"
2222
ackrtlog "github.com/aws-controllers-k8s/runtime/pkg/runtime/log"
2323
svcsdk "github.com/aws/aws-sdk-go/service/memorydb"
24+
"github.com/samber/lo"
2425

2526
svcapitypes "github.com/aws-controllers-k8s/memorydb-controller/apis/v1alpha1"
2627
)
2728

29+
const (
30+
maxNumberOfParametersUpdate = 20
31+
)
32+
2833
func (rm *resourceManager) setParameters(
2934
ctx context.Context,
3035
ko *svcapitypes.ParameterGroup,
@@ -158,6 +163,117 @@ func (rm *resourceManager) resetAllParameters(
158163
return &resource{ko}, nil
159164
}
160165

166+
// customUpdate overrides sdkUpdate by custom logic
167+
func (rm *resourceManager) customUpdate(
168+
ctx context.Context,
169+
desired *resource,
170+
latest *resource,
171+
delta *ackcompare.Delta,
172+
) (updated *resource, err error) {
173+
rlog := ackrtlog.FromContext(ctx)
174+
exit := rlog.Trace("rm.customUpdate")
175+
defer func() {
176+
exit(err)
177+
}()
178+
if delta.DifferentAt("Spec.Tags") {
179+
err = rm.updateTags(ctx, desired, latest)
180+
if err != nil {
181+
return nil, err
182+
}
183+
}
184+
185+
if delta.DifferentAt("Spec.ParameterNameValues") {
186+
ko, err := rm.resetParameterGroup(ctx, desired, latest)
187+
188+
if ko != nil || err != nil {
189+
return ko, err
190+
}
191+
}
192+
193+
if !delta.DifferentExcept("Spec.Tags") {
194+
return desired, nil
195+
}
196+
197+
inputs := rm.updateRequestPayload(desired)
198+
199+
var resp *svcsdk.UpdateParameterGroupOutput
200+
201+
// Update 20 parameters each time
202+
for _, input := range inputs {
203+
resp, err = rm.sdkapi.UpdateParameterGroupWithContext(ctx, input)
204+
rm.metrics.RecordAPICall("UPDATE", "UpdateParameterGroup", err)
205+
if err != nil {
206+
return nil, err
207+
}
208+
}
209+
210+
// Merge in the information we read from the API call above to the copy of
211+
// the original Kubernetes object we passed to the function
212+
ko := desired.ko.DeepCopy()
213+
214+
if ko.Status.ACKResourceMetadata == nil {
215+
ko.Status.ACKResourceMetadata = &ackv1alpha1.ResourceMetadata{}
216+
}
217+
218+
if resp != nil {
219+
if resp.ParameterGroup.ARN != nil {
220+
arn := ackv1alpha1.AWSResourceName(*resp.ParameterGroup.ARN)
221+
ko.Status.ACKResourceMetadata.ARN = &arn
222+
}
223+
if resp.ParameterGroup.Description != nil {
224+
ko.Spec.Description = resp.ParameterGroup.Description
225+
} else {
226+
ko.Spec.Description = nil
227+
}
228+
if resp.ParameterGroup.Family != nil {
229+
ko.Spec.Family = resp.ParameterGroup.Family
230+
} else {
231+
ko.Spec.Family = nil
232+
}
233+
if resp.ParameterGroup.Name != nil {
234+
ko.Spec.Name = resp.ParameterGroup.Name
235+
} else {
236+
ko.Spec.Name = nil
237+
}
238+
}
239+
240+
rm.setStatusDefaults(ko)
241+
ko, err = rm.setParameters(ctx, ko)
242+
243+
if err != nil {
244+
return nil, err
245+
}
246+
return &resource{ko}, nil
247+
}
248+
249+
// updateRequestPayload returns an array of SDK-specific struct for the HTTP request
250+
// payload of the Update API call for the resource
251+
// each element in return value has maximum 20 parameters
252+
func (rm *resourceManager) updateRequestPayload(
253+
desired *resource,
254+
) []*svcsdk.UpdateParameterGroupInput {
255+
parameterNameValues := lo.Chunk(desired.ko.Spec.ParameterNameValues, maxNumberOfParametersUpdate)
256+
return lo.Map(parameterNameValues, func(parameters []*svcapitypes.ParameterNameValue, index int) *svcsdk.UpdateParameterGroupInput {
257+
res := &svcsdk.UpdateParameterGroupInput{}
258+
if desired.ko.Spec.Name != nil {
259+
res.SetParameterGroupName(*desired.ko.Spec.Name)
260+
}
261+
f1 := []*svcsdk.ParameterNameValue{}
262+
for _, f1iter := range parameters {
263+
f1elem := &svcsdk.ParameterNameValue{}
264+
if f1iter.ParameterName != nil {
265+
f1elem.SetParameterName(*f1iter.ParameterName)
266+
}
267+
if f1iter.ParameterValue != nil {
268+
f1elem.SetParameterValue(*f1iter.ParameterValue)
269+
}
270+
f1 = append(f1, f1elem)
271+
}
272+
res.SetParameterNameValues(f1)
273+
return res
274+
})
275+
}
276+
161277
// getTags gets tags from given ParameterGroup.
162278
func (rm *resourceManager) getTags(
163279
ctx context.Context,

pkg/resource/parameter_group/sdk.go

Lines changed: 2 additions & 101 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

templates/hooks/parametergroup/sdk_update_post_set_output.go.tpl

Lines changed: 0 additions & 5 deletions
This file was deleted.

templates/hooks/parametergroup/sdk_update_pre_build_request.go.tpl

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)