def show(self, verification_uuid=None, sort_by="name", detailed=False): """Display results table of the verification.""" try: sortby_index = ("name", "duration").index(sort_by) except ValueError: print("Sorry, but verification results can't be sorted " "by '%s'." % sort_by) return 1 try: verification = db.verification_get(verification_uuid) tests = db.verification_result_get(verification_uuid) except exceptions.NotFoundException as e: print(six.text_type(e)) return 1 print("Total results of verification:\n") total_fields = [ "UUID", "Deployment UUID", "Set name", "Tests", "Failures", "Created at", "Status" ] cliutils.print_list([verification], fields=total_fields) print("\nTests:\n") fields = ["name", "time", "status"] values = [ objects.Verification(test) for test in six.itervalues(tests.data["test_cases"]) ] cliutils.print_list(values, fields, sortby_index=sortby_index) if detailed: for test in six.itervalues(tests.data["test_cases"]): if test["status"] == "FAIL": header = cliutils.make_header( "FAIL: %(name)s\n" "Time: %(time)s\n" "Type: %(type)s" % { "name": test["name"], "time": test["time"], "type": test["failure"]["type"] }) formatted_test = "%(header)s%(log)s\n" % { "header": header, "log": test["failure"]["log"] } print(formatted_test)
def start(self, task, deployment=None, task_args=None, task_args_file=None, tag=None, do_use=False, abort_on_sla_failure=False): """Start benchmark task. :param task: a file with yaml/json task :param task_args: Input task args (dict in json/yaml). These args are used to render input task that is jinja2 template. :param task_args_file: File with input task args (dict in json/yaml). These args are used to render input task that is jinja2 template. :param deployment: UUID or name of a deployment :param tag: optional tag for this task :param do_use: if True, the new task will be stored as the default one for future operations :param abort_on_sla_failure: if True, the execution of a benchmark scenario will stop when any SLA check for it fails """ try: input_task = self._load_task(task, task_args, task_args_file) except FailedToLoadTask: return (1) try: task = api.Task.create(deployment, tag) print( cliutils.make_header( _("Task %(tag)s %(uuid)s: started") % { "uuid": task["uuid"], "tag": task["tag"] })) print("Benchmarking... This can take a while...\n") print("To track task status use:\n") print("\trally task status\n\tor\n\trally task detailed\n") if do_use: self.use(task["uuid"]) api.Task.start(deployment, input_task, task=task, abort_on_sla_failure=abort_on_sla_failure) self.detailed(task_id=task["uuid"]) except exceptions.InvalidConfigException: return (1)
def show(self, verification_uuid=None, sort_by="name", detailed=False): """Display results table of the verification.""" try: sortby_index = ("name", "duration").index(sort_by) except ValueError: print("Sorry, but verification results can't be sorted " "by '%s'." % sort_by) return 1 try: verification = db.verification_get(verification_uuid) tests = db.verification_result_get(verification_uuid) except exceptions.NotFoundException as e: print(six.text_type(e)) return 1 print ("Total results of verification:\n") total_fields = ["UUID", "Deployment UUID", "Set name", "Tests", "Failures", "Created at", "Status"] cliutils.print_list([verification], fields=total_fields) print ("\nTests:\n") fields = ["name", "time", "status"] values = [objects.Verification(test) for test in six.itervalues(tests.data["test_cases"])] cliutils.print_list(values, fields, sortby_index=sortby_index) if detailed: for test in six.itervalues(tests.data["test_cases"]): if test["status"] == "FAIL": header = cliutils.make_header( "FAIL: %(name)s\n" "Time: %(time)s\n" "Type: %(type)s" % {"name": test["name"], "time": test["time"], "type": test["failure"]["type"]}) formatted_test = "%(header)s%(log)s\n" % { "header": header, "log": test["failure"]["log"]} print (formatted_test)
def start(self, task, deployment=None, task_args=None, task_args_file=None, tag=None, do_use=False, abort_on_sla_failure=False): """Start benchmark task. :param task: a file with yaml/json task :param task_args: Input task args (dict in json/yaml). These args are used to render input task that is jinja2 template. :param task_args_file: File with input task args (dict in json/yaml). These args are used to render input task that is jinja2 template. :param deployment: UUID or name of a deployment :param tag: optional tag for this task :param do_use: if True, the new task will be stored as the default one for future operations :param abort_on_sla_failure: if True, the execution of a benchmark scenario will stop when any SLA check for it fails """ try: input_task = self._load_task(task, task_args, task_args_file) except FailedToLoadTask: return(1) try: task = api.Task.create(deployment, tag) print(cliutils.make_header( _("Task %(tag)s %(uuid)s: started") % {"uuid": task["uuid"], "tag": task["tag"]})) print("Benchmarking... This can take a while...\n") print("To track task status use:\n") print("\trally task status\n\tor\n\trally task detailed\n") if do_use: self.use(task["uuid"]) api.Task.start(deployment, input_task, task=task, abort_on_sla_failure=abort_on_sla_failure) self.detailed(task_id=task["uuid"]) except exceptions.InvalidConfigException: return(1)
def _load_task(self, task_file, task_args=None, task_args_file=None): """Load tasks template from file and render it with passed args. :param task_file: Path to file with input task :param task_args: JSON or YAML representation of dict with args that will be used to render input task with jinja2 :param task_args_file: Path to file with JSON or YAML representation of dict, that will be used to render input with jinja2. If both specified task_args and task_args_file they will be merged. task_args has bigger priority so it will update values from task_args_file. :returns: Str with loaded and rendered task """ print(cliutils.make_header("Preparing input task")) def print_invalid_header(source_name, args): print(_("Invalid %(source)s passed: \n\n %(args)s \n") % { "source": source_name, "args": args }, file=sys.stderr) def parse_task_args(src_name, args): try: kw = args and yaml.safe_load(args) kw = {} if kw is None else kw except yaml.parser.ParserError as e: print_invalid_header(src_name, args) print(_("%(source)s has to be YAML or JSON. Details:" "\n\n%(err)s\n") % { "source": src_name, "err": e }, file=sys.stderr) raise TypeError() if not isinstance(kw, dict): print_invalid_header(src_name, args) print(_("%(src)s has to be dict, actually %(src_type)s\n") % { "src": src_name, "src_type": type(kw) }, file=sys.stderr) raise TypeError() return kw try: kw = {} if task_args_file: with open(task_args_file) as f: kw.update(parse_task_args("task_args_file", f.read())) kw.update(parse_task_args("task_args", task_args)) except TypeError: raise FailedToLoadTask() with open(task_file) as f: try: input_task = f.read() rendered_task = api.Task.render_template(input_task, **kw) except Exception as e: print( _("Failed to render task template:\n%(task)s\n%(err)s\n") % { "task": input_task, "err": e }, file=sys.stderr) raise FailedToLoadTask() print(_("Input task is:\n%s\n") % rendered_task) try: return yaml.safe_load(rendered_task) except Exception as e: print(_("Wrong format of rendered input task. It should be " "YAML or JSON.\n%s") % e, file=sys.stderr) raise FailedToLoadTask()
def _load_task(self, task_file, task_args=None, task_args_file=None): """Load tasks template from file and render it with passed args. :param task_file: Path to file with input task :param task_args: JSON or YAML representation of dict with args that will be used to render input task with jinja2 :param task_args_file: Path to file with JSON or YAML representation of dict, that will be used to render input with jinja2. If both specified task_args and task_args_file they will be merged. task_args has bigger priority so it will update values from task_args_file. :returns: Str with loaded and rendered task """ print(cliutils.make_header("Preparing input task")) def print_invalid_header(source_name, args): print(_("Invalid %(source)s passed: \n\n %(args)s \n") % {"source": source_name, "args": args}, file=sys.stderr) def parse_task_args(src_name, args): try: kw = args and yaml.safe_load(args) kw = {} if kw is None else kw except yaml.parser.ParserError as e: print_invalid_header(src_name, args) print(_("%(source)s has to be YAML or JSON. Details:" "\n\n%(err)s\n") % {"source": src_name, "err": e}, file=sys.stderr) raise TypeError() if not isinstance(kw, dict): print_invalid_header(src_name, args) print(_("%(src)s has to be dict, actually %(src_type)s\n") % {"src": src_name, "src_type": type(kw)}, file=sys.stderr) raise TypeError() return kw try: kw = {} if task_args_file: with open(task_args_file) as f: kw.update(parse_task_args("task_args_file", f.read())) kw.update(parse_task_args("task_args", task_args)) except TypeError: raise FailedToLoadTask() with open(task_file) as f: try: input_task = f.read() rendered_task = api.Task.render_template(input_task, **kw) except Exception as e: print(_("Failed to render task template:\n%(task)s\n%(err)s\n") % {"task": input_task, "err": e}, file=sys.stderr) raise FailedToLoadTask() print(_("Input task is:\n%s\n") % rendered_task) try: return yaml.safe_load(rendered_task) except Exception as e: print(_("Wrong format of rendered input task. It should be " "YAML or JSON.\n%s") % e, file=sys.stderr) raise FailedToLoadTask()
def test_make_header(self): h1 = cliutils.make_header("msg", size=4, symbol="=") self.assertEqual(h1, "====\n msg\n====\n")
def test_make_header(self): h1 = cliutils.make_header("msg", size="4", symbol="=") self.assertEqual(h1, "====\n msg\n====\n")