/
custom_update_api.go
121 lines (114 loc) · 4.66 KB
/
custom_update_api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package cache_parameter_group
import (
"context"
svcapitypes "github.com/aws-controllers-k8s/elasticache-controller/apis/v1alpha1"
ackcompare "github.com/aws-controllers-k8s/runtime/pkg/compare"
)
// Implements specialized logic for update CacheParameterGroup.
func (rm *resourceManager) customUpdateCacheParameterGroup(
ctx context.Context,
desired *resource,
latest *resource,
delta *ackcompare.Delta,
) (*resource, error) {
desiredParameters := desired.ko.Spec.ParameterNameValues
latestParameters := latest.ko.Spec.ParameterNameValues
updated := false
var err error
// Update
if (desiredParameters == nil || len(desiredParameters) == 0) &&
(latestParameters != nil && len(latestParameters) > 0) {
updated, err = rm.resetAllParameters(ctx, desired)
if !updated || err != nil {
return nil, err
}
} else {
removedParameters, modifiedParameters, addedParameters := rm.provideDelta(desiredParameters, latestParameters)
if removedParameters != nil && len(removedParameters) > 0 {
updated, err = rm.resetParameters(ctx, desired, removedParameters)
if !updated || err != nil {
return nil, err
}
}
if modifiedParameters != nil && len(modifiedParameters) > 0 {
updated, err = rm.saveParameters(ctx, desired, modifiedParameters)
if !updated || err != nil {
return nil, err
}
}
if addedParameters != nil && len(addedParameters) > 0 {
updated, err = rm.saveParameters(ctx, desired, addedParameters)
if !updated || err != nil {
return nil, err
}
}
}
if updated {
rm.setStatusDefaults(latest.ko)
// Populate latest.ko.Spec.ParameterNameValues with latest parameter values
// Populate latest.ko.Status.Parameters with latest detailed parameters
error := rm.customSetOutputDescribeCacheParameters(ctx, desired.ko.Spec.CacheParameterGroupName, latest.ko)
if error != nil {
return nil, error
}
}
return latest, nil
}
// provideDelta compares given desired and latest Parameters and returns
// removedParameters, modifiedParameters, addedParameters
func (rm *resourceManager) provideDelta(
desiredParameters []*svcapitypes.ParameterNameValue,
latestParameters []*svcapitypes.ParameterNameValue,
) ([]*svcapitypes.ParameterNameValue, []*svcapitypes.ParameterNameValue, []*svcapitypes.ParameterNameValue) {
desiredPametersMap := map[string]*svcapitypes.ParameterNameValue{}
for _, parameter := range desiredParameters {
p := *parameter
desiredPametersMap[*p.ParameterName] = &p
}
latestPametersMap := map[string]*svcapitypes.ParameterNameValue{}
for _, parameter := range latestParameters {
p := *parameter
latestPametersMap[*p.ParameterName] = &p
}
removedParameters := []*svcapitypes.ParameterNameValue{} // available in latest but not found in desired
modifiedParameters := []*svcapitypes.ParameterNameValue{} // available in both desired, latest but values differ
addedParameters := []*svcapitypes.ParameterNameValue{} // available in desired but not found in latest
for latestParameterName, latestParameterNameValue := range latestPametersMap {
desiredParameterNameValue, found := desiredPametersMap[latestParameterName]
if found && desiredParameterNameValue != nil &&
desiredParameterNameValue.ParameterValue != nil && *desiredParameterNameValue.ParameterValue != "" {
if *desiredParameterNameValue.ParameterValue != *latestParameterNameValue.ParameterValue {
// available in both desired, latest but values differ
modified := *desiredParameterNameValue
modifiedParameters = append(modifiedParameters, &modified)
}
} else {
// available in latest but not found in desired
removed := *latestParameterNameValue
removedParameters = append(removedParameters, &removed)
}
}
for desiredParameterName, desiredParameterNameValue := range desiredPametersMap {
_, found := latestPametersMap[desiredParameterName]
if !found && desiredParameterNameValue != nil {
// available in desired but not found in latest
added := *desiredParameterNameValue
if added.ParameterValue != nil && *added.ParameterValue != "" {
addedParameters = append(addedParameters, &added)
}
}
}
return removedParameters, modifiedParameters, addedParameters
}