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 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 if "target" in scenario_cfg: if is_ip_addr(scenario_cfg["target"]): scenario_cfg["ipaddr"] = scenario_cfg["target"] else: target = Context.get_server(scenario_cfg["target"]) # get public IP for target server, some scenarios require it if target.public_ip: runner_cfg["target"] = target.public_ip # TODO scenario_cfg["ipaddr"] is bad naming if host.context != target.context: # target is in another context, get its public IP scenario_cfg["ipaddr"] = target.public_ip else: # target is in the same context, get its private IP scenario_cfg["ipaddr"] = target.private_ip runner = base_runner.Runner.get(runner_cfg) print "Starting runner of type '%s'" % runner_cfg["type"] runner.run(scenario_cfg["type"], scenario_cfg) return runner