summaryrefslogtreecommitdiffstats
path: root/src/vat
AgeCommit message (Expand)AuthorFilesLines
2021-07-12session: api cleanupFilip Tehlar1-308/+1
2021-07-02interface: api cleanupFilip Tehlar1-1396/+18
2021-07-01ip: api cleanupFilip Tehlar1-1595/+66
2021-06-24l2: api cleanupFilip Tehlar1-1655/+6
2021-06-23virtio: api cleanupFilip Tehlar1-313/+0
2021-06-23mpls: api cleanupFilip Tehlar1-629/+0
2021-06-23span: api cleanupFilip Tehlar1-167/+0
2021-06-22tcp: api cleanupFilip Tehlar1-49/+0
2021-06-22virtio: api cleanupFilip Tehlar1-551/+13
2021-06-22misc: punt: api cleanupFilip Tehlar1-44/+0
2021-06-22devices: af_packet api cleanupFilip Tehlar1-175/+0
2021-06-22qos: api cleanupFilip Tehlar1-53/+0
2021-06-22devices: tapv2 api cleanupFilip Tehlar1-403/+0
2021-06-22sr: api cleanupFilip Tehlar1-179/+0
2021-06-22bonding: api cleanupFilip Tehlar1-655/+0
2021-06-22ipsec: api cleanupFilip Tehlar1-445/+0
2021-06-22ethernet: api cleanupFilip Tehlar1-111/+0
2021-06-22policer: api cleanupFilip Tehlar1-485/+0
2021-06-21feature: api cleanupFilip Tehlar1-72/+0
2021-06-21pg: api cleanupFilip Tehlar1-222/+0
2021-06-21misc: ipfix api cleanupFilip Tehlar1-343/+0
2021-06-21flow: api cleanupFilip Tehlar1-2/+0
2021-06-21gso: api cleanupFilip Tehlar1-43/+0
2021-06-21vxlan: api cleanupFilip Tehlar1-760/+0
2021-06-21classify: api cleanupFilip Tehlar1-1069/+1
2021-06-21bier: api cleanupFilip Tehlar1-162/+0
2021-03-26vlib: split vlib_main_t into global and per-threadDamjan Marion1-31/+23
2021-03-11misc: remove cop API support (part 1)Dave Barach1-99/+0
2021-02-12policer: use enum typesBrian Russell1-3/+6
2021-02-12policer: remove SSE2 prefixBrian Russell1-32/+31
2021-02-11policer: use ip dscpBrian Russell1-9/+8
2021-01-29misc: fix a trunccation on vhost dumpSteven Luong1-6/+5
2021-01-08vhost: Add event index for interrupt notification to driverSteven Luong1-6/+212
2021-01-07ipsec: Deprecated the old IPsec Tunnel interfaceNeale Ranns1-261/+0
2020-11-26gre: Move to new API generated types/messagesNeale Ranns1-200/+0
2020-10-21misc: minimize dependencies on udp.hFlorin Coras1-0/+1
2020-10-08interface: shorten vnet_hw_if_rx_modeDamjan Marion1-5/+5
2020-10-06feature: Add packet trace APIJon Loeliger1-2/+75
2020-10-02ip: Fix unformat_ip_prefixNathan Skrzypczak1-1/+4
2020-09-28virtio: add packet buffering on txMohsin Kazmi1-1/+3
2020-09-22lisp: Move to pluginNeale Ranns1-5028/+0
2020-09-21geneve: Move to pluginNeale Ranns1-1/+0
2020-09-21misc: Move l2tp to pluginNeale Ranns1-324/+0
2020-09-21lldp: Move to pluginNeale Ranns1-105/+0
2020-09-18vat: add infrastructure to align vnet test code and plugin test codeOle Troan4-383/+53
2020-09-11lisp: fix spelling mistake in option nameOnong Tayeng1-1/+1
2020-09-10lisp: fix vat crash with one_add_del_local_eid apiOnong Tayeng1-1/+1
2020-09-02bonding: add bond_create2 API to include gso optionSteven Luong1-0/+107
2020-09-02virtio: add virtio 1.1 api flagsMohsin Kazmi1-11/+51
2020-09-02tap: add virtio 1.1 API flagMohsin Kazmi1-1/+5
bp">True else "", input=remote_file_path) (ret_code, stdout, stderr) = ssh.exec_command(cmd, timeout) self._ret_code = ret_code self._stdout = stdout self._stderr = stderr logger.trace("Command '{0}' returned {1}'".format(cmd, self._ret_code)) logger.trace("stdout: '{0}'".format(self._stdout)) logger.trace("stderr: '{0}'".format(self._stderr)) # TODO: download vpp_api_test output file # self._delete_files(node, remote_file_path, remote_file_out) def execute_script_json_out(self, vat_name, node, timeout=10): """Pass all arguments to 'execute_script' method, then cleanup returned json output.""" self.execute_script(vat_name, node, timeout, json_out=True) self._stdout = cleanup_vat_json_output(self._stdout) @staticmethod def _delete_files(node, *files): """Use SSH to delete the specified files on node. :param node: Node in topology. :param files: Files to delete. :type node: dict :type files: iterable """ ssh = SSH() ssh.connect(node) files = " ".join([str(x) for x in files]) ssh.exec_command("rm {0}".format(files)) def script_should_have_failed(self): """Read return code from last executed script and raise exception if the script didn't fail.""" if self._ret_code is None: raise Exception("First execute the script!") if self._ret_code == 0: raise AssertionError( "Script execution passed, but failure was expected") def script_should_have_passed(self): """Read return code from last executed script and raise exception if the script failed.""" if self._ret_code is None: raise Exception("First execute the script!") if self._ret_code != 0: raise AssertionError( "Script execution failed, but success was expected") def get_script_stdout(self): """Returns value of stdout from last executed script.""" return self._stdout def get_script_stderr(self): """Returns value of stderr from last executed script.""" return self._stderr @staticmethod def cmd_from_template(node, vat_template_file, **vat_args): """Execute VAT script on specified node. This method supports script templates with parameters. :param node: Node in topology on witch the script is executed. :param vat_template_file: Template file of VAT script. :param vat_args: Arguments to the template file. :return: List of JSON objects returned by VAT. """ with VatTerminal(node) as vat: return vat.vat_terminal_exec_cmd_from_template(vat_template_file, **vat_args) class VatTerminal(object): """VAT interactive terminal. :param node: Node to open VAT terminal on. :param json_param: Defines if outputs from VAT are in JSON format. Default is True. :type node: dict :type json_param: bool """ __VAT_PROMPT = "vat# " __LINUX_PROMPT = ":~$ " def __init__(self, node, json_param=True): json_text = ' json' if json_param else '' self.json = json_param self._ssh = SSH() self._ssh.connect(node) self._tty = self._ssh.interactive_terminal_open() self._ssh.interactive_terminal_exec_command( self._tty, 'sudo -S {}{}'.format(Constants.VAT_BIN_NAME, json_text), self.__VAT_PROMPT) self._exec_failure = False def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.vat_terminal_close() def vat_terminal_exec_cmd(self, cmd): """Execute command on the opened VAT terminal. :param cmd: Command to be executed. :return: Command output in python representation of JSON format or None if not in JSON mode. """ logger.debug("Executing command in VAT terminal: {}".format(cmd)) try: out = self._ssh.interactive_terminal_exec_command(self._tty, cmd, self.__VAT_PROMPT) except: self._exec_failure = True raise logger.debug("VAT output: {}".format(out)) if self.json: obj_start = out.find('{') obj_end = out.rfind('}') array_start = out.find('[') array_end = out.rfind(']') if -1 == obj_start and -1 == array_start: raise RuntimeError("VAT: no JSON data.") if obj_start < array_start or -1 == array_start: start = obj_start end = obj_end + 1 else: start = array_start end = array_end + 1 out = out[start:end] json_out = json.loads(out) return json_out else: return None def vat_terminal_close(self): """Close VAT terminal.""" #interactive terminal is dead, we only need to close session if not self._exec_failure: self._ssh.interactive_terminal_exec_command(self._tty, 'quit', self.__LINUX_PROMPT) self._ssh.interactive_terminal_close(self._tty) def vat_terminal_exec_cmd_from_template(self, vat_template_file, **args): """Execute VAT script from a file. :param vat_template_file: Template file name of a VAT script. :param args: Dictionary of parameters for VAT script. :return: List of JSON objects returned by VAT. """ file_path = '{}/{}'.format(Constants.RESOURCES_TPL_VAT, vat_template_file) with open(file_path, 'r') as template_file: cmd_template = template_file.readlines() ret = [] for line_tmpl in cmd_template: vat_cmd = line_tmpl.format(**args) ret.append(self.vat_terminal_exec_cmd(vat_cmd.replace('\n', ''))) return ret