Merge lp:~ricardokirkner/ols-store-tests/retry-release-snap into lp:~ubuntuone-pqm-team/ols-store-tests/store-acceptance-tests

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 22
Merged at revision: 18
Proposed branch: lp:~ricardokirkner/ols-store-tests/retry-release-snap
Merge into: lp:~ubuntuone-pqm-team/ols-store-tests/store-acceptance-tests
Diff against target: 73 lines (+32/-10)
1 file modified
tests/api/snap/test_snap_release.py (+32/-10)
To merge this branch: bzr merge lp:~ricardokirkner/ols-store-tests/retry-release-snap
Reviewer Review Type Date Requested Status
Ricardo Kirkner (community) Approve
Fabián Ezequiel Gallina (community) Approve
Review via email: mp+299346@code.launchpad.net

Commit message

retry releasing snap if request fails

To post a comment you must log in.
18. By Ricardo Kirkner

retry releasing snap if request fails

19. By Ricardo Kirkner

added missing import

20. By Ricardo Kirkner

log about retrying to release

21. By Ricardo Kirkner

fixed typo

Revision history for this message
Fabián Ezequiel Gallina (fgallina) wrote :

LGTM

It should be possible at some point that the retry logic consist of polling the status_url until it gives an OK and then the release is retried.

review: Approve
22. By Ricardo Kirkner

refactor code to poll for status before retrying to release

Revision history for this message
Ricardo Kirkner (ricardokirkner) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/api/snap/test_snap_release.py'
2--- tests/api/snap/test_snap_release.py 2016-06-24 20:15:28 +0000
3+++ tests/api/snap/test_snap_release.py 2016-07-07 15:51:49 +0000
4@@ -1,5 +1,7 @@
5+import json
6+import logging
7+import time
8 import uuid
9-import json
10
11 import requests
12
13@@ -13,7 +15,11 @@
14 from .test_snap_push import push_snap
15
16
17-def release_snap(name=None, revision=None, channels=None, auth=None):
18+RELEASE_SNAP_RETRY_WAIT = 30
19+
20+
21+def release_snap(name=None, revision=None, channels=None,
22+ auth=None, retry=True, status_url=None):
23 headers = {
24 'Content-Type': 'application/json',
25 }
26@@ -30,6 +36,28 @@
27
28 url = '{}/dev/api/snap-release/'.format(SCA_ROOT_URL)
29 response = requests.post(url, data=json.dumps(data), headers=headers)
30+
31+ if retry and response.status_code == 409:
32+ if status_url is not None:
33+ response = poll_until_processed(status_url)
34+ else:
35+ logging.info(
36+ 'Failed to release: data=%s. Retrying in %s seconds.',
37+ data, RELEASE_SNAP_RETRY_WAIT)
38+ time.sleep(RELEASE_SNAP_RETRY_WAIT)
39+ response = requests.post(url, data=json.dumps(data), headers=headers)
40+
41+ return response
42+
43+
44+def poll_until_processed(status_url):
45+ response = get_snap_status(status_url)
46+ # TODO: how to avoid looping forever here in some sensible way?
47+ while not is_processed(response):
48+ response = get_snap_status(status_url)
49+ if not can_release(response):
50+ self.fail('Unexpected error. Can not release package. '
51+ 'Status: {}'.format(response.json()))
52 return response
53
54
55@@ -105,17 +133,11 @@
56 updown_id, version = upload_snap(self.name)
57 response = push_snap(self.name, updown_id, auth=self.auth)
58 status_url = get_snap_status_url(response)
59- response = get_snap_status(status_url)
60- # TODO: how to avoid looping forever here in some sensible way?
61- while not is_processed(response):
62- response = get_snap_status(status_url)
63- if not can_release(response):
64- self.fail('Unexpected error. Can not release package. '
65- 'Status: {}'.format(response.json()))
66+ response = poll_until_processed(status_url)
67
68 revision = get_snap_revision(response)
69 response = release_snap(self.name, revision, self.channels,
70- auth=self.auth)
71+ auth=self.auth, status_url=status_url)
72 self.assert_success(response)
73 self.assert_success_body(response, version, revision)
74

Subscribers

People subscribed via source and target branches

to all changes: