Skip to content

Commit

Permalink
Add prefer_schema1_digest configuration option
Browse files Browse the repository at this point in the history
When defined, this configuration option is passed to koji_upload
plugin so it can be used in deciding which manifest should be
used in the build output files.
This option is also forwarded to worker builds.

Signed-off-by: Luiz Carvalho <lucarval@redhat.com>
  • Loading branch information
lcarva committed Aug 29, 2017
1 parent fe5b492 commit dd21fb1
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 30 deletions.
1 change: 1 addition & 0 deletions docs/configuration_file.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ Some options are also mandatory.

* `group_manifests` (*optional*, `boolean`) — whether Atomic Reactor should create manifest lists, default is false

* `prefer_schema1_digest` (*optional*, `boolean`) — used by Atomic Reactor's koji_upload plugin when deciding which digest should be used in the image output files for a Koji build

## Build JSON Templates

Expand Down
1 change: 1 addition & 0 deletions osbs/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,7 @@ def _do_create_prod_build(self, git_uri, git_ref,
platform_descriptors=self.build_conf.get_platform_descriptors(),
koji_parent_build=koji_parent_build,
group_manifests=self.os_conf.get_group_manifests(),
prefer_schema1_digest=self.build_conf.get_prefer_schema1_digest(),
)
build_request.set_openshift_required_version(self.os_conf.get_openshift_required_version())
build_request.set_repo_info(repo_info)
Expand Down
38 changes: 22 additions & 16 deletions osbs/build/build_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ def render_orchestrate_build(self):
'koji_root': self.spec.kojiroot.value,
'openshift_required_version': sanitize_version(self._openshift_required_version),
'pulp_registry_name': self.spec.pulp_registry.value,
'prefer_schema1_digest': self.spec.prefer_schema1_digest.value,
'registry_api_versions': ','.join(self.spec.registry_api_versions.value or []) or None,
'smtp_additional_addresses': ','.join(self.spec.smtp_additional_addresses.value or [])
or None,
Expand Down Expand Up @@ -737,24 +738,29 @@ def render_koji_promote(self, use_auth=None):
self.dj.remove_plugin("exit_plugins", "koji_promote")

def render_koji_upload(self, use_auth=None):
if not self.dj.dock_json_has_plugin_conf('postbuild_plugins', 'koji_upload'):
phase = 'postbuild_plugins'
name = 'koji_upload'
if not self.dj.dock_json_has_plugin_conf(phase, name):
return

if self.spec.kojihub.value:
self.dj.dock_json_set_arg('postbuild_plugins', 'koji_upload',
'kojihub', self.spec.kojihub.value)
self.dj.dock_json_set_arg('postbuild_plugins', 'koji_upload', 'url',
self.spec.builder_openshift_url.value)
self.dj.dock_json_set_arg('postbuild_plugins', 'koji_upload',
'build_json_dir', self.spec.builder_build_json_dir.value)
self.dj.dock_json_set_arg('postbuild_plugins', 'koji_upload',
'koji_upload_dir', self.spec.koji_upload_dir.value)
if use_auth is not None:
self.dj.dock_json_set_arg('postbuild_plugins', 'koji_upload',
'use_auth', use_auth)
else:
logger.info("removing koji_upload from request as no kojihub specified")
self.dj.remove_plugin("postbuild_plugins", "koji_upload")
if not self.spec.kojihub.value:
logger.info('removing %s from request as no kojihub specified', name)
self.dj.remove_plugin(phase, name)
return

def set_arg(arg, value):
self.dj.dock_json_set_arg(phase, name, arg, value)

set_arg('kojihub', self.spec.kojihub.value)
set_arg('url', self.spec.builder_openshift_url.value)
set_arg('build_json_dir', self.spec.builder_build_json_dir.value)
set_arg('koji_upload_dir', self.spec.koji_upload_dir.value)

if use_auth is not None:
set_arg('use_auth', use_auth)

if self.spec.prefer_schema1_digest.value is not None:
set_arg('prefer_schema1_digest', self.spec.prefer_schema1_digest.value)

def render_koji_import(self, use_auth=None):
if not self.dj.dock_json_has_plugin_conf('exit_plugins', 'koji_import'):
Expand Down
4 changes: 3 additions & 1 deletion osbs/build/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ class BuildSpec(object):
yum_proxy = BuildParam("yum_proxy", allow_none=True)
koji_parent_build = BuildParam("koji_parent_build", allow_none=True)
group_manifests = BuildParam("group_manifests", allow_none=True)
prefer_schema1_digest = BuildParam("prefer_schema1_digest", allow_none=True)

def __init__(self):
self.required_params = [
Expand Down Expand Up @@ -230,7 +231,7 @@ def set_params(self, git_uri=None, git_ref=None,
token_secrets=None, arrangement_version=None,
info_url_format=None, artifacts_allowed_domains=None,
equal_labels=None, koji_upload_dir=None, yum_proxy=None,
koji_parent_build=None, group_manifests=None,
koji_parent_build=None, group_manifests=None, prefer_schema1_digest=None,
**kwargs):
self.git_uri.value = git_uri
self.git_ref.value = git_ref
Expand Down Expand Up @@ -288,6 +289,7 @@ def set_params(self, git_uri=None, git_ref=None,
self.git_branch.value = git_branch
self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value)
self.group_manifests.value = group_manifests or False
self.prefer_schema1_digest.value = prefer_schema1_digest
if not base_image:
raise OsbsValidationException("base_image must be provided")
self.trigger_imagestreamtag.value = get_imagestreamtag_from_image(base_image)
Expand Down
4 changes: 4 additions & 0 deletions osbs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,10 @@ def get_source_registry_uri(self):
def get_pulp_registry(self):
return self._get_value("pulp_registry_name", self.conf_section, "pulp_registry_name")

def get_prefer_schema1_digest(self):
return self._get_value("prefer_schema1_digest", self.conf_section, "prefer_schema1_digest",
is_bool_val=True)

def get_group_manifests(self):
return self._get_value("group_manifests", self.conf_section,
"group_manifests", is_bool_val=True)
Expand Down
38 changes: 25 additions & 13 deletions tests/build_/test_build_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,26 +155,31 @@ def assert_import_image_plugin(self, plugins, name_label, registry_uri,
"postbuild_plugins", "import_image", "args",
"insecure_registry")

def assert_koji_upload_plugin(self, plugins, use_auth, valid=True):
def assert_koji_upload_plugin(self, plugins, use_auth, prefer_schema1_digest, valid=True):
phase = 'postbuild_plugins'
name = 'koji_upload'
if not valid:
with pytest.raises(NoSuchPluginException):
get_plugin(plugins, "postbuild_plugins", "koji_upload")
get_plugin(plugins, phase, name)
else:
assert get_plugin(plugins, "postbuild_plugins", "koji_upload")
assert plugin_value_get(plugins, "postbuild_plugins", "koji_upload", "args",
"koji_upload_dir")
assert get_plugin(plugins, phase, name)
plugin_args = plugin_value_get(plugins, phase, name, 'args')
assert plugin_args.get('koji_upload_dir')

if use_auth is not None:
assert plugin_value_get(plugins, "postbuild_plugins", "koji_upload", "args",
"use_auth") == use_auth
assert plugin_args['use_auth'] == use_auth
else:
with pytest.raises(KeyError):
plugin_value_get(plugins, "postbuild_plugins", "koji_upload", "args",
"use_auth")
assert 'use_auth' not in plugin_args

if prefer_schema1_digest is not None:
assert plugin_args['prefer_schema1_digest'] == prefer_schema1_digest
else:
assert 'prefer_schema1_digest' not in plugin_args

@pytest.mark.parametrize('kojihub', ("http://hub/", None))
@pytest.mark.parametrize('use_auth', (True, False, None))
def test_render_koji_upload(self, use_auth, kojihub):
@pytest.mark.parametrize('prefer_schema1_digest', (True, False, None))
def test_render_koji_upload(self, use_auth, kojihub, prefer_schema1_digest):
inner_template = WORKER_INNER_TEMPLATE.format(
arrangement_version=DEFAULT_ARRANGEMENT_VERSION)
build_request = BuildRequest(INPUTS_PATH, inner_template=inner_template,
Expand All @@ -196,10 +201,12 @@ def test_render_koji_upload(self, use_auth, kojihub):
}
if use_auth is not None:
kwargs['use_auth'] = use_auth
if prefer_schema1_digest is not None:
kwargs['prefer_schema1_digest'] = prefer_schema1_digest
build_request.set_params(**kwargs)
build_json = build_request.render()
plugins = get_plugins_from_build_json(build_json)
self.assert_koji_upload_plugin(plugins, use_auth, kojihub)
self.assert_koji_upload_plugin(plugins, use_auth, prefer_schema1_digest, kojihub)

@pytest.mark.parametrize(('koji_hub', 'base_image', 'scratch', 'enabled'), (
("http://hub/", 'fedora:latest', False, True),
Expand Down Expand Up @@ -1433,6 +1440,7 @@ def test_render_optional_plugins(self, tmpdir):
},
{}
))
@pytest.mark.parametrize('prefer_schema1_digest', [True, False, None])
@pytest.mark.parametrize(('openshift_req_version', 'worker_openshift_req_version'), (
(None, '1.0.6'),
('1.3.4', '1.3.4'),
Expand All @@ -1442,7 +1450,7 @@ def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
build_imagestream, worker_build_image,
additional_kwargs, koji_parent_build,
openshift_req_version, worker_openshift_req_version,
valid):
prefer_schema1_digest, valid):
phase = 'buildstep_plugins'
plugin = 'orchestrate_build'

Expand All @@ -1469,6 +1477,8 @@ def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
kwargs['build_imagestream'] = build_imagestream
if koji_parent_build:
kwargs['koji_parent_build'] = koji_parent_build
if prefer_schema1_digest is not None:
kwargs['prefer_schema1_digest'] = prefer_schema1_digest
kwargs.update(additional_kwargs)

inner_template = ORCHESTRATOR_INNER_TEMPLATE.format(
Expand Down Expand Up @@ -1536,6 +1546,8 @@ def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
worker_config.get_proxy())
assert (parse_version(worker_openshift_req_version) ==
worker_config.get_openshift_required_version())
assert (kwargs.get('prefer_schema1_digest') ==
worker_config.get_prefer_schema1_digest())

def test_render_prod_with_pulp_no_auth(self):
"""
Expand Down

0 comments on commit dd21fb1

Please sign in to comment.