@@ -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+
2833func (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.
162278func (rm * resourceManager ) getTags (
163279 ctx context.Context ,
0 commit comments