From b82111d589cf3f82cbe115d002b29eee959a428f Mon Sep 17 00:00:00 2001 From: Paul Bourke Date: Thu, 14 Jan 2016 11:41:35 +0000 Subject: [PATCH] Pick up proxy buildargs from environment We currently support any buildarg via --build-args. This patch picks up the default supported proxy buildargs if set in the user's environment, to allow for more transparent proxy support. The --build-args will take precendence. DocImpact Implements blueprint: better-proxy-support Change-Id: I084e5d1cc8f9993d65167878f9983ad58a68e86e --- kolla/cmd/build.py | 20 +++++++++++++++++++- kolla/tests/test_build.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/kolla/cmd/build.py b/kolla/cmd/build.py index aff472d83c..e275997511 100755 --- a/kolla/cmd/build.py +++ b/kolla/cmd/build.py @@ -204,6 +204,23 @@ class WorkerThread(Thread): return dest_archive + def update_buildargs(self): + buildargs = dict() + if self.conf.build_args: + buildargs = dict(self.conf.build_args) + + proxy_vars = ('HTTP_PROXY', 'http_proxy', 'HTTPS_PROXY', + 'https_proxy', 'FTP_PROXY', 'ftp_proxy', + 'NO_PROXY', 'no_proxy') + + for proxy_var in proxy_vars: + if proxy_var in os.environ and proxy_var not in buildargs: + buildargs[proxy_var] = os.environ.get(proxy_var) + + if not buildargs: + return None + return buildargs + def builder(self, image): LOG.debug('%s:Processing', image['name']) if image['status'] == 'unmatched': @@ -256,13 +273,14 @@ class WorkerThread(Thread): pull = True if image['parent'] is None else False image['logs'] = str() + buildargs = self.update_buildargs() for response in self.dc.build(path=image['path'], tag=image['fullname'], nocache=self.nocache, rm=True, pull=pull, forcerm=self.forcerm, - buildargs=self.conf.build_args): + buildargs=buildargs): stream = json.loads(response.decode('utf-8')) if 'stream' in stream: diff --git a/kolla/tests/test_build.py b/kolla/tests/test_build.py index afc2e75465..d1ace9ec8e 100644 --- a/kolla/tests/test_build.py +++ b/kolla/tests/test_build.py @@ -12,6 +12,7 @@ import fixtures import mock +import os from kolla.cmd import build from kolla.tests import base @@ -34,6 +35,7 @@ class WorkerThreadTest(base.TestCase): # NOTE(jeffrey4l): use a real, temporary dir FAKE_IMAGE['path'] = self.useFixture(fixtures.TempDir()).path + @mock.patch.dict(os.environ, clear=True) @mock.patch('docker.Client') def test_build_image(self, mock_client): queue = mock.Mock() @@ -48,6 +50,7 @@ class WorkerThreadTest(base.TestCase): nocache=False, rm=True, pull=True, forcerm=True, buildargs=None) + @mock.patch.dict(os.environ, clear=True) @mock.patch('docker.Client') def test_build_image_with_build_arg(self, mock_client): build_args = { @@ -64,3 +67,38 @@ class WorkerThreadTest(base.TestCase): path=FAKE_IMAGE['path'], tag=FAKE_IMAGE['fullname'], nocache=False, rm=True, pull=True, forcerm=True, buildargs=build_args) + + @mock.patch.dict(os.environ, {'http_proxy': 'http://FROM_ENV:8080'}, + clear=True) + @mock.patch('docker.Client') + def test_build_arg_from_env(self, mock_client): + build_args = { + 'http_proxy': 'http://FROM_ENV:8080', + } + worker = build.WorkerThread(mock.Mock(), + mock.Mock(), + self.conf) + worker.builder(FAKE_IMAGE) + + mock_client().build.assert_called_once_with( + path=FAKE_IMAGE['path'], tag=FAKE_IMAGE['fullname'], + nocache=False, rm=True, pull=True, forcerm=True, + buildargs=build_args) + + @mock.patch.dict(os.environ, {'http_proxy': 'http://FROM_ENV:8080'}, + clear=True) + @mock.patch('docker.Client') + def test_build_arg_precedence(self, mock_client): + build_args = { + 'http_proxy': 'http://localhost:8080', + } + self.conf.set_override('build_args', build_args) + worker = build.WorkerThread(mock.Mock(), + mock.Mock(), + self.conf) + worker.builder(FAKE_IMAGE) + + mock_client().build.assert_called_once_with( + path=FAKE_IMAGE['path'], tag=FAKE_IMAGE['fullname'], + nocache=False, rm=True, pull=True, forcerm=True, + buildargs=build_args)