c12s-kubespray/tests/scripts/md-table/main.py
jayonlau 6b5da84014
Clean up extra spaces last one (#7904)
Although these errors are not important, they affect the code specification.
2021-08-25 12:06:09 -07:00

97 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python
import argparse
import sys
import glob
from pathlib import Path
import yaml
from pydblite import Base
import re
import jinja2
import sys
from pprint import pprint
parser = argparse.ArgumentParser(description='Generate a Markdown table representing the CI test coverage')
parser.add_argument('--dir', default='tests/files/', help='folder with test yml files')
args = parser.parse_args()
p = Path(args.dir)
env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=sys.path[0]))
# Data represents CI coverage data matrix
class Data:
def __init__(self):
self.db = Base(':memory:')
self.db.create('container_manager', 'network_plugin', 'operating_system')
def set(self, container_manager, network_plugin, operating_system):
self.db.insert(container_manager=container_manager, network_plugin=network_plugin, operating_system=operating_system)
self.db.commit()
def exists(self, container_manager, network_plugin, operating_system):
return len((self.db("container_manager") == container_manager) & (self.db("network_plugin") == network_plugin) & (self.db("operating_system") == operating_system)) > 0
def jinja(self):
template = env.get_template('table.md.j2')
container_engines = list(self.db.get_unique_ids('container_manager'))
network_plugins = list(self.db.get_unique_ids("network_plugin"))
operating_systems = list(self.db.get_unique_ids("operating_system"))
container_engines.sort()
container_engines.reverse() # reverse sort container_engines to get Docker first in the list
network_plugins.sort()
operating_systems.sort()
return template.render(
container_engines=container_engines,
network_plugins=network_plugins,
operating_systems=operating_systems,
exists=self.exists
)
def markdown(self):
out = ''
for container_manager in self.db.get_unique_ids('container_manager'):
# Prepare the headers
out += "# " + container_manager + "\n"
headers = '|OS / CNI| '
underline = '|----|'
for network_plugin in self.db.get_unique_ids("network_plugin"):
headers += network_plugin + ' | '
underline += '----|'
out += headers + "\n" + underline + "\n"
for operating_system in self.db.get_unique_ids("operating_system"):
out += '| ' + operating_system + ' | '
for network_plugin in self.db.get_unique_ids("network_plugin"):
if self.exists(container_manager, network_plugin, operating_system):
emoji = ':white_check_mark:'
else:
emoji = ':x:'
out += emoji + ' | '
out += "\n"
pprint(self.db.get_unique_ids('operating_system'))
pprint(self.db.get_unique_ids('network_plugin'))
return out
if not p.is_dir():
print("Path is not a directory")
sys.exit(2)
data = Data()
files = p.glob('*.yml')
for f in files:
y = yaml.load(f.open(), Loader=yaml.FullLoader)
container_manager = y.get('container_manager', 'docker')
network_plugin = y.get('kube_network_plugin', 'calico')
x = re.match(r"^[a-z-]+_([a-z0-9]+).*", f.name)
operating_system = x.group(1)
data.set(container_manager=container_manager, network_plugin=network_plugin, operating_system=operating_system)
#print(data.markdown())
print(data.jinja())