From 98f50c55391a0dcd41c8bc9c7c6d504f9b7b68dc Mon Sep 17 00:00:00 2001 From: Matt Boersma Date: Mon, 30 Jan 2017 16:47:28 -0700 Subject: [PATCH] fix(models/app): recreate proc types on switch from Dockerfile to buildpack Or vice versa. --- rootfs/api/models/app.py | 24 +++++++++++++++++++----- rootfs/api/tests/test_build.py | 10 ++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/rootfs/api/models/app.py b/rootfs/api/models/app.py index 9143d97f1..84f01ff2d 100644 --- a/rootfs/api/models/app.py +++ b/rootfs/api/models/app.py @@ -449,13 +449,28 @@ def deploy(self, release, force_deploy=False, rollback_on_failure=True): # noqa # use create to make sure minimum resources are created self.create() + # set processes structure to default if app is new. if self.structure == {}: self.structure = self._default_structure(release) self.save() - - app_settings = self.appsettings_set.latest() + # reset canonical process types if build type has changed. + else: + # find the previous release's build type + prev_release = release.previous() + if prev_release and prev_release.build: + if prev_release.build.type != release.build.type: + structure = self.structure.copy() + # zero out canonical pod counts + for proctype in ['cmd', 'web']: + if proctype in structure: + structure[proctype] = 0 + # update with the default process type. + structure.update(self._default_structure(release)) + self.structure = structure + self.save() # deploy application to k8s. Also handles initial scaling + app_settings = self.appsettings_set.latest() deploys = {} for scale_type, replicas in self.structure.items(): deploys[scale_type] = self._gather_app_settings(release, app_settings, scale_type, replicas) # noqa @@ -874,9 +889,8 @@ def _update_application_service(self, namespace, app_type, port, routable=False, # delete the annotation service['metadata']['labels'].pop('router.deis.io/routable', None) - # Set app type if there is not one available - if 'type' not in service['spec']['selector']: - service['spec']['selector']['type'] = app_type + # Set app type selector + service['spec']['selector']['type'] = app_type # Find if target port exists already, update / create as required if routable: diff --git a/rootfs/api/tests/test_build.py b/rootfs/api/tests/test_build.py index 8841bc27c..ac740a87f 100644 --- a/rootfs/api/tests/test_build.py +++ b/rootfs/api/tests/test_build.py @@ -288,17 +288,23 @@ def test_build_forgotten_procfile(self, mock_requests): self.assertEqual(response.status_code, 200, response.data) self.assertEqual(len(response.data['results']), 0) - # verify web is still there + # verify web is not there url = "/v2/apps/{app_id}/pods/web".format(**locals()) response = self.client.get(url) self.assertEqual(response.status_code, 200, response.data) self.assertEqual(len(response.data['results']), 0) + # verify cmd is there + url = "/v2/apps/{app_id}/pods/cmd".format(**locals()) + response = self.client.get(url) + self.assertEqual(response.status_code, 200, response.data) + self.assertEqual(len(response.data['results']), 1) + # look at the app structure url = "/v2/apps/{app_id}".format(**locals()) response = self.client.get(url) self.assertEqual(response.status_code, 200, response.data) - self.assertEqual(response.json()['structure'], {'web': 0, 'worker': 0}) + self.assertEqual(response.json()['structure'], {'cmd': 1, 'web': 0, 'worker': 0}) @override_settings(DEIS_DEPLOY_PROCFILE_MISSING_REMOVE=False) def test_build_no_remove_process(self, mock_requests):