@@ -15,6 +15,7 @@ package replication_group
1515
1616import (
1717 "context"
18+ svcapitypes "github.com/aws-controllers-k8s/elasticache-controller/apis/v1alpha1"
1819
1920 svcsdk "github.com/aws/aws-sdk-go/service/elasticache"
2021)
@@ -35,8 +36,7 @@ func (rm *resourceManager) updateSpecFields(
3536 }
3637 // populate relevant ko.Spec fields with observed state of respRG.NodeGroups
3738 setReplicasPerNodeGroup (respRG , resource )
38-
39- //TODO: set Spec NodeGroupConfiguration
39+ setNodeGroupConfiguration (respRG , resource )
4040
4141 // updating some Spec fields requires a DescribeCacheClusters call
4242 latestCacheCluster , err := rm .describeCacheCluster (ctx , resource )
@@ -47,6 +47,50 @@ func (rm *resourceManager) updateSpecFields(
4747 }
4848}
4949
50+ // if NodeGroupConfiguration was given in the desired.Spec, update ko.Spec with the latest observed value
51+ func setNodeGroupConfiguration (
52+ respRG * svcsdk.ReplicationGroup ,
53+ resource * resource ,
54+ ) {
55+ ko := resource .ko
56+ if respRG .NodeGroups != nil && ko .Spec .NodeGroupConfiguration != nil {
57+ nodeGroupConfigurations := []* svcapitypes.NodeGroupConfiguration {}
58+ for _ , nodeGroup := range respRG .NodeGroups {
59+ nodeGroupConfiguration := & svcapitypes.NodeGroupConfiguration {}
60+
61+ if nodeGroup .NodeGroupId != nil {
62+ nodeGroupConfiguration .NodeGroupID = nodeGroup .NodeGroupId
63+ }
64+ replicaAZs := []* string {}
65+
66+ for _ , nodeGroupMember := range nodeGroup .NodeGroupMembers {
67+ if nodeGroupMember .CurrentRole != nil && * nodeGroupMember .CurrentRole == "primary" {
68+ nodeGroupConfiguration .PrimaryAvailabilityZone = nodeGroupMember .PreferredAvailabilityZone
69+ }
70+
71+ // In this case we cannot say what is primary AZ and replica AZ.
72+ if nodeGroupMember .CurrentRole == nil && nodeGroupConfiguration .PrimaryAvailabilityZone == nil {
73+ // We cannot determine the correct AZ so we would use the first node group member as primary
74+ nodeGroupConfiguration .PrimaryAvailabilityZone = nodeGroupMember .PreferredAvailabilityZone
75+ }
76+
77+ if nodeGroupConfiguration .PrimaryAvailabilityZone != nil || * nodeGroupMember .CurrentRole == "replica" {
78+ replicaAZs = append (replicaAZs , nodeGroupMember .PreferredAvailabilityZone )
79+ }
80+ }
81+
82+ if len (replicaAZs ) > 0 {
83+ nodeGroupConfiguration .ReplicaAvailabilityZones = replicaAZs
84+ }
85+
86+ replicaCount := int64 (len (replicaAZs ))
87+ nodeGroupConfiguration .ReplicaCount = & replicaCount
88+ }
89+
90+ ko .Spec .NodeGroupConfiguration = nodeGroupConfigurations
91+ }
92+ }
93+
5094//TODO: for all the fields here, reevaluate if the latest observed state should always be populated,
5195// even if the corresponding field was not specified in desired
5296
0 commit comments