diff --git a/kolla/image/build.py b/kolla/image/build.py index c270c7cd8e..7fd6fd714e 100755 --- a/kolla/image/build.py +++ b/kolla/image/build.py @@ -30,6 +30,7 @@ import tempfile import threading import time +from distutils.version import StrictVersion import docker import git import jinja2 @@ -221,9 +222,15 @@ class PushTask(DockerTask): self.success = False def push_image(self, image): - for response in self.dc.push(image.canonical_name, - stream=True, - insecure_registry=True): + kwargs = dict(stream=True) + + # Since docker 3.0.0, the argument of 'insecure_registry' is removed. + # To be compatible, set 'insecure_registry=True' for old releases. + dc_running_ver = StrictVersion(docker.version) + if dc_running_ver < StrictVersion('3.0.0'): + kwargs['insecure_registry'] = True + + for response in self.dc.push(image.canonical_name, **kwargs): stream = json.loads(response) if 'stream' in stream: self.logger.info(stream['stream']) diff --git a/kolla/tests/test_build.py b/kolla/tests/test_build.py index 17b86054b5..b6d5a36f4e 100644 --- a/kolla/tests/test_build.py +++ b/kolla/tests/test_build.py @@ -40,13 +40,23 @@ class TasksTest(base.TestCase): # NOTE(jeffrey4l): use a real, temporary dir self.image.path = self.useFixture(fixtures.TempDir()).path + @mock.patch('docker.version', '2.7.0') + @mock.patch.dict(os.environ, clear=True) + @mock.patch('docker.Client') + def test_push_image_before_v3_0_0(self, mock_client): + pusher = build.PushTask(self.conf, self.image) + pusher.run() + mock_client().push.assert_called_once_with( + self.image.canonical_name, stream=True, insecure_registry=True) + + @mock.patch('docker.version', '3.0.0') @mock.patch.dict(os.environ, clear=True) @mock.patch('docker.Client') def test_push_image(self, mock_client): pusher = build.PushTask(self.conf, self.image) pusher.run() mock_client().push.assert_called_once_with( - self.image.canonical_name, stream=True, insecure_registry=True) + self.image.canonical_name, stream=True) @mock.patch.dict(os.environ, clear=True) @mock.patch('docker.Client')