Skip to content

Commit

Permalink
Enable inject_parent_image plugin
Browse files Browse the repository at this point in the history
Signed-off-by: Luiz Carvalho <lucarval@redhat.com>
  • Loading branch information
lcarva committed Aug 9, 2017
1 parent 010892c commit f796c8f
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 8 deletions.
7 changes: 7 additions & 0 deletions inputs/orchestrator_inner:4.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
"repos": []
}
},
{
"name": "inject_parent_image",
"args": {
"koji_build": "{{KOJI_PARENT_BUILD}}",
"koji_hub": "{{KOJI_HUB}}"
}
},
{
"name": "pull_base_image",
"args": {
Expand Down
7 changes: 7 additions & 0 deletions inputs/worker_inner:4.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
"from_task_id": "{{FROM_TASK_ID}}"
}
},
{
"name": "inject_parent_image",
"args": {
"koji_build": "{{KOJI_PARENT_BUILD}}",
"koji_hub": "{{KOJI_HUB}}"
}
},
{
"name": "pull_base_image",
"args": {
Expand Down
2 changes: 2 additions & 0 deletions osbs/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,7 @@ def _do_create_prod_build(self, git_uri, git_ref,
filesystem_koji_task_id=None,
koji_upload_dir=None,
is_auto=False,
koji_parent_build=None,
**kwargs):
repo_info = utils.get_repo_info(git_uri, git_ref, git_branch=git_branch)
df_parser = repo_info.dockerfile_parser
Expand Down Expand Up @@ -519,6 +520,7 @@ def _do_create_prod_build(self, git_uri, git_ref,
filesystem_koji_task_id=filesystem_koji_task_id,
koji_upload_dir=koji_upload_dir,
platform_descriptors=self.build_conf.get_platform_descriptors(),
koji_parent_build=koji_parent_build,
)
build_request.set_openshift_required_version(self.os_conf.get_openshift_required_version())
build_request.set_repo_info(repo_info)
Expand Down
20 changes: 20 additions & 0 deletions osbs/build/build_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ def render_orchestrate_build(self):
'user': self.spec.user.value,
'yum_repourls': self.spec.yum_repourls.value,
'arrangement_version': self.spec.arrangement_version.value,
'koji_parent_build': self.spec.koji_parent_build.value,
}

self.dj.dock_json_set_arg(phase, plugin, 'platforms', self.spec.platforms.value)
Expand Down Expand Up @@ -579,6 +580,7 @@ def adjust_for_custom_base_image(self):
# Plugins irrelevant to building base images.
plugins.append(("prebuild_plugins", "pull_base_image"))
plugins.append(("prebuild_plugins", "koji_parent"))
plugins.append(("prebuild_plugins", "inject_parent_image"))
msg = "removing %s from custom image build request"

else:
Expand Down Expand Up @@ -1097,6 +1099,23 @@ def render_pull_base_image(self):
self.dj.dock_json_set_arg(phase, plugin, 'parent_registry',
source_registry.docker_uri if source_registry else None)

def render_inject_parent_image(self):
phase = 'prebuild_plugins'
plugin = 'inject_parent_image'
if not self.dj.dock_json_has_plugin_conf(phase, plugin):
return

koji_build = self.spec.koji_parent_build.value
koji_hub = self.spec.kojihub.value

if not koji_build or not koji_hub:
logger.info('removing %s, koji_parent_build and koji_hub must be provided', plugin)
self.dj.remove_plugin(phase, plugin)
return

self.dj.dock_json_set_arg(phase, plugin, 'koji_build', koji_build)
self.dj.dock_json_set_arg(phase, plugin, 'koji_hub', koji_hub)

def render_customizations(self):
"""
Customize prod_inner for site specific customizations
Expand Down Expand Up @@ -1347,6 +1366,7 @@ def render(self, validate=True):
self.render_sendmail()
self.render_fetch_maven_artifacts()
self.render_tag_from_config()
self.render_inject_parent_image()
self.render_version()
self.render_node_selectors()

Expand Down
6 changes: 5 additions & 1 deletion osbs/build/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ class BuildSpec(object):
equal_labels = BuildParam("equal_labels", allow_none=True)
koji_upload_dir = BuildParam("koji_upload_dir", allow_none=True)
yum_proxy = BuildParam("yum_proxy", allow_none=True)
koji_parent_build = BuildParam("koji_parent_build", allow_none=True)

def __init__(self):
self.required_params = [
Expand Down Expand Up @@ -227,7 +228,9 @@ def set_params(self, git_uri=None, git_ref=None,
reactor_config_secret=None, client_config_secret=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, **kwargs):
equal_labels=None, koji_upload_dir=None, yum_proxy=None,
koji_parent_build=None,
**kwargs):
self.git_uri.value = git_uri
self.git_ref.value = git_ref
self.user.value = user
Expand Down Expand Up @@ -323,6 +326,7 @@ def set_params(self, git_uri=None, git_ref=None,
self.filesystem_koji_task_id.value = filesystem_koji_task_id
self.koji_upload_dir.value = koji_upload_dir
self.yum_proxy.value = yum_proxy
self.koji_parent_build.value = koji_parent_build

self._populate_image_tag()

Expand Down
3 changes: 3 additions & 0 deletions osbs/cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ def cmd_build(args, osbs):
'platform': args.platform,
'platforms': args.platforms,
'release': args.release,
'koji_parent_build': args.koji_parent_build,
}
if args.arrangement_version:
build_kwargs['arrangement_version'] = args.arrangement_version
Expand Down Expand Up @@ -704,6 +705,8 @@ def cli():
help="perform a scratch build")
build_parser.add_argument("--yum-proxy", action='store', required=False,
help="set yum proxy to repos from koji/add-yum-repo params")
build_parser.add_argument('--koji-parent-build', action='store', required=False,
help='overwrite parent image with image from koji build')

worker_group = build_parser.add_argument_group(title='arguments for --worker',
description='Required arguments for creating a '
Expand Down
21 changes: 21 additions & 0 deletions tests/build_/test_arrangements.py
Original file line number Diff line number Diff line change
Expand Up @@ -771,6 +771,7 @@ class TestArrangementV4(TestArrangementV3):
'prebuild_plugins': [
'reactor_config',
'add_filesystem',
'inject_parent_image',
'pull_base_image',
'bump_release',
'add_labels_in_dockerfile',
Expand Down Expand Up @@ -809,6 +810,7 @@ class TestArrangementV4(TestArrangementV3):
WORKER_INNER_TEMPLATE: {
'prebuild_plugins': [
'add_filesystem',
'inject_parent_image',
'pull_base_image',
'add_labels_in_dockerfile',
'change_from_in_dockerfile',
Expand Down Expand Up @@ -1006,3 +1008,22 @@ def test_group_manifests(self, openshift): # noqa:F811
'pulp_registry_name': osbs_api.build_conf.get_pulp_registry()
}
assert args == expected_args

@pytest.mark.parametrize('build_type', ( # noqa:F811
'orchestrator',
'worker',
))
def test_inject_parent_image(self, osbs, build_type):
additional_params = {
'base_image': 'foo',
'koji_parent_build': 'fedora-26-9',
}
_, build_json = self.get_build_request(build_type, osbs, additional_params)
plugins = get_plugins_from_build_json(build_json)

args = plugin_value_get(plugins, 'prebuild_plugins', 'inject_parent_image', 'args')
expected_args = {
'koji_build': 'fedora-26-9',
'koji_hub': osbs.build_conf.get_kojihub()
}
assert args == expected_args
80 changes: 74 additions & 6 deletions tests/build_/test_build_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
of the BSD license. See the LICENSE file for details.
"""
import copy
import glob
import json
import os
import fnmatch
Expand Down Expand Up @@ -1397,6 +1398,7 @@ def test_render_optional_plugins(self, tmpdir):
# Only one version defined so far
DEFAULT_ARRANGEMENT_VERSION,
])
@pytest.mark.parametrize('koji_parent_build', ['fedora-26-9', None])
@pytest.mark.parametrize(('build_image', 'build_imagestream', 'worker_build_image', 'valid'), (
('fedora:latest', None, 'fedora:latest', True),
(None, 'buildroot-stream:v1.0', KeyError, True),
Expand Down Expand Up @@ -1435,8 +1437,9 @@ def test_render_optional_plugins(self, tmpdir):
def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
arrangement_version, build_image,
build_imagestream, worker_build_image,
additional_kwargs, openshift_req_version,
worker_openshift_req_version, valid):
additional_kwargs, koji_parent_build,
openshift_req_version, worker_openshift_req_version,
valid):
phase = 'buildstep_plugins'
plugin = 'orchestrate_build'

Expand All @@ -1461,6 +1464,8 @@ def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
kwargs['build_image'] = build_image
if build_imagestream:
kwargs['build_imagestream'] = build_imagestream
if koji_parent_build:
kwargs['koji_parent_build'] = koji_parent_build
kwargs.update(additional_kwargs)

inner_template = ORCHESTRATOR_INNER_TEMPLATE.format(
Expand All @@ -1485,6 +1490,7 @@ def test_render_orchestrate_build(self, tmpdir, platforms, secret, disabled,
assert plugin_value_get(plugins, phase, plugin, 'args', 'platforms') == platforms
build_kwargs = plugin_value_get(plugins, phase, plugin, 'args', 'build_kwargs')
assert build_kwargs['arrangement_version'] == arrangement_version
assert build_kwargs.get('koji_parent_build') == koji_parent_build

worker_config_kwargs = plugin_value_get(plugins, phase, plugin, 'args',
'config_kwargs')
Expand Down Expand Up @@ -1593,9 +1599,10 @@ def create_image_change_trigger_json(outdir, custom_triggers=USE_DEFAULT_TRIGGER
}
]

# Make temporary copies of the JSON files
for basename in [DEFAULT_OUTER_TEMPLATE, DEFAULT_INNER_TEMPLATE]:
shutil.copy(os.path.join(INPUTS_PATH, basename),
# Make temporary copies of all the JSON files
for json_file_path in glob.glob(os.path.join(INPUTS_PATH, '*.json')):
basename = os.path.basename(json_file_path)
shutil.copy(json_file_path,
os.path.join(outdir, basename))

# Create a build JSON description with an image change trigger
Expand Down Expand Up @@ -1710,12 +1717,25 @@ def test_render_prod_request_with_trigger(self, tmpdir, registry_uri,
("http://registry.example.com", True),
])
@pytest.mark.parametrize('use_auth', (True, False, None))
@pytest.mark.parametrize('koji_parent_build', ('fedora-26-9', None))
def test_render_custom_base_image_with_trigger(self, tmpdir, registry_uri,
insecure_registry, use_auth):
insecure_registry, use_auth,
koji_parent_build):
name_label = "fedora/resultingimage"
self.create_image_change_trigger_json(str(tmpdir))
build_request = BuildRequest(str(tmpdir))

build_request.customize_conf['enable_plugins'].append(
{
"plugin_type": "prebuild_plugins",
"plugin_name": "inject_parent_image",
"plugin_args": {
"koji_build": "{{KOJI_PARENT_BUILD}}",
"koji_hub": "{{KOJI_HUB}}"
},
}
)

kwargs = get_sample_prod_params()
kwargs['base_image'] = 'koji/image-build'
kwargs['yum_repourls'] = ["http://example.com/my.repo"]
Expand All @@ -1726,6 +1746,8 @@ def test_render_custom_base_image_with_trigger(self, tmpdir, registry_uri,
kwargs['openshift_uri'] = 'http://openshift/'
if use_auth is not None:
kwargs['use_auth'] = use_auth
if koji_parent_build:
kwargs['koji_parent_build'] = koji_parent_build

build_request.set_params(**kwargs)
build_json = build_request.render()
Expand All @@ -1745,6 +1767,9 @@ def test_render_custom_base_image_with_trigger(self, tmpdir, registry_uri,
get_plugin(plugins, "prebuild_plugins",
"stop_autorebuild_if_disabled")

with pytest.raises(NoSuchPluginException):
get_plugin(plugins, "prebuild_plugins", "inject_parent_image")

self.assert_import_image_plugin(
plugins=plugins,
name_label=name_label,
Expand Down Expand Up @@ -2254,6 +2279,49 @@ def test_render_group_manifest(self, platform_descriptors, goarch,
with pytest.raises(NoSuchPluginException):
get_plugin(plugins, plugin_type, plugin_name)

@pytest.mark.parametrize(('koji_parent_build', 'koji_hub', 'plugin_enabled'), (
('fedora-26-9', 'http://hub/', True),
(None, 'http://hub/', False),
('fedora-26-9', None, False),
(None, None, False),
))
def test_render_inject_parent_image(self, koji_parent_build, koji_hub, plugin_enabled):
plugin_type = "prebuild_plugins"
plugin_name = "inject_parent_image"

build_request = BuildRequest(INPUTS_PATH)
build_request.customize_conf['enable_plugins'].append(
{
"plugin_type": plugin_type,
"plugin_name": plugin_name,
"plugin_args": {
"koji_build": "{{KOJI_PARENT_BUILD}}",
"koji_hub": "{{KOJI_HUB}}"
},
}
)

kwargs = get_sample_prod_params()
kwargs.pop('kojihub', None)
if koji_hub:
kwargs['kojihub'] = koji_hub
if koji_parent_build:
kwargs['koji_parent_build'] = koji_parent_build
build_request.set_params(**kwargs)

build_json = build_request.render()
plugins = get_plugins_from_build_json(build_json)

if plugin_enabled:
assert get_plugin(plugins, plugin_type, plugin_name)
assert plugin_value_get(plugins, plugin_type, plugin_name, 'args',
'koji_build') == koji_parent_build
assert plugin_value_get(plugins, plugin_type, plugin_name, 'args',
'koji_hub') == kwargs['kojihub']
else:
with pytest.raises(NoSuchPluginException):
get_plugin(plugins, plugin_type, plugin_name)

@pytest.mark.parametrize(('platform', 'platforms', 'is_auto', 'scratch', 'expected'), [
(None, None, False, False, {'explicit1': 'yes',
'explicit2': 'yes'}),
Expand Down
4 changes: 3 additions & 1 deletion tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1760,6 +1760,7 @@ def __init__(self, platform, release, platforms, arrangement_version,
self.git_uri = None
self.git_ref = None
self.git_branch = TEST_GIT_BRANCH
self.koji_parent_build = None

expected_kwargs = {
'platform': platform,
Expand All @@ -1774,6 +1775,7 @@ def __init__(self, platform, release, platforms, arrangement_version,
'target': None,
'architecture': None,
'yum_repourls': None,
'koji_parent_build': None,
}
if arrangement_version:
expected_kwargs.update({
Expand All @@ -1792,7 +1794,7 @@ def __init__(self, platform, release, platforms, arrangement_version,
if worker:
(flexmock(osbs)
.should_receive("create_worker_build")
.once()
# .once()
.with_args(**expected_kwargs)
.and_raise(CustomTestException))

Expand Down

0 comments on commit f796c8f

Please sign in to comment.