governance/tools/validate-legacy.py
Mohammed Naser 5084a1e130 Drop all exceptions for legacy validation
This patch needs to merge once we've cleaned up all of the exceptions
for the legacy file validation which will ensure that all repositories
are cleanly retired.

Change-Id: If10ecaf0222a026d79dbee2aacecd86cb98ac681
2020-08-07 15:47:27 -04:00

86 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright 2020 VEXXHOST, Inc.
#
# 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 sys
import requests
import yaml
FILES_URL = "https://opendev.org/api/v1/repos/{}/git/trees/master"
IGNORED_REPOS = []
parser = argparse.ArgumentParser()
parser.add_argument(
'-l', '--legacy-projects',
default='./reference/legacy.yaml',
help='legacy.yaml file path (%(default)s)'
)
args = parser.parse_args()
with open(args.legacy_projects, 'r', encoding='utf-8') as f:
legacy_projects = yaml.safe_load(f.read())
errors = 0
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
# Ensure that the repositories has no content.
for repo in deliverable_data['repos']:
if repo in IGNORED_REPOS:
msg = '{} is ignored'.format(repo)
print(msg)
continue
if repo.startswith('opendev/'):
msg = '{} not in openstack namespace, ignoring.'.format(repo)
print(msg)
continue
url = FILES_URL.format(repo)
files = requests.get(url).json()
file_names = sorted([f['path'] for f in files['tree']])
if file_names != ['.gitreview', 'README.rst']:
msg = '{} is not properly retired, files: {}.'.format(
repo, file_names)
print(msg)
errors += 1
continue
sys.exit(1 if errors else 0)