performance-docs/scripts/rally-runners/rally_runners/reliability/runner.py
Ilya Shakhat c83599d45b Add tool for Rally reliability analytics
Change-Id: I160580f4f5f4ef7dd9cfdb1fc887a1fce8e2c4d2
2016-09-29 16:57:54 +03:00

90 lines
3.2 KiB
Python

# coding=utf-8
# 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 functools
import itertools
import logging
import os
import shlex
from oslo_concurrency import processutils
import rally_runners.reliability as me
import rally_runners.reliability.rally_plugins as plugins
from rally_runners.reliability import report
from rally_runners import utils
SCENARIOS_DIR = 'rally_runners/reliability/scenarios/'
def make_help_options(base, type_filter=None):
path = utils.resolve_relative_path(base)
files = itertools.chain.from_iterable(
[map(functools.partial(os.path.join, root), files)
for root, dirs, files in os.walk(path)]) # list of files in a tree
if type_filter:
files = (f for f in files if type_filter(f)) # filtered list
rel_files = map(functools.partial(os.path.relpath, start=path), files)
return '\n '.join('%s' % f.partition('.')[0] for f in sorted(rel_files))
SCENARIOS_LIST = make_help_options(SCENARIOS_DIR,
type_filter=lambda x: x.endswith('.yaml'))
USAGE = """rally-reliability [-h] -s SCENARIO -o OUTPUT -b BOOK
Scenario is one of:
%s
""" % SCENARIOS_LIST
def main():
parser = argparse.ArgumentParser(prog='rally-reliability', usage=USAGE)
parser.add_argument('-d', '--debug', action='store_true')
parser.add_argument('-s', '--scenario', dest='scenario', required=True,
help='Rally scenario')
parser.add_argument('-o', '--output', dest='output', required=True,
help='raw Rally output')
parser.add_argument('-b', '--book', dest='book', required=True,
help='folder where to write RST book')
args = parser.parse_args()
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
level=logging.DEBUG if args.debug else logging.INFO)
plugin_paths = os.path.dirname(plugins.__file__)
scenario_dir = os.path.join(os.path.dirname(me.__file__), 'scenarios')
scenario_path = os.path.join(scenario_dir, args.scenario)
if not scenario_path.endswith('.yaml'):
scenario_path += '.yaml'
run_cmd = ('rally --plugin-paths %(path)s task start --task %(scenario)s' %
dict(path=plugin_paths, scenario=scenario_path))
logging.info('Executing %s' % run_cmd)
command_stdout, command_stderr = processutils.execute(
*shlex.split(run_cmd))
logging.info('Execution is done: %s' % command_stdout)
command_stdout, command_stderr = processutils.execute(
*shlex.split('rally task results'))
with open(args.output, 'w') as fd:
fd.write(command_stdout)
report.make_report(args.scenario, [args.output], args.book)
if __name__ == '__main__':
main()