From 5c5578c1109036f706b5c013cf8fbbaf05042639 Mon Sep 17 00:00:00 2001 From: lijianguo Date: Tue, 24 Sep 2024 18:01:08 +0800 Subject: [PATCH] fix(controller): app_settings boolean field cannot be set correctly --- ...5_alter_appsettings_autodeploy_and_more.py | 28 ++++++++++ rootfs/api/models/app.py | 3 +- rootfs/api/models/appsettings.py | 8 ++- rootfs/api/tests/test_app_settings.py | 56 +++++++++++++------ 4 files changed, 74 insertions(+), 21 deletions(-) create mode 100644 rootfs/api/migrations/0015_alter_appsettings_autodeploy_and_more.py diff --git a/rootfs/api/migrations/0015_alter_appsettings_autodeploy_and_more.py b/rootfs/api/migrations/0015_alter_appsettings_autodeploy_and_more.py new file mode 100644 index 000000000..f3786e0a8 --- /dev/null +++ b/rootfs/api/migrations/0015_alter_appsettings_autodeploy_and_more.py @@ -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), + ), + ] diff --git a/rootfs/api/models/app.py b/rootfs/api/models/app.py index 52c1239e2..464eac2b5 100644 --- a/rootfs/api/models/app.py +++ b/rootfs/api/models/app.py @@ -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: diff --git a/rootfs/api/models/appsettings.py b/rootfs/api/models/appsettings.py index 61282ad81..46d00a035 100644 --- a/rootfs/api/models/appsettings.py +++ b/rootfs/api/models/appsettings.py @@ -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) @@ -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)] diff --git a/rootfs/api/tests/test_app_settings.py b/rootfs/api/tests/test_app_settings.py index 7f4b621bf..92cb3a9a2 100644 --- a/rootfs/api/tests/test_app_settings.py +++ b/rootfs/api/tests/test_app_settings.py @@ -24,7 +24,7 @@ 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 """ @@ -32,6 +32,8 @@ def test_settings_routable(self, mock_requests): 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', @@ -39,39 +41,59 @@ def test_settings_routable(self, mock_requests): ) 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