shaker/tools/build_scenario_catalog.py
Ilya Shakhat 737b019a3a Update documentation
Change-Id: Id2a831e8a245778bdea508fd818b47c8ecd0f8e7
2020-03-08 21:53:04 +04:00

110 lines
3.6 KiB
Python

# Copyright (c) 2016 OpenStack Foundation
#
# 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.
from __future__ import print_function
import re
import os
import sys
import textwrap
import jinja2
import yaml
def make(src, dest):
scenarios = []
templates = []
jinja_env = jinja2.Environment()
for dirpath, dirnames, filenames in os.walk(src):
for filename in sorted(filenames):
if not (filename.endswith('.yaml') or
filename.endswith('.hot')):
continue
fullpath = os.path.join(dirpath, filename)
with open(fullpath) as f:
try:
raw = f.read()
compiled_template = jinja_env.from_string(raw)
rendered_template = compiled_template.render(
dict(agents={}))
content = yaml.safe_load(rendered_template)
s_id = '/'.join(fullpath.split('/')[2:]).split('.')[0]
info = dict(title=content.get('title') or s_id,
description=content['description'],
path=fullpath,
scenario_id=s_id)
if filename.endswith('.yaml'):
scenarios.append(info)
else:
templates.append(info)
except Exception as e:
print('Failed to read file %s: %s' % (fullpath, e))
scenarios.sort(key=lambda x: x['scenario_id'])
templates.sort(key=lambda x: x['scenario_id'])
with open(dest, 'w') as out:
print('.. _catalog:\n', file=out)
print('Scenario Catalog', file=out)
print('================', file=out)
print('', file=out)
print('Scenarios', file=out)
print('---------', file=out)
print('', file=out)
for info in scenarios:
print_info(out, info, prefix='scenario')
print('To use this scenario specify parameter ``--scenario %s``.\n'
'Scenario source is available at: '
'https://opendev.org/performa/shaker/src/branch/master/%s' %
(info['scenario_id'], info['path']), file=out)
print('', file=out)
print('Heat Templates', file=out)
print('--------------', file=out)
print('', file=out)
for info in templates:
print_info(out, info, prefix='template')
print('Template source is available at: '
'https://opendev.org/performa/shaker/src/branch/master/%s' %
info['path'], file=out)
print('', file=out)
def print_info(out, info, prefix):
block_id = re.sub(r'[^\w\d]+', '_', info['title']).lower()
print('.. _%s_%s:\n' % (prefix, block_id), file=out)
print(info['title'], file=out)
print('^' * len(info['title']), file=out)
print('\n'.join(textwrap.wrap(info['description'], width=79)), file=out)
print('', file=out)
if len(sys.argv) < 2:
print('Usage: build_scenario_catalog <dest file>')
sys.exit(1)
print('Generating scenario catalog')
make(src='shaker/scenarios/', dest=sys.argv[1])