@@ -9,23 +9,30 @@ import (
99 networkv1 "k8s.io/api/networking/v1"
1010)
1111
12+ const (
13+ TLS_ANNOTATION_PREFIX = "servers.com/certificate-"
14+ )
15+
1216// 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.
1320// Returns map of hosts to portal cert id
1421func (s * SyncManager ) SyncTLS (ingress * networkv1.Ingress , certManagerPrefix string ) (map [string ]string , error ) {
1522 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 )
1928 certificate , err := s .tlsMgr .GetByID (id )
2029 if err != nil {
2130 return nil , fmt .Errorf ("fetching cert with id %q from API failed: %v" , id , err )
2231 }
23- for _ , host := range tls .Hosts {
24- sslCerts [host ] = certificate .ID
25- }
32+ sslCerts [host ] = certificate .ID
2633 continue
2734 }
28- sKey := ingress .Namespace + "/" + tls . SecretName
35+ sKey := ingress .Namespace + "/" + secretName
2936 secret , err := s .store .GetSecret (sKey )
3037 if err != nil {
3138 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
4754 primary , chain := tlsmanager .SplitCerts (cert )
4855
4956 fingerprint := tlsmanager .GetPemFingerprint (primary )
50-
5157 if fingerprint == "" {
5258 return nil , fmt .Errorf ("can't calculate 'tls.crt' fingerprint for %s" , string (cert ))
5359 }
5460
5561 if s .tlsMgr .HasRegistration (fingerprint ) {
5662 certificate , err := s .tlsMgr .Get (fingerprint )
57-
5863 if err != nil {
5964 return nil , err
6065 }
61-
62- for _ , host := range tls .Hosts {
63- sslCerts [host ] = certificate .ID
64- }
65-
66+ sslCerts [host ] = certificate .ID
6667 continue
6768 }
6869
6970 certificate , err := s .tlsMgr .SyncCertificate (
7071 fingerprint ,
71- tls . SecretName ,
72+ secretName ,
7273 primary ,
7374 tlsmanager .StripSpaces (key ),
7475 chain ,
@@ -78,10 +79,31 @@ func (s *SyncManager) SyncTLS(ingress *networkv1.Ingress, certManagerPrefix stri
7879 return nil , err
7980 }
8081
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
8194 for _ , host := range tls .Hosts {
82- sslCerts [host ] = certificate . ID
95+ res [host ] = sName
8396 }
97+ }
8498
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+ }
85106 }
86- return sslCerts , nil
107+
108+ return res
87109}
0 commit comments