Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.2.15 on 2024-09-24 09:01

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0014_alter_certificate_app'),
]

operations = [
migrations.AlterField(
model_name='appsettings',
name='autodeploy',
field=models.BooleanField(default=None),
),
migrations.AlterField(
model_name='appsettings',
name='autorollback',
field=models.BooleanField(default=None),
),
migrations.AlterField(
model_name='appsettings',
name='routable',
field=models.BooleanField(default=None),
),
]
3 changes: 2 additions & 1 deletion rootfs/api/models/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ def create(self, *args, **kwargs): # noqa
try:
self.appsettings_set.latest()
except AppSettings.DoesNotExist:
AppSettings.objects.create(owner=self.owner, app=self)
AppSettings.objects.create(
owner=self.owner, app=self, routable=True, autodeploy=True, autorollback=True)
try:
self.tls_set.latest()
except TLS.DoesNotExist:
Expand Down
8 changes: 5 additions & 3 deletions rootfs/api/models/appsettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class AppSettings(UuidAuditedModel):

owner = models.ForeignKey(User, on_delete=models.PROTECT)
app = models.ForeignKey('App', on_delete=models.CASCADE)
routable = models.BooleanField(default=True)
autodeploy = models.BooleanField(default=True)
autorollback = models.BooleanField(default=True)
routable = models.BooleanField(default=None)
autodeploy = models.BooleanField(default=None)
autorollback = models.BooleanField(default=None)
autoscale = models.JSONField(default=dict, blank=True)
label = models.JSONField(default=dict, blank=True)

Expand Down Expand Up @@ -70,6 +70,8 @@ def _update_field(self, field, previous_settings):
# if nothing changed copy the settings from previous
if new is None and old is not None:
setattr(self, field, old)
elif new is None and isinstance(self._meta.get_field(field), models.BooleanField):
setattr(self, field, True)
elif old != new:
self.summary += ["{} changed {} from {} to {}".format(self.owner, field, old, new)]

Expand Down
56 changes: 39 additions & 17 deletions rootfs/api/tests/test_app_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,54 +24,76 @@ def tearDown(self):
# make sure every test has a clean slate for k8s mocking
cache.clear()

def test_settings_routable(self, mock_requests):
def test_settings_bool(self, mock_requests):
"""
Create an application with the routable flag turned on or off
"""
# create app, expecting routable to be true
app_id = self.create_app()
app = App.objects.get(id=app_id)
self.assertTrue(app.appsettings_set.latest().routable)
self.assertTrue(app.appsettings_set.latest().autodeploy)
self.assertTrue(app.appsettings_set.latest().autorollback)
# Set routable to false
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'routable': False}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertFalse(app.appsettings_set.latest().routable)

def test_settings_autodeploy(self, mock_requests):
"""
Create an application with the autorollback flag turned on or off
"""
# create app, expecting autodeploy to be true
app_id = self.create_app()
app = App.objects.get(id=app_id)
self.assertTrue(app.appsettings_set.latest().autodeploy)
self.assertTrue(app.appsettings_set.latest().autorollback)

# Set autodeploy to false
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'autodeploy': False}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertFalse(app.appsettings_set.latest().routable)
self.assertFalse(app.appsettings_set.latest().autodeploy)

def test_settings_autorollback(self, mock_requests):
"""
Create an application with the autorollback flag turned on or off
"""
# create app, expecting autorollback to be true
app_id = self.create_app()
app = App.objects.get(id=app_id)
self.assertTrue(app.appsettings_set.latest().autorollback)

# Set autorollback to false
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'autorollback': False}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertFalse(app.appsettings_set.latest().routable)
self.assertFalse(app.appsettings_set.latest().autodeploy)
self.assertFalse(app.appsettings_set.latest().autorollback)

# Set autorollback to true
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'autorollback': True}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertFalse(app.appsettings_set.latest().routable)
self.assertFalse(app.appsettings_set.latest().autodeploy)
self.assertTrue(app.appsettings_set.latest().autorollback)

# Set autodeploy to true
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'autodeploy': True}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertFalse(app.appsettings_set.latest().routable)
self.assertTrue(app.appsettings_set.latest().autodeploy)
self.assertTrue(app.appsettings_set.latest().autorollback)

# Set routable to false
response = self.client.post(
f'/v2/apps/{app.id}/settings',
{'routable': True}
)
self.assertEqual(response.status_code, 201, response.data)
self.assertTrue(app.appsettings_set.latest().routable)
self.assertTrue(app.appsettings_set.latest().autodeploy)
self.assertTrue(app.appsettings_set.latest().autorollback)

def test_autoscale(self, mock_requests):
"""
Test that autoscale can be applied
Expand Down