@@ -158,6 +158,68 @@ def _get_entrypoint(self, container_type):
158158 entrypoint = ['/bin/bash' , '-c' ]
159159
160160 return entrypoint
161+
162+ def _refresh_tls (self , certs_auto_enabled , hosts ):
163+ namespace = name = self .id
164+ try :
165+ data = self ._scheduler .certificate .get (namespace , name ).json ()
166+ except KubeException :
167+ self .log ("certificate {} does not exist" .format (namespace ), level = logging .INFO )
168+ data = None
169+
170+ if certs_auto_enabled :
171+ if data :
172+ version = data ["metadata" ]["resourceVersion" ]
173+ self ._scheduler .certificate .put (
174+ namespace , name , settings .INGRESS_CLASS , hosts , version )
175+ else :
176+ self ._scheduler .certificate .create (
177+ namespace , name , settings .INGRESS_CLASS , hosts )
178+ elif data :
179+ self ._scheduler .certificate .delete (namespace , name )
180+
181+ def _refresh_ingress (self , hosts , tls_map , ssl_redirect ):
182+ ingress = namespace = self .id
183+ # Put Ingress
184+ kwargs = {
185+ "hosts" : hosts ,
186+ "tls" : [{"secretName" : k , "hosts" : v } for k , v in tls_map .items ()],
187+ "ssl_redirect" : ssl_redirect
188+ }
189+ whitelist = self .appsettings_set .latest ().whitelist
190+ if whitelist : kwargs .update ({"whitelist" : whitelist })
191+ data = self ._scheduler .ingress .get (namespace , ingress ).json ()
192+ version = data ["metadata" ]["resourceVersion" ]
193+ self ._scheduler .ingress .put (
194+ ingress , settings .INGRESS_CLASS , namespace , version , ** kwargs )
195+
196+ def _refresh_ingress_and_tls (self ):
197+ ingress = self .id
198+ hosts , tls_map = [], {}
199+
200+ tls = self .tls_set .latest ()
201+ ssl_redirect = "true" if bool (tls .https_enforced ) else "false"
202+ certs_auto_enabled = bool (tls .certs_auto_enabled )
203+
204+ for domain in Domain .objects .filter (app = self ):
205+ if str (domain .domain ) == self .id :
206+ host = "%s.%s" % (ingress , settings .PLATFORM_DOMAIN )
207+ else :
208+ host = str (domain .domain )
209+ hosts .append (host )
210+ if certs_auto_enabled or domain .certificate :
211+ if certs_auto_enabled :
212+ secret_name = '%s-auto-tls' % self .id
213+ elif domain .certificate :
214+ secret_name = '%s-cert' % domain .certificate .name
215+ if secret_name not in tls_map :
216+ tls_map [secret_name ] = []
217+ tls_map [secret_name ].append (host )
218+ self ._refresh_ingress (hosts , tls_map , ssl_redirect )
219+ self ._refresh_tls (certs_auto_enabled , hosts )
220+
221+ def refresh (self ):
222+ self ._refresh_ingress_and_tls ()
161223
162224 def log (self , message , level = logging .INFO ):
163225 """Logs a message in the context of this application.
@@ -190,9 +252,7 @@ def create(self, *args, **kwargs): # noqa
190252 )
191253
192254 # create required minimum resources in k8s for the application
193- namespace = self .id
194- ingress = self .id
195- service = self .id
255+ namespace = ingress = service = self .id
196256 quota_name = '{}-quota' .format (self .id )
197257 try :
198258 self .log ('creating Namespace {} and services' .format (namespace ), level = logging .DEBUG )
@@ -234,13 +294,13 @@ def create(self, *args, **kwargs): # noqa
234294 if ingress == "" :
235295 raise ServiceUnavailable ('Empty hostname' )
236296 try :
237- self ._scheduler .ingress .get (ingress )
297+ self ._scheduler .ingress .get (namespace , ingress )
238298 except KubeException :
239299 self .log ("creating Ingress {}" .format (namespace ), level = logging .INFO )
240300 host = "%s.%s" % (ingress , settings .PLATFORM_DOMAIN )
241301 self ._scheduler .ingress .create (
242302 ingress , settings .INGRESS_CLASS , namespace ,
243- hosts = [host , ], tls = [] )
303+ hosts = [host , ])
244304 except KubeException as e :
245305 raise ServiceUnavailable ('Could not create Ingress in Kubernetes' ) from e
246306 try :
@@ -572,13 +632,8 @@ def deploy(self, release, force_deploy=False, rollback_on_failure=True): # noqa
572632 # let initial deploy settle before routing traffic to the application
573633 if deploys and app_type :
574634 app_settings = self .appsettings_set .latest ()
575- if app_settings .whitelist :
576- addresses = "," .join (address for address in app_settings .whitelist )
577- else :
578- addresses = None
579635 service_annotations = {
580636 'maintenance' : app_settings .maintenance ,
581- 'whitelist' : addresses
582637 }
583638
584639 routable = deploys [app_type ].get ('routable' )
@@ -950,24 +1005,6 @@ def _update_application_service(self, namespace, app_type, port, routable=False,
9501005 self ._scheduler .svc .update (namespace , namespace , data = old_service )
9511006 raise ServiceUnavailable (str (e )) from e
9521007
953- def whitelist (self , whitelist ):
954- """
955- Add/ Delete addresses to application whitelist
956- """
957- service = self ._fetch_service_config (self .id )
958-
959- try :
960- if whitelist :
961- addresses = "," .join (address for address in whitelist )
962- service ['metadata' ]['annotations' ]['router.drycc.cc/whitelist' ] = addresses
963- elif 'router.drycc.cc/whitelist' in service ['metadata' ]['annotations' ]:
964- service ['metadata' ]['annotations' ].pop ('router.drycc.cc/whitelist' , None )
965- else :
966- return
967- self ._scheduler .svc .update (self .id , self .id , data = service )
968- except KubeException as e :
969- raise ServiceUnavailable (str (e )) from e
970-
9711008 def autoscale (self , proc_type , autoscale ):
9721009 """
9731010 Set autoscale rules for the application
0 commit comments