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+', '') |     scheme = r.scheme.replace('git+', '') | ||||||
| 
 | 
 | ||||||
|     baseurl = urlparse.urlunsplit((scheme, r.netloc, r.path, '', '')) |     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] |     lines = [line for line in output.split('\n') if line] | ||||||
|     if len(lines) == 0: |     if len(lines) == 0: | ||||||
| @ -776,3 +776,8 @@ def retry(timeout=120, interval=30, wait_on=Exception): | |||||||
|                     time.sleep(interval) |                     time.sleep(interval) | ||||||
|         return inner |         return inner | ||||||
|     return wrapper |     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']) |             ['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)) |         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): | class TestGetVariantData(unittest.TestCase): | ||||||
|     def test_get_simple(self): |     def test_get_simple(self): | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user