# -*- coding: utf-8 -*-
+import csv
+import json
from prettytable import PrettyTable, FRAME, ALL
import os
+import sys
import yaml
from teuthology.exceptions import ParseError
suite_dir = os.path.abspath(args["<suite_dir>"])
fields = args["--fields"].split(',')
include_facet = args['--show-facet'] == 'yes'
+ output_format = args['--format']
if args['--combinations']:
limit = int(args['--limit'])
subset = None
if args['--subset']:
subset = map(int, args['--subset'].split('/'))
- describe_combinations(suite_dir, fields, subset,
- limit, filter_in, filter_out,
- include_facet)
+ headers, rows = get_combinations(suite_dir, fields, subset,
+ limit, filter_in,
+ filter_out, include_facet)
+ hrule = ALL
else:
- describe_suite(suite_dir, fields, include_facet)
+ headers, rows = describe_suite(suite_dir, fields, include_facet,
+ output_format)
+ hrule = FRAME
+
+ output_results(headers, rows, output_format, hrule)
+
+def output_results(headers, rows, output_format, hrule):
+ if output_format == 'json':
+ objects = [{k: v for k, v in zip(headers, row) if v}
+ for row in rows]
+ print(json.dumps(dict(headers=headers, data=objects)))
+ elif output_format == 'csv':
+ writer = csv.writer(sys.stdout)
+ writer.writerows([headers] + rows)
+ else:
+ table = PrettyTable(headers)
+ table.align = 'l'
+ table.vrules = ALL
+ table.hrules = hrule
+ for row in rows:
+ table.add_row(row)
+ print(table)
def get_combinations(suite_dir, fields, subset,
limit, filter_in, filter_out,
return headers, sorted([[row.get(field, '') for field in headers]
for row in rows])
-def describe_combinations(suite_dir, fields, subset,
- limit, filter_in, filter_out,
- include_facet):
- headers, rows = get_combinations(suite_dir, fields, subset,
- limit, filter_in, filter_out,
- include_facet)
-
- table = PrettyTable(headers)
- table.align = 'l'
- table.vrules = ALL
- table.hrules = ALL
-
- for row in rows:
- table.add_row(row)
-
- print(table)
-
-def describe_suite(suite_dir, fields, include_facet):
+def describe_suite(suite_dir, fields, include_facet, output_format):
try:
- rows = tree_with_info(suite_dir, fields, include_facet, '', [])
+ rows = tree_with_info(suite_dir, fields, include_facet, '', [],
+ output_format=output_format)
except ParseError:
return 1
headers = ['path']
if include_facet:
headers.append('facet')
-
- table = PrettyTable(headers + fields)
- table.align = 'l'
- table.vrules = ALL
- table.hrules = FRAME
-
- for row in rows:
- table.add_row(row)
-
- print(suite_dir)
- print(table)
+ return headers + fields, rows
def extract_info(file_name, fields, _isdir=os.path.isdir, _open=open):
empty_result = {f: '' for f in fields}
return {field: description[0].get(field, '') for field in fields}
+def path_relative_to_suites(path):
+ try:
+ root = os.path.join('ceph-qa-suite', 'suites')
+ return path[path.index(root) + len(root):]
+ except ValueError:
+ return path
+
def tree_with_info(cur_dir, fields, include_facet, prefix, rows,
_listdir=os.listdir, _isdir=os.path.isdir,
- _open=open):
+ _open=open, output_format='plain'):
files = sorted(_listdir(cur_dir))
has_yamls = any([x.endswith('.yaml') for x in files])
facet = os.path.basename(cur_dir) if has_yamls else ''
dir_pad = '│ '
info = extract_info(path, fields, _isdir, _open)
tree_node = prefix + file_pad + f
+ if output_format != 'plain':
+ tree_node = path_relative_to_suites(path)
meta = [info[f] for f in fields]
row = [tree_node]
if include_facet:
if _isdir(path):
tree_with_info(path, fields, include_facet,
prefix + dir_pad, rows,
- _listdir, _isdir, _open)
+ _listdir, _isdir, _open, output_format)
return rows