def flavors(self, deployment=None): """Display available flavors. :param deployment: UUID or name of a deployment """ headers = ["ID", "Name", "vCPUs", "RAM (MB)", "Swap (MB)", "Disk (GB)"] mixed_case_fields = ["ID", "Name", "vCPUs"] float_cols = ["RAM (MB)", "Swap (MB)", "Disk (GB)"] formatters = dict( zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) for endpoint_dict in self._get_endpoints(deployment): self._print_header("Flavors", endpoint_dict) table_rows = [] clients = osclients.Clients(objects.Endpoint(**endpoint_dict)) nova_client = clients.nova() for flavor in nova_client.flavors.list(): data = [ flavor.id, flavor.name, flavor.vcpus, flavor.ram, flavor.swap, flavor.disk ] table_rows.append(utils.Struct(**dict(zip(headers, data)))) cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def flavors(self, deploy_id=None): """Show the flavors that are available in a deployment. :param deploy_id: the UUID of a deployment """ headers = ['ID', 'Name', 'vCPUs', 'RAM (MB)', 'Swap (MB)', 'Disk (GB)'] mixed_case_fields = ['ID', 'Name', 'vCPUs'] float_cols = ['RAM (MB)', 'Swap (MB)', 'Disk (GB)'] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) table_rows = [] try: endpoints = db.deployment_get(deploy_id)['endpoints'] for endpoint_dict in endpoints: clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) nova_client = clients.nova() for flavor in nova_client.flavors.list(): data = [flavor.id, flavor.name, flavor.vcpus, flavor.ram, flavor.swap, flavor.disk] table_rows.append(utils.Struct(**dict(zip(headers, data)))) except exceptions.InvalidArgumentsException: print(_("Authentication Issues: %s") % sys.exc_info()[1]) return(1) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def _print_iterations_data(raw): headers = ['iteration', "full duration"] float_cols = ['full duration'] for i in range(0, len(raw)): if raw[i]['atomic_actions']: for (c, a) in enumerate(raw[i]['atomic_actions'], 1): action = str(c) + "-" + a['action'] headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) for (c, r) in enumerate(raw, 1): dlist = [c] d = [] if r['atomic_actions']: for l in r['atomic_actions']: d.append(l['duration']) dlist.append(sum(d)) dlist = dlist + d table_rows.append(rutils.Struct(**dict(zip(headers, dlist)))) else: data = dlist + ["N/A" for i in range(1, len(headers))] table_rows.append(rutils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters) print()
def images(self, deployment=None): """Display available images. :param deployment: UUID or name of a deployment """ headers = ["UUID", "Name", "Size (B)"] mixed_case_fields = ["UUID", "Name"] float_cols = ["Size (B)"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) for endpoint_dict in self._get_endpoints(deployment): self._print_header("Images", endpoint_dict) table_rows = [] clients = osclients.Clients(objects.Endpoint(**endpoint_dict)) glance_client = clients.glance() for image in glance_client.images.list(): data = [image.id, image.name, image.size] table_rows.append(utils.Struct(**dict(zip(headers, data)))) cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def flavors(self, deployment=None): """Display available flavors. :param deployment: UUID or name of a deployment """ headers = ["ID", "Name", "vCPUs", "RAM (MB)", "Swap (MB)", "Disk (GB)"] mixed_case_fields = ["ID", "Name", "vCPUs"] float_cols = ["RAM (MB)", "Swap (MB)", "Disk (GB)"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) for endpoint_dict in self._get_endpoints(deployment): self._print_header("Flavors", endpoint_dict) table_rows = [] clients = osclients.Clients(objects.Endpoint(**endpoint_dict)) nova_client = clients.nova() for flavor in nova_client.flavors.list(): data = [flavor.id, flavor.name, flavor.vcpus, flavor.ram, flavor.swap, flavor.disk] table_rows.append(utils.Struct(**dict(zip(headers, data)))) cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def _print_iterations_data(raw_data): headers = ["iteration", "full duration"] float_cols = ["full duration"] atomic_actions = [] for row in raw_data: # find first non-error result to get atomic actions names if not row["error"] and "atomic_actions" in row: atomic_actions = row["atomic_actions"].keys() for row in raw_data: if row["atomic_actions"]: for (c, a) in enumerate(atomic_actions, 1): action = "%(no)i. %(action)s" % {"no": c, "action": a} headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) for (c, r) in enumerate(raw_data, 1): dlist = [c] dlist.append(r["duration"]) if r["atomic_actions"]: for action in atomic_actions: dlist.append(r["atomic_actions"].get(action) or 0) cliutils.print_list(table_rows, fields=headers, formatters=formatters) print()
def flavors(self, deployment=None): """Display available flavors. :param deployment: UUID or name of a deployment """ headers = ['ID', 'Name', 'vCPUs', 'RAM (MB)', 'Swap (MB)', 'Disk (GB)'] mixed_case_fields = ['ID', 'Name', 'vCPUs'] float_cols = ['RAM (MB)', 'Swap (MB)', 'Disk (GB)'] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) table_rows = [] try: for endpoint_dict in self._get_endpoints(deployment): clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) nova_client = clients.nova() for flavor in nova_client.flavors.list(): data = [flavor.id, flavor.name, flavor.vcpus, flavor.ram, flavor.swap, flavor.disk] table_rows.append(utils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields) except exceptions.InvalidArgumentsException as e: print(_("Authentication Issues: %s") % e) return(1)
def _print_iterations_data(raw_data): headers = ["iteration", "full duration"] float_cols = ["full duration"] atomic_actions = [] for row in raw_data: # find first non-error result to get atomic actions names if not row["error"] and "atomic_actions" in row: atomic_actions = row["atomic_actions"].keys() for row in raw_data: if row["atomic_actions"]: for (c, a) in enumerate(atomic_actions, 1): action = "%(no)i. %(action)s" % {"no": c, "action": a} headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict( zip(float_cols, [ cliutils.pretty_float_formatter(col, 3) for col in float_cols ])) for (c, r) in enumerate(raw_data, 1): dlist = [c] dlist.append(r["duration"]) if r["atomic_actions"]: for action in atomic_actions: dlist.append(r["atomic_actions"].get(action) or 0) cliutils.print_list(table_rows, fields=headers, formatters=formatters) print()
def images(self, deployment=None): """Display available images. :param deployment: UUID or name of a deployment """ headers = ['UUID', 'Name', 'Size (B)'] mixed_case_fields = ['UUID', 'Name'] float_cols = ["Size (B)"] table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) try: for endpoint_dict in self._get_endpoints(deployment): clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) glance_client = clients.glance() for image in glance_client.images.list(): data = [image.id, image.name, image.size] table_rows.append(utils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields) except exceptions.InvalidArgumentsException as e: print(_("Authentication Issues: %s") % e) return(1)
def flavors(self, deploy_id=None): """Display available flavors. :param deploy_id: the UUID of a deployment """ headers = ['ID', 'Name', 'vCPUs', 'RAM (MB)', 'Swap (MB)', 'Disk (GB)'] mixed_case_fields = ['ID', 'Name', 'vCPUs'] float_cols = ['RAM (MB)', 'Swap (MB)', 'Disk (GB)'] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) table_rows = [] try: for endpoint_dict in self._get_endpoints(deploy_id): clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) nova_client = clients.nova() for flavor in nova_client.flavors.list(): data = [flavor.id, flavor.name, flavor.vcpus, flavor.ram, flavor.swap, flavor.disk] table_rows.append(utils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields) except exceptions.InvalidArgumentsException as e: print(_("Authentication Issues: %s") % e) return(1)
def images(self, deploy_id=None): """Display available images. :param deploy_id: the UUID of a deployment """ headers = ['UUID', 'Name', 'Size (B)'] mixed_case_fields = ['UUID', 'Name'] float_cols = ["Size (B)"] table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) try: for endpoint_dict in self._get_endpoints(deploy_id): clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) glance_client = clients.glance() for image in glance_client.images.list(): data = [image.id, image.name, image.size] table_rows.append(utils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields) except exceptions.InvalidArgumentsException as e: print(_("Authentication Issues: %s") % e) return(1)
def images(self, deployment=None): """Display available images. :param deployment: UUID or name of a deployment """ headers = ["UUID", "Name", "Size (B)"] mixed_case_fields = ["UUID", "Name"] float_cols = ["Size (B)"] formatters = dict( zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) for endpoint_dict in self._get_endpoints(deployment): self._print_header("Images", endpoint_dict) table_rows = [] clients = osclients.Clients(objects.Endpoint(**endpoint_dict)) glance_client = clients.glance() for image in glance_client.images.list(): data = [image.id, image.name, image.size] table_rows.append(utils.Struct(**dict(zip(headers, data)))) cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def images(self, deploy_id=None): """Show the images that are available in a deployment. :param deploy_id: the UUID of a deployment """ headers = ['UUID', 'Name', 'Size (B)'] mixed_case_fields = ['UUID', 'Name'] float_cols = ["Size (B)"] table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col) for col in float_cols])) try: endpoints = db.deployment_get(deploy_id)['endpoints'] for endpoint_dict in endpoints: clients = osclients.Clients(endpoint.Endpoint(**endpoint_dict)) glance_client = clients.glance() for image in glance_client.images.list(): data = [image.id, image.name, image.size] table_rows.append(utils.Struct(**dict(zip(headers, data)))) except exceptions.InvalidArgumentsException: print(_("Authentication Issues: %s") % sys.exc_info()[1]) return(1) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters, mixed_case_fields=mixed_case_fields)
def test_pretty_float_formatter_none_value(self): test_table_rows = {"test_header": None} self.__dict__.update(**test_table_rows) formatter = cliutils.pretty_float_formatter("test_header") return_value = formatter(self) self.assertEqual(return_value, "n/a")
def test_pretty_float_formatter_nonrounding(self): test_table_rows = {"test_header": 6.56565} self.__dict__.update(**test_table_rows) formatter = cliutils.pretty_float_formatter("test_header") return_value = formatter(self) self.assertEqual(return_value, 6.56565)
def detailed(self, task_id=None, iterations_data=False): """Get detailed information about task :param task_id: Task uuid :param iterations_data: print detailed results for each iteration Prints detailed information of task. """ def _print_iterations_data(raw): headers = ['iteration', "full duration"] float_cols = ['full duration'] for i in range(0, len(raw)): if raw[i]['atomic_actions']: for (c, a) in enumerate(raw[i]['atomic_actions'], 1): action = str(c) + "-" + a['action'] headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) for (c, r) in enumerate(raw, 1): dlist = [c] d = [] if r['atomic_actions']: for l in r['atomic_actions']: d.append(l['duration']) dlist.append(sum(d)) dlist = dlist + d table_rows.append(rutils.Struct(**dict(zip(headers, dlist)))) else: data = dlist + ["N/A" for i in range(1, len(headers))] table_rows.append(rutils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters) print() def _get_atomic_action_durations(raw): atomic_actions_names = [] for r in raw: if 'atomic_actions' in r: for a in r['atomic_actions']: atomic_actions_names.append(a["action"]) break result = {} for atomic_action in atomic_actions_names: result[atomic_action] = utils.get_durations( raw, lambda r: next(a["duration"] for a in r["atomic_actions"] if a["action"] == atomic_action), lambda r: any((a["action"] == atomic_action) for a in r["atomic_actions"])) return result if task_id == "last": task = db.task_get_detailed_last() task_id = task.uuid else: task = db.task_get_detailed(task_id) if task is None: print("The task %s can not be found" % task_id) return(1) print() print("=" * 80) print(_("Task %(task_id)s is %(status)s.") % {"task_id": task_id, "status": task["status"]}) if task["failed"]: print("-" * 80) verification = yaml.safe_load(task["verification_log"]) if not cfg.CONF.debug: print(verification[0]) print(verification[1]) print() print(_("For more details run:\nrally -vd task detailed %s") % task["uuid"]) else: print(yaml.safe_load(verification[2])) return for result in task["results"]: key = result["key"] print("-" * 80) print() print("test scenario %s" % key["name"]) print("args position %s" % key["pos"]) print("args values:") pprint.pprint(key["kw"]) raw = result["data"]["raw"] table_cols = ["action", "min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile", "success", "count"] float_cols = ["min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] action_durations = _get_atomic_action_durations(raw) actions_list = action_durations.keys() action_durations["total"] = utils.get_durations( raw, lambda x: x["duration"], lambda r: not r["error"]) actions_list.append("total") for action in actions_list: durations = action_durations[action] if durations: data = [action, min(durations), utils.mean(durations), max(durations), utils.percentile(durations, 0.90), utils.percentile(durations, 0.95), "%.1f%%" % (len(durations) * 100.0 / len(raw)), len(raw)] else: data = [action, None, None, None, None, None, 0, len(raw)] table_rows.append(rutils.Struct(**dict(zip(table_cols, data)))) common_cliutils.print_list(table_rows, fields=table_cols, formatters=formatters) if iterations_data: _print_iterations_data(raw) # NOTE(hughsaunders): ssrs=scenario specific results ssrs = [] for result in raw: data = result["scenario_output"].get("data") if data: ssrs.append(data) if ssrs: keys = set() for ssr in ssrs: keys.update(ssr.keys()) headers = ["key", "max", "avg", "min", "90 pecentile", "95 pecentile"] float_cols = ["max", "avg", "min", "90 pecentile", "95 pecentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] for key in keys: values = [float(ssr[key]) for ssr in ssrs if key in ssr] if values: row = [str(key), max(values), utils.mean(values), min(values), utils.percentile(values, 0.90), utils.percentile(values, 0.95)] else: row = [str(key)] + ['n/a'] * 5 table_rows.append(rutils.Struct(**dict(zip(headers, row)))) print("\nScenario Specific Results\n") common_cliutils.print_list(table_rows, fields=headers, formatters=formatters) for result in raw: errors = result["scenario_output"].get("errors") if errors: print(errors) print() print("HINTS:") print(_("* To plot HTML graphics with this data, run:")) print("\trally task plot2html %s --out output.html" % task["uuid"]) print() print(_("* To get raw JSON output of task results, run:")) print("\trally task results %s\n" % task["uuid"])
def detailed(self, task_id=None, iterations_data=False): """Get detailed information about task :param task_id: Task uuid :param iterations_data: print detailed results for each iteration Prints detailed information of task. """ def _print_iterations_data(raw): headers = ['iteration', "full duration"] float_cols = ['full duration'] for i in range(0, len(raw)): if raw[i]['atomic_actions']: for (c, a) in enumerate(raw[i]['atomic_actions'], 1): action = str(c) + "-" + a['action'] headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) for (c, r) in enumerate(raw, 1): dlist = [c] d = [] if r['atomic_actions']: for l in r['atomic_actions']: d.append(l['duration']) dlist.append(sum(d)) dlist = dlist + d table_rows.append(rutils.Struct(**dict(zip(headers, dlist)))) else: data = dlist + ["N/A" for i in range(1, len(headers))] table_rows.append(rutils.Struct(**dict(zip(headers, data)))) common_cliutils.print_list(table_rows, fields=headers, formatters=formatters) print() def _get_atomic_action_durations(raw): atomic_actions_names = [] for r in raw: if 'atomic_actions' in r: for a in r['atomic_actions']: atomic_actions_names.append(a["action"]) break result = {} for atomic_action in atomic_actions_names: result[atomic_action] = utils.get_durations( raw, lambda r: next(a["duration"] for a in r["atomic_actions"] if a["action"] == atomic_action), lambda r: any((a["action"] == atomic_action) for a in r["atomic_actions"])) return result if task_id == "last": task = db.task_get_detailed_last() task_id = task.uuid else: task = db.task_get_detailed(task_id) if task is None: print("The task %s can not be found" % task_id) return(1) print() print("=" * 80) print(_("Task %(task_id)s is %(status)s.") % {"task_id": task_id, "status": task["status"]}) if task["failed"]: print("-" * 80) verification = yaml.safe_load(task["verification_log"]) if not cfg.CONF.debug: print(verification[0]) print(verification[1]) print() print(_("For more details run:\nrally -vd task detailed %s") % task["uuid"]) else: print(yaml.safe_load(verification[2])) return for result in task["results"]: key = result["key"] print("-" * 80) print() print("test scenario %s" % key["name"]) print("args position %s" % key["pos"]) print("args values:") pprint.pprint(key["kw"]) scenario_time = result["data"]["scenario_duration"] raw = result["data"]["raw"] table_cols = ["action", "min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile", "success", "count"] float_cols = ["min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] action_durations = _get_atomic_action_durations(raw) actions_list = action_durations.keys() action_durations["total"] = utils.get_durations( raw, lambda x: x["duration"], lambda r: not r["error"]) actions_list.append("total") for action in actions_list: durations = action_durations[action] if durations: data = [action, min(durations), utils.mean(durations), max(durations), utils.percentile(durations, 0.90), utils.percentile(durations, 0.95), "%.1f%%" % (len(durations) * 100.0 / len(raw)), len(raw)] else: data = [action, None, None, None, None, None, 0, len(raw)] table_rows.append(rutils.Struct(**dict(zip(table_cols, data)))) common_cliutils.print_list(table_rows, fields=table_cols, formatters=formatters) if iterations_data: _print_iterations_data(raw) print(_("Whole scenario time without context preparation: "), scenario_time) # NOTE(hughsaunders): ssrs=scenario specific results ssrs = [] for result in raw: data = result["scenario_output"].get("data") if data: ssrs.append(data) if ssrs: keys = set() for ssr in ssrs: keys.update(ssr.keys()) headers = ["key", "max", "avg", "min", "90 pecentile", "95 pecentile"] float_cols = ["max", "avg", "min", "90 pecentile", "95 pecentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] for key in keys: values = [float(ssr[key]) for ssr in ssrs if key in ssr] if values: row = [str(key), max(values), utils.mean(values), min(values), utils.percentile(values, 0.90), utils.percentile(values, 0.95)] else: row = [str(key)] + ['n/a'] * 5 table_rows.append(rutils.Struct(**dict(zip(headers, row)))) print("\nScenario Specific Results\n") common_cliutils.print_list(table_rows, fields=headers, formatters=formatters) for result in raw: errors = result["scenario_output"].get("errors") if errors: print(errors) print() print("HINTS:") print(_("* To plot HTML graphics with this data, run:")) print("\trally task plot2html %s --out output.html" % task["uuid"]) print() print(_("* To get raw JSON output of task results, run:")) print("\trally task results %s\n" % task["uuid"])
def detailed(self, task_id=None, iterations_data=False): """Display results table. :param task_id: Task uuid :param iterations_data: print detailed results for each iteration Prints detailed information of task. """ def _print_iterations_data(raw_data): headers = ["iteration", "full duration"] float_cols = ["full duration"] atomic_actions = [] for row in raw_data: # find first non-error result to get atomic actions names if not row["error"] and "atomic_actions" in row: atomic_actions = row["atomic_actions"].keys() for row in raw_data: if row["atomic_actions"]: for (c, a) in enumerate(atomic_actions, 1): action = "%(no)i. %(action)s" % {"no": c, "action": a} headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict( zip(float_cols, [ cliutils.pretty_float_formatter(col, 3) for col in float_cols ])) for (c, r) in enumerate(raw_data, 1): dlist = [c] dlist.append(r["duration"]) if r["atomic_actions"]: for action in atomic_actions: dlist.append(r["atomic_actions"].get(action) or 0) cliutils.print_list(table_rows, fields=headers, formatters=formatters) print() task = db.task_get_detailed(task_id) if task is None: print("The task %s can not be found" % task_id) return (1) print() print("-" * 80) print( _("Task %(task_id)s: %(status)s") % { "task_id": task_id, "status": task["status"] }) if task["status"] == consts.TaskStatus.FAILED: print("-" * 80) verification = yaml.safe_load(task["verification_log"]) if not logging.is_debug(): print(verification[0]) print(verification[1]) print() print( _("For more details run:\nrally -vd task detailed %s") % task["uuid"]) else: print(yaml.safe_load(verification[2])) return for result in task["results"]: key = result["key"] print("-" * 80) print() print("test scenario %s" % key["name"]) print("args position %s" % key["pos"]) print("args values:") print(json.dumps(key["kw"], indent=2)) raw = result["data"]["raw"] table_cols = [ "action", "min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile", "success", "count" ] float_cols = [ "min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile" ] formatters = dict( zip(float_cols, [ cliutils.pretty_float_formatter(col, 3) for col in float_cols ])) table_rows = [] actions_data = utils.get_atomic_actions_data(raw) for action in actions_data: durations = actions_data[action] if durations: data = [ action, min(durations), utils.mean(durations), max(durations), utils.percentile(durations, 0.90), utils.percentile(durations, 0.95), "%.1f%%" % (len(durations) * 100.0 / len(raw)), len(raw) ] else: data = [ action, None, None, None, None, None, "0.0%", len(raw) ] table_rows.append(rutils.Struct(**dict(zip(table_cols, data)))) cliutils.print_list(table_rows, fields=table_cols, formatters=formatters) if iterations_data: _print_iterations_data(raw) print(_("Load duration: %s") % result["data"]["load_duration"]) print(_("Full duration: %s") % result["data"]["full_duration"]) # NOTE(hughsaunders): ssrs=scenario specific results ssrs = [] for result in raw: data = result["scenario_output"].get("data") if data: ssrs.append(data) if ssrs: keys = set() for ssr in ssrs: keys.update(ssr.keys()) headers = [ "key", "max", "avg", "min", "90 pecentile", "95 pecentile" ] float_cols = [ "max", "avg", "min", "90 pecentile", "95 pecentile" ] formatters = dict( zip(float_cols, [ cliutils.pretty_float_formatter(col, 3) for col in float_cols ])) table_rows = [] for key in keys: values = [float(ssr[key]) for ssr in ssrs if key in ssr] if values: row = [ str(key), max(values), utils.mean(values), min(values), utils.percentile(values, 0.90), utils.percentile(values, 0.95) ] else: row = [str(key)] + ["n/a"] * 5 table_rows.append(rutils.Struct(**dict(zip(headers, row)))) print("\nScenario Specific Results\n") cliutils.print_list(table_rows, fields=headers, formatters=formatters) for result in raw: errors = result["scenario_output"].get("errors") if errors: print(errors) print() print("HINTS:") print(_("* To plot HTML graphics with this data, run:")) print("\trally task report %s --out output.html" % task["uuid"]) print() print(_("* To get raw JSON output of task results, run:")) print("\trally task results %s\n" % task["uuid"])
def test_print_list(self): class TestObj(object): x = 1 y = 2 z = 3.142857142857143 aOrB = 3 # mixed case field out = moves.StringIO() cliutils.print_list([TestObj()], ["x", "y"], print_header=True, print_border=True, sortby_index=None, out=out) self.assertEqual("+---+---+\n" "| x | y |\n" "+---+---+\n" "| 1 | 2 |\n" "+---+---+", out.getvalue().strip()) out = moves.StringIO() formatter = cliutils.pretty_float_formatter("z", 5) cliutils.print_list([TestObj()], ["z"], print_header=True, print_border=True, sortby_index=None, formatters={"z": formatter}, out=out) self.assertEqual("+---------+\n" "| z |\n" "+---------+\n" "| 3.14286 |\n" "+---------+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x"], print_header=True, print_border=True, out=out) self.assertEqual("+---+\n" "| x |\n" "+---+\n" "| 1 |\n" "+---+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x", "y"], print_header=True, print_border=True, out=out) self.assertEqual("+---+---+\n" "| x | y |\n" "+---+---+\n" "| 1 | 2 |\n" "+---+---+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x"], print_header=False, print_border=False, out=out) self.assertEqual("1", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x", "y"], print_header=False, print_border=False, out=out) self.assertEqual("1 2", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x"], print_header=True, print_border=False, out=out) self.assertEqual("x \n1", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x", "y"], print_header=True, print_border=False, out=out) self.assertEqual("x y \n1 2", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x"], print_header=False, print_border=True, out=out) self.assertEqual("+--+\n" "|1 |\n" "+--+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["x", "y"], print_header=False, print_border=True, out=out) self.assertEqual("+--+--+\n" "|1 |2 |\n" "+--+--+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["aOrB"], mixed_case_fields=["aOrB"], print_header=True, print_border=True, out=out) self.assertEqual("+------+\n" "| aOrB |\n" "+------+\n" "| 3 |\n" "+------+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["aOrB"], mixed_case_fields=["aOrB"], print_header=False, print_border=True, out=out) self.assertEqual("+--+\n" "|3 |\n" "+--+", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["aOrB"], mixed_case_fields=["aOrB"], print_header=True, print_border=False, out=out) self.assertEqual("aOrB \n" "3", out.getvalue().strip()) out = moves.StringIO() cliutils.print_list([TestObj()], ["aOrB"], mixed_case_fields=["aOrB"], print_header=False, print_border=False, out=out) self.assertEqual("3", out.getvalue().strip()) out = moves.StringIO() self.assertRaisesRegexp(ValueError, "Field labels list.*has different number " "of elements than fields list", cliutils.print_list, [TestObj()], ["x"], field_labels=["x", "y"], sortby_index=None, out=out)
def detailed(self, task_id=None, iterations_data=False): """Display results table. :param task_id: Task uuid :param iterations_data: print detailed results for each iteration Prints detailed information of task. """ def _print_iterations_data(raw_data): headers = ["iteration", "full duration"] float_cols = ["full duration"] atomic_actions = [] for row in raw_data: # find first non-error result to get atomic actions names if not row["error"] and "atomic_actions" in row: atomic_actions = row["atomic_actions"].keys() for row in raw_data: if row["atomic_actions"]: for (c, a) in enumerate(atomic_actions, 1): action = "%(no)i. %(action)s" % {"no": c, "action": a} headers.append(action) float_cols.append(action) break table_rows = [] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) for (c, r) in enumerate(raw_data, 1): dlist = [c] dlist.append(r["duration"]) if r["atomic_actions"]: for action in atomic_actions: dlist.append(r["atomic_actions"].get(action) or 0) cliutils.print_list(table_rows, fields=headers, formatters=formatters) print() task = db.task_get_detailed(task_id) if task is None: print("The task %s can not be found" % task_id) return(1) print() print("-" * 80) print(_("Task %(task_id)s: %(status)s") % {"task_id": task_id, "status": task["status"]}) if task["status"] == consts.TaskStatus.FAILED: print("-" * 80) verification = yaml.safe_load(task["verification_log"]) if not logging.is_debug(): print(verification[0]) print(verification[1]) print() print(_("For more details run:\nrally -vd task detailed %s") % task["uuid"]) else: print(yaml.safe_load(verification[2])) return for result in task["results"]: key = result["key"] print("-" * 80) print() print("test scenario %s" % key["name"]) print("args position %s" % key["pos"]) print("args values:") print(json.dumps(key["kw"], indent=2)) raw = result["data"]["raw"] table_cols = ["action", "min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile", "success", "count"] float_cols = ["min (sec)", "avg (sec)", "max (sec)", "90 percentile", "95 percentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] actions_data = utils.get_atomic_actions_data(raw) for action in actions_data: durations = actions_data[action] if durations: data = [action, min(durations), utils.mean(durations), max(durations), utils.percentile(durations, 0.90), utils.percentile(durations, 0.95), "%.1f%%" % (len(durations) * 100.0 / len(raw)), len(raw)] else: data = [action, None, None, None, None, None, "0.0%", len(raw)] table_rows.append(rutils.Struct(**dict(zip(table_cols, data)))) cliutils.print_list(table_rows, fields=table_cols, formatters=formatters) if iterations_data: _print_iterations_data(raw) print(_("Load duration: %s") % result["data"]["load_duration"]) print(_("Full duration: %s") % result["data"]["full_duration"]) # NOTE(hughsaunders): ssrs=scenario specific results ssrs = [] for result in raw: data = result["scenario_output"].get("data") if data: ssrs.append(data) if ssrs: keys = set() for ssr in ssrs: keys.update(ssr.keys()) headers = ["key", "max", "avg", "min", "90 pecentile", "95 pecentile"] float_cols = ["max", "avg", "min", "90 pecentile", "95 pecentile"] formatters = dict(zip(float_cols, [cliutils.pretty_float_formatter(col, 3) for col in float_cols])) table_rows = [] for key in keys: values = [float(ssr[key]) for ssr in ssrs if key in ssr] if values: row = [str(key), max(values), utils.mean(values), min(values), utils.percentile(values, 0.90), utils.percentile(values, 0.95)] else: row = [str(key)] + ["n/a"] * 5 table_rows.append(rutils.Struct(**dict(zip(headers, row)))) print("\nScenario Specific Results\n") cliutils.print_list(table_rows, fields=headers, formatters=formatters) for result in raw: errors = result["scenario_output"].get("errors") if errors: print(errors) print() print("HINTS:") print(_("* To plot HTML graphics with this data, run:")) print("\trally task report %s --out output.html" % task["uuid"]) print() print(_("* To get raw JSON output of task results, run:")) print("\trally task results %s\n" % task["uuid"])