horizon/tools/list-horizon-plugins.py

101 lines
3.2 KiB
Python
Executable File

#!/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()