From 5083ebdfb0f5a09d67e37cb2078633efcaa18f4b Mon Sep 17 00:00:00 2001 From: Giulia Naponiello Date: Jul 03 2018 07:41:35 +0000 Subject: Merge #250 `Pull dist-git namespace also from koji.` --- diff --git a/docs/policies.rst b/docs/policies.rst index 8d4efed..dbfd76a 100644 --- a/docs/policies.rst +++ b/docs/policies.rst @@ -240,7 +240,7 @@ Examples: .. code-block:: console DIST_GIT_BASE_URL = 'https://src.fedoraproject.org/' - DIST_GIT_URL_TEMPLATE = '{DIST_GIT_BASE_URL}rpms/{pkg_name}/raw/{rev}/f/gating.yaml' + DIST_GIT_URL_TEMPLATE = '{DIST_GIT_BASE_URL}{pkg_namespace}/{pkg_name}/raw/{rev}/f/gating.yaml' KOJI_BASE_URL = 'https://koji.fedoraproject.org/kojihub' Greenwave checks if a gating.yaml file exists in the specified repo, and, if it diff --git a/greenwave/config.py b/greenwave/config.py index 4a31187..bb693e3 100644 --- a/greenwave/config.py +++ b/greenwave/config.py @@ -24,7 +24,7 @@ class Config(object): # Options for outbound HTTP requests made by python-requests DIST_GIT_BASE_URL = 'https://src.fedoraproject.org/' - DIST_GIT_URL_TEMPLATE = '{DIST_GIT_BASE_URL}rpms/{pkg_name}/raw/{rev}/f/gating.yaml' + DIST_GIT_URL_TEMPLATE = '{DIST_GIT_BASE_URL}{pkg_namespace}/{pkg_name}/raw/{rev}/f/gating.yaml' KOJI_BASE_URL = 'https://koji.fedoraproject.org/kojihub' REQUESTS_TIMEOUT = (6.1, 15) REQUESTS_VERIFY = True diff --git a/greenwave/policies.py b/greenwave/policies.py index 0f1166c..9a4366f 100644 --- a/greenwave/policies.py +++ b/greenwave/policies.py @@ -305,8 +305,8 @@ class RemoteRule(Rule): return [] pkg_name = subject_identifier.rsplit('-', 2)[0] - rev = greenwave.resources.retrieve_rev_from_koji(subject_identifier) - response = greenwave.resources.retrieve_yaml_remote_rule(rev, pkg_name) + pkg_namespace, rev = greenwave.resources.retrieve_scm_from_koji(subject_identifier) + response = greenwave.resources.retrieve_yaml_remote_rule(rev, pkg_name, pkg_namespace) if response is None: # greenwave extension file not found diff --git a/greenwave/resources.py b/greenwave/resources.py index 0d4e894..58db8c0 100644 --- a/greenwave/resources.py +++ b/greenwave/resources.py @@ -26,8 +26,8 @@ requests_session = requests.Session() @cached @greenwave.utils.retry(wait_on=urllib3.exceptions.NewConnectionError) -def retrieve_rev_from_koji(nvr): - """ Retrieve cached rev from koji using the nrv """ +def retrieve_scm_from_koji(nvr): + """ Retrieve cached rev and namespace from koji using the nvr """ proxy = xmlrpc.client.ServerProxy(current_app.config['KOJI_BASE_URL']) build = proxy.getBuild(nvr) @@ -36,19 +36,32 @@ def retrieve_rev_from_koji(nvr): build, nvr, current_app.config['KOJI_BASE_URL'])) try: - url = urlparse(build['extra']['source']['original_url']) + original_url = build['extra']['source']['original_url'] + url = urlparse(original_url) + if not url.scheme.startswith('git'): - raise BadGateway('Error occurred looking for the "rev" in koji.') - return url.fragment + raise BadGateway('Unable to extract scm from koji. ' + '%s doesn\'t begin with git://' % url) + + if url.netloc not in current_app.config['DIST_GIT_BASE_URL']: + raise BadGateway('Unable to extract scm from koji. ' + '%s is an unrecognized scm domain.' % url) + + rev = url.fragment + namespace = url.path.split('/')[-2] + return namespace, rev except Exception: - raise BadGateway('Error occurred looking for the "rev" in koji.') + error = 'Error occurred looking for the "rev" in koji.' + log.exception(error) + raise BadGateway(error) @cached -def retrieve_yaml_remote_rule(rev, pkg_name): +def retrieve_yaml_remote_rule(rev, pkg_name, pkg_namespace): """ Retrieve cached gating.yaml content for a given rev. """ data = { "DIST_GIT_BASE_URL": current_app.config['DIST_GIT_BASE_URL'].rstrip('/') + '/', + "pkg_namespace": pkg_namespace, "pkg_name": pkg_name, "rev": rev } diff --git a/greenwave/tests/test_policies.py b/greenwave/tests/test_policies.py index 7d7cb41..25d9d20 100644 --- a/greenwave/tests/test_policies.py +++ b/greenwave/tests/test_policies.py @@ -267,7 +267,8 @@ rules: p.write(serverside_fragment) app = create_app('greenwave.config.TestingConfig') with app.app_context(): - with mock.patch('greenwave.resources.retrieve_rev_from_koji'): + with mock.patch('greenwave.resources.retrieve_scm_from_koji') as scm: + scm.return_value = ('rpms', 'nethack') with mock.patch('greenwave.resources.retrieve_yaml_remote_rule') as f: f.return_value = remote_fragment policies = load_policies(tmpdir.strpath) @@ -329,7 +330,8 @@ rules: p.write(serverside_fragment) app = create_app('greenwave.config.TestingConfig') with app.app_context(): - with mock.patch('greenwave.resources.retrieve_rev_from_koji'): + with mock.patch('greenwave.resources.retrieve_scm_from_koji') as scm: + scm.return_value = ('rpms', 'nethack') with mock.patch('greenwave.resources.retrieve_yaml_remote_rule') as f: f.return_value = remote_fragment policies = load_policies(tmpdir.strpath) @@ -384,7 +386,8 @@ rules: p.write(serverside_fragment) app = create_app('greenwave.config.TestingConfig') with app.app_context(): - with mock.patch('greenwave.resources.retrieve_rev_from_koji'): + with mock.patch('greenwave.resources.retrieve_scm_from_koji') as scm: + scm.return_value = ('rpms', 'nethack') with mock.patch('greenwave.resources.retrieve_yaml_remote_rule') as f: f.return_value = remote_fragment policies = load_policies(tmpdir.strpath) @@ -438,7 +441,8 @@ rules: p.write(serverside_fragment) app = create_app('greenwave.config.TestingConfig') with app.app_context(): - with mock.patch('greenwave.resources.retrieve_rev_from_koji'): + with mock.patch('greenwave.resources.retrieve_scm_from_koji') as scm: + scm.return_value = ('rpms', 'nethack') with mock.patch('greenwave.resources.retrieve_yaml_remote_rule') as f: f.return_value = remote_fragment policies = load_policies(tmpdir.strpath)