From cc9112b499f8c668da5e4874aefceb1677587e5d Mon Sep 17 00:00:00 2001 From: Matt Prahl Date: Jun 20 2017 17:35:40 +0000 Subject: Add the ability to query via PDC in 'fedcontainer_rc.py' --- diff --git a/ansible/library/fedcontainer_rc.py b/ansible/library/fedcontainer_rc.py index 525f8a9..d923471 100755 --- a/ansible/library/fedcontainer_rc.py +++ b/ansible/library/fedcontainer_rc.py @@ -29,6 +29,13 @@ options: description: - Fedora Release number required: true + query_source: + description + - The source to query about container information + choices: + - pkgdb + - pdc + default: pkgdb ''' @@ -53,6 +60,7 @@ requests.adapters.DEFAULT_RETRIES = 5 # # cntr == container # pkgdb == package db +# pdc == Product Definition Center # dg == datagrepper # fgc == Fedora Generational Core @@ -107,6 +115,55 @@ def get_cntr_list(pkgdb_url, release_num): return [cntr[u'name'] for cntr in sanitized_cntr_list] +def get_cntr_list_pdc(pdc_url, release_num): + # type: (str, int) -> list + """ + Query PDC for container list, sanitize out containers that are inactive + or are blacklisted. + + :arg pdc_url: str, PDC URL + :arg release_num: int, Fedora release to query for + :return: list of container names + """ + + # Get blacklist from https://pagure.io/releng/container-blacklist + blacklist_url = ('https://pagure.io/releng/container-blacklist/raw/master' + '/f/blacklist.json') + + # First query PDC for all container branches we currently have + pdc_api_url = '{0}/rest_api/v1/component-branches/'.format( + pdc_url.rstrip('/')) + query_args = { + 'name': 'f{0}'.format(release_num), + 'type': 'container', + 'active': True, + 'page_size': 100 + } + cntr_set = set() + + while True: + pdc_branches = requests.get( + pdc_api_url, params=query_args, timeout=60).json() + + for branch_rv in pdc_branches['results']: + cntr_set.add(branch_rv['global_component']) + + if pdc_branches['next']: + pdc_api_url = pdc_branches['next'] + else: + # There are no more results to iterate through + break + + blacklist = requests.get(blacklist_url, timeout=60).json() + # sanitize the container list + sanitized_cntr_list = [ + cntr for cntr in cntr_set + if cntr not in blacklist.get('f{}'.format(release_num), []) + ] + + return sanitized_cntr_list + + def get_lists(release_num, cntr_list, dg_api_url, dg_req_params): # type: (int, list, str, dict) -> tuple """ @@ -224,7 +281,8 @@ def get_lists(release_num, cntr_list, dg_api_url, dg_req_params): return (rclist, rebuildlist, errors) -def get_releasecandidates(release_num): + +def get_releasecandidates(release_num, query_source): # type: (int) -> tuple """ Logic to actually get the release candidate, this is likely to change over @@ -233,9 +291,12 @@ def get_releasecandidates(release_num): global module - # pkgdb2 api vars - pkgdb_url = "https://admin.fedoraproject.org/pkgdb" - cntr_list = get_cntr_list(pkgdb_url, release_num) + if query_source == 'pkgdb': + pkgdb_url = "https://admin.fedoraproject.org/pkgdb" + cntr_list = get_cntr_list(pkgdb_url, release_num) + else: + pdc_api_url = "https://pdc.fedoraproject.org" + cntr_list = get_cntr_list_pdc(pdc_api_url, release_num) # datagrepper api vars dg_api_url = "https://apps.fedoraproject.org/datagrepper/raw" @@ -256,11 +317,13 @@ def main(): module = AnsibleModule( argument_spec=dict( release=dict(required=True, type="int", default=None), + query_source=dict(default="pkgdb", choices=["pkgdb", "pdc"]) ), supports_check_mode=False ) - rclist, rebuildlist, errors = get_releasecandidates(module.params['release']) + rclist, rebuildlist, errors = get_releasecandidates( + module.params['release'], module.params['query_source']) if rclist and rebuildlist: # Technically this never changes anything on the system, so always mark