Merge #1688 Integration tests: add v3-packager coverage

This commit is contained in:
Mike McLean
2021-03-17 19:33:57 +00:00
10 changed files with 139 additions and 7 deletions

View File

@@ -96,10 +96,23 @@ def clone_and_start_build(repo, pkg_util):
:rtype utils.Repo, list:
"""
repo.bump()
builds = pkg_util.run("--optional", "rebuild_strategy=all")
yield repo, builds
for build in builds:
pkg_util.cancel(build, ignore_errors=True)
_builds = []
_cancel = True
def _build(*args, cancel=True, **kwargs):
nonlocal _builds, _cancel
options = [str(i) for i in args]
builds = pkg_util.run(*options, **kwargs)
if not builds:
raise AssertionError(f"Packaging utility args={options} did not produce any builds")
_builds, _cancel = (builds, cancel)
return repo, builds
yield _build
if _cancel:
for build in _builds:
pkg_util.cancel(build, ignore_errors=True)
@pytest.fixture(scope="function")

View File

@@ -139,3 +139,15 @@ testdata:
rest_submit_module_build:
module: testmodule
branch: test-submit-module
v3_normal_build:
module: testmodule
branch: test-v3-normal-build
v3_multiple_contexts:
module: testmodule
branch: test-v3-multiple-contexts
v3_no_components:
module: testmodule
branch: test-v3-no-components
v3_buildrequire:
module: testmodule
branch: test-v3-buildrequire

View File

@@ -9,7 +9,7 @@ def test_buildonly(clone_and_start_build, mbs):
* Assert that the expected filter field was created in the module metadata.
"""
repo, builds = clone_and_start_build
repo, builds = clone_and_start_build("--optional", "rebuild_strategy=all")
# Check the original modulemd
modulemd = repo.modulemd

View File

@@ -8,7 +8,7 @@ def test_rest_module_build(clone_and_start_build, mbs, koji, pkg_util):
* There is no need for exhaustive testing of the REST API here,
as extensive coverage of it is already implemented in tests/test_web/test_views.py.
"""
repo, builds = clone_and_start_build
repo, builds = clone_and_start_build("--optional", "rebuild_strategy=all")
assert len(builds) >= 1
username = getpass.getuser()

View File

@@ -1,6 +1,6 @@
def test_static_context(clone_and_start_build, mbs):
repo, builds = clone_and_start_build
repo, builds = clone_and_start_build("--optional", "rebuild_strategy=all")
static_contexts = repo.modulemd["data"]["xmd"]["mbs_options"]["contexts"]

View File

@@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
def test_v3_buildrequire(mbs, clone_and_start_build):
"""Test buildrequire fields in the v3-packager mmd.
Preconditions:
* 2 contexts defined in mmd, one of which 'build-requires' another module
(as well as a koji-resolver enabled platform).
* Build-required module is tagged in koji with koji_tag_with_modules from said platform.
Steps:
* Submit a build.
* Wait until the build(s) are in build state.
* Cancel the build(s).
Checks:
* That that number of builds produced is equal to the number of configurations.
* That each build has expected buildrequires items.
"""
repo, builds = clone_and_start_build()
contexts = {
cfg["context"]: cfg for cfg in repo.modulemd["data"]["configurations"]
}
assert len(builds) == len(contexts)
for build in builds:
mbs.wait_for_module_build(build, lambda bld: bld.get("state") >= 2)
ctx = build.module_build_data["context"]
assert ctx in contexts
for buildrequire, data in build.module_build_data["buildrequires"].items():
if buildrequire == "platform":
mmd_platform = contexts[ctx]["platform"]
assert data["stream"] == mmd_platform \
if mmd_platform.endswith(".z") else f"{mmd_platform}.z"
continue
assert buildrequire in contexts[ctx]["buildrequires"]
assert data["stream"] == contexts[ctx]["buildrequires"][buildrequire][0]

View File

@@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
def test_v3_multiple_contexts(clone_and_start_build):
"""Test that multiple configurations in v3-packager modulemd produce multiple module builds"""
repo, builds = clone_and_start_build("--optional", "rebuild_strategy=all")
assert len(builds) == len(repo.modulemd["data"]["configurations"])

View File

@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
def test_v3_no_components(mbs, clone_and_start_build):
"""Test a minimal mmd - with no RPM components"""
_, builds = clone_and_start_build(cancel=False)
assert len(builds) == 1
build = builds[0]
mbs.wait_for_module_build_to_succeed(build)
assert not build.data["component_builds"]

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
def test_v3_normal_build(mbs, koji, clone_and_start_build):
"""Test a normal module-build submitted with v3-packager YAML modulemd."""
repo, builds = clone_and_start_build("--optional", "rebuild_strategy=all", cancel=False)
build = builds[0]
# actual input (v3 packager mmd)
assert len(repo.modulemd["data"]["configurations"]) == 1
mmd_configuration = repo.modulemd["data"]["configurations"][0]
mmd_context = mmd_configuration["context"]
mmd_platform = mmd_configuration["platform"]
mbs.wait_for_module_build_to_succeed(build)
# assert module build components
assert sorted(build.component_names()) == sorted(repo.components + ["module-build-macros"])
for component_rpm in build.components():
assert koji.get_task(component_rpm["task_id"])["state"] == 2 # is closed
# assert produced koji build
koji_build = koji.get_build(build.nvr())
koji_build_devel = koji.get_build(build.nvr(name_suffix="-devel"))
assert koji_build and koji_build_devel
module_data = koji_build['extra']['typeinfo']['module']
assert module_data['module_build_service_id'] == int(build.id)
assert module_data['context'] == mmd_context
koji_mmd = koji.get_modulemd(koji_build)
actual_platforms = koji_mmd["data"]["dependencies"][0]["buildrequires"]["platform"]
assert len(actual_platforms) == 1
assert actual_platforms[0] == f"{mmd_platform}.z"

View File

@@ -79,6 +79,15 @@ class Koji:
self._session = koji.ClientSession(self._server)
self._pathinfo = koji.PathInfo(self._topurl)
def get_task(self, task_id):
"""Koji task data for task id
:param int task_id: task id
:return: Dictionary with Koji task data or None, if task is not found
:rtype: dict or None
"""
return self._session.getTaskInfo(task_id)
def get_build(self, nvr_dict):
"""Koji build data for NVR