Skip to content

Commit d4415c9

Browse files
author
Matthew Fisher
authored
fix(api): fail when rolling back to v1 (#762)
v1 is an intial release created when `deis create` is called, but does not contain any build information.
1 parent b27c816 commit d4415c9

2 files changed

Lines changed: 38 additions & 57 deletions

File tree

rootfs/api/models/release.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ def rollback(self, user, version=None):
217217

218218
if version < 1:
219219
raise DeisException('version cannot be below 0')
220+
elif version == 1:
221+
raise DeisException('Cannot roll back to initial release.')
220222

221223
prev = self.app.release_set.get(version=version)
222224
new_release = self.new(

rootfs/api/tests/test_release.py

Lines changed: 36 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -136,83 +136,62 @@ def test_release_rollback(self, mock_requests):
136136
response = self.client.post(url)
137137
self.assertEqual(response.status_code, 201, response.data)
138138
app_id = response.data['id']
139+
app = App.objects.get(id=app_id)
139140
# try to rollback with only 1 release extant, expecting 400
140141
url = "/v2/apps/{app_id}/releases/rollback/".format(**locals())
141142
response = self.client.post(url)
142143
self.assertEqual(response.status_code, 400, response.data)
143144
self.assertEqual(response.data, {'detail': 'version cannot be below 0'})
144145
self.assertEqual(response.get('content-type'), 'application/json')
145-
# update config to roll a new release
146+
# update the build to roll a new release
147+
url = '/v2/apps/{app_id}/builds'.format(**locals())
148+
body = {'image': 'autotest/example'}
149+
response = self.client.post(url, body)
150+
self.assertEqual(response.status_code, 201, response.data)
151+
# update config to roll another release
146152
url = '/v2/apps/{app_id}/config'.format(**locals())
147153
body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})}
148154
response = self.client.post(url, body)
149155
self.assertEqual(response.status_code, 201, response.data)
150-
# TODO: edge case that fails becasue version 1 has no build object.
151-
# update the build to roll a new release
152-
# url = '/v2/apps/{app_id}/builds'.format(**locals())
153-
# body = {'image': 'autotest/example'}
154-
# response = self.client.post(url, body)
155-
# self.assertEqual(response.status_code, 201, response.data)
156-
# rollback and check to see that a 4th release was created
157-
# with the build and config of release #2
156+
# create another release with a different build
157+
url = '/v2/apps/{app_id}/builds'.format(**locals())
158+
body = {'image': 'autotest/example:canary'}
159+
response = self.client.post(url, body)
160+
self.assertEqual(response.status_code, 201, response.data)
161+
# rollback and check to see that a 5th release was created
162+
# with the build and config of release #3
158163
url = "/v2/apps/{app_id}/releases/rollback/".format(**locals())
159164
response = self.client.post(url)
160165
self.assertEqual(response.status_code, 201, response.data)
161-
url = '/v2/apps/{app_id}/releases'.format(**locals())
162-
response = self.client.get(url)
163-
self.assertEqual(response.status_code, 200, response.data)
164-
self.assertEqual(response.data['count'], 3)
165-
url = '/v2/apps/{app_id}/releases/v1'.format(**locals())
166-
response = self.client.get(url)
167-
self.assertEqual(response.status_code, 200, response.data)
168-
release1 = response.data
169-
self.assertEqual(release1['version'], 1)
170-
url = '/v2/apps/{app_id}/releases/v3'.format(**locals())
171-
response = self.client.get(url)
172-
self.assertEqual(response.status_code, 200, response.data)
173-
release3 = response.data
174-
self.assertEqual(release3['version'], 3)
175-
self.assertNotEqual(release1['uuid'], release3['uuid'])
176-
self.assertEqual(release1['build'], release3['build'])
177-
self.assertEqual(release1['config'], release3['config'])
178-
# rollback explicitly to release #1 and check that a 5th release
179-
# was created with the build and config of release #1
166+
self.assertEqual(Release.objects.count(), 5)
167+
release1 = Release.objects.get(app=app, version=1)
168+
release2 = Release.objects.get(app=app, version=2)
169+
release3 = Release.objects.get(app=app, version=3)
170+
release4 = Release.objects.get(app=app, version=4)
171+
release5 = Release.objects.get(app=app, version=5)
172+
# verify the rollback to v3
173+
self.assertNotEqual(release5.uuid, release3.uuid)
174+
self.assertNotEqual(release5.build, release4.build)
175+
self.assertEqual(release5.build, release3.build)
176+
self.assertEqual(release5.config.values, release3.config.values)
177+
# double-check to see that the current build and config is the same as v3
178+
self.assertEqual(release5.build.image, 'autotest/example')
179+
self.assertEqual(release5.config.values, {'NEW_URL1': 'http://localhost:8080/'})
180+
# try to rollback to v1 and verify that the rollback failed
181+
# (v1 is an initial release with no build)
180182
url = "/v2/apps/{app_id}/releases/rollback/".format(**locals())
181183
body = {'version': 1}
182184
response = self.client.post(url, body)
183-
self.assertEqual(response.status_code, 201, response.data)
184-
url = '/v2/apps/{app_id}/releases'.format(**locals())
185-
response = self.client.get(url)
186-
self.assertEqual(response.status_code, 200, response.data)
187-
self.assertEqual(response.data['count'], 4)
188-
url = '/v2/apps/{app_id}/releases/v1'.format(**locals())
189-
response = self.client.get(url)
190-
self.assertEqual(response.status_code, 200, response.data)
191-
release1 = response.data
192-
url = '/v2/apps/{app_id}/releases/v4'.format(**locals())
193-
response = self.client.get(url)
194-
self.assertEqual(response.status_code, 200, response.data)
195-
release4 = response.data
196-
self.assertEqual(release4['version'], 4)
197-
self.assertNotEqual(release1['uuid'], release4['uuid'])
198-
self.assertEqual(release1['build'], release4['build'])
199-
self.assertEqual(release1['config'], release4['config'])
200-
# check to see that the current config is actually the initial one
201-
url = "/v2/apps/{app_id}/config".format(**locals())
202-
response = self.client.get(url)
203-
self.assertEqual(response.status_code, 200, response.data)
204-
self.assertEqual(response.data['values'], {})
205-
# rollback to #2 and see that it has the correct config
185+
self.assertContains(response, 'Cannot roll back to initial release.', status_code=400)
186+
# roll back to v2 so we can verify config gets rolled back too
206187
url = "/v2/apps/{app_id}/releases/rollback/".format(**locals())
207188
body = {'version': 2}
208189
response = self.client.post(url, body)
209190
self.assertEqual(response.status_code, 201, response.data)
210-
url = "/v2/apps/{app_id}/config".format(**locals())
211-
response = self.client.get(url)
212-
self.assertEqual(response.status_code, 200, response.data)
213-
values = response.data['values']
214-
self.assertIn('NEW_URL1', values)
215-
self.assertEqual('http://localhost:8080/', values['NEW_URL1'])
191+
self.assertEqual(Release.objects.count(), 6)
192+
release6 = Release.objects.get(app=app, version=6)
193+
self.assertEqual(release6.build.image, 'autotest/example')
194+
self.assertEqual(release6.config.values, {})
216195

217196
def test_release_str(self, mock_requests):
218197
"""Test the text representation of a release."""

0 commit comments

Comments
 (0)