-import yaml
-import atexit
-import pkg_resources
-
-from yardstick.benchmark.context.model import Context
-from yardstick.benchmark.runners import base as base_runner
-from yardstick.cmdparser import CmdParser
-
-
-class TaskParser(object):
- '''Parser for task config files in yaml format'''
- def __init__(self, path):
- self.path = path
-
- def parse(self):
- '''parses the task file and return an context and scenario instances'''
- print "Parsing task config:", self.path
- try:
- with open(self.path) as stream:
- cfg = yaml.load(stream)
- except IOError as ioerror:
- sys.exit(ioerror)
-
- if cfg["schema"] != "yardstick:task:0.1":
- sys.exit("error: file %s has unknown schema %s" % (self.path,
- cfg["schema"]))
-
- # TODO: support one or many contexts? Many would simpler and precise
- if "context" in cfg:
- context_cfgs = [cfg["context"]]
- else:
- context_cfgs = cfg["contexts"]
-
- for cfg_attrs in context_cfgs:
- context = Context()
- context.init(cfg_attrs)
-
- run_in_parallel = cfg.get("run_in_parallel", False)
-
- # TODO we need something better here, a class that represent the file
- return cfg["scenarios"], run_in_parallel
-
-
-def atexit_handler():
- '''handler for process termination'''
- base_runner.Runner.terminate_all()
-
- if len(Context.list) > 0:
- print "Undeploying all contexts"
- for context in Context.list:
- context.undeploy()
-
-
-def run_one_scenario(scenario_cfg, output_file):
- '''run one scenario using context'''
- key_filename = pkg_resources.resource_filename(
- 'yardstick.resources', 'files/yardstick_key')
-
- host = Context.get_server(scenario_cfg["host"])
-
- runner_cfg = scenario_cfg["runner"]
- runner_cfg['host'] = host.public_ip
- runner_cfg['user'] = host.context.user
- runner_cfg['key_filename'] = key_filename
- runner_cfg['output_filename'] = output_file