Add info block into report toolkit

This commit is contained in:
Ilya Shakhat 2016-03-20 19:38:28 +03:00
parent f063c85052
commit d5e8cfc269
2 changed files with 82 additions and 5 deletions

View File

@ -61,16 +61,24 @@ def generate_chart(chart_str, db, doc_folder, tag):
* *
''' % dict(title=title) ''' % dict(title=title)
table += ''.join((' - %s\n' % axes[k]) for k in sorted(axes.keys())) axes_keys = sorted(axes.keys())
table += ''.join((' - %s\n' % axes[k]) for k in axes_keys)
y_keys = set(axes.keys()) ^ set('x') y_keys = set(axes.keys()) ^ set('x')
for chart_rec in chart_data: for chart_rec in chart_data:
for k in y_keys: for k in y_keys:
lines[k].append((chart_rec['x'], chart_rec[k])) lines[k].append((chart_rec['x'], chart_rec[k]))
values = []
for v in axes_keys:
cv = chart_rec[v] or 0
patt = ' - %%%s' % ('d' if isinstance(cv, int) else '.1f')
values.append(patt % cv)
table += (' *\n' + table += (' *\n' +
'\n'.join(' - %.1f' % (chart_rec[v] or 0) '\n'.join(values) +
for v in sorted(axes.keys())) +
'\n') '\n')
xy_chart = pygal.XY(style=style.RedBlueStyle, xy_chart = pygal.XY(style=style.RedBlueStyle,
@ -94,6 +102,47 @@ def generate_chart(chart_str, db, doc_folder, tag):
return doc return doc
def generate_info(definition_str, db, doc_folder, tag):
definition = yaml.safe_load(definition_str)
pipeline = definition.get('pipeline')
title = definition.get('title')
fields = definition.get('fields')
collection_name = definition.get('collection') or 'records'
collection = db.get_collection(collection_name)
LOG.debug('Title: %s', title)
pipeline.insert(0, {'$match': {'status': 'OK'}})
if tag:
pipeline.insert(0, {'$match': {'tag': tag}})
data = [r for r in collection.aggregate(pipeline)]
if not data:
LOG.warning('No data returned for info block: %s', title)
return '**No data**'
data = data[0]
table = '''
.. list-table::
:header-rows: 1
*
- attribute
- value
'''
for field_name, field_title in sorted(fields.items(), key=lambda a: a[0]):
value = data[field_name]
patt = (''' *\n - %%s\n - %%%s\n''' %
('d' if isinstance(value, int) else '.1f'))
table += patt % (field_title, value)
return table
def _make_dir(name): def _make_dir(name):
try: try:
os.makedirs(name) os.makedirs(name)
@ -128,6 +177,11 @@ def generate_report(scenario, base_dir, mongo_url, db_name, doc_folder,
db=db, db=db,
doc_folder=doc_folder, doc_folder=doc_folder,
tag=tag) tag=tag)
jinja_env.filters['info'] = functools.partial(
generate_info,
db=db,
doc_folder=doc_folder,
tag=tag)
template = utils.read_file(report_template, base_dir=base_dir) template = utils.read_file(report_template, base_dir=base_dir)
compiled_template = jinja_env.from_string(template) compiled_template = jinja_env.from_string(template)

View File

@ -5,8 +5,31 @@ This report is result of `message_queue_performance`_ execution
with `Oslo.messaging Simulator`_ with `Oslo.messaging Simulator`_
Test Case 1: RPC CAST Throughput Test RPC CAST failover throughput test
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Summary**
{{'''
title: Execution summary
fields:
a1: Client sent, msg
b1: Server received, msg
b2: Loss, msg
c1: Avg. latency, ms
c2: Max latency, ms
collection: records
pipeline:
- $match: { task: omsimulator, mode: cast }
- $project:
a1: "$client.count"
b1: "$server.count"
b2: { $subtract: ["$client.count", "$server.count" ] }
c1: { $multiply: ["$server.latency", 1000] }
c2: { $multiply: ["$server.max_latency", 1000] }
''' | info
}}
**Messages sent by the client** **Messages sent by the client**