def add_bond_eth_interface(node, ifc_name=None, sw_if_idx=None): """Add BondEthernet interface to current topology. :param node: DUT node from topology. :param ifc_name: Name of the BondEthernet interface. :param sw_if_idx: SW interface index. :type node: dict :type ifc_name: str :type sw_if_idx: int """ if_key = Topology.add_new_port(node, 'eth_bond') vat_executor = VatExecutor() vat_executor.execute_script_json_out("dump_interfaces.vat", node) interface_dump_json = vat_executor.get_script_stdout() if ifc_name and sw_if_idx is None: sw_if_idx = VatJsonUtil.get_interface_sw_index_from_json( interface_dump_json, ifc_name) Topology.update_interface_sw_if_index(node, if_key, sw_if_idx) if sw_if_idx and ifc_name is None: ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_idx) Topology.update_interface_name(node, if_key, ifc_name) ifc_mac = VatJsonUtil.get_interface_mac_from_json( interface_dump_json, sw_if_idx) Topology.update_interface_mac_address(node, if_key, ifc_mac)
def create_gre_tunnel_interface(node, source_ip, destination_ip): """Create GRE tunnel interface on node. :param node: VPP node to add tunnel interface. :param source_ip: Source of the GRE tunnel. :param destination_ip: Destination of the GRE tunnel. :type node: dict :type source_ip: str :type destination_ip: str :returns: Name and index of created GRE tunnel interface. :rtype: tuple :raises RuntimeError: If unable to create GRE tunnel interface. """ output = VatExecutor.cmd_from_template(node, "create_gre.vat", src=source_ip, dst=destination_ip) output = output[0] if output["retval"] == 0: sw_if_idx = output["sw_if_index"] vat_executor = VatExecutor() vat_executor.execute_script_json_out("dump_interfaces.vat", node) interface_dump_json = vat_executor.get_script_stdout() name = VatJsonUtil.get_interface_name_from_json( interface_dump_json, sw_if_idx) if_key = Topology.add_new_port(node, "gre_tunnel") Topology.update_interface_sw_if_index(node, if_key, sw_if_idx) Topology.update_interface_name(node, if_key, name) return name, sw_if_idx else: raise RuntimeError('Unable to create GRE tunnel on node {}.' .format(node))
def vpp_show_lisp_map_register(node): """Get LISP Map Register from VPP node. :param node: VPP node. :type node: dict :returns: LISP Map Register as python list. :rtype: list """ vat = VatExecutor() vat.execute_script_json_out('lisp/show_lisp_map_register.vat', node) return JsonParser().parse_data(vat.get_script_stdout())
def vpp_show_lisp_eid_table(node): """Get lisp eid table from VPP node. :param node: VPP node. :type node: dict :returns: Lisp eid table as python list. :rtype: list """ vat = VatExecutor() vat.execute_script_json_out('lisp/show_lisp_eid_table.vat', node) return JsonParser().parse_data(vat.get_script_stdout())
def vpp_show_lisp_state(node): """Get lisp state from VPP node. :param node: VPP node. :type node: dict :returns: Lisp gpe state. :rtype: list """ vat = VatExecutor() vat.execute_script_json_out('lisp/show_lisp_status.vat', node) return JsonParser().parse_data(vat.get_script_stdout())
def vpp_show_lisp_pitr(node): """Get Lisp PITR feature config from VPP node. :param node: VPP node. :type node: dict :returns: Lisp PITR config data. :rtype: dict """ vat = VatExecutor() vat.execute_script_json_out('lisp/show_lisp_pitr.vat', node) return JsonParser().parse_data(vat.get_script_stdout())
def vpp_show_lisp_rloc_config(node): """Get LISP RLOC configuration from VPP node. :param node: VPP node. :type node: dict :returns: LISP RLOC configuration as python list. :rtype: list """ vat = VatExecutor() vat.execute_script_json_out('lisp/show_lisp_rloc_config.vat', node) return JsonParser().parse_data(vat.get_script_stdout())
def vpp_get_nat_static_mappings(node): """Get NAT static mappings from VPP node. :param node: VPP node. :type node: dict :returns: List of static mappings. :rtype: list :raises RuntimeError: If the output is not as expected. """ vat = VatExecutor() # JSON output not supported for this command vat.execute_script('snat/snat_mapping_dump.vat', node, json_out=False) stdout = vat.get_script_stdout() lines = stdout.split("\n") data = [] # lines[0,1] are table and column headers for line in lines[2::]: # Ignore extra data after NAT table if "snat_static_mapping_dump error: Misc" in line or "vat#" in line: continue items = line.split(" ") while "" in items: items.remove("") if len(items) == 0: continue elif len(items) == 4: # no ports were returned data.append({ "local_address": items[0], "remote_address": items[1], "vrf": items[2], "protocol": items[3] }) elif len(items) == 6: data.append({ "local_address": items[0], "local_port": items[1], "remote_address": items[2], "remote_port": items[3], "vrf": items[4], "protocol": items[5] }) else: raise RuntimeError("Unexpected output from snat_mapping_dump.") return data
def update_vpp_interface_data_on_node(node): """Update vpp generated interface data for a given node in DICT__nodes. Updates interface names, software if index numbers and any other details generated specifically by vpp that are unknown before testcase run. It does this by dumping interface list to JSON output from all devices using vpp_api_test, and pairing known information from topology (mac address/pci address of interface) to state from VPP. :param node: Node selected from DICT__nodes. :type node: dict """ vat_executor = VatExecutor() vat_executor.execute_script_json_out("dump_interfaces.vat", node) interface_dump_json = vat_executor.get_script_stdout() VatJsonUtil.update_vpp_interface_data_from_json(node, interface_dump_json)
def vpp_get_nat_interfaces(node): """Get list of interfaces configured with NAT from VPP node. :param node: VPP node. :type node: dict :returns: List of interfaces on the node that are configured with NAT. :rtype: list :raises RuntimeError: If the output is not as expected. """ vat = VatExecutor() # JSON output not supported for this command vat.execute_script('snat/snat_interface_dump.vat', node, json_out=False) stdout = vat.get_script_stdout() lines = stdout.split("\n") data = [] for line in lines: items = line.split(" ") for trash in ("", "vat#"): while trash in items: items.remove(trash) if len(items) == 0: continue elif len(items) == 3: data.append({ # items[0] is the table header - "sw_if_index" "sw_if_index": items[1], "direction": items[2] }) else: raise RuntimeError( "Unexpected output from snat_interface_dump.") return data