Skip to content

Commit 092164a

Browse files
Raul MarreroRulox
Raul Marrero
authored andcommitted
Add Wildcard certificate to ingress resources
* Closes #426
1 parent 237a7cd commit 092164a

File tree

12 files changed

+182
-73
lines changed

12 files changed

+182
-73
lines changed

cmd/nginx-ingress/main.go

+37-12
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ The external address of the service is used when reporting the status of Ingress
9393

9494
nginxDebug = flag.Bool("nginx-debug", false,
9595
"Enable debugging for NGINX. Uses the nginx-debug binary. Requires 'error-log-level: debug' in the ConfigMap.")
96+
97+
wildcardTLSSecret = flag.String("wildcard-tls-secret", "",
98+
`A Secret with a TLS certificate and key for TLS termination of every Ingress host for which TLS termination is enabled but the Secret is not specified.
99+
Format: <namespace>/<name>. If the argument is not set, for such Ingress hosts NGINX will break any attempt to establish a TLS connection.
100+
If the argument is set, but the Ingress controller is not able to fetch the Secret from Kubernetes API, the Ingress controller will fail to start.`)
96101
)
97102

98103
func main() {
@@ -168,17 +173,9 @@ func main() {
168173
ngxc := nginx.NewNginxController("/etc/nginx/", nginxBinaryPath, local)
169174

170175
if *defaultServerSecret != "" {
171-
ns, name, err := utils.ParseNamespaceName(*defaultServerSecret)
172-
if err != nil {
173-
glog.Fatalf("Error parsing the default-server-tls-secret argument: %v", err)
174-
}
175-
secret, err := kubeClient.CoreV1().Secrets(ns).Get(name, meta_v1.GetOptions{})
176-
if err != nil {
177-
glog.Fatalf("Error when getting %v: %v", *defaultServerSecret, err)
178-
}
179-
err = nginx.ValidateTLSSecret(secret)
176+
secret, err := getAndValidateSecret(kubeClient, *defaultServerSecret)
180177
if err != nil {
181-
glog.Fatalf("%v is invalid: %v", *defaultServerSecret, err)
178+
glog.Fatalf("Error trying to get the default server TLS secret %v: %v", *defaultServerSecret, err)
182179
}
183180

184181
bytes := nginx.GenerateCertAndKeyFileContent(secret)
@@ -190,6 +187,16 @@ func main() {
190187
}
191188
}
192189

190+
if *wildcardTLSSecret != "" {
191+
secret, err := getAndValidateSecret(kubeClient, *wildcardTLSSecret)
192+
if err != nil {
193+
glog.Fatalf("Error trying to get the wildcard TLS secret %v: %v", *wildcardTLSSecret, err)
194+
}
195+
196+
bytes := nginx.GenerateCertAndKeyFileContent(secret)
197+
ngxc.AddOrUpdateSecretFile(nginx.WildcardSecretName, bytes, nginx.TLSSecretFileMode)
198+
}
199+
193200
cfg := nginx.NewDefaultConfig()
194201
if *nginxConfigMaps != "" {
195202
ns, name, err := utils.ParseNamespaceName(*nginxConfigMaps)
@@ -242,8 +249,8 @@ func main() {
242249
glog.Fatalf("Failed to create NginxAPIController: %v", err)
243250
}
244251
}
245-
246-
cnf := nginx.NewConfigurator(ngxc, cfg, nginxAPI, templateExecutor)
252+
isWildcardEnabled := *wildcardTLSSecret != ""
253+
cnf := nginx.NewConfigurator(ngxc, cfg, nginxAPI, templateExecutor, isWildcardEnabled)
247254
controllerNamespace := os.Getenv("POD_NAMESPACE")
248255

249256
lbcInput := controller.NewLoadBalancerControllerInput{
@@ -259,6 +266,7 @@ func main() {
259266
ControllerNamespace: controllerNamespace,
260267
ReportIngressStatus: *reportIngressStatus,
261268
IsLeaderElectionEnabled: *leaderElectionEnabled,
269+
WildcardTLSSecret: *wildcardTLSSecret,
262270
}
263271

264272
lbc := controller.NewLoadBalancerController(lbcInput)
@@ -381,3 +389,20 @@ func validateCIDRorIP(cidr string) error {
381389
}
382390
return nil
383391
}
392+
393+
// getAndValidateSecret gets and validates a secret.
394+
func getAndValidateSecret(kubeClient *kubernetes.Clientset, secretNsName string) (secret *api_v1.Secret, err error) {
395+
ns, name, err := utils.ParseNamespaceName(secretNsName)
396+
if err != nil {
397+
return nil, fmt.Errorf("could not parse the %v argument: %v", secretNsName, err)
398+
}
399+
secret, err = kubeClient.CoreV1().Secrets(ns).Get(name, meta_v1.GetOptions{})
400+
if err != nil {
401+
return nil, fmt.Errorf("could not get %v: %v", secretNsName, err)
402+
}
403+
err = nginx.ValidateTLSSecret(secret)
404+
if err != nil {
405+
return nil, fmt.Errorf("%v is invalid: %v", secretNsName, err)
406+
}
407+
return secret, nil
408+
}

deployments/helm-chart/Chart.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: nginx-ingress
2-
version: 0.3.2
2+
version: 0.3.3
33
appVersion: edge
44
description: NGINX Ingress Controller
55
sources:

deployments/helm-chart/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ Parameter | Description | Default
6969
`controller.defaultTLS.cert` | The base64-encoded TLS certificate for the default HTTPS server. If not specified, a pre-generated self-signed certificate is used. **Note:** It is recommended that you specify your own certificate. | A pre-generated self-signed certificate.
7070
`controller.defaultTLS.key` | The base64-encoded TLS key for the default HTTPS server. **Note:** If not specified, a pre-generated key is used. It is recommended that you specify your own key. | A pre-generated key.
7171
`controller.defaultTLS.secret` | The secret with a TLS certificate and key for the default HTTPS server. The value must follow the following format: `<namespace>/<name>`. Used as an alternative to specifiying a certifcate and key using `controller.defaultTLS.cert` and `controller.defaultTLS.key` parameters. | None
72+
`controller.wildcardTLS.cert` | The base64-encoded TLS certificate for every Ingress host that has TLS enabled but no secret specified. If the parameter is not set, for such Ingress hosts NGINX will break any attempt to establish a TLS connection. | None
73+
`controller.wildcardTLS.key` | The base64-encoded TLS key for every Ingress host that has TLS enabled but no secret specified. If the parameter is not set, for such Ingress hosts NGINX will break any attempt to establish a TLS connection. | None
74+
`controller.wildcardTLS.secret` | The secret with a TLS certificate and key for every Ingress host that has TLS enabled but no secret specified. The value must follow the following format: `<namespace>/<name>`. Used as an alternative to specifying a certificate and key using `controller.wildcardTLS.cert` and `controller.wildcardTLS.key` parameters. | None
7275
`controller.nodeSelector` | The node selector for pod assignment for the Ingress controller pods. | { }
7376
`controller.terminationGracePeriodSeconds` | The termination grace period of the Ingress controller pod. | 30
7477
`controller.tolerations` | The tolerations of the Ingress controller pods. | []

deployments/helm-chart/templates/controller-daemonset.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ spec:
8282
- -external-service={{ .Values.controller.reportIngressStatus.externalService }}
8383
- -enable-leader-election={{ .Values.controller.reportIngressStatus.enableLeaderElection }}
8484
{{- end }}
85+
{{- if .Values.controller.wildcardTLS.secret }}
86+
- -wildcard-tls-secret={{ .Values.controller.wildcardTLS.secret }}
87+
{{- else if and .Values.controller.wildcardTLS.cert .Values.controller.wildcardTLS.key }}
88+
- -wildcard-tls-secret=$(POD_NAMESPACE)/wildcard-tls-secret
89+
{{- end }}
8590
{{- if and .Values.prometheus.create .Values.controller.nginxStatus.enable }}
8691
- image: "{{ .Values.prometheus.image.repository }}:{{ .Values.prometheus.image.tag }}"
8792
name: nginx-prometheus-exporter

deployments/helm-chart/templates/controller-deployment.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ spec:
8080
- -external-service={{ .Values.controller.reportIngressStatus.externalService }}
8181
- -enable-leader-election={{ .Values.controller.reportIngressStatus.enableLeaderElection }}
8282
{{- end }}
83+
{{- if .Values.controller.wildcardTLS.secret }}
84+
- -wildcard-tls-secret={{ .Values.controller.wildcardTLS.secret }}
85+
{{- else if and .Values.controller.wildcardTLS.cert .Values.controller.wildcardTLS.key }}
86+
- -wildcard-tls-secret=$(POD_NAMESPACE)/wildcard-tls-secret
87+
{{- end }}
8388
{{- if and .Values.prometheus.create .Values.controller.nginxStatus.enable }}
8489
- image: "{{ .Values.prometheus.image.repository }}:{{ .Values.prometheus.image.tag }}"
8590
name: nginx-prometheus-exporter
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{{ if and (not .Values.controller.wildcardTLS.secret) (and .Values.controller.wildcardTLS.cert .Values.controller.wildcardTLS.key) }}
2+
apiVersion: v1
3+
kind: Secret
4+
metadata:
5+
name: wildcard-tls-secret
6+
labels:
7+
app: {{ .Values.controller.name | trunc 63 }}
8+
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
9+
heritage: {{ .Release.Service }}
10+
release: {{ .Release.Name }}
11+
type: Opaque
12+
data:
13+
tls.crt: {{ .Values.controller.wildcardTLS.cert }}
14+
tls.key: {{ .Values.controller.wildcardTLS.key }}
15+
{{- end }}

deployments/helm-chart/values.yaml

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ controller:
1010
pullPolicy: IfNotPresent
1111
config:
1212
entries: {}
13-
# It is recommended to use your own TLS certificate and key
13+
# It is recommended to use your own TLS certificates and keys
1414
defaultTLS:
1515
cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWFZQ0NRREFPRjl0THNhWFhEQU5CZ2txaGtpRzl3MEJBUXNGQURBaE1SOHdIUVlEVlFRRERCWk8KUjBsT1dFbHVaM0psYzNORGIyNTBjbTlzYkdWeU1CNFhEVEU0TURreE1qRTRNRE16TlZvWERUSXpNRGt4TVRFNApNRE16TlZvd0lURWZNQjBHQTFVRUF3d1dUa2RKVGxoSmJtZHlaWE56UTI5dWRISnZiR3hsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwvN2hIUEtFWGRMdjNyaUM3QlBrMTNpWkt5eTlyQ08KR2xZUXYyK2EzUDF0azIrS3YwVGF5aGRCbDRrcnNUcTZzZm8vWUk1Y2Vhbkw4WGM3U1pyQkVRYm9EN2REbWs1Qgo4eDZLS2xHWU5IWlg0Rm5UZ0VPaStlM2ptTFFxRlBSY1kzVnNPazFFeUZBL0JnWlJVbkNHZUtGeERSN0tQdGhyCmtqSXVuektURXUyaDU4Tlp0S21ScUJHdDEwcTNRYzhZT3ExM2FnbmovUWRjc0ZYYTJnMjB1K1lYZDdoZ3krZksKWk4vVUkxQUQ0YzZyM1lma1ZWUmVHd1lxQVp1WXN2V0RKbW1GNWRwdEMzN011cDBPRUxVTExSakZJOTZXNXIwSAo1TmdPc25NWFJNV1hYVlpiNWRxT3R0SmRtS3FhZ25TZ1JQQVpQN2MwQjFQU2FqYzZjNGZRVXpNQ0F3RUFBVEFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWpLb2tRdGRPcEsrTzhibWVPc3lySmdJSXJycVFVY2ZOUitjb0hZVUoKdGhrYnhITFMzR3VBTWI5dm15VExPY2xxeC9aYzJPblEwMEJCLzlTb0swcitFZ1U2UlVrRWtWcitTTFA3NTdUWgozZWI4dmdPdEduMS9ienM3bzNBaS9kclkrcUI5Q2k1S3lPc3FHTG1US2xFaUtOYkcyR1ZyTWxjS0ZYQU80YTY3Cklnc1hzYktNbTQwV1U3cG9mcGltU1ZmaXFSdkV5YmN3N0NYODF6cFErUyt1eHRYK2VBZ3V0NHh3VlI5d2IyVXYKelhuZk9HbWhWNThDd1dIQnNKa0kxNXhaa2VUWXdSN0diaEFMSkZUUkk3dkhvQXprTWIzbjAxQjQyWjNrN3RXNQpJUDFmTlpIOFUvOWxiUHNoT21FRFZkdjF5ZytVRVJxbStGSis2R0oxeFJGcGZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
1616
key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdi91RWM4b1JkMHUvZXVJTHNFK1RYZUprckxMMnNJNGFWaEMvYjVyYy9XMlRiNHEvClJOcktGMEdYaVN1eE9ycXgrajlnamx4NXFjdnhkenRKbXNFUkJ1Z1B0ME9hVGtIekhvb3FVWmcwZGxmZ1dkT0EKUTZMNTdlT1l0Q29VOUZ4amRXdzZUVVRJVUQ4R0JsRlNjSVo0b1hFTkhzbysyR3VTTWk2Zk1wTVM3YUhudzFtMApxWkdvRWEzWFNyZEJ6eGc2clhkcUNlUDlCMXl3VmRyYURiUzc1aGQzdUdETDU4cGszOVFqVUFQaHpxdmRoK1JWClZGNGJCaW9CbTVpeTlZTW1hWVhsMm0wTGZzeTZuUTRRdFFzdEdNVWozcGJtdlFmazJBNnljeGRFeFpkZFZsdmwKMm82MjBsMllxcHFDZEtCRThCay90elFIVTlKcU56cHpoOUJUTXdJREFRQUJBb0lCQVFDZklHbXowOHhRVmorNwpLZnZJUXQwQ0YzR2MxNld6eDhVNml4MHg4Mm15d1kxUUNlL3BzWE9LZlRxT1h1SENyUlp5TnUvZ2IvUUQ4bUFOCmxOMjRZTWl0TWRJODg5TEZoTkp3QU5OODJDeTczckM5bzVvUDlkazAvYzRIbjAzSkVYNzZ5QjgzQm9rR1FvYksKMjhMNk0rdHUzUmFqNjd6Vmc2d2szaEhrU0pXSzBwV1YrSjdrUkRWYmhDYUZhNk5nMUZNRWxhTlozVDhhUUtyQgpDUDNDeEFTdjYxWTk5TEI4KzNXWVFIK3NYaTVGM01pYVNBZ1BkQUk3WEh1dXFET1lvMU5PL0JoSGt1aVg2QnRtCnorNTZud2pZMy8yUytSRmNBc3JMTnIwMDJZZi9oY0IraVlDNzVWYmcydVd6WTY3TWdOTGQ5VW9RU3BDRkYrVm4KM0cyUnhybnhBb0dCQU40U3M0ZVlPU2huMVpQQjdhTUZsY0k2RHR2S2ErTGZTTXFyY2pOZjJlSEpZNnhubmxKdgpGenpGL2RiVWVTbWxSekR0WkdlcXZXaHFISy9iTjIyeWJhOU1WMDlRQ0JFTk5jNmtWajJTVHpUWkJVbEx4QzYrCk93Z0wyZHhKendWelU0VC84ajdHalRUN05BZVpFS2FvRHFyRG5BYWkyaW5oZU1JVWZHRXFGKzJyQW9HQkFOMVAKK0tZL0lsS3RWRzRKSklQNzBjUis3RmpyeXJpY05iWCtQVzUvOXFHaWxnY2grZ3l4b25BWlBpd2NpeDN3QVpGdwpaZC96ZFB2aTBkWEppc1BSZjRMazg5b2pCUmpiRmRmc2l5UmJYbyt3TFU4NUhRU2NGMnN5aUFPaTVBRHdVU0FkCm45YWFweUNweEFkREtERHdObit3ZFhtaTZ0OHRpSFRkK3RoVDhkaVpBb0dCQUt6Wis1bG9OOTBtYlF4VVh5YUwKMjFSUm9tMGJjcndsTmVCaWNFSmlzaEhYa2xpSVVxZ3hSZklNM2hhUVRUcklKZENFaHFsV01aV0xPb2I2NTNyZgo3aFlMSXM1ZUtka3o0aFRVdnpldm9TMHVXcm9CV2xOVHlGanIrSWhKZnZUc0hpOGdsU3FkbXgySkJhZUFVWUNXCndNdlQ4NmNLclNyNkQrZG8wS05FZzFsL0FvR0FlMkFVdHVFbFNqLzBmRzgrV3hHc1RFV1JqclRNUzRSUjhRWXQKeXdjdFA4aDZxTGxKUTRCWGxQU05rMXZLTmtOUkxIb2pZT2pCQTViYjhibXNVU1BlV09NNENoaFJ4QnlHbmR2eAphYkJDRkFwY0IvbEg4d1R0alVZYlN5T294ZGt5OEp0ek90ajJhS0FiZHd6NlArWDZDODhjZmxYVFo5MWpYL3RMCjF3TmRKS2tDZ1lCbyt0UzB5TzJ2SWFmK2UwSkN5TGhzVDQ5cTN3Zis2QWVqWGx2WDJ1VnRYejN5QTZnbXo5aCsKcDNlK2JMRUxwb3B0WFhNdUFRR0xhUkcrYlNNcjR5dERYbE5ZSndUeThXczNKY3dlSTdqZVp2b0ZpbmNvVlVIMwphdmxoTUVCRGYxSjltSDB5cDBwWUNaS2ROdHNvZEZtQktzVEtQMjJhTmtsVVhCS3gyZzR6cFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
1717
# secret: <namespace>/<secret_name>
18+
wildcardTLS:
19+
cert: ""
20+
key: ""
21+
# secret: <namespace>/<secret_name>
1822
nodeSelector: {}
1923
terminationGracePeriodSeconds: 30
2024
tolerations: []

docs/cli-arguments.md

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ Usage of ./nginx-ingress:
99
If not set, certificate and key in the file "/etc/nginx/secrets/default" are used. If a secret is set,
1010
but the Ingress controller is not able to fetch it from Kubernetes API or a secret is not set and
1111
the file "/etc/nginx/secrets/default" does not exist, the Ingress controller will fail to start
12+
-wildcard-tls-secret string
13+
A Secret with a TLS certificate and key for TLS termination of every Ingress host for which TLS termination is enabled but the Secret is not specified.
14+
Format: <namespace>/<name>. If the argument is not set, for such Ingress hosts NGINX will break any attempt to establish a TLS connection.
15+
If the argument is set, but the Ingress controller is not able to fetch the Secret from Kubernetes API, the Ingress controller will fail to start.
1216
-enable-leader-election
1317
Enable Leader election to avoid multiple replicas of the controller reporting the status of Ingress resources -- only one replica will report status. See -report-ingress-status flag.
1418
-external-service string

internal/controller/controller.go

+49-31
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ type LoadBalancerController struct {
7979
resync time.Duration
8080
namespace string
8181
controllerNamespace string
82+
wildcardTLSSecret string
8283
}
8384

8485
var keyFunc = cache.DeletionHandlingMetaNamespaceKeyFunc
@@ -97,6 +98,7 @@ type NewLoadBalancerControllerInput struct {
9798
ControllerNamespace string
9899
ReportIngressStatus bool
99100
IsLeaderElectionEnabled bool
101+
WildcardTLSSecret string
100102
}
101103

102104
// NewLoadBalancerController creates a controller
@@ -113,6 +115,7 @@ func NewLoadBalancerController(input NewLoadBalancerControllerInput) *LoadBalanc
113115
resync: input.ResyncPeriod,
114116
namespace: input.Namespace,
115117
controllerNamespace: input.ControllerNamespace,
118+
wildcardTLSSecret: input.WildcardTLSSecret,
116119
}
117120

118121
eventBroadcaster := record.NewBroadcaster()
@@ -647,10 +650,9 @@ func (lbc *LoadBalancerController) syncSecret(task queue.Task) {
647650
if !secrExists {
648651
glog.V(2).Infof("Deleting Secret: %v\n", key)
649652

650-
lbc.handleSecretDeletion(key, ings)
651-
652-
if key == lbc.defaultServerSecret {
653-
glog.Warningf("The default server Secret %v was removed. Retaining the Secret.", key)
653+
lbc.handleRegularSecretDeletion(key, ings)
654+
if lbc.isSpecialSecret(key) {
655+
glog.Warningf("A special TLS Secret %v was removed. Retaining the Secret.", key)
654656
}
655657
return
656658
}
@@ -659,17 +661,21 @@ func (lbc *LoadBalancerController) syncSecret(task queue.Task) {
659661

660662
secret := obj.(*api_v1.Secret)
661663

662-
if key == lbc.defaultServerSecret {
663-
lbc.handleDefaultSecretUpdate(secret)
664-
// we don't return here in case the default secret is also used in Ingress resources
664+
if lbc.isSpecialSecret(key) {
665+
lbc.handleSpecialSecretUpdate(secret)
666+
// we don't return here in case the special secret is also used in Ingress resources
665667
}
666668

667669
if len(ings) > 0 {
668670
lbc.handleSecretUpdate(secret, ings)
669671
}
670672
}
671673

672-
func (lbc *LoadBalancerController) handleSecretDeletion(key string, ings []extensions.Ingress) {
674+
func (lbc *LoadBalancerController) isSpecialSecret(secretName string) bool {
675+
return secretName == lbc.defaultServerSecret || secretName == lbc.wildcardTLSSecret
676+
}
677+
678+
func (lbc *LoadBalancerController) handleRegularSecretDeletion(key string, ings []extensions.Ingress) {
673679
eventType := api_v1.EventTypeWarning
674680
title := "Missing Secret"
675681
message := fmt.Sprintf("Secret %v was removed", key)
@@ -702,7 +708,7 @@ func (lbc *LoadBalancerController) handleSecretUpdate(secret *api_v1.Secret, ing
702708
glog.Errorf("Couldn't validate secret %v: %v", secretNsName, err)
703709
glog.Errorf("Removing invalid secret %v", secretNsName)
704710

705-
lbc.handleSecretDeletion(secretNsName, ings)
711+
lbc.handleRegularSecretDeletion(secretNsName, ings)
706712

707713
lbc.recorder.Eventf(secret, api_v1.EventTypeWarning, "Rejected", "%v was rejected: %v", secretNsName, err)
708714
return
@@ -726,24 +732,31 @@ func (lbc *LoadBalancerController) handleSecretUpdate(secret *api_v1.Secret, ing
726732
lbc.emitEventForIngresses(eventType, title, message, ings)
727733
}
728734

729-
func (lbc *LoadBalancerController) handleDefaultSecretUpdate(secret *api_v1.Secret) {
735+
func (lbc *LoadBalancerController) handleSpecialSecretUpdate(secret *api_v1.Secret) {
736+
var specialSecretsToUpdate []string
730737
secretNsName := secret.Namespace + "/" + secret.Name
731-
732738
err := nginx.ValidateTLSSecret(secret)
733739
if err != nil {
734-
glog.Errorf("Couldn't validate the default server Secret %v: %v", secretNsName, err)
735-
lbc.recorder.Eventf(secret, api_v1.EventTypeWarning, "Rejected", "the default server Secret %v was rejected, using the previous version: %v", secretNsName, err)
740+
glog.Errorf("Couldn't validate the special Secret %v: %v", secretNsName, err)
741+
lbc.recorder.Eventf(secret, api_v1.EventTypeWarning, "Rejected", "the special Secret %v was rejected, using the previous version: %v", secretNsName, err)
736742
return
737743
}
738744

739-
err = lbc.configurator.AddOrUpdateDefaultServerTLSSecret(secret)
745+
if secretNsName == lbc.defaultServerSecret {
746+
specialSecretsToUpdate = append(specialSecretsToUpdate, nginx.DefaultServerSecretName)
747+
}
748+
if secretNsName == lbc.wildcardTLSSecret {
749+
specialSecretsToUpdate = append(specialSecretsToUpdate, nginx.WildcardSecretName)
750+
}
751+
752+
err = lbc.configurator.AddOrUpdateSpecialSecrets(secret, specialSecretsToUpdate)
740753
if err != nil {
741-
glog.Errorf("Error when updating the default server Secret %v: %v", secretNsName, err)
742-
lbc.recorder.Eventf(secret, api_v1.EventTypeWarning, "UpdatedWithError", "the default server Secret %v was updated, but not applied: %v", secretNsName, err)
754+
glog.Errorf("Error when updating the special Secret %v: %v", secretNsName, err)
755+
lbc.recorder.Eventf(secret, api_v1.EventTypeWarning, "UpdatedWithError", "the special Secret %v was updated, but not applied: %v", secretNsName, err)
743756
return
744757
}
745758

746-
lbc.recorder.Eventf(secret, api_v1.EventTypeNormal, "Updated", "the default server Secret %v was updated", secretNsName)
759+
lbc.recorder.Eventf(secret, api_v1.EventTypeNormal, "Updated", "the special Secret %v was updated", secretNsName)
747760
}
748761

749762
func (lbc *LoadBalancerController) emitEventForIngresses(eventType string, title string, message string, ings []extensions.Ingress) {
@@ -906,6 +919,23 @@ func (lbc *LoadBalancerController) getIngressForEndpoints(obj interface{}) []ext
906919
return ings
907920
}
908921

922+
func (lbc *LoadBalancerController) getAndValidateSecret(secretKey string) (*api_v1.Secret, error) {
923+
secretObject, secretExists, err := lbc.secretLister.GetByKey(secretKey)
924+
if err != nil {
925+
return nil, fmt.Errorf("error retrieving secret %v", secretKey)
926+
}
927+
if !secretExists {
928+
return nil, fmt.Errorf("secret %v not found", secretKey)
929+
}
930+
secret := secretObject.(*api_v1.Secret)
931+
932+
err = nginx.ValidateTLSSecret(secret)
933+
if err != nil {
934+
return nil, fmt.Errorf("error validating secret %v", secretKey)
935+
}
936+
return secret, nil
937+
}
938+
909939
func (lbc *LoadBalancerController) createIngress(ing *extensions.Ingress) (*nginx.IngressEx, error) {
910940
ingEx := &nginx.IngressEx{
911941
Ingress: ing,
@@ -915,21 +945,9 @@ func (lbc *LoadBalancerController) createIngress(ing *extensions.Ingress) (*ngin
915945
for _, tls := range ing.Spec.TLS {
916946
secretName := tls.SecretName
917947
secretKey := ing.Namespace + "/" + secretName
918-
919-
secretObject, secretExists, err := lbc.secretLister.GetByKey(secretKey)
920-
if err != nil {
921-
glog.Warningf("Error retrieving secret %v for Ingress %v: %v", secretName, ing.Name, err)
922-
continue
923-
}
924-
if !secretExists {
925-
glog.Warningf("secret %v not found for Ingress %v", secretKey, ing.Name)
926-
continue
927-
}
928-
secret := secretObject.(*api_v1.Secret)
929-
930-
err = nginx.ValidateTLSSecret(secret)
948+
secret, err := lbc.getAndValidateSecret(secretKey)
931949
if err != nil {
932-
glog.Warningf("Error validating secret %v for Ingress %v: %v", secretName, ing.Name, err)
950+
glog.Warningf("Error trying to get the secret %v for Ingress %v: %v", secretName, ing.Name, err)
933951
continue
934952
}
935953
ingEx.TLSSecrets[secretName] = secret

0 commit comments

Comments
 (0)