@@ -9,23 +9,30 @@ import (
9
9
networkv1 "k8s.io/api/networking/v1"
10
10
)
11
11
12
+ const (
13
+ TLS_ANNOTATION_PREFIX = "servers.com/certificate-"
14
+ )
15
+
12
16
// SyncTLS syncs ingress tls certs stored in secrets to portal.
17
+ // If secret name starts with certManagerPrefix-<certID> we looking for cert from API
18
+ // Due to secret name don't support upperCase for such cases we additionally checks annotations
19
+ // with TLS_ANNOTATION_PREFIX which overrides ingress tls certs for matching hosts.
13
20
// Returns map of hosts to portal cert id
14
21
func (s * SyncManager ) SyncTLS (ingress * networkv1.Ingress , certManagerPrefix string ) (map [string ]string , error ) {
15
22
var sslCerts = make (map [string ]string )
16
- for _ , tls := range ingress .Spec .TLS {
17
- if strings .HasPrefix (tls .SecretName , certManagerPrefix ) {
18
- id := strings .TrimPrefix (tls .SecretName , certManagerPrefix )
23
+
24
+ hostsSecrets := mergeTLSWithAnnotations (ingress )
25
+ for host , secretName := range hostsSecrets {
26
+ if strings .HasPrefix (secretName , certManagerPrefix ) {
27
+ id := strings .TrimPrefix (secretName , certManagerPrefix )
19
28
certificate , err := s .tlsMgr .GetByID (id )
20
29
if err != nil {
21
30
return nil , fmt .Errorf ("fetching cert with id %q from API failed: %v" , id , err )
22
31
}
23
- for _ , host := range tls .Hosts {
24
- sslCerts [host ] = certificate .ID
25
- }
32
+ sslCerts [host ] = certificate .ID
26
33
continue
27
34
}
28
- sKey := ingress .Namespace + "/" + tls . SecretName
35
+ sKey := ingress .Namespace + "/" + secretName
29
36
secret , err := s .store .GetSecret (sKey )
30
37
if err != nil {
31
38
return nil , fmt .Errorf ("fetching secret with key %q from store failed: %v" , sKey , err )
@@ -47,28 +54,22 @@ func (s *SyncManager) SyncTLS(ingress *networkv1.Ingress, certManagerPrefix stri
47
54
primary , chain := tlsmanager .SplitCerts (cert )
48
55
49
56
fingerprint := tlsmanager .GetPemFingerprint (primary )
50
-
51
57
if fingerprint == "" {
52
58
return nil , fmt .Errorf ("can't calculate 'tls.crt' fingerprint for %s" , string (cert ))
53
59
}
54
60
55
61
if s .tlsMgr .HasRegistration (fingerprint ) {
56
62
certificate , err := s .tlsMgr .Get (fingerprint )
57
-
58
63
if err != nil {
59
64
return nil , err
60
65
}
61
-
62
- for _ , host := range tls .Hosts {
63
- sslCerts [host ] = certificate .ID
64
- }
65
-
66
+ sslCerts [host ] = certificate .ID
66
67
continue
67
68
}
68
69
69
70
certificate , err := s .tlsMgr .SyncCertificate (
70
71
fingerprint ,
71
- tls . SecretName ,
72
+ secretName ,
72
73
primary ,
73
74
tlsmanager .StripSpaces (key ),
74
75
chain ,
@@ -78,10 +79,31 @@ func (s *SyncManager) SyncTLS(ingress *networkv1.Ingress, certManagerPrefix stri
78
79
return nil , err
79
80
}
80
81
82
+ sslCerts [host ] = certificate .ID
83
+ }
84
+ return sslCerts , nil
85
+ }
86
+
87
+ // mergeTLSWithAnnotations merge info about host and associated secret from ingress.Spec.TLS and ingress.Annotations
88
+ // returns map[host]secret
89
+ func mergeTLSWithAnnotations (ingress * networkv1.Ingress ) map [string ]string {
90
+ res := make (map [string ]string )
91
+
92
+ for _ , tls := range ingress .Spec .TLS {
93
+ sName := tls .SecretName
81
94
for _ , host := range tls .Hosts {
82
- sslCerts [host ] = certificate . ID
95
+ res [host ] = sName
83
96
}
97
+ }
84
98
99
+ // annotations overrides settings from tls
100
+ for k , v := range ingress .Annotations {
101
+ if strings .HasPrefix (k , TLS_ANNOTATION_PREFIX ) {
102
+ if host , ok := strings .CutPrefix (k , TLS_ANNOTATION_PREFIX ); ok {
103
+ res [host ] = v
104
+ }
105
+ }
85
106
}
86
- return sslCerts , nil
107
+
108
+ return res
87
109
}
0 commit comments