diff --git a/container-images/container_image_prepare_defaults.yaml b/container-images/container_image_prepare_defaults.yaml index b2786d502..bff3571b9 100644 --- a/container-images/container_image_prepare_defaults.yaml +++ b/container-images/container_image_prepare_defaults.yaml @@ -17,7 +17,6 @@ parameter_defaults: name_prefix: openstack- name_suffix: '' tag: current-tripleo - default_tag: True rhel_containers: false # Substitute neutron images based on driver. Can be 'other' or 'ovn'. diff --git a/tripleo_common/image/image_uploader.py b/tripleo_common/image/image_uploader.py index 30938d941..b924b0fc6 100644 --- a/tripleo_common/image/image_uploader.py +++ b/tripleo_common/image/image_uploader.py @@ -886,7 +886,11 @@ class BaseImageUploader(object): tags_r = RegistrySessionHelper.get(session, tags_url, timeout=30) tags = tags_r.json()['tags'] if default_tag and tag not in tags: - parts['tag'] = tags[-1] + if tags: + parts['tag'] = tags[-1] + else: + raise ImageNotFoundException('Not found image: %s' % + image_url.geturl()) manifest_url = cls._build_url( image_url, CALL_MANIFEST % parts diff --git a/tripleo_common/image/kolla_builder.py b/tripleo_common/image/kolla_builder.py index dd48b065c..736d822b0 100644 --- a/tripleo_common/image/kolla_builder.py +++ b/tripleo_common/image/kolla_builder.py @@ -332,10 +332,11 @@ def container_images_prepare(template_file=DEFAULT_TEMPLATE_FILE, ) uploader = manager.uploader('python') images = [i.get('imagename', '') for i in result] - if result: - default_tag = result[0].get('default_tag', False) - else: - default_tag = False + # set a flag to record whether the default tag is used or not. the + # logic here is that if the tag key is not already in mapping then it + # wil be added during the template render, so default_tag is set to + # True. + default_tag = 'tag' not in mapping_args if tag_from_label: image_version_tags = uploader.discover_image_tags( @@ -453,11 +454,6 @@ class KollaImageBuilder(base.BaseImageManager): hyphenated appropriately. ''' mapping = dict(kwargs) - # set a flag to record whether the default tag is used or not. the - # logic here is that if the tag key is not already in mapping then it - # wil be added during the template render, so default_tag is set to - # True. - mapping['default_tag'] = 'tag' not in mapping if CONTAINER_IMAGES_DEFAULTS is None: return diff --git a/tripleo_common/tests/image/test_image_uploader.py b/tripleo_common/tests/image/test_image_uploader.py index 8fdd4b99d..416bd18c1 100644 --- a/tripleo_common/tests/image/test_image_uploader.py +++ b/tripleo_common/tests/image/test_image_uploader.py @@ -884,6 +884,86 @@ class TestBaseImageUploader(base.TestCase): build(url1, '/t/nova-api/blobs/asdf1234') ) + def test_inspect_default_tag(self): + req = self.requests + session = requests.Session() + session.headers['Authorization'] = 'Bearer asdf1234' + inspect = image_uploader.BaseImageUploader._inspect + + url1 = urlparse('docker://docker.io/t/nova-api:latest') + + manifest_resp = { + 'schemaVersion': 2, + 'config': { + 'mediaType': 'text/html', + 'digest': 'abcdef' + }, + 'layers': [ + {'digest': 'aaa'}, + {'digest': 'bbb'}, + {'digest': 'ccc'}, + ] + } + manifest_str = json.dumps(manifest_resp, indent=3) + manifest_headers = {'Docker-Content-Digest': 'eeeeee'} + tags_resp = {'tags': ['one', 'two']} + config_resp = { + 'created': '2018-10-02T11:13:45.567533229Z', + 'docker_version': '1.13.1', + 'config': { + 'Labels': { + 'build-date': '20181002', + 'build_id': '1538477701', + 'kolla_version': '7.0.0' + } + }, + 'architecture': 'amd64', + 'os': 'linux', + } + + req.get('https://registry-1.docker.io/v2/t/nova-api/tags/list', + json=tags_resp) + req.get('https://registry-1.docker.io/v2/t/nova-api/blobs/abcdef', + json=config_resp) + req.get('https://registry-1.docker.io/v2/t/nova-api/manifests/two', + text=manifest_str, headers=manifest_headers) + + # test default_tag=True + self.assertEqual( + { + 'Architecture': 'amd64', + 'Created': '2018-10-02T11:13:45.567533229Z', + 'Digest': 'eeeeee', + 'DockerVersion': '1.13.1', + 'Labels': { + 'build-date': '20181002', + 'build_id': '1538477701', + 'kolla_version': '7.0.0' + }, + 'Layers': ['aaa', 'bbb', 'ccc'], + 'Name': 'docker.io/t/nova-api', + 'Os': 'linux', + 'RepoTags': ['one', 'two'], + 'Tag': 'latest' + }, + inspect(url1, session=session, default_tag=True) + ) + + # test default_tag=False + req.get('https://registry-1.docker.io/v2/t/nova-api/manifests/latest', + status_code=404) + self.assertRaises(ImageNotFoundException, inspect, url1, + session=session, + default_tag=False) + + # test default_tag=True, but no tags returned + tags_resp = {'tags': []} + req.get('https://registry-1.docker.io/v2/t/nova-api/tags/list', + json=tags_resp) + self.assertRaises(ImageNotFoundException, inspect, url1, + session=session, + default_tag=True) + def test_inspect(self): req = self.requests session = requests.Session() diff --git a/tripleo_common/tests/image/test_kolla_builder.py b/tripleo_common/tests/image/test_kolla_builder.py index 25c397a50..0c88c80d9 100644 --- a/tripleo_common/tests/image/test_kolla_builder.py +++ b/tripleo_common/tests/image/test_kolla_builder.py @@ -241,7 +241,6 @@ class TestKollaImageBuilderTemplate(base.TestCase): 'name_suffix': '', 'rhel_containers': False, 'neutron_driver': 'ovn', - 'default_tag': True, } for key in ( 'namespace', @@ -278,7 +277,6 @@ class TestKollaImageBuilderTemplate(base.TestCase): 'ceph_tag': 'latest', 'name_prefix': 'prefix-', 'name_suffix': '-suffix', - 'default_tag': False, 'tag': 'master', 'rhel_containers': False, 'neutron_driver': 'ovn', @@ -707,6 +705,36 @@ class TestPrepare(base.TestCase): ) ) + @mock.patch.object(image_uploader, 'ImageUploadManager') + @mock.patch('tripleo_common.image.kolla_builder.' + 'detect_insecure_registries', return_value={}) + def test_prepare_default_tag(self, mock_insecure, mock_manager): + mock_manager_instance = mock.Mock() + mock_manager.return_value = mock_manager_instance + mock_uploader = mock.Mock() + mock_uploader.discover_image_tags.return_value = [] + mock_manager_instance.uploader.return_value = mock_uploader + + kb.container_images_prepare( + template_file=TEMPLATE_PATH, + output_env_file=constants.CONTAINER_DEFAULTS_ENVIRONMENT, + output_images_file='container_images.yaml', + mapping_args={}, + tag_from_label="n-v", + ) + self.assertTrue( + mock_uploader.discover_image_tags.call_args_list[0][0][2]) + + kb.container_images_prepare( + template_file=TEMPLATE_PATH, + output_env_file=constants.CONTAINER_DEFAULTS_ENVIRONMENT, + output_images_file='container_images.yaml', + mapping_args={"tag": "master"}, + tag_from_label="n-v", + ) + self.assertFalse( + mock_uploader.discover_image_tags.call_args_list[1][0][2]) + def test_get_enabled_services_empty(self): self.assertEqual( set([]),