Add timeout to requests.get() in kolla/cmd/build.py
When kolla-build is running, if there are network issues or if the source's location (like http://tarballs.openstack.org) fails to respond due to high number of concurrent requests, kolla-build just hangs/blocks indefinitely. This patch set resolves this issue by adding a timeout of 120 seconds for requests.get() in kolla/cmd/build.py, adds a unit test for it in kolla/tests/test_build.py and also the "timeout" argument in kolla/common/config.py. Change-Id: I7c8745a20b9bd1c3f5d6a55c72a794f16fd7e513 Closes-Bug: #1548614
This commit is contained in:
parent
c81097df8b
commit
320c1f9272
@ -164,7 +164,14 @@ class WorkerThread(threading.Thread):
|
||||
if source.get('type') == 'url':
|
||||
LOG.debug("%s:Getting archive from %s", image['name'],
|
||||
source['source'])
|
||||
r = requests.get(source['source'])
|
||||
try:
|
||||
r = requests.get(source['source'], timeout=self.conf.timeout)
|
||||
except requests_exc.Timeout:
|
||||
LOG.exception('Request timed out while getting archive'
|
||||
' from %s', source['source'])
|
||||
image['status'] = "error"
|
||||
image['logs'] = str()
|
||||
return
|
||||
|
||||
if r.status_code == 200:
|
||||
with open(dest_archive, 'wb') as f:
|
||||
|
@ -131,6 +131,8 @@ _CLI_OPTS = [
|
||||
cfg.BoolOpt('template-only', default=False,
|
||||
deprecated_group='kolla-build',
|
||||
help=("Don't build images. Generate Dockerfile only")),
|
||||
cfg.IntOpt('timeout', default=120,
|
||||
help='Time in seconds after which any operation times out'),
|
||||
]
|
||||
|
||||
_BASE_OPTS = [
|
||||
|
@ -14,6 +14,7 @@ import fixtures
|
||||
import itertools
|
||||
import mock
|
||||
import os
|
||||
import requests
|
||||
|
||||
from kolla.cmd import build
|
||||
from kolla.tests import base
|
||||
@ -106,6 +107,27 @@ class WorkerThreadTest(base.TestCase):
|
||||
nocache=False, rm=True, pull=True, forcerm=True,
|
||||
buildargs=build_args)
|
||||
|
||||
@mock.patch('docker.Client')
|
||||
@mock.patch('requests.get')
|
||||
def test_requests_get_timeout(self, mock_get, mock_client):
|
||||
worker = build.WorkerThread(mock.Mock(),
|
||||
mock.Mock(),
|
||||
self.conf)
|
||||
self.image['source'] = {
|
||||
'source': 'http://fake/source',
|
||||
'type': 'url',
|
||||
'name': 'fake-image-base'
|
||||
}
|
||||
mock_get.side_effect = requests.exceptions.Timeout
|
||||
get_result = worker.process_source(self.image,
|
||||
self.image['source'])
|
||||
|
||||
self.assertIsNone(get_result)
|
||||
self.assertEqual(self.image['status'], 'error')
|
||||
self.assertEqual(self.image['logs'], str())
|
||||
mock_get.assert_called_once_with(self.image['source']['source'],
|
||||
timeout=120)
|
||||
|
||||
|
||||
class KollaWorkerTest(base.TestCase):
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user