Skip to content

Commit ea370fa

Browse files
authored
Merge pull request #10 from serverscom/tls-from-annotations
add ability to specify tls certs in annotations
2 parents 9bfb39a + dc9bb0b commit ea370fa

File tree

2 files changed

+52
-21
lines changed

2 files changed

+52
-21
lines changed

internal/service/sync/tls.go

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
1421
func (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
}

internal/service/sync/tls_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"go.uber.org/mock/gomock"
1515
v1 "k8s.io/api/core/v1"
1616
networkv1 "k8s.io/api/networking/v1"
17+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718
)
1819

1920
var (
@@ -38,6 +39,11 @@ func TestSyncTLS(t *testing.T) {
3839
},
3940
},
4041
},
42+
ObjectMeta: metav1.ObjectMeta{
43+
Annotations: map[string]string{
44+
TLS_ANNOTATION_PREFIX + "example1.com": "test-secret",
45+
},
46+
},
4147
}
4248
ingress.Namespace = "default"
4349

@@ -51,9 +57,9 @@ func TestSyncTLS(t *testing.T) {
5157

5258
t.Run("Successfully syncing TLS", func(t *testing.T) {
5359
g := NewWithT(t)
54-
storeHandler.EXPECT().GetSecret("default/test-secret").Return(secret, nil)
60+
storeHandler.EXPECT().GetSecret("default/test-secret").Return(secret, nil).Times(2)
5561

56-
tlsManagerHandler.EXPECT().HasRegistration(testdata.ValidPEMFingerprint).Return(false)
62+
tlsManagerHandler.EXPECT().HasRegistration(testdata.ValidPEMFingerprint).Return(false).Times(2)
5763

5864
expectedCert := &client.SSLCertificate{ID: "cert-id"}
5965
tlsManagerHandler.EXPECT().SyncCertificate(
@@ -62,11 +68,12 @@ func TestSyncTLS(t *testing.T) {
6268
gomock.Any(),
6369
gomock.Any(),
6470
gomock.Any()).
65-
Return(expectedCert, nil)
71+
Return(expectedCert, nil).Times(2)
6672

6773
result, err := syncManager.SyncTLS(ingress, scCertManagerPrefix)
6874
g.Expect(err).To(BeNil())
6975
g.Expect(result).To(HaveKeyWithValue("example.com", "cert-id"))
76+
g.Expect(result).To(HaveKeyWithValue("example1.com", "cert-id"))
7077
})
7178

7279
t.Run("Error fetching secret", func(t *testing.T) {
@@ -131,12 +138,14 @@ func TestSyncTLS(t *testing.T) {
131138
g := NewWithT(t)
132139

133140
ingress.Spec.TLS[0].SecretName = scCertManagerPrefix + "someid"
141+
ingress.Annotations[TLS_ANNOTATION_PREFIX+"example1.com"] = scCertManagerPrefix + "someid"
134142
tlsManagerHandler.EXPECT().
135143
GetByID("someid").
136-
Return(&serverscom.SSLCertificate{ID: "someid"}, nil)
144+
Return(&serverscom.SSLCertificate{ID: "someid"}, nil).Times(2)
137145

138146
result, err := syncManager.SyncTLS(ingress, scCertManagerPrefix)
139147
g.Expect(err).To(BeNil())
140148
g.Expect(result).To(HaveKeyWithValue("example.com", "someid"))
149+
g.Expect(result).To(HaveKeyWithValue("example1.com", "someid"))
141150
})
142151
}

0 commit comments

Comments
 (0)