#!/usr/bin/env python3 # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import argparse import os import sys import requests import yaml parser = argparse.ArgumentParser() parser.add_argument( '-p', '--projects', default='./reference/projects.yaml', help='projects.yaml file path (%(default)s)', ) parser.add_argument( '-l', '--legacy-projects', default='./reference/legacy.yaml', help='legact.yaml file path (%(default)s)' ) parser.add_argument( '-g', '--gerrit', default=('http://opendev.org/openstack-infra/project-config/' 'raw/branch/master/gerrit/projects.yaml'), help=('URL for gerrit project list, ignored if --project-config is set or ' 'when running in Zuul'), ) parser.add_argument( '-c', '--project-config', default=('/home/zuul/src/opendev.org/openstack-infra/project-config'), help='Local path of project-config', ) args = parser.parse_args() with open(args.projects, 'r', encoding='utf-8') as f: projects = yaml.safe_load(f.read()) with open(args.legacy_projects, 'r', encoding='utf-8') as f: legacy_projects = yaml.safe_load(f.read()) if os.path.exists(args.project_config): projects_yaml = '%s/gerrit/projects.yaml' % args.project_config with open(projects_yaml) as gerrit_projects: gerrit_data = yaml.safe_load(gerrit_projects) else: response = requests.get(args.gerrit) gerrit_data = yaml.safe_load(response.text) gerrit_projects = set( entry.get('project') for entry in gerrit_data ) errors = 0 for team_name, team_data in projects.items(): deliverables = team_data.get('deliverables') for deliverable_name, deliverable_data in deliverables.items(): for repo_name in deliverable_data.get('repos', []): if repo_name not in gerrit_projects: print('Unknown repository {} as part of {} in {}'.format( repo_name, deliverable_name, team_name)) errors += 1 for team_name, team_data in legacy_projects.items(): # Check if the team has been retired if 'retired-on' in team_data: continue deliverables = team_data.get('deliverables') # Team has no deliverables, retired with no retired-on date if not deliverables: print('{} team has no deliverables with no retired-on date'.format( team_name )) errors += 1 continue # In this case, team is not retired but has retired projects for deliverable_name, deliverable_data in deliverables.items(): # Retired-on date missing for a deliverable if 'retired-on' not in deliverable_data: print('{} is missing a retired-on date'.format(deliverable_name)) errors += 1 continue sys.exit(1 if errors else 0)