@@ -20,7 +20,7 @@ class Meta:
2020 ordering = ['-created' ]
2121
2222 def __str__ (self ):
23- return "{}-{}" . format ( self .app . id , str ( self . procfile_type ) )
23+ return self ._svc_name ( )
2424
2525 def as_dict (self ):
2626 return {
@@ -30,9 +30,8 @@ def as_dict(self):
3030
3131 def create (self , * args , ** kwargs ): # noqa
3232 # create required minimum service in k8s for the application
33-
34- namespace = self .app .id
35- svc_name = "{}-{}" .format (namespace , self .procfile_type )
33+ namespace = self ._namespace ()
34+ svc_name = self ._svc_name ()
3635 self .log ('creating Service: {}' .format (svc_name ), level = logging .DEBUG )
3736 try :
3837 try :
@@ -54,8 +53,8 @@ def save(self, *args, **kwargs):
5453 return service
5554
5655 def delete (self , * args , ** kwargs ):
57- namespace = self .app . id
58- svc_name = "{}-{}" . format ( namespace , self .procfile_type )
56+ namespace = self ._namespace ()
57+ svc_name = self ._svc_name ( )
5958 self .log ('deleting Service: {}' .format (svc_name ), level = logging .DEBUG )
6059 try :
6160 self ._scheduler .svc .delete (namespace , svc_name )
@@ -77,10 +76,38 @@ def log(self, message, level=logging.INFO):
7776 """
7877 logger .log (level , "[{}]: {}" .format (self .id , message ))
7978
79+ def maintenance_mode (self , mode ):
80+ """
81+ Turn service maintenance mode on/off
82+ """
83+ namespace = self ._namespace ()
84+ svc_name = self ._svc_name ()
85+
86+ try :
87+ service = self ._fetch_service_config (namespace , svc_name )
88+ except (ServiceUnavailable , KubeException ) as e :
89+ # ignore non-existing services
90+ return
91+
92+ old_service = service .copy () # in case anything fails for rollback
93+
94+ try :
95+ service ['metadata' ]['annotations' ]['router.deis.io/maintenance' ] = str (mode ).lower ()
96+ self ._scheduler .svc .update (namespace , svc_name , data = service )
97+ except KubeException as e :
98+ self ._scheduler .svc .update (namespace , svc_name , data = old_service )
99+ raise ServiceUnavailable (str (e )) from e
100+
101+ def _namespace (self ):
102+ return self .app .id
103+
104+ def _svc_name (self ):
105+ return "{}-{}" .format (self .app .id , self .procfile_type )
106+
80107 def _gather_settings (self ):
81108 app_settings = self .app .appsettings_set .latest ()
82109 return {
83- 'domains' : "{}-{}" . format ( self .app . id , self . procfile_type ),
110+ 'domains' : self ._svc_name ( ),
84111 'maintenance' : app_settings .maintenance ,
85112 'routable' : app_settings .routable ,
86113 'proxyDomain' : self .app .id ,
0 commit comments