util: Retry resolving git branches
When there's a temporary network issue, Pungi will fail to turn a branch into a commit hash. This would abort the whole compose. Instead we should just retry a few times. Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
parent
700106facf
commit
0cdf996e6e
@ -253,7 +253,7 @@ def resolve_git_url(url):
|
||||
scheme = r.scheme.replace('git+', '')
|
||||
|
||||
baseurl = urlparse.urlunsplit((scheme, r.netloc, r.path, '', ''))
|
||||
_, output = run(['git', 'ls-remote', baseurl, ref])
|
||||
_, output = git_ls_remote(baseurl, ref)
|
||||
|
||||
lines = [line for line in output.split('\n') if line]
|
||||
if len(lines) == 0:
|
||||
@ -776,3 +776,8 @@ def retry(timeout=120, interval=30, wait_on=Exception):
|
||||
time.sleep(interval)
|
||||
return inner
|
||||
return wrapper
|
||||
|
||||
|
||||
@retry(wait_on=RuntimeError)
|
||||
def git_ls_remote(baseurl, ref):
|
||||
return run(['git', 'ls-remote', baseurl, ref])
|
||||
|
@ -92,6 +92,18 @@ class TestGitRefResolver(unittest.TestCase):
|
||||
['git', 'ls-remote', 'https://git.example.com/repo.git', 'refs/heads/my-branch'])
|
||||
self.assertIn('ref does not exist in remote repo', str(ctx.exception))
|
||||
|
||||
@mock.patch('time.sleep')
|
||||
@mock.patch('pungi.util.run')
|
||||
def test_retry(self, run, sleep):
|
||||
run.side_effect = [RuntimeError('Boom'), (0, 'CAFEBABE\tHEAD\n')]
|
||||
|
||||
url = util.resolve_git_url('https://git.example.com/repo.git?somedir#HEAD')
|
||||
|
||||
self.assertEqual(url, 'https://git.example.com/repo.git?somedir#CAFEBABE')
|
||||
self.assertEqual(sleep.call_args_list, [mock.call(30)])
|
||||
self.assertEqual(run.call_args_list,
|
||||
[mock.call(['git', 'ls-remote', 'https://git.example.com/repo.git', 'HEAD'])] * 2)
|
||||
|
||||
|
||||
class TestGetVariantData(unittest.TestCase):
|
||||
def test_get_simple(self):
|
||||
|
Loading…
Reference in New Issue
Block a user