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

Commit 8e21f19

Browse files
authored
Fix replicas and service to be optional fields
* Replicas now get set to a default of 1 when not set
1 parent 6a83855 commit 8e21f19

File tree

4 files changed

+175
-1
lines changed

4 files changed

+175
-1
lines changed

deploy/crds/k8s.nginx.org_nginxingresscontrollers_crd.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ spec:
195195
description: The number of replicas of the Ingress Controller pod. The
196196
default is 1. Only applies if the type is set to deployment.
197197
format: int32
198+
nullable: true
198199
type: integer
199200
reportIngressStatus:
200201
description: Update the address field in the status of Ingresses resources.
@@ -222,6 +223,7 @@ spec:
222223
type: object
223224
service:
224225
description: The service of the Ingress controller.
226+
nullable: true
225227
properties:
226228
extraLabels:
227229
additionalProperties:

pkg/apis/k8s/v1alpha1/nginxingresscontroller_types.go

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type NginxIngressControllerSpec struct {
2020
Image Image `json:"image"`
2121
// The number of replicas of the Ingress Controller pod. The default is 1. Only applies if the type is set to deployment.
2222
// +kubebuilder:validation:Optional
23+
// +nullable
2324
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
2425
Replicas *int32 `json:"replicas"`
2526
// The TLS Secret for TLS termination of the default server. The format is namespace/name.
@@ -55,6 +56,7 @@ type NginxIngressControllerSpec struct {
5556
IngressClass string `json:"ingressClass"`
5657
// The service of the Ingress controller.
5758
// +kubebuilder:validation:Optional
59+
// +nullable
5860
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
5961
Service *Service `json:"service"`
6062
// Ignore Ingress resources without the “kubernetes.io/ingress.class” annotation.

pkg/controller/nginxingresscontroller/deployment.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ func deploymentForNginxIngressController(instance *k8sv1alpha1.NginxIngressContr
8282
}
8383

8484
func hasDeploymentChanged(dep *appsv1.Deployment, instance *k8sv1alpha1.NginxIngressController) bool {
85-
if dep.Spec.Replicas != nil && instance.Spec.Replicas != nil && *dep.Spec.Replicas != *instance.Spec.Replicas {
85+
defaultReplicaCount := int32(1)
86+
if dep.Spec.Replicas != nil && instance.Spec.Replicas == nil && *dep.Spec.Replicas != defaultReplicaCount ||
87+
dep.Spec.Replicas != nil && instance.Spec.Replicas != nil && *dep.Spec.Replicas != *instance.Spec.Replicas {
8688
return true
8789
}
8890

@@ -101,6 +103,11 @@ func hasDeploymentChanged(dep *appsv1.Deployment, instance *k8sv1alpha1.NginxIng
101103

102104
func updateDeployment(dep *appsv1.Deployment, instance *k8sv1alpha1.NginxIngressController) *appsv1.Deployment {
103105
dep.Spec.Replicas = instance.Spec.Replicas
106+
if instance.Spec.Replicas == nil {
107+
defaultReplicaCount := new(int32)
108+
*defaultReplicaCount = 1
109+
dep.Spec.Replicas = defaultReplicaCount
110+
}
104111
dep.Spec.Template.Spec.Containers[0].Image = generateImage(instance.Spec.Image.Repository, instance.Spec.Image.Tag)
105112
dep.Spec.Template.Spec.Containers[0].Args = generatePodArgs(instance)
106113
return dep

pkg/controller/nginxingresscontroller/deployment_test.go

+163
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,166 @@ func TestDeploymentForNginxIngressController(t *testing.T) {
9999
t.Errorf("deploymentForNginxIngressController(%+v) returned %+v but expected %+v", instance, result, expected)
100100
}
101101
}
102+
103+
func TestHasDeploymentChanged(t *testing.T) {
104+
runAsUser := new(int64)
105+
allowPrivilegeEscalation := new(bool)
106+
*runAsUser = 101
107+
*allowPrivilegeEscalation = true
108+
replicas := new(int32)
109+
*replicas = 1
110+
111+
instance := &k8sv1alpha1.NginxIngressController{
112+
ObjectMeta: metav1.ObjectMeta{
113+
Name: "my-nginx-ingress-controller",
114+
Namespace: "my-nginx-ingress-controller",
115+
},
116+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
117+
Image: k8sv1alpha1.Image{
118+
Repository: "nginx-ingress",
119+
Tag: "edge",
120+
},
121+
Replicas: replicas,
122+
},
123+
}
124+
125+
defaultDeployment := &appsv1.Deployment{
126+
ObjectMeta: metav1.ObjectMeta{
127+
Name: "my-nginx-ingress-controller",
128+
Namespace: "my-nginx-ingress-controller",
129+
},
130+
Spec: appsv1.DeploymentSpec{
131+
Replicas: replicas,
132+
Template: corev1.PodTemplateSpec{
133+
ObjectMeta: v1.ObjectMeta{
134+
Name: "my-nginx-ingress-controller",
135+
Namespace: "my-nginx-ingress-controller",
136+
},
137+
Spec: corev1.PodSpec{
138+
Containers: []corev1.Container{
139+
{
140+
Name: "my-nginx-ingress-controller",
141+
Image: "nginx-ingress:edge",
142+
Args: generatePodArgs(instance),
143+
},
144+
},
145+
},
146+
},
147+
},
148+
}
149+
150+
tenReplicas := int32(10)
151+
152+
tests := []struct {
153+
deployment *appsv1.Deployment
154+
instance *k8sv1alpha1.NginxIngressController
155+
expected bool
156+
msg string
157+
}{
158+
{
159+
deployment: defaultDeployment,
160+
instance: instance,
161+
expected: false,
162+
msg: "no changes",
163+
},
164+
{
165+
deployment: defaultDeployment,
166+
instance: &k8sv1alpha1.NginxIngressController{
167+
ObjectMeta: metav1.ObjectMeta{
168+
Name: "my-nginx-ingress-controller",
169+
Namespace: "my-nginx-ingress-controller",
170+
},
171+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
172+
Image: k8sv1alpha1.Image{
173+
Repository: "nginx-ingress",
174+
Tag: "edge",
175+
},
176+
Replicas: &tenReplicas,
177+
},
178+
},
179+
expected: true,
180+
msg: "replicas increased",
181+
},
182+
{
183+
deployment: &appsv1.Deployment{
184+
ObjectMeta: metav1.ObjectMeta{
185+
Name: "my-nginx-ingress-controller",
186+
Namespace: "my-nginx-ingress-controller",
187+
},
188+
Spec: appsv1.DeploymentSpec{
189+
Replicas: &tenReplicas, // Deployment with 10 replicas
190+
Template: corev1.PodTemplateSpec{
191+
ObjectMeta: v1.ObjectMeta{
192+
Name: "my-nginx-ingress-controller",
193+
Namespace: "my-nginx-ingress-controller",
194+
},
195+
Spec: corev1.PodSpec{
196+
Containers: []corev1.Container{
197+
{
198+
Name: "my-nginx-ingress-controller",
199+
Image: "nginx-ingress:edge",
200+
Args: generatePodArgs(instance),
201+
},
202+
},
203+
},
204+
},
205+
},
206+
},
207+
instance: &k8sv1alpha1.NginxIngressController{
208+
ObjectMeta: metav1.ObjectMeta{
209+
Name: "my-nginx-ingress-controller",
210+
Namespace: "my-nginx-ingress-controller",
211+
},
212+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
213+
Image: k8sv1alpha1.Image{
214+
Repository: "nginx-ingress",
215+
Tag: "edge",
216+
},
217+
},
218+
},
219+
expected: true,
220+
msg: "replicas field removed",
221+
},
222+
{
223+
deployment: defaultDeployment,
224+
instance: &k8sv1alpha1.NginxIngressController{
225+
ObjectMeta: metav1.ObjectMeta{
226+
Name: "my-nginx-ingress-controller",
227+
Namespace: "my-nginx-ingress-controller",
228+
},
229+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
230+
Image: k8sv1alpha1.Image{
231+
Repository: "nginx-plus-ingress",
232+
Tag: "edge",
233+
},
234+
},
235+
},
236+
expected: true,
237+
msg: "image repository update",
238+
},
239+
{
240+
deployment: defaultDeployment,
241+
instance: &k8sv1alpha1.NginxIngressController{
242+
ObjectMeta: metav1.ObjectMeta{
243+
Name: "my-nginx-ingress-controller",
244+
Namespace: "my-nginx-ingress-controller",
245+
},
246+
Spec: k8sv1alpha1.NginxIngressControllerSpec{
247+
Image: k8sv1alpha1.Image{
248+
Repository: "nginx-ingress",
249+
Tag: "edge",
250+
PullPolicy: "Always",
251+
},
252+
},
253+
},
254+
expected: true,
255+
msg: "pull policy update",
256+
},
257+
}
258+
for _, test := range tests {
259+
result := hasDeploymentChanged(test.deployment, test.instance)
260+
if result != test.expected {
261+
t.Errorf("hasDeploymentChanged() returned %v but expected %v for the case of %v", result, test.expected, test.msg)
262+
}
263+
}
264+
}

0 commit comments

Comments
 (0)