Skip to content

Commit f7645a7

Browse files
committed
chore(maintenance): remove maintenance support
1 parent bba3608 commit f7645a7

6 files changed

Lines changed: 23 additions & 145 deletions

File tree

rootfs/api/migrations/0001_initial.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class Migration(migrations.Migration):
4646
('uuid', models.UUIDField(auto_created=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True, verbose_name='UUID')),
4747
('created', models.DateTimeField(auto_now_add=True)),
4848
('updated', models.DateTimeField(auto_now=True)),
49-
('maintenance', models.NullBooleanField(default=None)),
5049
('routable', models.NullBooleanField(default=None)),
5150
('whitelist', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), default=None, size=None)),
5251
('autoscale', jsonfield.fields.JSONField(blank=True, default={})),

rootfs/api/models/app.py

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,9 @@ def _refresh_ingress(self, hosts, tls_map, ssl_redirect):
208208
def refresh_ingress_and_tls(self):
209209
if not getattr(self, 'refresh_ingress_and_tls_enabled', True):
210210
return
211+
app_settings = self.appsettings_set.latest()
212+
if not app_settings.routable:
213+
return
211214
ingress = self.id
212215
hosts, tls_map = [], {}
213216

@@ -298,21 +301,23 @@ def create(self, *args, **kwargs): # noqa
298301
raise ServiceUnavailable('Could not delete the Namespace in Kubernetes') from e
299302

300303
raise ServiceUnavailable('Kubernetes resources could not be created') from e
301-
setattr(self, 'refresh_ingress_and_tls_enabled', False) # do not refresh
302304
try:
303-
self.appsettings_set.latest()
304-
except AppSettings.DoesNotExist:
305-
AppSettings.objects.create(owner=self.owner, app=self)
306-
try:
307-
self.tls_set.latest()
308-
except TLS.DoesNotExist:
309-
TLS.objects.create(owner=self.owner, app=self)
310-
# Attach the platform specific application sub domain to the k8s service
311-
# Only attach it on first release in case a customer has remove the app domain
312-
if rel.version == 1 and not Domain.objects.filter(domain=self.id).exists():
313-
Domain.objects.create(owner=self.owner, app=self, domain=self.id)
314-
# The default routable is true, so refresh ingress and tls
315-
setattr(self, 'refresh_ingress_and_tls_enabled', True)
305+
setattr(self, 'refresh_ingress_and_tls_enabled', False) # do not refresh
306+
try:
307+
self.appsettings_set.latest()
308+
except AppSettings.DoesNotExist:
309+
AppSettings.objects.create(owner=self.owner, app=self)
310+
try:
311+
self.tls_set.latest()
312+
except TLS.DoesNotExist:
313+
TLS.objects.create(owner=self.owner, app=self)
314+
# Attach the platform specific application sub domain to the k8s service
315+
# Only attach it on first release in case a customer has remove the app domain
316+
if rel.version == 1 and not Domain.objects.filter(domain=self.id).exists():
317+
Domain.objects.create(owner=self.owner, app=self, domain=self.id)
318+
# The default routable is true, so refresh ingress and tls
319+
finally:
320+
setattr(self, 'refresh_ingress_and_tls_enabled', True)
316321
self.refresh_ingress_and_tls() # refresh
317322

318323
def delete(self, *args, **kwargs):
@@ -660,7 +665,8 @@ def _check_deployment_in_progress(self, deploys, force_deploy=False):
660665
if in_progress and not deploy_okay:
661666
raise AlreadyExists('Deployment for {} is already in progress'.format(name))
662667

663-
def _default_structure(self, release):
668+
@staticmethod
669+
def _default_structure(release):
664670
"""Scale to default structure based on release type"""
665671
# If web in procfile then honor it
666672
if release.build.procfile and 'web' in release.build.procfile:
@@ -940,23 +946,6 @@ def _build_env_vars(self, release):
940946
default_env.update(release.config.values)
941947
return default_env
942948

943-
def maintenance_mode(self, mode):
944-
"""
945-
Turn application maintenance mode on/off
946-
"""
947-
if mode:
948-
namespace = ingress = self.id
949-
try:
950-
data = self._scheduler.ingress.get(namespace, ingress).json()
951-
for rule in data["spec"]["rules"]:
952-
for path in rule["http"]["paths"]:
953-
path["backend"]["serviceName"] = "drycc-maintenance-proxy"
954-
self._scheduler.ingress.patch(ingress, namespace, data)
955-
except KubeException:
956-
self.log("creating Ingress {}".format(namespace), level=logging.INFO)
957-
else:
958-
self.refresh_ingress_and_tls()
959-
960949
def routable(self, routable):
961950
"""
962951
Turn on/off if an application is publically routable

rootfs/api/models/appsettings.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class AppSettings(UuidAuditedModel):
1818

1919
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
2020
app = models.ForeignKey('App', on_delete=models.CASCADE)
21-
maintenance = models.NullBooleanField(default=None)
2221
routable = models.NullBooleanField(default=None)
2322
# the default values is None to differentiate from user sending an empty whitelist
2423
# and user just updating other fields meaning the values needs to be copied from prev release
@@ -49,20 +48,6 @@ def new(self, user, whitelist):
4948

5049
return app_settings
5150

52-
def _update_maintenance(self, previous_settings):
53-
old = getattr(previous_settings, 'maintenance', None)
54-
new = getattr(self, 'maintenance', None)
55-
# If no previous settings then assume it is the first record and default to true
56-
if not previous_settings:
57-
setattr(self, 'maintenance', False)
58-
self.app.maintenance_mode(False)
59-
# if nothing changed copy the settings from previous
60-
elif new is None and old is not None:
61-
setattr(self, 'maintenance', old)
62-
elif old != new:
63-
self.app.maintenance_mode(new)
64-
self.summary += ["{} changed maintenance mode from {} to {}".format(self.owner, old, new)] # noqa
65-
6651
def _update_routable(self, previous_settings):
6752
old = getattr(previous_settings, 'routable', None)
6853
new = getattr(self, 'routable', None)
@@ -179,7 +164,6 @@ def save(self, *args, **kwargs):
179164
pass
180165

181166
try:
182-
self._update_maintenance(previous_settings)
183167
self._update_routable(previous_settings)
184168
self._update_whitelist(previous_settings)
185169
self._update_autoscale(previous_settings)

rootfs/api/tests/test_app_settings.py

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -25,48 +25,6 @@ def tearDown(self):
2525
# make sure every test has a clean slate for k8s mocking
2626
cache.clear()
2727

28-
def test_settings_maintenance(self, mock_requests):
29-
"""
30-
Test that maintenance can be applied
31-
"""
32-
app_id = self.create_app()
33-
app = App.objects.get(id=app_id)
34-
35-
settings = {'maintenance': True}
36-
response = self.client.post(
37-
'/v2/apps/{app_id}/settings'.format(**locals()),
38-
settings)
39-
self.assertEqual(response.status_code, 201, response.data)
40-
self.assertTrue(response.data['maintenance'])
41-
self.assertTrue(app.appsettings_set.latest().maintenance)
42-
43-
settings = {'routable': False}
44-
response = self.client.post(
45-
'/v2/apps/{app_id}/settings'.format(**locals()),
46-
settings)
47-
self.assertEqual(response.status_code, 201, response.data)
48-
self.assertTrue(app.appsettings_set.latest().maintenance)
49-
50-
settings['maintenance'] = False
51-
response = self.client.post(
52-
'/v2/apps/{app_id}/settings'.format(**locals()),
53-
settings)
54-
self.assertEqual(response.status_code, 201, response.data)
55-
self.assertFalse(response.data['maintenance'])
56-
self.assertFalse(app.appsettings_set.latest().maintenance)
57-
58-
response = self.client.post(
59-
'/v2/apps/{app_id}/settings'.format(**locals()),
60-
settings)
61-
self.assertEqual(response.status_code, 409, response.data)
62-
self.assertFalse(app.appsettings_set.latest().maintenance)
63-
64-
settings['maintenance'] = "test"
65-
response = self.client.post(
66-
'/v2/apps/{app_id}/settings'.format(**locals()),
67-
settings)
68-
self.assertEqual(response.status_code, 400, response.data)
69-
7028
def test_settings_routable(self, mock_requests):
7129
"""
7230
Create an application with the routable flag turned on or off
@@ -83,13 +41,6 @@ def test_settings_routable(self, mock_requests):
8341
self.assertEqual(response.status_code, 201, response.data)
8442
self.assertFalse(app.appsettings_set.latest().routable)
8543

86-
settings = {'maintenance': True}
87-
response = self.client.post(
88-
'/v2/apps/{app.id}/settings'.format(**locals()),
89-
settings)
90-
self.assertEqual(response.status_code, 201, response.data)
91-
self.assertFalse(app.appsettings_set.latest().routable)
92-
9344
def test_settings_whitelist(self, mock_requests):
9445
"""
9546
Test that addresses can be added/deleted to whitelist
@@ -163,7 +114,7 @@ def test_settings_whitelist(self, mock_requests):
163114
whitelist)
164115
self.assertEqual(response.status_code, 400, response.data)
165116
# update other appsettings and whitelist should be retained
166-
settings = {'maintenance': True}
117+
settings = {'routable': False}
167118
response = self.client.post(
168119
'/v2/apps/{app.id}/settings'.format(**locals()),
169120
settings)

rootfs/api/tests/test_build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def test_build_default_containers(self, mock_requests):
220220
self.assertEqual(container['type'], 'web')
221221
self.assertEqual(container['release'], 'v2')
222222
# pod name is auto generated so use regex
223-
self.assertRegex(container['name'], app_id + '-web-[0-9]{8,10}-[a-z0-9]{5}')
223+
self.assertRegex(container['name'], app_id + '-web-[0-9]{7,10}-[a-z0-9]{5}')
224224

225225
# start with a new app
226226
app_id = self.create_app()

rootfs/api/tests/test_services.py

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from django.core.cache import cache
33
from rest_framework.authtoken.models import Token
44

5-
from api.models import App
65

76
from api.tests import DryccTransactionTestCase
87

@@ -22,50 +21,6 @@ def tearDown(self):
2221
# make sure every test has a clean slate for k8s mocking
2322
cache.clear()
2423

25-
def test_settings_maintenance(self):
26-
"""
27-
Test that maintenance can be applied
28-
"""
29-
app_id = self.create_app()
30-
app = App.objects.get(id=app_id)
31-
32-
# create service
33-
response = self.client.post(
34-
'/v2/apps/{}/services'.format(app_id),
35-
{'procfile_type': 'test', 'path_pattern': '/testep/notify'}
36-
)
37-
self.assertEqual(response.status_code, 201, response.data)
38-
39-
# maintenance mode & routable sequence
40-
settings = {'maintenance': True}
41-
response = self.client.post(
42-
'/v2/apps/{app_id}/settings'.format(**locals()),
43-
settings)
44-
self.assertEqual(response.status_code, 201, response.data)
45-
self.assertTrue(response.data['maintenance'])
46-
self.assertTrue(app.appsettings_set.latest().maintenance)
47-
48-
settings = {'routable': False}
49-
response = self.client.post(
50-
'/v2/apps/{app_id}/settings'.format(**locals()),
51-
settings)
52-
self.assertEqual(response.status_code, 201, response.data)
53-
self.assertTrue(app.appsettings_set.latest().maintenance)
54-
55-
settings['maintenance'] = False
56-
response = self.client.post(
57-
'/v2/apps/{app_id}/settings'.format(**locals()),
58-
settings)
59-
self.assertEqual(response.status_code, 201, response.data)
60-
self.assertFalse(response.data['maintenance'])
61-
self.assertFalse(app.appsettings_set.latest().maintenance)
62-
63-
response = self.client.post(
64-
'/v2/apps/{app_id}/settings'.format(**locals()),
65-
settings)
66-
self.assertEqual(response.status_code, 409, response.data)
67-
self.assertFalse(app.appsettings_set.latest().maintenance)
68-
6924
def test_service_basic_ops(self):
7025
"""Test basic service operations."""
7126
app_id = self.create_app()

0 commit comments

Comments
 (0)