Skip to content

Commit 17c0af8

Browse files
[webhook] Add targetPort while scaffolding csv (#4178)
* [webhook] Specify ports while scaffolding csv * update samples * update csv tests
1 parent 767cc3b commit 17c0af8

File tree

4 files changed

+67
-28
lines changed

4 files changed

+67
-28
lines changed

internal/generate/clusterserviceversion/clusterserviceversion_updaters.go

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -269,23 +269,36 @@ func applyCustomResourceDefinitions(c *collector.Manifests, csv *operatorsv1alph
269269
// applyWebhooks updates csv's webhookDefinitions with any mutating and validating webhooks in the collector.
270270
func applyWebhooks(c *collector.Manifests, csv *operatorsv1alpha1.ClusterServiceVersion) {
271271
webhookDescriptions := []operatorsv1alpha1.WebhookDescription{}
272+
272273
for _, webhook := range c.ValidatingWebhooks {
273-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, webhook.ClientConfig)
274-
if serviceName == "" && depName == "" {
274+
var validatingServiceName string
275+
depName, svc := findMatchingDeploymentAndServiceForWebhook(c, webhook.ClientConfig)
276+
277+
if svc != nil {
278+
validatingServiceName = svc.GetName()
279+
}
280+
281+
if validatingServiceName == "" && depName == "" {
275282
log.Infof("No service found for validating webhook %q", webhook.Name)
276283
} else if depName == "" {
277-
log.Infof("No deployment is selected by service %q for validating webhook %q", serviceName, webhook.Name)
284+
log.Infof("No deployment is selected by service %q for validating webhook %q", validatingServiceName, webhook.Name)
278285
}
279-
webhookDescriptions = append(webhookDescriptions, validatingToWebhookDescription(webhook, depName))
286+
webhookDescriptions = append(webhookDescriptions, validatingToWebhookDescription(webhook, depName, svc))
280287
}
281288
for _, webhook := range c.MutatingWebhooks {
282-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, webhook.ClientConfig)
283-
if serviceName == "" && depName == "" {
289+
var mutatingServiceName string
290+
depName, svc := findMatchingDeploymentAndServiceForWebhook(c, webhook.ClientConfig)
291+
292+
if svc != nil {
293+
mutatingServiceName = svc.GetName()
294+
}
295+
296+
if mutatingServiceName == "" && depName == "" {
284297
log.Infof("No service found for mutating webhook %q", webhook.Name)
285298
} else if depName == "" {
286-
log.Infof("No deployment is selected by service %q for mutating webhook %q", serviceName, webhook.Name)
299+
log.Infof("No deployment is selected by service %q for mutating webhook %q", mutatingServiceName, webhook.Name)
287300
}
288-
webhookDescriptions = append(webhookDescriptions, mutatingToWebhookDescription(webhook, depName))
301+
webhookDescriptions = append(webhookDescriptions, mutatingToWebhookDescription(webhook, depName, svc))
289302
}
290303
csv.Spec.WebhookDefinitions = webhookDescriptions
291304
}
@@ -294,7 +307,7 @@ func applyWebhooks(c *collector.Manifests, csv *operatorsv1alpha1.ClusterService
294307
var defaultAdmissionReviewVersions = []string{"v1beta1"}
295308

296309
// validatingToWebhookDescription transforms webhook into a WebhookDescription.
297-
func validatingToWebhookDescription(webhook admissionregv1.ValidatingWebhook, depName string) operatorsv1alpha1.WebhookDescription {
310+
func validatingToWebhookDescription(webhook admissionregv1.ValidatingWebhook, depName string, ws *corev1.Service) operatorsv1alpha1.WebhookDescription {
298311
description := operatorsv1alpha1.WebhookDescription{
299312
Type: operatorsv1alpha1.ValidatingAdmissionWebhook,
300313
GenerateName: webhook.Name,
@@ -315,8 +328,18 @@ func validatingToWebhookDescription(webhook admissionregv1.ValidatingWebhook, de
315328
}
316329

317330
if serviceRef := webhook.ClientConfig.Service; serviceRef != nil {
331+
var webhookServiceRefPort int32 = 443
318332
if serviceRef.Port != nil {
319-
description.ContainerPort = *serviceRef.Port
333+
webhookServiceRefPort = *serviceRef.Port
334+
}
335+
if ws != nil {
336+
for _, port := range ws.Spec.Ports {
337+
if webhookServiceRefPort == port.Port {
338+
description.ContainerPort = port.Port
339+
description.TargetPort = &port.TargetPort
340+
break
341+
}
342+
}
320343
}
321344
description.DeploymentName = depName
322345
if description.DeploymentName == "" {
@@ -328,7 +351,7 @@ func validatingToWebhookDescription(webhook admissionregv1.ValidatingWebhook, de
328351
}
329352

330353
// mutatingToWebhookDescription transforms webhook into a WebhookDescription.
331-
func mutatingToWebhookDescription(webhook admissionregv1.MutatingWebhook, depName string) operatorsv1alpha1.WebhookDescription {
354+
func mutatingToWebhookDescription(webhook admissionregv1.MutatingWebhook, depName string, ws *corev1.Service) operatorsv1alpha1.WebhookDescription {
332355
description := operatorsv1alpha1.WebhookDescription{
333356
Type: operatorsv1alpha1.MutatingAdmissionWebhook,
334357
GenerateName: webhook.Name,
@@ -350,8 +373,18 @@ func mutatingToWebhookDescription(webhook admissionregv1.MutatingWebhook, depNam
350373
}
351374

352375
if serviceRef := webhook.ClientConfig.Service; serviceRef != nil {
376+
var webhookServiceRefPort int32 = 443
353377
if serviceRef.Port != nil {
354-
description.ContainerPort = *serviceRef.Port
378+
webhookServiceRefPort = *serviceRef.Port
379+
}
380+
if ws != nil {
381+
for _, port := range ws.Spec.Ports {
382+
if webhookServiceRefPort == port.Port {
383+
description.ContainerPort = port.Port
384+
description.TargetPort = &port.TargetPort
385+
break
386+
}
387+
}
355388
}
356389
description.DeploymentName = depName
357390
if description.DeploymentName == "" {
@@ -365,15 +398,14 @@ func mutatingToWebhookDescription(webhook admissionregv1.MutatingWebhook, depNam
365398
// findMatchingDeploymentAndServiceForWebhook matches a Service to a webhook's client config (if it uses a service)
366399
// then matches that Service to a Deployment by comparing label selectors (if the Service uses label selectors).
367400
// The names of both Service and Deployment are returned if found.
368-
func findMatchingDeploymentAndServiceForWebhook(c *collector.Manifests, wcc admissionregv1.WebhookClientConfig) (depName, serviceName string) {
401+
func findMatchingDeploymentAndServiceForWebhook(c *collector.Manifests, wcc admissionregv1.WebhookClientConfig) (depName string, ws *corev1.Service) {
369402
// Return if a service reference is not specified, since a URL will be in that case.
370403
if wcc.Service == nil {
371404
return
372405
}
373406

374407
// Find the matching service, if any. The webhook server may be externally managed
375408
// if no service is created by the operator.
376-
var ws *corev1.Service
377409
for i, service := range c.Services {
378410
if service.GetName() == wcc.Service.Name {
379411
ws = &c.Services[i]
@@ -383,7 +415,6 @@ func findMatchingDeploymentAndServiceForWebhook(c *collector.Manifests, wcc admi
383415
if ws == nil {
384416
return
385417
}
386-
serviceName = ws.GetName()
387418

388419
// Only ExternalName-type services cannot have selectors.
389420
if ws.Spec.Type == corev1.ServiceTypeExternalName {
@@ -416,7 +447,7 @@ func findMatchingDeploymentAndServiceForWebhook(c *collector.Manifests, wcc admi
416447
}
417448
}
418449

419-
return depName, serviceName
450+
return depName, ws
420451
}
421452

422453
// applyCustomResources updates csv's "alm-examples" annotation with the

internal/generate/clusterserviceversion/clusterserviceversion_updaters_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
4949
c.Deployments = []appsv1.Deployment{newDeployment(depName1, labels)}
5050
c.Services = []corev1.Service{newService(serviceName1, labels)}
5151
wcc.Service.Name = serviceName1
52-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
52+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
5353
Expect(depName).To(Equal(depName1))
54-
Expect(serviceName).To(Equal(serviceName1))
54+
Expect(service.GetName()).To(Equal(serviceName1))
5555
})
5656

5757
By("parsing two deployments and two services with non-intersecting labels")
@@ -67,9 +67,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
6767
newService(serviceName2, labels2),
6868
}
6969
wcc.Service.Name = serviceName1
70-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
70+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
7171
Expect(depName).To(Equal(depName1))
72-
Expect(serviceName).To(Equal(serviceName1))
72+
Expect(service.GetName()).To(Equal(serviceName1))
7373
})
7474

7575
By("parsing two deployments and two services with a label subset")
@@ -82,9 +82,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
8282
}
8383
c.Services = []corev1.Service{newService(serviceName1, labels1)}
8484
wcc.Service.Name = serviceName1
85-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
85+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
8686
Expect(depName).To(Equal(depName2))
87-
Expect(serviceName).To(Equal(serviceName1))
87+
Expect(service.GetName()).To(Equal(serviceName1))
8888
})
8989
})
9090

@@ -95,9 +95,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
9595
c.Deployments = []appsv1.Deployment{newDeployment(depName1, labels)}
9696
c.Services = []corev1.Service{newService(serviceName1, labels)}
9797
wcc.Service.Name = serviceName2
98-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
98+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
9999
Expect(depName).To(BeEmpty())
100-
Expect(serviceName).To(BeEmpty())
100+
Expect(service).To(BeNil())
101101
})
102102
})
103103

@@ -109,9 +109,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
109109
c.Deployments = []appsv1.Deployment{newDeployment(depName1, labels1)}
110110
c.Services = []corev1.Service{newService(serviceName1, labels2)}
111111
wcc.Service.Name = serviceName1
112-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
112+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
113113
Expect(depName).To(BeEmpty())
114-
Expect(serviceName).To(Equal(serviceName1))
114+
Expect(service.GetName()).To(Equal(serviceName1))
115115
})
116116

117117
By("parsing one deployment and one service with two intersecting labels")
@@ -121,9 +121,9 @@ var _ = Describe("findMatchingDeploymentAndServiceForWebhook", func() {
121121
c.Deployments = []appsv1.Deployment{newDeployment(depName1, labels1)}
122122
c.Services = []corev1.Service{newService(serviceName1, labels2)}
123123
wcc.Service.Name = serviceName1
124-
depName, serviceName := findMatchingDeploymentAndServiceForWebhook(c, wcc)
124+
depName, service := findMatchingDeploymentAndServiceForWebhook(c, wcc)
125125
Expect(depName).To(BeEmpty())
126-
Expect(serviceName).To(Equal(serviceName1))
126+
Expect(service.GetName()).To(Equal(serviceName1))
127127
})
128128
})
129129
})

internal/generate/testdata/clusterserviceversions/output/memcached-operator.clusterserviceversion.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ spec:
215215
webhookdefinitions:
216216
- admissionReviewVersions:
217217
- v1beta1
218+
containerPort: 443
218219
deploymentName: memcached-operator-controller-manager
219220
failurePolicy: Fail
220221
generateName: vmemcached.kb.io
@@ -229,10 +230,12 @@ spec:
229230
resources:
230231
- memcacheds
231232
sideEffects: None
233+
targetPort: 9443
232234
type: ValidatingAdmissionWebhook
233235
webhookPath: /validate-cache-my-domain-v1alpha1-memcached
234236
- admissionReviewVersions:
235237
- v1beta1
238+
containerPort: 443
236239
deploymentName: memcached-operator-controller-manager
237240
failurePolicy: Fail
238241
generateName: mmemcached.kb.io
@@ -247,5 +250,6 @@ spec:
247250
resources:
248251
- memcacheds
249252
sideEffects: None
253+
targetPort: 9443
250254
type: MutatingAdmissionWebhook
251255
webhookPath: /mutate-cache-my-domain-v1alpha1-memcached

testdata/go/memcached-operator/bundle/manifests/memcached-operator.clusterserviceversion.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ spec:
205205
webhookdefinitions:
206206
- admissionReviewVersions:
207207
- v1beta1
208+
containerPort: 443
208209
deploymentName: memcached-operator-controller-manager
209210
failurePolicy: Fail
210211
generateName: vmemcached.kb.io
@@ -219,10 +220,12 @@ spec:
219220
resources:
220221
- memcacheds
221222
sideEffects: None
223+
targetPort: 9443
222224
type: ValidatingAdmissionWebhook
223225
webhookPath: /validate-cache-example-com-v1alpha1-memcached
224226
- admissionReviewVersions:
225227
- v1beta1
228+
containerPort: 443
226229
deploymentName: memcached-operator-controller-manager
227230
failurePolicy: Fail
228231
generateName: mmemcached.kb.io
@@ -237,5 +240,6 @@ spec:
237240
resources:
238241
- memcacheds
239242
sideEffects: None
243+
targetPort: 9443
240244
type: MutatingAdmissionWebhook
241245
webhookPath: /mutate-cache-example-com-v1alpha1-memcached

0 commit comments

Comments
 (0)