diff options
Diffstat (limited to 'scripts/automation/trex_control_plane/console/trex_status.py')
-rw-r--r-- | scripts/automation/trex_control_plane/console/trex_status.py | 157 |
1 files changed, 141 insertions, 16 deletions
diff --git a/scripts/automation/trex_control_plane/console/trex_status.py b/scripts/automation/trex_control_plane/console/trex_status.py index 54853ea3..b01bc3e7 100644 --- a/scripts/automation/trex_control_plane/console/trex_status.py +++ b/scripts/automation/trex_control_plane/console/trex_status.py @@ -51,6 +51,46 @@ def float_to_human_readable (size, suffix = "bps"): size /= 1024.0 return "NaN" + +# total stats (ports + global) +class Stats(): + def __init__ (self, rpc_client, port_list, interval = 100): + + self.rpc_client = rpc_client + + self.port_list = port_list + self.port_stats = {} + + self.interval = interval + self.delay_count = 0 + + def get_port_stats (self, port_id): + if self.port_stats.get(port_id): + return self.port_stats[port_id] + else: + return None + + def query_sync (self): + self.delay_count += 1 + if self.delay_count < self.interval: + return + + self.delay_count = 0 + + # query global stats + + # query port stats + + rc, resp_list = self.rpc_client.get_port_stats(self.port_list) + if not rc: + return + + for i, rc in enumerate(resp_list): + if rc[0]: + self.port_stats[self.port_list[i]] = rc[1] + + + # status object class TrexStatus(): def __init__ (self, stdscr, rpc_client): @@ -60,13 +100,39 @@ class TrexStatus(): self.get_server_info() + self.stats = Stats(rpc_client, self.rpc_client.get_owned_ports()) + + self.actions = {} + self.actions[ord('q')] = self.action_quit + self.actions[ord('p')] = self.action_ping + + def action_quit(self): + return False + + def action_ping (self): + self.add_log_event("Pinging RPC server") + rc, msg = self.rpc_client.ping_rpc_server() + if rc: + self.add_log_event("Server replied: '{0}'".format(msg)) + else: + self.add_log_event("Failed to get reply") + return True + def get_server_info (self): - rc, msg = self.rpc_client.get_rpc_server_status() + rc, msg = self.rpc_client.get_rpc_server_version() + + if rc: + self.server_version = msg + else: + self.server_version = None + + rc, msg = self.rpc_client.get_system_info() if rc: - self.server_status = msg + self.server_sys_info = msg else: - self.server_status = None + self.server_sys_info = None + def add_log_event (self, msg): self.log.append("[{0}] {1}".format(str(datetime.datetime.now().time()), msg)) @@ -87,29 +153,75 @@ class TrexStatus(): # static info panel def update_info (self): - if self.server_status == None: + if self.server_version == None: return self.info_panel.clear() connection_details = self.rpc_client.get_connection_details() - self.info_panel.getwin().addstr(3, 2, "{:<30} {:30}".format("Server:", connection_details['server'] + ":" + str(connection_details['port']))) - self.info_panel.getwin().addstr(4, 2, "{:<30} {:30}".format("Version:", self.server_status["general"]["version"])) + self.info_panel.getwin().addstr(3, 2, "{:<30} {:30}".format("Server:",self.server_sys_info["hostname"] + ":" + str(connection_details['port']))) + self.info_panel.getwin().addstr(4, 2, "{:<30} {:30}".format("Version:", self.server_version["version"])) self.info_panel.getwin().addstr(5, 2, "{:<30} {:30}".format("Build:", - self.server_status["general"]["build_date"] + " @ " + self.server_status["general"]["build_time"] + " by " + self.server_status["general"]["version_user"])) + self.server_version["build_date"] + " @ " + self.server_version["build_time"] + " by " + self.server_version["built_by"])) + + self.info_panel.getwin().addstr(6, 2, "{:<30} {:30}".format("Server Uptime:", self.server_sys_info["uptime"])) + self.info_panel.getwin().addstr(7, 2, "{:<30} {:<3} / {:<30}".format("DP Cores:", str(self.server_sys_info["dp_core_count"]) + " cores", self.server_sys_info["core_type"])) + self.info_panel.getwin().addstr(9, 2, "{:<30} {:<30}".format("Ports Count:", self.server_sys_info["port_count"])) + + ports_owned = " ".join(str(x) for x in self.rpc_client.get_owned_ports()) + if not ports_owned: + ports_owned = "None" + self.info_panel.getwin().addstr(10, 2, "{:<30} {:<30}".format("Ports Owned:", ports_owned)) - self.info_panel.getwin().addstr(6, 2, "{:<30} {:30}".format("Server Uptime:", self.server_status["general"]["uptime"])) # general stats - def update_general (self, gen_stats): - pass + def update_ports_stats (self): + + self.ports_stats_panel.clear() + + owned_ports = self.rpc_client.get_owned_ports() + if not owned_ports: + self.ports_stats_panel.getwin().addstr(3, 2, "No Owned Ports - Please Acquire One Or More Ports") + return + + # table header + self.ports_stats_panel.getwin().addstr(3, 2, "{:^15} {:^15} {:^15} {:^15} {:^15} {:^15} {:^15}".format( + "Port ID", "Tx [pps]", "Tx [bps]", "Tx [bytes]", "Rx [pps]", "Rx [bps]", "Rx [bytes]")) + + # port loop + self.stats.query_sync() + + for i, port_index in enumerate(owned_ports): + + port_stats = self.stats.get_port_stats(port_index) + + if port_stats: + self.ports_stats_panel.getwin().addstr(5 + (i * 4), 2, "{:^15} {:^15,} {:^15,} {:^15,} {:^15,} {:^15,} {:^15,}".format( + "{0} ({1})".format(str(port_index), self.server_sys_info["ports"][port_index]["speed"]), + port_stats["tx_pps"], + port_stats["tx_bps"], + port_stats["total_tx_bytes"], + port_stats["rx_pps"], + port_stats["rx_bps"], + port_stats["total_rx_bytes"])) + + else: + self.ports_stats_panel.getwin().addstr(5 + (i * 4), 2, "{:^15} {:^15} {:^15} {:^15} {:^15} {:^15} {:^15}".format( + "{0} ({1})".format(str(port_index), self.server_sys_info["ports"][port_index]["speed"]), + "N/A", + "N/A", + "N/A", + "N/A", + "N/A", + "N/A")) # control panel def update_control (self): self.control_panel.clear() - self.control_panel.getwin().addstr(1, 2, "'f' - freeze, 'c' - clear stats, 'p' - ping server, 'q' - quit") + self.control_panel.getwin().addstr(1, 2, "'g' - general, '0-{0}' - specific port, 'f' - freeze, 'c' - clear stats, 'p' - ping server, 'q' - quit" + .format(self.rpc_client.get_port_count() - 1)) index = 3 @@ -126,11 +238,11 @@ class TrexStatus(): self.max_x = self.stdscr.getmaxyx()[1] # create cls panel - self.main_panel = TrexStatusPanel(int(self.max_y * 0.8), self.max_x / 2, 0,0, "Trex Ports:") + self.ports_stats_panel = TrexStatusPanel(int(self.max_y * 0.8), self.max_x / 2, 0,0, "Trex Ports:") - self.general_panel = TrexStatusPanel(int(self.max_y * 0.6), self.max_x / 2, 0, self.max_x /2, "General Statistics:") + self.general_panel = TrexStatusPanel(int(self.max_y * 0.5), self.max_x / 2, 0, self.max_x /2, "General Statistics:") - self.info_panel = TrexStatusPanel(int(self.max_y * 0.2), self.max_x / 2, int(self.max_y * 0.6), self.max_x /2, "Server Info:") + self.info_panel = TrexStatusPanel(int(self.max_y * 0.3), self.max_x / 2, int(self.max_y * 0.5), self.max_x /2, "Server Info:") self.control_panel = TrexStatusPanel(int(self.max_y * 0.2), self.max_x , int(self.max_y * 0.8), 0, "") @@ -139,6 +251,18 @@ class TrexStatus(): def wait_for_key_input (self): ch = self.stdscr.getch() + # no key , continue + if ch == curses.ERR: + return True + + # check for registered function + if ch in self.actions: + return self.actions[ch]() + else: + self.add_log_event("Unknown key pressed, please see legend") + + return True + if (ch != curses.ERR): # stop/start status if (ch == ord('f')): @@ -160,7 +284,7 @@ class TrexStatus(): elif (ch == ord('q')): return False else: - self.add_log_event("Unknown key pressed {0}".format("'" + chr(ch) + "'" if chr(ch).isalpha() else "")) + self.add_log_event("Unknown key pressed, please see legend") return True @@ -187,10 +311,11 @@ class TrexStatus(): self.update_control() self.update_info() + self.update_ports_stats() panel.update_panels(); self.stdscr.refresh() - sleep(0.1) + sleep(0.01) def show_trex_status_internal (stdscr, rpc_client): |