Skip to content

Commit 63ca37c

Browse files
committed
feat(rootfs/api): support maintenance mode.
implement maintenance mode and do minor refactoring
1 parent b6fb2ad commit 63ca37c

2 files changed

Lines changed: 40 additions & 7 deletions

File tree

rootfs/api/models/app.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from api.models import UuidAuditedModel, AlreadyExists, DeisException, ServiceUnavailable
2323
from api.models.config import Config
2424
from api.models.domain import Domain
25+
from api.models.service import Service
2526
from api.models.release import Release
2627
from api.models.tls import TLS
2728
from api.models.appsettings import AppSettings
@@ -892,6 +893,11 @@ def maintenance_mode(self, mode):
892893
self._scheduler.svc.update(self.id, self.id, data=old_service)
893894
raise ServiceUnavailable(str(e)) from e
894895

896+
# set maintenance mode for services
897+
for svc in self.service_set.all():
898+
svc.maintenance_mode(mode)
899+
900+
895901
def routable(self, routable):
896902
"""
897903
Turn on/off if an application is publically routable

rootfs/api/models/service.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)