#!/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 csv import glob import os import yaml # The script picks up deliverables whose type is 'horizon-plugin' in the # openstack/releases repository. Some horizon plugins are released together # with other repositories and we cannot pick them up for such case. # EXTRA_PLUGINS is used to declare such horizon plugins. # Each entry is a tuple of # - the deliverable name in the releases repo, and # - the repository name of the dashboard. EXTRA_PLUGINS = { 'networking-bgpvpn': 'networking-bgpvpn', } def read_plugin_data_from_releases(releases_repo, release): plugins = {} deliverables_glob = '%s/deliverables/%s/*.yaml' % (releases_repo, release) for deliverable in glob.glob(deliverables_glob): with open(deliverable) as f: data = yaml.safe_load(f) name = os.path.splitext(os.path.basename(deliverable))[0] if data['type'] == 'horizon-plugin': pass elif name in EXTRA_PLUGINS: name = EXTRA_PLUGINS[name] else: continue repos = [repo for repo in data['repository-settings'] if os.path.basename(repo) == name] if not repos: repos = list(data['repository-settings'].keys())[0] data['repository'] = repos[0] plugins[name] = data return plugins def get_plugin_info(name, config): repo = ':opendev-repo:`%s`' % config['repository'] if 'storyboard' in config: bug_tracker = ':storyboard:`%s`' % config['storyboard'] elif 'launchpad' in config: bug_tracker = ':launchpad:`%s`' % config['launchpad'] else: bug_tracker = None return [name, repo, bug_tracker] def write_csv(plugins, csv_file): with open(csv_file, 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile, lineterminator='\n', quoting=csv.QUOTE_MINIMAL) csvwriter.writerow(['Plugin', 'Repository', 'Bug Tracker']) for name in sorted(plugins): csvwriter.writerow(get_plugin_info(name, plugins[name])) def main(): parser = argparse.ArgumentParser() parser.add_argument( '--csv-file', default='plugin-registry.csv', help='Path to a CSV file which contains the plugin list.' ) parser.add_argument( 'repo', help='Path to openstack/releases repository cloned to local.' ) parser.add_argument( 'release', help='Release name like "ussuri' ) args = parser.parse_args() plugins = read_plugin_data_from_releases(args.repo, args.release) write_csv(plugins, args.csv_file) if __name__ == '__main__': main()