Skip to content
This repository was archived by the owner on May 24, 2023. It is now read-only.

Commit d19d549

Browse files
committed
Add support for updating ExtraLabels
1 parent ad81ccf commit d19d549

File tree

2 files changed

+271
-4
lines changed

2 files changed

+271
-4
lines changed

pkg/controller/nginxingresscontroller/service.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package nginxingresscontroller
22

33
import (
4+
"reflect"
5+
46
k8sv1alpha1 "github.com/nginxinc/nginx-ingress-operator/pkg/apis/k8s/v1alpha1"
57
corev1 "k8s.io/api/core/v1"
68
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -47,10 +49,21 @@ func serviceForNginxIngressController(instance *k8sv1alpha1.NginxIngressControll
4749
}
4850

4951
func hasServiceChanged(svc *corev1.Service, instance *k8sv1alpha1.NginxIngressController) bool {
50-
return svc.Spec.Type != corev1.ServiceType(instance.Spec.ServiceType)
52+
if svc.Spec.Type != corev1.ServiceType(instance.Spec.ServiceType) {
53+
return true
54+
}
55+
if instance.Spec.Service != nil && !reflect.DeepEqual(svc.Labels, instance.Spec.Service.ExtraLabels) {
56+
return true
57+
}
58+
return svc.Labels != nil && instance.Spec.Service == nil
5159
}
5260

5361
func updateService(svc *corev1.Service, instance *k8sv1alpha1.NginxIngressController) *corev1.Service {
5462
svc.Spec.Type = corev1.ServiceType(instance.Spec.ServiceType)
63+
if instance.Spec.Service != nil {
64+
svc.Labels = instance.Spec.Service.ExtraLabels
65+
} else {
66+
svc.Labels = nil
67+
}
5568
return svc
5669
}

pkg/controller/nginxingresscontroller/service_test.go

+257-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
func TestServiceForNginxIngressController(t *testing.T) {
1414
name := "my-service"
1515
namespace := "my-nginx-ingress"
16-
serviceType := "LoadBalancer"
1716
extraLabels := map[string]string{"app": "my-nginx-ingress"}
1817

1918
instance := &k8sv1alpha1.NginxIngressController{
@@ -23,7 +22,7 @@ func TestServiceForNginxIngressController(t *testing.T) {
2322
Labels: extraLabels,
2423
},
2524
Spec: k8sv1alpha1.NginxIngressControllerSpec{
26-
ServiceType: serviceType,
25+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
2726
Service: &k8sv1alpha1.Service{
2827
ExtraLabels: extraLabels,
2928
},
@@ -57,7 +56,7 @@ func TestServiceForNginxIngressController(t *testing.T) {
5756
},
5857
},
5958
Selector: map[string]string{"app": instance.Name},
60-
Type: corev1.ServiceType(serviceType),
59+
Type: corev1.ServiceTypeLoadBalancer,
6160
},
6261
}
6362

@@ -66,3 +65,258 @@ func TestServiceForNginxIngressController(t *testing.T) {
6665
t.Errorf("serviceForNginxIngressController() mismatch (-want +got):\n%s", diff)
6766
}
6867
}
68+
69+
func TestHasServiceChanged(t *testing.T) {
70+
name := "my-service"
71+
namespace := "my-nginx-ingress"
72+
extraLabels := map[string]string{"app": "my-nginx-ingress"}
73+
74+
tests := []struct {
75+
svc *corev1.Service
76+
instance *k8sv1alpha1.NginxIngressController
77+
expected bool
78+
msg string
79+
}{
80+
{
81+
&corev1.Service{
82+
ObjectMeta: v1.ObjectMeta{
83+
Name: name,
84+
Namespace: namespace,
85+
},
86+
Spec: corev1.ServiceSpec{
87+
Type: corev1.ServiceTypeLoadBalancer,
88+
},
89+
},
90+
&k8sv1alpha1.NginxIngressController{
91+
ObjectMeta: v1.ObjectMeta{
92+
Name: name,
93+
Namespace: namespace,
94+
},
95+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
96+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
97+
},
98+
},
99+
false,
100+
"no changes",
101+
},
102+
{
103+
&corev1.Service{
104+
ObjectMeta: v1.ObjectMeta{
105+
Name: name,
106+
Namespace: namespace,
107+
},
108+
Spec: corev1.ServiceSpec{
109+
Type: corev1.ServiceTypeLoadBalancer,
110+
},
111+
},
112+
&k8sv1alpha1.NginxIngressController{
113+
ObjectMeta: v1.ObjectMeta{
114+
Name: name,
115+
Namespace: namespace,
116+
},
117+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
118+
ServiceType: "NodePort",
119+
},
120+
},
121+
true,
122+
"different service type",
123+
},
124+
{
125+
&corev1.Service{
126+
ObjectMeta: v1.ObjectMeta{
127+
Name: name,
128+
Namespace: namespace,
129+
Labels: extraLabels,
130+
},
131+
Spec: corev1.ServiceSpec{
132+
Type: corev1.ServiceTypeLoadBalancer,
133+
},
134+
},
135+
&k8sv1alpha1.NginxIngressController{
136+
ObjectMeta: v1.ObjectMeta{
137+
Name: name,
138+
Namespace: namespace,
139+
},
140+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
141+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
142+
Service: &k8sv1alpha1.Service{
143+
ExtraLabels: map[string]string{"new": "label"},
144+
},
145+
},
146+
},
147+
true,
148+
"different label",
149+
},
150+
{
151+
&corev1.Service{
152+
ObjectMeta: v1.ObjectMeta{
153+
Name: name,
154+
Namespace: namespace,
155+
Labels: extraLabels,
156+
},
157+
Spec: corev1.ServiceSpec{
158+
Type: corev1.ServiceTypeLoadBalancer,
159+
},
160+
},
161+
&k8sv1alpha1.NginxIngressController{
162+
ObjectMeta: v1.ObjectMeta{
163+
Name: name,
164+
Namespace: namespace,
165+
},
166+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
167+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
168+
Service: &k8sv1alpha1.Service{
169+
ExtraLabels: nil,
170+
},
171+
},
172+
},
173+
true,
174+
"remove label",
175+
},
176+
{
177+
&corev1.Service{
178+
ObjectMeta: v1.ObjectMeta{
179+
Name: name,
180+
Namespace: namespace,
181+
Labels: extraLabels,
182+
},
183+
Spec: corev1.ServiceSpec{
184+
Type: corev1.ServiceTypeLoadBalancer,
185+
},
186+
},
187+
&k8sv1alpha1.NginxIngressController{
188+
ObjectMeta: v1.ObjectMeta{
189+
Name: name,
190+
Namespace: namespace,
191+
},
192+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
193+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
194+
},
195+
},
196+
true,
197+
"remove service parameters",
198+
},
199+
}
200+
for _, test := range tests {
201+
result := hasServiceChanged(test.svc, test.instance)
202+
if result != test.expected {
203+
t.Errorf("hasServiceChanged() = %v, want %v for the case of %v", result, test.expected, test.msg)
204+
}
205+
}
206+
}
207+
208+
func TestUpdateService(t *testing.T) {
209+
name := "my-service"
210+
namespace := "my-nginx-ingress"
211+
extraLabels := map[string]string{"app": "my-nginx-ingress"}
212+
213+
tests := []struct {
214+
svc *corev1.Service
215+
instance *k8sv1alpha1.NginxIngressController
216+
expected *corev1.Service
217+
msg string
218+
}{
219+
{
220+
&corev1.Service{
221+
ObjectMeta: v1.ObjectMeta{
222+
Name: name,
223+
Namespace: namespace,
224+
},
225+
Spec: corev1.ServiceSpec{
226+
Type: corev1.ServiceTypeLoadBalancer,
227+
},
228+
},
229+
&k8sv1alpha1.NginxIngressController{
230+
ObjectMeta: v1.ObjectMeta{
231+
Name: name,
232+
Namespace: namespace,
233+
},
234+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
235+
ServiceType: string(corev1.ServiceTypeNodePort),
236+
},
237+
},
238+
&corev1.Service{
239+
ObjectMeta: v1.ObjectMeta{
240+
Name: name,
241+
Namespace: namespace,
242+
},
243+
Spec: corev1.ServiceSpec{
244+
Type: corev1.ServiceTypeNodePort,
245+
},
246+
},
247+
"override service type",
248+
},
249+
{
250+
&corev1.Service{
251+
ObjectMeta: v1.ObjectMeta{
252+
Name: name,
253+
Namespace: namespace,
254+
Labels: map[string]string{"my": "labelToBeOverridden"},
255+
},
256+
Spec: corev1.ServiceSpec{
257+
Type: corev1.ServiceTypeLoadBalancer,
258+
},
259+
},
260+
&k8sv1alpha1.NginxIngressController{
261+
ObjectMeta: v1.ObjectMeta{
262+
Name: name,
263+
Namespace: namespace,
264+
},
265+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
266+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
267+
Service: &k8sv1alpha1.Service{
268+
ExtraLabels: extraLabels,
269+
},
270+
},
271+
},
272+
&corev1.Service{
273+
ObjectMeta: v1.ObjectMeta{
274+
Name: name,
275+
Namespace: namespace,
276+
Labels: extraLabels,
277+
},
278+
Spec: corev1.ServiceSpec{
279+
Type: corev1.ServiceTypeLoadBalancer,
280+
},
281+
},
282+
"override labels",
283+
},
284+
{
285+
&corev1.Service{
286+
ObjectMeta: v1.ObjectMeta{
287+
Name: name,
288+
Namespace: namespace,
289+
Labels: map[string]string{"my": "labelToBeRemoved"},
290+
},
291+
Spec: corev1.ServiceSpec{
292+
Type: corev1.ServiceTypeLoadBalancer,
293+
},
294+
},
295+
&k8sv1alpha1.NginxIngressController{
296+
ObjectMeta: v1.ObjectMeta{
297+
Name: name,
298+
Namespace: namespace,
299+
},
300+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
301+
ServiceType: string(corev1.ServiceTypeLoadBalancer),
302+
},
303+
},
304+
&corev1.Service{
305+
ObjectMeta: v1.ObjectMeta{
306+
Name: name,
307+
Namespace: namespace,
308+
},
309+
Spec: corev1.ServiceSpec{
310+
Type: corev1.ServiceTypeLoadBalancer,
311+
},
312+
},
313+
"remove labels",
314+
},
315+
}
316+
for _, test := range tests {
317+
result := updateService(test.svc, test.instance)
318+
if diff := cmp.Diff(test.expected, result); diff != "" {
319+
t.Errorf("updateService() mismatch for the case of %v (-want +got):\n%s", test.msg, diff)
320+
}
321+
}
322+
}

0 commit comments

Comments
 (0)