Merge "Add ability to filter container images to modify"
This commit is contained in:
@@ -334,6 +334,12 @@ class DockerImageUploader(ImageUploader):
|
|||||||
i = DockerImageUploader._inspect(image_url.geturl(), insecure)
|
i = DockerImageUploader._inspect(image_url.geturl(), insecure)
|
||||||
return i.get('Digest')
|
return i.get('Digest')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _image_labels(image, insecure):
|
||||||
|
image_url = DockerImageUploader._image_to_url(image)
|
||||||
|
i = DockerImageUploader._inspect(image_url.geturl(), insecure)
|
||||||
|
return i.get('Labels', {}) or {}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _image_exists(image, insecure_registries):
|
def _image_exists(image, insecure_registries):
|
||||||
try:
|
try:
|
||||||
@@ -455,6 +461,18 @@ class DockerImageUploader(ImageUploader):
|
|||||||
return self._discover_tag_from_inspect(i, image, tag_from_label,
|
return self._discover_tag_from_inspect(i, image, tag_from_label,
|
||||||
fallback_tag)
|
fallback_tag)
|
||||||
|
|
||||||
|
def filter_images_with_labels(self, images, labels):
|
||||||
|
images_with_labels = []
|
||||||
|
for image in images:
|
||||||
|
url = self._image_to_url(image)
|
||||||
|
image_labels = self._image_labels(url.geturl(),
|
||||||
|
self.is_insecure_registry(
|
||||||
|
url.netloc))
|
||||||
|
if set(labels).issubset(set(image_labels)):
|
||||||
|
images_with_labels.append(image)
|
||||||
|
|
||||||
|
return images_with_labels
|
||||||
|
|
||||||
def cleanup(self, local_images):
|
def cleanup(self, local_images):
|
||||||
if not local_images:
|
if not local_images:
|
||||||
return []
|
return []
|
||||||
|
@@ -138,13 +138,10 @@ def container_images_prepare_multi(environment, roles_data, dry_run=False,
|
|||||||
pull_source = cip_entry.get('pull_source')
|
pull_source = cip_entry.get('pull_source')
|
||||||
modify_role = cip_entry.get('modify_role')
|
modify_role = cip_entry.get('modify_role')
|
||||||
modify_vars = cip_entry.get('modify_vars')
|
modify_vars = cip_entry.get('modify_vars')
|
||||||
if modify_role:
|
modify_only_with_labels = cip_entry.get('modify_only_with_labels')
|
||||||
append_tag = cip_entry.get(
|
modify_append_tag = cip_entry.get('modify_append_tag',
|
||||||
'modify_append_tag',
|
time.strftime(
|
||||||
time.strftime('-modified-%Y%m%d%H%M%S')
|
'-modified-%Y%m%d%H%M%S'))
|
||||||
)
|
|
||||||
else:
|
|
||||||
append_tag = None
|
|
||||||
|
|
||||||
prepare_data = container_images_prepare(
|
prepare_data = container_images_prepare(
|
||||||
excludes=cip_entry.get('excludes'),
|
excludes=cip_entry.get('excludes'),
|
||||||
@@ -156,9 +153,10 @@ def container_images_prepare_multi(environment, roles_data, dry_run=False,
|
|||||||
output_env_file='image_params',
|
output_env_file='image_params',
|
||||||
output_images_file='upload_data',
|
output_images_file='upload_data',
|
||||||
tag_from_label=cip_entry.get('tag_from_label'),
|
tag_from_label=cip_entry.get('tag_from_label'),
|
||||||
append_tag=append_tag,
|
modify_append_tag=modify_append_tag,
|
||||||
modify_role=modify_role,
|
modify_role=modify_role,
|
||||||
modify_vars=modify_vars,
|
modify_vars=modify_vars,
|
||||||
|
modify_only_with_labels=modify_only_with_labels,
|
||||||
)
|
)
|
||||||
env_params.update(prepare_data['image_params'])
|
env_params.update(prepare_data['image_params'])
|
||||||
|
|
||||||
@@ -192,8 +190,8 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE,
|
|||||||
pull_source=None, push_destination=None,
|
pull_source=None, push_destination=None,
|
||||||
mapping_args=None, output_env_file=None,
|
mapping_args=None, output_env_file=None,
|
||||||
output_images_file=None, tag_from_label=None,
|
output_images_file=None, tag_from_label=None,
|
||||||
append_tag=None, modify_role=None,
|
modify_append_tag=None, modify_role=None,
|
||||||
modify_vars=None):
|
modify_vars=None, modify_only_with_labels=None):
|
||||||
"""Perform container image preparation
|
"""Perform container image preparation
|
||||||
|
|
||||||
:param template_file: path to Jinja2 file containing all image entries
|
:param template_file: path to Jinja2 file containing all image entries
|
||||||
@@ -212,18 +210,19 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE,
|
|||||||
:param output_images_file: key to use for image upload data
|
:param output_images_file: key to use for image upload data
|
||||||
:param tag_from_label: string when set will trigger tag discovery on every
|
:param tag_from_label: string when set will trigger tag discovery on every
|
||||||
image
|
image
|
||||||
:param append_tag: string to append to the tag for the destination image
|
:param modify_append_tag: string to append to the tag for the destination
|
||||||
|
image
|
||||||
:param modify_role: string of ansible role name to run during upload before
|
:param modify_role: string of ansible role name to run during upload before
|
||||||
the push to destination
|
the push to destination
|
||||||
:param modify_vars: dict of variables to pass to modify_role
|
:param modify_vars: dict of variables to pass to modify_role
|
||||||
|
:param modify_only_with_labels: only modify the container images with the
|
||||||
|
given labels
|
||||||
:returns: dict with entries for the supplied output_env_file or
|
:returns: dict with entries for the supplied output_env_file or
|
||||||
output_images_file
|
output_images_file
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if mapping_args is None:
|
if mapping_args is None:
|
||||||
mapping_args = {}
|
mapping_args = {}
|
||||||
if not append_tag:
|
|
||||||
append_tag = ''
|
|
||||||
|
|
||||||
if service_filter:
|
if service_filter:
|
||||||
if 'OS::TripleO::Services::OpenDaylightApi' in service_filter:
|
if 'OS::TripleO::Services::OpenDaylightApi' in service_filter:
|
||||||
@@ -253,9 +252,10 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE,
|
|||||||
result = builder.container_images_from_template(
|
result = builder.container_images_from_template(
|
||||||
filter=ffunc, **mapping_args)
|
filter=ffunc, **mapping_args)
|
||||||
|
|
||||||
|
uploader = image_uploader.ImageUploadManager().uploader('docker')
|
||||||
|
images = [i.get('imagename', '') for i in result]
|
||||||
|
|
||||||
if tag_from_label:
|
if tag_from_label:
|
||||||
uploader = image_uploader.ImageUploadManager().uploader('docker')
|
|
||||||
images = [i.get('imagename', '') for i in result]
|
|
||||||
image_version_tags = uploader.discover_image_tags(
|
image_version_tags = uploader.discover_image_tags(
|
||||||
images, tag_from_label)
|
images, tag_from_label)
|
||||||
for entry in result:
|
for entry in result:
|
||||||
@@ -265,9 +265,23 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE,
|
|||||||
entry['imagename'] = '%s:%s' % (
|
entry['imagename'] = '%s:%s' % (
|
||||||
image_no_tag, image_version_tags[image_no_tag])
|
image_no_tag, image_version_tags[image_no_tag])
|
||||||
|
|
||||||
|
if modify_only_with_labels:
|
||||||
|
images_with_labels = uploader.filter_images_with_labels(
|
||||||
|
images, modify_only_with_labels)
|
||||||
|
|
||||||
params = {}
|
params = {}
|
||||||
for entry in result:
|
for entry in result:
|
||||||
imagename = entry.get('imagename', '')
|
imagename = entry.get('imagename', '')
|
||||||
|
append_tag = ''
|
||||||
|
if modify_role and (
|
||||||
|
(not modify_only_with_labels)
|
||||||
|
or imagename in images_with_labels):
|
||||||
|
entry['modify_role'] = modify_role
|
||||||
|
if modify_append_tag:
|
||||||
|
entry['modify_append_tag'] = modify_append_tag
|
||||||
|
append_tag = modify_append_tag
|
||||||
|
if modify_vars:
|
||||||
|
entry['modify_vars'] = modify_vars
|
||||||
if pull_source:
|
if pull_source:
|
||||||
entry['pull_source'] = pull_source
|
entry['pull_source'] = pull_source
|
||||||
if push_destination:
|
if push_destination:
|
||||||
@@ -276,12 +290,6 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE,
|
|||||||
# push_destination, since that is where they will be uploaded to
|
# push_destination, since that is where they will be uploaded to
|
||||||
image = imagename.partition('/')[2]
|
image = imagename.partition('/')[2]
|
||||||
imagename = '/'.join((push_destination, image))
|
imagename = '/'.join((push_destination, image))
|
||||||
if append_tag:
|
|
||||||
entry['modify_append_tag'] = append_tag
|
|
||||||
if modify_role:
|
|
||||||
entry['modify_role'] = modify_role
|
|
||||||
if modify_vars:
|
|
||||||
entry['modify_vars'] = modify_vars
|
|
||||||
if 'params' in entry:
|
if 'params' in entry:
|
||||||
for p in entry.pop('params'):
|
for p in entry.pop('params'):
|
||||||
params[p] = imagename + append_tag
|
params[p] = imagename + append_tag
|
||||||
|
@@ -792,6 +792,7 @@ class TestPrepare(base.TestCase):
|
|||||||
'excludes': ['nova', 'neutron'],
|
'excludes': ['nova', 'neutron'],
|
||||||
'push_destination': '192.0.2.1:8787',
|
'push_destination': '192.0.2.1:8787',
|
||||||
'modify_role': 'add-foo-plugin',
|
'modify_role': 'add-foo-plugin',
|
||||||
|
'modify_only_with_labels': ['kolla_version'],
|
||||||
'modify_vars': {'foo_version': '1.0.1'}
|
'modify_vars': {'foo_version': '1.0.1'}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
@@ -834,8 +835,9 @@ class TestPrepare(base.TestCase):
|
|||||||
push_destination=None,
|
push_destination=None,
|
||||||
service_filter=None,
|
service_filter=None,
|
||||||
tag_from_label='foo',
|
tag_from_label='foo',
|
||||||
append_tag=None,
|
modify_append_tag=mock.ANY,
|
||||||
modify_role=None,
|
modify_role=None,
|
||||||
|
modify_only_with_labels=None,
|
||||||
modify_vars=None
|
modify_vars=None
|
||||||
),
|
),
|
||||||
mock.call(
|
mock.call(
|
||||||
@@ -848,8 +850,9 @@ class TestPrepare(base.TestCase):
|
|||||||
push_destination='192.0.2.1:8787',
|
push_destination='192.0.2.1:8787',
|
||||||
service_filter=None,
|
service_filter=None,
|
||||||
tag_from_label='bar',
|
tag_from_label='bar',
|
||||||
append_tag=mock.ANY,
|
modify_append_tag=mock.ANY,
|
||||||
modify_role='add-foo-plugin',
|
modify_role='add-foo-plugin',
|
||||||
|
modify_only_with_labels=['kolla_version'],
|
||||||
modify_vars={'foo_version': '1.0.1'}
|
modify_vars={'foo_version': '1.0.1'}
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
@@ -887,6 +890,7 @@ class TestPrepare(base.TestCase):
|
|||||||
'excludes': ['nova', 'neutron'],
|
'excludes': ['nova', 'neutron'],
|
||||||
'push_destination': '192.0.2.1:8787',
|
'push_destination': '192.0.2.1:8787',
|
||||||
'modify_role': 'add-foo-plugin',
|
'modify_role': 'add-foo-plugin',
|
||||||
|
'modify_only_with_labels': ['kolla_version'],
|
||||||
'modify_vars': {'foo_version': '1.0.1'},
|
'modify_vars': {'foo_version': '1.0.1'},
|
||||||
'modify_append_tag': 'modify-123'
|
'modify_append_tag': 'modify-123'
|
||||||
}]
|
}]
|
||||||
@@ -930,8 +934,9 @@ class TestPrepare(base.TestCase):
|
|||||||
push_destination=None,
|
push_destination=None,
|
||||||
service_filter=None,
|
service_filter=None,
|
||||||
tag_from_label='foo',
|
tag_from_label='foo',
|
||||||
append_tag=None,
|
modify_append_tag=mock.ANY,
|
||||||
modify_role=None,
|
modify_role=None,
|
||||||
|
modify_only_with_labels=None,
|
||||||
modify_vars=None
|
modify_vars=None
|
||||||
),
|
),
|
||||||
mock.call(
|
mock.call(
|
||||||
@@ -944,8 +949,9 @@ class TestPrepare(base.TestCase):
|
|||||||
push_destination='192.0.2.1:8787',
|
push_destination='192.0.2.1:8787',
|
||||||
service_filter=None,
|
service_filter=None,
|
||||||
tag_from_label='bar',
|
tag_from_label='bar',
|
||||||
append_tag=mock.ANY,
|
modify_append_tag=mock.ANY,
|
||||||
modify_role='add-foo-plugin',
|
modify_role='add-foo-plugin',
|
||||||
|
modify_only_with_labels=['kolla_version'],
|
||||||
modify_vars={'foo_version': '1.0.1'}
|
modify_vars={'foo_version': '1.0.1'}
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
|
Reference in New Issue
Block a user