From 28e821fee011b32354fbef813585da112226ce08 Mon Sep 17 00:00:00 2001 From: mprahl Date: Thu, 1 Mar 2018 20:31:00 -0500 Subject: [PATCH] Start querying modules by context when it's available When implementing module stream expansion, we'll need to make sure the buildrequires are queried using their context as well. --- module_build_service/resolver/PDCResolver.py | 24 ++++++++++++------- module_build_service/resolver/base.py | 4 ++-- .../scheduler/handlers/modules.py | 11 +++++---- tests/conftest.py | 2 ++ tests/test_build/test_build.py | 5 ++++ tests/test_resolver/test_pdc.py | 4 ++-- 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/module_build_service/resolver/PDCResolver.py b/module_build_service/resolver/PDCResolver.py index 5dd215f4..d948394e 100644 --- a/module_build_service/resolver/PDCResolver.py +++ b/module_build_service/resolver/PDCResolver.py @@ -132,6 +132,8 @@ class PDCResolver(GenericResolver): elif is_module_dict(data): result = {'variant_id': data['name'], 'variant_version': data['version']} + if data.get('context'): + result['variant_context'] = data['context'] if 'release' in data: result['variant_release'] = data['release'] @@ -190,6 +192,8 @@ class PDCResolver(GenericResolver): query['variant_release'] = variant_dict['variant_release'] if module_info.get('active'): query['active'] = module_info['active'] + if module_info.get('context'): + query['variant_context'] = module_info['context'] # TODO: So far sorting on Fedora prod PDC instance is broken and it sorts # only by variant_uid by default. Once the sorting is fixed, we can start @@ -220,11 +224,12 @@ class PDCResolver(GenericResolver): assert len(results) <= 1, pprint.pformat(retval) return results[0] - def get_module_tag(self, name, stream, version, strict=False): + def get_module_tag(self, name, stream, version, context, strict=False): """ :param name: a module's name :param stream: a module's stream :param version: a module's version + :param context: a module's context :param strict: Normally this function returns None if no module can be found. If strict=True, then an UnprocessableEntity is raised. :return: koji tag string @@ -232,7 +237,8 @@ class PDCResolver(GenericResolver): module_info = { 'name': name, 'version': stream, - 'release': str(version) + 'release': str(version), + 'context': context } return self._get_module(module_info, strict=strict)['koji_tag'] @@ -388,12 +394,13 @@ class PDCResolver(GenericResolver): # Return the union of all rpms in all profiles of the given keys. return results - def get_module_build_dependencies(self, name=None, stream=None, version=None, mmd=None, - strict=False): + def get_module_build_dependencies(self, name=None, stream=None, version=None, context=None, + mmd=None, strict=False): """ :param name: a module's name (required if mmd is not set) :param stream: a module's stream (required if mmd is not set) :param version: a module's version (required if mmd is not set) + :param context: a module's context (required if mmd is not set) :param mmd: uses the mmd instead of the name, stream, version to query PDC :param strict: Normally this function returns None if no module can be found. If strict=True, then an UnprocessableEntity is raised. @@ -401,12 +408,12 @@ class PDCResolver(GenericResolver): """ if mmd: log.debug("get_module_build_dependencies(mmd=%r strict=%r)" % (mmd, strict)) - elif any(x is None for x in [name, stream, version]): - raise RuntimeError('The name, stream, and version weren\'t specified') + elif any(x is None for x in [name, stream, version, context]): + raise RuntimeError('The name, stream, version, and/or context weren\'t specified') else: version = str(version) log.debug("get_module_build_dependencies(%s, strict=%r)" - % (', '.join([name, stream, str(version)]), strict)) + % (', '.join([name, stream, str(version), context]), strict)) # This is the set we're going to build up and return. module_tags = {} @@ -417,7 +424,8 @@ class PDCResolver(GenericResolver): module_info = { 'name': name, 'version': stream, - 'release': str(version) + 'release': str(version), + 'context': context } queried_module = self._get_module(module_info, strict=strict) yaml = queried_module['modulemd'] diff --git a/module_build_service/resolver/base.py b/module_build_service/resolver/base.py index dadd2128..5553f5ca 100644 --- a/module_build_service/resolver/base.py +++ b/module_build_service/resolver/base.py @@ -98,7 +98,7 @@ class GenericResolver(six.with_metaclass(ABCMeta)): return mmd @abstractmethod - def get_module_tag(self, name, stream, version, strict=False): + def get_module_tag(self, name, stream, version, context, strict=False): raise NotImplementedError() @abstractmethod @@ -107,7 +107,7 @@ class GenericResolver(six.with_metaclass(ABCMeta)): @abstractmethod def get_module_build_dependencies(self, name=None, stream=None, version=None, mmd=None, - strict=False): + context=None, strict=False): raise NotImplementedError() @abstractmethod diff --git a/module_build_service/scheduler/handlers/modules.py b/module_build_service/scheduler/handlers/modules.py index 3072284d..88ddc323 100644 --- a/module_build_service/scheduler/handlers/modules.py +++ b/module_build_service/scheduler/handlers/modules.py @@ -229,9 +229,10 @@ def wait(config, session, msg): else: # For Koji backend, query for the module we are going to # build to get the koji_tag and deps from it. - log.info("Getting deps for %s" % (':'.join([build.name, build.stream, build.version]))) + nsvc = ':'.join([build.name, build.stream, build.version]) + log.info("Getting deps for %s" % (nsvc)) deps_dict = resolver.get_module_build_dependencies( - build.name, build.stream, build.version, strict=True) + build.name, build.stream, build.version, build.context, strict=True) dependencies = set(deps_dict.keys()) # Find out the name of Koji tag to which the module's Content @@ -244,9 +245,9 @@ def wait(config, session, msg): module_names_streams[base_module_name]) break - log.info('Getting tag for {0}'.format(':'.join([ - build.name, build.stream, build.version]))) - tag = resolver.get_module_tag(build.name, build.stream, build.version, strict=True) + log.info('Getting tag for {0}'.format(nsvc)) + tag = resolver.get_module_tag( + build.name, build.stream, build.version, build.context, strict=True) return dependencies, tag, cg_build_koji_tag diff --git a/tests/conftest.py b/tests/conftest.py index 87076af1..106f6044 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -140,6 +140,7 @@ def pdc_module_inactive(pdc): 'variant_type': 'module', 'variant_version': 'master', 'variant_release': '20180205135154', + 'variant_context': 'c2c572ec', 'koji_tag': 'module-95b214a704c984be', 'modulemd': TESTMODULE_MODULEMD, 'runtime_deps': [ @@ -194,6 +195,7 @@ def pdc_module_reuse(pdc_module_active): pdc_module_reuse.endpoints['unreleasedvariants']['GET'][-1].update({ 'variant_uid': 'testmodule:master:{0}'.format(mmd.get_version()), 'variant_release': str(mmd.get_version()), + 'variant_context': '7c29193d', 'modulemd': mmd.dumps(), 'koji_tag': 'module-de3adf79caf3e1b8' }) diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index c0835aa7..5d30d266 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -411,6 +411,7 @@ class TestBuild: 'variant_type': 'module', 'variant_version': 'master', 'variant_release': '20180205135154', + 'variant_context': 'c2c572ec', 'koji_tag': 'module-95b214a704c984be', 'modulemd': python3_yaml, 'runtime_deps': [ @@ -916,6 +917,8 @@ class TestBuild: """ now = datetime.utcnow() submitted_time = now - timedelta(minutes=3) + pdc_module_inactive.endpoints['unreleasedvariants']['GET'][-1]['variant_context'] = \ + '7c29193d' # Create a module in the failed state build_one = models.ModuleBuild() build_one.name = 'testmodule' @@ -1040,6 +1043,8 @@ class TestBuild: FakeModuleBuilder.INSTANT_COMPLETE = True now = datetime.utcnow() submitted_time = now - timedelta(minutes=3) + pdc_module_inactive.endpoints['unreleasedvariants']['GET'][-1]['variant_context'] = \ + '7c29193d' # Create a module in the failed state build_one = models.ModuleBuild() build_one.name = 'testmodule' diff --git a/tests/test_resolver/test_pdc.py b/tests/test_resolver/test_pdc.py index 8ac3bea6..e07d4f64 100644 --- a/tests/test_resolver/test_pdc.py +++ b/tests/test_resolver/test_pdc.py @@ -90,7 +90,7 @@ class TestPDCModule: }) resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc') result = resolver.get_module_build_dependencies( - 'testmodule', 'master', '20180205135154').keys() + 'testmodule', 'master', '20180205135154', 'c2c572ec').keys() assert set(result) == expected def test_get_module_build_dependencies_recursive(self, pdc_module_active): @@ -126,7 +126,7 @@ class TestPDCModule: resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc') result = resolver.get_module_build_dependencies( - 'testmodule2', 'master', '20180123171545').keys() + 'testmodule2', 'master', '20180123171545', 'c2c572ec').keys() assert set(result) == set(['module-f28-build']) @patch("module_build_service.config.Config.system",