Merge "Switch kolla_docker to rely on SHA256 for image changes"
This commit is contained in:
commit
93a220aaf9
@ -436,6 +436,12 @@ class DockerWorker(object):
|
|||||||
else:
|
else:
|
||||||
return full_image, 'latest'
|
return full_image, 'latest'
|
||||||
|
|
||||||
|
def get_image_id(self):
|
||||||
|
full_image = self.params.get('image')
|
||||||
|
|
||||||
|
image = self.dc.images(name=full_image, quiet=True)
|
||||||
|
return image[0] if len(image) == 1 else None
|
||||||
|
|
||||||
def pull_image(self):
|
def pull_image(self):
|
||||||
if self.params.get('auth_username'):
|
if self.params.get('auth_username'):
|
||||||
self.dc.login(
|
self.dc.login(
|
||||||
@ -446,6 +452,7 @@ class DockerWorker(object):
|
|||||||
)
|
)
|
||||||
|
|
||||||
image, tag = self.parse_image()
|
image, tag = self.parse_image()
|
||||||
|
old_image_id = self.get_image_id()
|
||||||
|
|
||||||
statuses = [
|
statuses = [
|
||||||
json.loads(line.strip().decode('utf-8')) for line in self.dc.pull(
|
json.loads(line.strip().decode('utf-8')) for line in self.dc.pull(
|
||||||
@ -468,23 +475,8 @@ class DockerWorker(object):
|
|||||||
failed=True
|
failed=True
|
||||||
)
|
)
|
||||||
|
|
||||||
if status and status.get('status'):
|
new_image_id = self.get_image_id()
|
||||||
# NOTE(SamYaple): This allows us to use v1 and v2 docker
|
self.changed = old_image_id != new_image_id
|
||||||
# registries. Eventually docker will stop supporting v1
|
|
||||||
# registries and when that happens we can remove this.
|
|
||||||
if 'legacy registry' in status['status']:
|
|
||||||
continue
|
|
||||||
elif 'Downloaded newer image for' in status['status']:
|
|
||||||
self.changed = True
|
|
||||||
return
|
|
||||||
elif 'Image is up to date for' in status['status']:
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
self.module.fail_json(
|
|
||||||
msg="Unknown status message: {}".format(
|
|
||||||
status['status']),
|
|
||||||
failed=True
|
|
||||||
)
|
|
||||||
|
|
||||||
def remove_container(self):
|
def remove_container(self):
|
||||||
if self.check_container():
|
if self.check_container():
|
||||||
|
@ -481,6 +481,22 @@ class TestImage(base.BaseTestCase):
|
|||||||
self.dw.dc.images.assert_called_once_with()
|
self.dw.dc.images.assert_called_once_with()
|
||||||
self.assertTrue(return_data)
|
self.assertTrue(return_data)
|
||||||
|
|
||||||
|
def test_get_image_id_not_exists(self):
|
||||||
|
self.dw = get_DockerWorker(
|
||||||
|
{'image': 'myregistrydomain.com:5000/ubuntu:16.04'})
|
||||||
|
self.dw.dc.images.return_value = []
|
||||||
|
|
||||||
|
return_data = self.dw.get_image_id()
|
||||||
|
self.assertIsNone(return_data)
|
||||||
|
|
||||||
|
def test_get_image_id_exists(self):
|
||||||
|
self.dw = get_DockerWorker(
|
||||||
|
{'image': 'myregistrydomain.com:5000/ubuntu:16.04'})
|
||||||
|
self.dw.dc.images.return_value = ['sha256:47c3bdbcf99f0c1a36e4db']
|
||||||
|
|
||||||
|
return_data = self.dw.get_image_id()
|
||||||
|
self.assertEqual('sha256:47c3bdbcf99f0c1a36e4db', return_data)
|
||||||
|
|
||||||
def test_pull_image_new(self):
|
def test_pull_image_new(self):
|
||||||
self.dw = get_DockerWorker(
|
self.dw = get_DockerWorker(
|
||||||
{'image': 'myregistrydomain.com:5000/ubuntu:16.04',
|
{'image': 'myregistrydomain.com:5000/ubuntu:16.04',
|
||||||
@ -494,6 +510,10 @@ class TestImage(base.BaseTestCase):
|
|||||||
b'{"status":"Digest: sha256:47c3bdbcf99f0c1a36e4db"}\r\n',
|
b'{"status":"Digest: sha256:47c3bdbcf99f0c1a36e4db"}\r\n',
|
||||||
b'{"status":"Downloaded newer image for ubuntu:16.04"}\r\n'
|
b'{"status":"Downloaded newer image for ubuntu:16.04"}\r\n'
|
||||||
]
|
]
|
||||||
|
self.dw.dc.images.side_effect = [
|
||||||
|
[],
|
||||||
|
['sha256:47c3bdbcf99f0c1a36e4db']
|
||||||
|
]
|
||||||
|
|
||||||
self.dw.pull_image()
|
self.dw.pull_image()
|
||||||
self.dw.dc.pull.assert_called_once_with(
|
self.dw.dc.pull.assert_called_once_with(
|
||||||
@ -510,6 +530,10 @@ class TestImage(base.BaseTestCase):
|
|||||||
b'{"status":"Digest: sha256:47c3bdbf0c1a36e4db"}\r\n',
|
b'{"status":"Digest: sha256:47c3bdbf0c1a36e4db"}\r\n',
|
||||||
b'{"status":"mage is up to date for ubuntu:16.04"}\r\n'
|
b'{"status":"mage is up to date for ubuntu:16.04"}\r\n'
|
||||||
]
|
]
|
||||||
|
self.dw.dc.images.side_effect = [
|
||||||
|
['sha256:47c3bdbcf99f0c1a36e4db'],
|
||||||
|
['sha256:47c3bdbcf99f0c1a36e4db']
|
||||||
|
]
|
||||||
|
|
||||||
self.dw.pull_image()
|
self.dw.pull_image()
|
||||||
self.dw.dc.pull.assert_called_once_with(
|
self.dw.dc.pull.assert_called_once_with(
|
||||||
@ -518,22 +542,6 @@ class TestImage(base.BaseTestCase):
|
|||||||
stream=True)
|
stream=True)
|
||||||
self.assertFalse(self.dw.changed)
|
self.assertFalse(self.dw.changed)
|
||||||
|
|
||||||
def test_pull_image_unknown_status(self):
|
|
||||||
self.dw = get_DockerWorker(
|
|
||||||
{'image': 'myregistrydomain.com:5000/ubuntu:16.04'})
|
|
||||||
self.dw.dc.pull.return_value = [
|
|
||||||
b'{"status": "some random message"}\r\n']
|
|
||||||
|
|
||||||
self.dw.pull_image()
|
|
||||||
self.dw.dc.pull.assert_called_once_with(
|
|
||||||
repository='myregistrydomain.com:5000/ubuntu',
|
|
||||||
tag='16.04',
|
|
||||||
stream=True)
|
|
||||||
self.assertFalse(self.dw.changed)
|
|
||||||
self.dw.module.fail_json.assert_called_with(
|
|
||||||
msg='Unknown status message: some random message',
|
|
||||||
failed=True)
|
|
||||||
|
|
||||||
def test_pull_image_not_exists(self):
|
def test_pull_image_not_exists(self):
|
||||||
self.dw = get_DockerWorker(
|
self.dw = get_DockerWorker(
|
||||||
{'image': 'unknown:16.04'})
|
{'image': 'unknown:16.04'})
|
||||||
|
Loading…
Reference in New Issue
Block a user