@@ -82,36 +82,47 @@ func (r *Reconciler) SetWeight(desiredWeight int32, additionalDestinations ...v1
82
82
if err != nil || ! isFound {
83
83
return err
84
84
}
85
+ canaryService , err := getService (canaryServiceName , services )
86
+ if err != nil {
87
+ return err
88
+ }
89
+ err = unstructured .SetNestedField (canaryService , int64 (desiredWeight ), "weight" )
90
+ if err != nil {
91
+ return err
92
+ }
93
+ stableService , err := getService (stableServiceName , services )
94
+ if err != nil {
95
+ return err
96
+ }
97
+ err = unstructured .SetNestedField (stableService , int64 (100 - desiredWeight ), "weight" )
98
+ if err != nil {
99
+ return err
100
+ }
101
+ err = unstructured .SetNestedSlice (traefikService .Object , services , "spec" , "weighted" , "services" )
102
+ if err != nil {
103
+ return err
104
+ }
105
+ _ , err = r .Client .Update (ctx , traefikService , metav1.UpdateOptions {})
106
+ return err
107
+ }
108
+
109
+ func getService (serviceName string , services []interface {}) (map [string ]interface {}, error ) {
110
+ var selectedService map [string ]interface {}
85
111
for _ , service := range services {
86
112
typedService , ok := service .(map [string ]interface {})
87
113
if ! ok {
88
- return errors .New ("Failed type assertion setting weight for traefik service" )
114
+ return nil , errors .New ("Failed type assertion setting weight for traefik service" )
89
115
}
90
- serviceName , isFound , err := unstructured .NestedString (typedService , "name" )
116
+ nameOfCurrentService , isFound , err := unstructured .NestedString (typedService , "name" )
91
117
if err != nil || ! isFound {
92
- return err
118
+ return nil , err
93
119
}
94
- if serviceName == canaryServiceName {
95
- err := unstructured .SetNestedField (typedService , int64 (desiredWeight ), "weight" )
96
- if err != nil {
97
- return err
98
- }
99
- continue
120
+ if nameOfCurrentService == serviceName {
121
+ selectedService = typedService
122
+ break
100
123
}
101
- if serviceName == stableServiceName {
102
- err := unstructured .SetNestedField (typedService , int64 (100 - desiredWeight ), "weight" )
103
- if err != nil {
104
- return err
105
- }
106
- continue
107
- }
108
- }
109
- err = unstructured .SetNestedSlice (traefikService .Object , services , "spec" , "weighted" , "services" )
110
- if err != nil {
111
- return err
112
124
}
113
- _ , err = r .Client .Update (ctx , traefikService , metav1.UpdateOptions {})
114
- return err
125
+ return selectedService , nil
115
126
}
116
127
117
128
func (r * Reconciler ) VerifyWeight (desiredWeight int32 , additionalDestinations ... v1alpha1.WeightDestination ) (* bool , error ) {
@@ -129,37 +140,23 @@ func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations ..
129
140
if err != nil || ! isFound {
130
141
return & verifyingStatus , err
131
142
}
132
- for _ , service := range services {
133
- typedService , ok := service .(map [string ]interface {})
134
- if ! ok {
135
- return & verifyingStatus , errors .New ("Failed type assertion setting weight for traefik service" )
136
- }
137
- serviceName , isFound , err := unstructured .NestedString (typedService , "name" )
138
- if err != nil || ! isFound {
139
- return & verifyingStatus , err
140
- }
141
- if serviceName == canaryServiceName {
142
- verifyingStatus = false
143
- weight , isFound , err := unstructured .NestedInt64 (typedService , "weight" )
144
- if err != nil || ! isFound {
145
- return & verifyingStatus , err
146
- }
147
- verifyingStatus = weight == int64 (desiredWeight )
148
- if ! verifyingStatus {
149
- return & verifyingStatus , errors .New ("Traefik service weight for canary service is not right" )
150
- }
151
- }
152
- if serviceName == stableServiceName {
153
- verifyingStatus = false
154
- weight , isFound , err := unstructured .NestedInt64 (typedService , "weight" )
155
- if err != nil || ! isFound {
156
- return & verifyingStatus , err
157
- }
158
- verifyingStatus = weight == int64 (100 - desiredWeight )
159
- if ! verifyingStatus {
160
- return & verifyingStatus , errors .New ("Traefik service weight for canary service is not right" )
161
- }
162
- }
143
+ canaryService , err := getService (canaryServiceName , services )
144
+ if err != nil {
145
+ return & verifyingStatus , err
146
+ }
147
+ weight , isFound , err := unstructured .NestedInt64 (canaryService , "weight" )
148
+ verifyingStatus = weight == int64 (desiredWeight )
149
+ if err != nil || ! isFound || ! verifyingStatus {
150
+ return & verifyingStatus , err
151
+ }
152
+ stableService , err := getService (stableServiceName , services )
153
+ if err != nil {
154
+ return & verifyingStatus , err
155
+ }
156
+ weight , isFound , err = unstructured .NestedInt64 (stableService , "weight" )
157
+ verifyingStatus = weight == int64 (100 - desiredWeight )
158
+ if err != nil || ! isFound || ! verifyingStatus {
159
+ return & verifyingStatus , err
163
160
}
164
161
return & verifyingStatus , nil
165
162
}
0 commit comments