Skip to content

Commit 0da5d10

Browse files
committed
feat(k8s): match cert data structure to the TLS one for Ingress
http://kubernetes.io/docs/user-guide/ingress/#tls Fixes #576
1 parent eb44d0f commit 0da5d10

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

rootfs/api/management/commands/load_db_state_to_k8s.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.core.management.base import BaseCommand
2+
from django.shortcuts import get_object_or_404
23

34
from api.models import Key, App, Domain, Certificate, Config
45

@@ -13,4 +14,11 @@ def handle(self, *args, **options):
1314
for model in (Key, App, Domain, Certificate, Config):
1415
for obj in model.objects.all():
1516
obj.save()
17+
18+
# certificates have to be attached to domains to create k8s secrets
19+
for cert in Certificate.objects.all():
20+
for domain in cert.domains:
21+
domain = get_object_or_404(Domain, domain=domain)
22+
cert.attach_in_kubernetes(domain)
23+
1624
print("Done Publishing DB state to k8s.")

rootfs/api/models/certificate.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,6 @@ def delete(self, *args, **kwargs):
156156
return super(Certificate, self).delete(*args, **kwargs)
157157

158158
def attach(self, *args, **kwargs):
159-
data = {
160-
'cert': self.certificate,
161-
'key': self.key
162-
}
163-
164159
# add the certificate to the domain
165160
domain = get_object_or_404(Domain, domain=kwargs['domain'])
166161
if domain.certificate is not None:
@@ -169,14 +164,30 @@ def attach(self, *args, **kwargs):
169164
domain.certificate = self
170165
domain.save()
171166

172-
name = '%s-cert' % self.name
173-
app = domain.app
174-
# only create if it exists
167+
# create in kubernetes
168+
self.attach_in_kubernetes(domain)
169+
170+
def attach_in_kubernetes(self, domain):
171+
"""Creates the certificate as a kubernetes secret"""
172+
# only create if it exists - We raise an exception when a secret doesn't exist
175173
try:
176-
# We raise an exception when a secret doesn't exist
177-
self._scheduler._get_secret(app, name)
174+
name = '%s-cert' % self.name
175+
app = domain.app
176+
data = {
177+
'tls.crt': self.certificate,
178+
'tls.key': self.key
179+
}
180+
181+
secret = self._scheduler._get_secret(app, name).json()['data']
178182
except KubeHTTPException:
179183
self._scheduler._create_secret(app, name, data)
184+
else:
185+
# update cert secret to the TLS Ingress format if required
186+
if secret != data:
187+
try:
188+
self._scheduler._update_secret(app, name, data)
189+
except KubeHTTPException:
190+
raise
180191

181192
# get config for the service
182193
config = self._load_service_config(app, 'router')

0 commit comments

Comments
 (0)