From 320c1f92724d6c7bce45398dd783c4334969d23d Mon Sep 17 00:00:00 2001 From: Vikram Hosakote Date: Tue, 23 Feb 2016 21:04:04 +0000 Subject: [PATCH] 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 --- kolla/cmd/build.py | 9 ++++++++- kolla/common/config.py | 2 ++ kolla/tests/test_build.py | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/kolla/cmd/build.py b/kolla/cmd/build.py index dcbef77186..42eaa3011a 100755 --- a/kolla/cmd/build.py +++ b/kolla/cmd/build.py @@ -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: diff --git a/kolla/common/config.py b/kolla/common/config.py index f8629e4388..2eeb8c9ca5 100644 --- a/kolla/common/config.py +++ b/kolla/common/config.py @@ -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 = [ diff --git a/kolla/tests/test_build.py b/kolla/tests/test_build.py index 76020ef2a8..b6eeffa7d0 100644 --- a/kolla/tests/test_build.py +++ b/kolla/tests/test_build.py @@ -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):