X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fvpp_papi_provider.py;h=f72d37df7b2eb791dcf94383119d42be116c1ba9;hb=d57f636;hp=087a14b7fad6662456d325adf30c4439974744b4;hpb=75e7d1301475d49311d14e202936c62df0c07d10;p=vpp.git diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index 087a14b7fad..f72d37df7b2 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -36,6 +36,13 @@ class L2_VTR_OP: L2_TRANSLATE_2_2 = 8 +class QOS_SOURCE: + EXT = 0 + VLAN = 1 + MPLS = 2 + IP = 3 + + class UnexpectedApiReturnValueError(Exception): """ exception raised when the API return value is unexpected """ pass @@ -362,7 +369,8 @@ class VppPapiProvider(object): is_ipv6=0, encap_vrf_id=0, decap_next_index=0xFFFFFFFF, - vni=0): + vni=0, + instance=0xFFFFFFFF): """ :param dst_addr: @@ -373,6 +381,7 @@ class VppPapiProvider(object): :param decap_next_index: (Default value = 0xFFFFFFFF) :param mcast_sw_if_index: (Default value = 0xFFFFFFFF) :param vni: (Default value = 0) + :param instance: (Default value = 0xFFFFFFFF) """ return self.api(self.papi.vxlan_add_del_tunnel, @@ -383,7 +392,8 @@ class VppPapiProvider(object): 'mcast_sw_if_index': mcast_sw_if_index, 'encap_vrf_id': encap_vrf_id, 'decap_next_index': decap_next_index, - 'vni': vni}) + 'vni': vni, + 'instance': instance}) def geneve_add_del_tunnel( self, @@ -463,6 +473,27 @@ class VppPapiProvider(object): 'address': address, 'pid': os.getpid(), }) + def want_ip6_ra_events(self, enable_disable=1): + return self.api(self.papi.want_ip6_ra_events, + {'enable_disable': enable_disable, + 'pid': os.getpid(), }) + + def ip6nd_send_router_solicitation(self, sw_if_index, irt=1, mrt=120, + mrc=0, mrd=0): + return self.api(self.papi.ip6nd_send_router_solicitation, + {'irt': irt, + 'mrt': mrt, + 'mrc': mrc, + 'mrd': mrd, + 'sw_if_index': sw_if_index}) + + def ip6_nd_address_autoconfig(self, sw_if_index, enable, + install_default_routes): + return self.api(self.papi.ip6_nd_address_autoconfig, + {'sw_if_index': sw_if_index, + 'enable': enable, + 'install_default_routes': install_default_routes}) + def want_macs_learn_events(self, enable_disable=1, scan_delay=0, max_macs_in_event=0, learn_limit=0): return self.api(self.papi.want_l2_macs_events, @@ -537,7 +568,8 @@ class VppPapiProvider(object): 'enable': enable}) def bridge_flags(self, bd_id, is_set, feature_bitmap): - """Enable/disable required feature of the bridge domain with defined ID. + """Enable/disable required feature of the bridge domain with defined + ID. :param int bd_id: Bridge domain ID. :param int is_set: Set to 1 to enable, set to 0 to disable the feature. @@ -626,6 +658,31 @@ class VppPapiProvider(object): {'sw_if_index': sw_if_index, 'admin_up_down': admin_up_down}) + def sw_interface_set_mtu(self, sw_if_index, mtu): + """ + :param sw_if_index: + :param mtu: + + """ + return self.api(self.papi.sw_interface_set_mtu, + {'sw_if_index': sw_if_index, + 'mtu': mtu}) + + def sw_interface_set_promiscuous(self, sw_if_index, enable): + """ + :param sw_if_index: + :param enable: + + """ + return self.api(self.papi.sw_interface_set_promiscuous, + {'sw_if_index': sw_if_index, + 'enable': enable}) + + def sw_interface_set_mac_address(self, sw_if_index, mac): + return self.api(self.papi.sw_interface_set_mac_address, + {'sw_if_index': sw_if_index, + 'mac_address': mac}) + def create_subif(self, sw_if_index, sub_id, outer_vlan, inner_vlan, no_tags=0, one_tag=0, two_tags=0, dot1ad=0, exact_match=0, default_sub=0, outer_vlan_id_any=0, inner_vlan_id_any=0): @@ -973,7 +1030,9 @@ class VppPapiProvider(object): src_address, dst_address, outer_fib_id=0, - is_teb=0, + tunnel_type=0, + instance=0xFFFFFFFF, + session_id=0, is_add=1, is_ip6=0): """ Add a GRE tunnel @@ -981,19 +1040,23 @@ class VppPapiProvider(object): :param src_address: :param dst_address: :param outer_fib_id: (Default value = 0) + :param tunnel_type: (Default value = 0) + :param instance: (Default value = 0xFFFFFFFF) + :param session_id: (Defalt value = 0) :param is_add: (Default value = 1) :param is_ipv6: (Default value = 0) - :param is_teb: (Default value = 0) """ return self.api( self.papi.gre_add_del_tunnel, {'is_add': is_add, 'is_ipv6': is_ip6, - 'teb': is_teb, + 'tunnel_type': tunnel_type, + 'instance': instance, 'src_address': src_address, 'dst_address': dst_address, - 'outer_fib_id': outer_fib_id} + 'outer_fib_id': outer_fib_id, + 'session_id': session_id} ) def udp_encap_add_del(self, @@ -1031,6 +1094,11 @@ class VppPapiProvider(object): def udp_encap_dump(self): return self.api(self.papi.udp_encap_dump, {}) + def want_udp_encap_stats(self, enable=1): + return self.api(self.papi.want_udp_encap_stats, + {'enable': enable, + 'pid': os.getpid()}) + def mpls_fib_dump(self): return self.api(self.papi.mpls_fib_dump, {}) @@ -1095,7 +1163,6 @@ class VppPapiProvider(object): :param next_hop_weight: (Default value = 1) """ - return self.api( self.papi.mpls_route_add_del, {'mr_label': label, @@ -1235,6 +1302,7 @@ class VppPapiProvider(object): vrf_id=0, protocol=0, twice_nat=0, + self_twice_nat=0, out2in_only=0, tag="", is_add=1): @@ -1249,6 +1317,9 @@ class VppPapiProvider(object): :param vrf_id: VRF ID :param protocol: IP protocol (Default value = 0) :param twice_nat: 1 if translate external host address and port + :param self_twice_nat: 1 if translate external host address and port + whenever external host address equals + local address of internal host :param out2in_only: if 1 rule is matching only out2in direction :param tag: Opaque string tag :param is_add: 1 if add, 0 if delete (Default value = 1) @@ -1265,6 +1336,7 @@ class VppPapiProvider(object): 'vrf_id': vrf_id, 'protocol': protocol, 'twice_nat': twice_nat, + 'self_twice_nat': self_twice_nat, 'out2in_only': out2in_only, 'tag': tag}) @@ -1429,6 +1501,7 @@ class VppPapiProvider(object): protocol, vrf_id=0, twice_nat=0, + self_twice_nat=0, out2in_only=0, tag='', local_num=0, @@ -1448,6 +1521,7 @@ class VppPapiProvider(object): 'protocol': protocol, 'vrf_id': vrf_id, 'twice_nat': twice_nat, + 'self_twice_nat': self_twice_nat, 'out2in_only': out2in_only, 'tag': tag, 'local_num': local_num, @@ -1466,7 +1540,9 @@ class VppPapiProvider(object): port, protocol, vrf_id=0, - is_in=1): + is_in=1, + ext_host_address=None, + ext_host_port=0): """Delete NAT44 session :param addr: IPv4 address @@ -1474,14 +1550,28 @@ class VppPapiProvider(object): :param protocol: IP protocol number :param vrf_id: VRF ID :param is_in: 1 if inside network addres and port pari, 0 if outside - """ - return self.api( - self.papi.nat44_del_session, - {'address': addr, - 'port': port, - 'protocol': protocol, - 'vrf_id': vrf_id, - 'is_in': is_in}) + :param ext_host_address: external host IPv4 address + :param ext_host_port: external host port + """ + if ext_host_address is None: + return self.api( + self.papi.nat44_del_session, + {'address': addr, + 'port': port, + 'protocol': protocol, + 'vrf_id': vrf_id, + 'is_in': is_in}) + else: + return self.api( + self.papi.nat44_del_session, + {'address': addr, + 'port': port, + 'protocol': protocol, + 'vrf_id': vrf_id, + 'is_in': is_in, + 'ext_host_valid': 1, + 'ext_host_address': ext_host_address, + 'ext_host_port': ext_host_port}) def nat44_forwarding_enable_disable( self, @@ -2125,6 +2215,29 @@ class VppPapiProvider(object): 'l2_table_index': l2_table_index, 'is_add': is_add}) + def output_acl_set_interface( + self, + is_add, + sw_if_index, + ip4_table_index=0xFFFFFFFF, + ip6_table_index=0xFFFFFFFF, + l2_table_index=0xFFFFFFFF): + """ + :param is_add: + :param sw_if_index: + :param ip4_table_index: (Default value = 0xFFFFFFFF) + :param ip6_table_index: (Default value = 0xFFFFFFFF) + :param l2_table_index: (Default value = 0xFFFFFFFF) + """ + + return self.api( + self.papi.output_acl_set_interface, + {'sw_if_index': sw_if_index, + 'ip4_table_index': ip4_table_index, + 'ip6_table_index': ip6_table_index, + 'l2_table_index': l2_table_index, + 'is_add': is_add}) + def set_ipfix_exporter( self, collector_address, @@ -2210,6 +2323,7 @@ class VppPapiProvider(object): e_flags, next_hop_afi, next_hop_sw_if_index, + next_hop_address, i_flags, bier_imp=0, rpf_id=0, @@ -2234,7 +2348,8 @@ class VppPapiProvider(object): 'next_hop_afi': next_hop_afi, 'grp_address_length': grp_address_length, 'grp_address': grp_address, - 'src_address': src_address}) + 'src_address': src_address, + 'nh_address': next_hop_address}) def mfib_signal_dump(self): return self.api(self.papi.mfib_signal_dump, {}) @@ -2654,6 +2769,16 @@ class VppPapiProvider(object): 'acls': acls}, expected_retval=expected_retval) + def acl_interface_set_etype_whitelist(self, sw_if_index, + n_input, whitelist, + expected_retval=0): + return self.api(self.papi.acl_interface_set_etype_whitelist, + {'sw_if_index': sw_if_index, + 'count': len(whitelist), + 'n_input': n_input, + 'whitelist': whitelist}, + expected_retval=expected_retval) + def acl_interface_add_del(self, sw_if_index, acl_index, @@ -2676,6 +2801,12 @@ class VppPapiProvider(object): {'acl_index': acl_index}, expected_retval=expected_retval) + def acl_interface_list_dump(self, sw_if_index=0xFFFFFFFF, + expected_retval=0): + return self.api(self.papi.acl_interface_list_dump, + {'sw_if_index': sw_if_index}, + expected_retval=expected_retval) + def macip_acl_add(self, rules, tag=""): """ Add MACIP acl @@ -2818,25 +2949,14 @@ class VppPapiProvider(object): paths, is_add=1): """ BIER Route add/del """ - br_paths = [] - for p in paths: - br_paths.append({'next_hop': p.nh_addr, - 'weight': 1, - 'afi': 0, - 'preference': 0, - 'table_id': p.nh_table_id, - 'next_hop_id': p.next_hop_id, - 'is_udp_encap': p.is_udp_encap, - 'n_labels': len(p.nh_labels), - 'label_stack': p.nh_labels}) return self.api( self.papi.bier_route_add_del, {'br_tbl_id': {"bt_set": bti.set_id, "bt_sub_domain": bti.sub_domain_id, "bt_hdr_len_id": bti.hdr_len_id}, 'br_bp': bp, - 'br_n_paths': len(br_paths), - 'br_paths': br_paths, + 'br_n_paths': len(paths), + 'br_paths': paths, 'br_is_add': is_add}) def bier_route_dump(self, bti): @@ -2886,12 +3006,16 @@ class VppPapiProvider(object): bdti, bp, payload_proto, + next_hop_afi, next_hop, next_hop_tbl_id=0, next_hop_rpf_id=~0, next_hop_is_ip4=1, is_add=1): """ BIER Route add/del """ + lstack = [] + while (len(lstack) < 16): + lstack.append({}) return self.api( self.papi.bier_disp_entry_add_del, {'bde_tbl_id': bdti, @@ -2900,10 +3024,10 @@ class VppPapiProvider(object): 'bde_n_paths': 1, 'bde_paths': [{'next_hop': next_hop, 'table_id': next_hop_tbl_id, - 'afi': 0, + 'afi': next_hop_afi, 'rpf_id': next_hop_rpf_id, 'n_labels': 0, - 'label_stack': [0]}], + 'label_stack': lstack}], 'bde_is_add': is_add}) def bier_disp_entry_dump(self, bdti): @@ -2952,9 +3076,8 @@ class VppPapiProvider(object): :returns: reply from the API """ return self.api( - self.papi.ipsec_interface_add_del_spd, { - 'spd_id': spd_id, - 'sw_if_index': sw_if_index, 'is_add': is_add}) + self.papi.ipsec_interface_add_del_spd, + {'spd_id': spd_id, 'sw_if_index': sw_if_index, 'is_add': is_add}) def ipsec_sad_add_del_entry(self, sad_id, @@ -2969,7 +3092,8 @@ class VppPapiProvider(object): crypto_key_length=0, crypto_key='JPjyOWBeVEQiMe7h', is_add=1, - is_tunnel=1): + is_tunnel=1, + udp_encap=0): """ IPSEC SA add/del Sample CLI : 'ipsec sa add 10 spi 1001 esp \ crypto-key 4a506a794f574265564551694d653768 \ @@ -3022,7 +3146,8 @@ class VppPapiProvider(object): 'crypto_key_length': crypto_key_length, 'crypto_key': crypto_key, 'is_add': is_add, - 'is_tunnel': is_tunnel}) + 'is_tunnel': is_tunnel, + 'udp_encap': udp_encap}) def ipsec_spd_add_del_entry(self, spd_id, @@ -3125,3 +3250,332 @@ class VppPapiProvider(object): def ip_reassembly_get(self, is_ip6=0): """ Get IP reassembly parameters """ return self.api(self.papi.ip_reassembly_get, {'is_ip6': is_ip6}) + + def ip_reassembly_enable_disable(self, sw_if_index, enable_ip4=False, + enable_ip6=False): + """ Enable/disable IP reassembly """ + return self.api(self.papi.ip_reassembly_enable_disable, + {'sw_if_index': sw_if_index, + 'enable_ip4': 1 if enable_ip4 else 0, + 'enable_ip6': 1 if enable_ip6 else 0, + }) + + def gbp_endpoint_add_del(self, is_add, sw_if_index, addr, is_ip6, epg): + """ GBP endpoint Add/Del """ + return self.api(self.papi.gbp_endpoint_add_del, + {'is_add': is_add, + 'endpoint': { + 'is_ip6': is_ip6, + 'sw_if_index': sw_if_index, + 'address': addr, + 'epg_id': epg}}) + + def gbp_endpoint_dump(self): + """ GBP endpoint Dump """ + return self.api(self.papi.gbp_endpoint_dump, {}) + + def gbp_endpoint_group_add_del(self, is_add, epg, bd, + ip4_rd, + ip6_rd, + uplink_sw_if_index): + """ GBP endpoint group Add/Del """ + return self.api(self.papi.gbp_endpoint_group_add_del, + {'is_add': is_add, + 'epg': { + 'uplink_sw_if_index': uplink_sw_if_index, + 'bd_id': bd, + 'ip4_table_id': ip4_rd, + 'ip6_table_id': ip6_rd, + 'epg_id': epg}}) + + def gbp_endpoint_group_dump(self): + """ GBP endpoint group Dump """ + return self.api(self.papi.gbp_endpoint_group_dump, {}) + + def gbp_recirc_add_del(self, is_add, sw_if_index, epg, is_ext): + """ GBP recirc Add/Del """ + return self.api(self.papi.gbp_recirc_add_del, + {'is_add': is_add, + 'recirc': { + 'is_ext': is_ext, + 'sw_if_index': sw_if_index, + 'epg_id': epg}}) + + def gbp_recirc_dump(self): + """ GBP recirc Dump """ + return self.api(self.papi.gbp_recirc_dump, {}) + + def gbp_subnet_add_del(self, is_add, table_id, + is_internal, + addr, addr_len, + sw_if_index=0xffffffff, + epg_id=0xffffffff, + is_ip6=False): + """ GBP Subnet Add/Del """ + return self.api(self.papi.gbp_subnet_add_del, + {'is_add': is_add, + 'subnet': { + 'is_internal': is_internal, + 'is_ip6': is_ip6, + 'sw_if_index': sw_if_index, + 'epg_id': epg_id, + 'address': addr, + 'address_length': addr_len, + 'table_id': table_id}}) + + def gbp_subnet_dump(self): + """ GBP Subnet Dump """ + return self.api(self.papi.gbp_subnet_dump, {}) + + def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index): + """ GBP contract Add/Del """ + return self.api(self.papi.gbp_contract_add_del, + {'is_add': is_add, + 'contract': { + 'acl_index': acl_index, + 'src_epg': src_epg, + 'dst_epg': dst_epg}}) + + def gbp_contract_dump(self): + """ GBP contract Dump """ + return self.api(self.papi.gbp_contract_dump, {}) + + def ipip_6rd_add_tunnel(self, fib_index, ip6_prefix, ip6_prefix_len, + ip4_prefix, ip4_prefix_len, ip4_src, + security_check): + """ 6RD tunnel Add """ + return self.api(self.papi.ipip_6rd_add_tunnel, + {'fib_index': fib_index, + 'ip6_prefix': ip6_prefix, + 'ip6_prefix_len': ip6_prefix_len, + 'ip4_prefix': ip4_prefix, + 'ip4_prefix_len': ip4_prefix_len, + 'ip4_src': ip4_src, + 'security_check': security_check}) + + def ipip_6rd_del_tunnel(self, sw_if_index): + """ 6RD tunnel Delete """ + return self.api(self.papi.ipip_6rd_del_tunnel, + {'sw_if_index': sw_if_index}) + + def ipip_add_tunnel(self, src_address, dst_address, is_ipv6=1, + instance=0xFFFFFFFF, fib_index=0, tc_tos=0): + """ IPIP tunnel Add/Del """ + return self.api(self.papi.ipip_add_tunnel, + {'is_ipv6': is_ipv6, + 'instance': instance, + 'src_address': src_address, + 'dst_address': dst_address, + 'fib_index': fib_index, + 'tc_tos': tc_tos}) + + def ipip_del_tunnel(self, sw_if_index): + """ IPIP tunnel Delete """ + return self.api(self.papi.ipip_del_tunnel, + {'sw_if_index': sw_if_index}) + + def qos_egress_map_update(self, id, outputs): + """ QOS egress map update """ + return self.api(self.papi.qos_egress_map_update, + {'map_id': id, + 'rows': outputs}) + + def qos_egress_map_delete(self, id): + """ QOS egress map delete """ + return self.api(self.papi.qos_egress_map_delete, + {'map_id': id}) + + def qos_mark_enable_disable(self, sw_if_index, + output_source, + map_id, + enable): + """ QOS Mark Enable/Disable """ + return self.api(self.papi.qos_mark_enable_disable, + {'map_id': map_id, + 'sw_if_index': sw_if_index, + 'output_source': output_source, + 'enable': enable}) + + def qos_record_enable_disable(self, sw_if_index, input_source, enable): + """ IP QoS recording Enble/Disable """ + return self.api(self.papi.qos_record_enable_disable, + {'sw_if_index': sw_if_index, + 'input_source': input_source, + 'enable': enable}) + + def igmp_listen(self, enable, sw_if_index, saddr, gaddr): + """ Listen for new (S,G) on specified interface + + :param enable: add/del + :param sw_if_index: interface sw index + :param saddr: source ip4 addr + :param gaddr: group ip4 addr + """ + return self.api(self.papi.igmp_listen, + {'enable': enable, + 'sw_if_index': sw_if_index, + 'saddr': saddr, + 'gaddr': gaddr}) + + def igmp_dump(self, sw_if_index=None): + """ Dump all (S,G) interface configurations """ + if sw_if_index is None: + dump_all = 1 + sw_if_index = 0 + else: + dump_all = 0 + return self.api(self.papi.igmp_dump, {'sw_if_index': sw_if_index, + 'dump_all': dump_all}) + + def igmp_clear_interface(self, sw_if_index): + """ Remove all (S,G)s from specified interface + doesn't send IGMP report! + """ + return self.api( + self.papi.igmp_clear_interface, { + 'sw_if_index': sw_if_index}) + + def want_igmp_events(self, enable=1): + return self.api(self.papi.want_igmp_events, {'enable': enable, + 'pid': os.getpid()}) + + def bond_create( + self, + mode, + lb, + use_custom_mac, + mac_address=''): + """ + :param mode: mode + :param lb: load balance + :param use_custom_mac: use custom mac + :param mac_address: mac address + """ + return self.api( + self.papi.bond_create, + {'mode': mode, + 'lb': lb, + 'use_custom_mac': use_custom_mac, + 'mac_address': mac_address + }) + + def bond_delete( + self, + sw_if_index): + """ + :param sw_if_index: interface the operation is applied to + """ + return self.api(self.papi.bond_delete, + {'sw_if_index': sw_if_index}) + + def bond_enslave( + self, + sw_if_index, + bond_sw_if_index, + is_passive, + is_long_timeout): + """ + :param sw_if_index: slave sw_if_index + :param bond_sw_if_index: bond sw_if_index + :param is_passive: is passive lacp speaker + :param is_long_time: 90 seconds timeout instead of 3 seconds timeout + """ + return self.api( + self.papi.bond_enslave, + {'sw_if_index': sw_if_index, + 'bond_sw_if_index': bond_sw_if_index, + 'is_passive': is_passive, + 'is_long_timeout': is_long_timeout + }) + + def bond_detach_slave( + self, + sw_if_index): + """ + :param sw_if_index: slave interface the operation is applied to + """ + return self.api(self.papi.bond_detach_slave, + {'sw_if_index': sw_if_index}) + + def sw_interface_slave_dump( + self, + sw_if_index): + """ + :param sw_if_index: bond sw_if_index + """ + return self.api(self.papi.sw_interface_slave_dump, + {'sw_if_index': sw_if_index}) + + def sw_interface_bond_dump( + self): + """ + + """ + return self.api(self.papi.sw_interface_bond_dump, + {}) + + def create_vhost_user_if( + self, + is_server, + sock_filename, + renumber, + custom_dev_instance, + use_custom_mac, + mac_address, + tag=''): + """ + :param is_server: is server + :param sock_filename: socket name + :param renumber: renumber + :param custom_dev_instance: custom dev instance + :param use_custom_mac: use custom mac + :param mac_address: mac address + :param tag: tag (default '' + """ + return self.api( + self.papi.create_vhost_user_if, + {'is_server': is_server, + 'sock_filename': sock_filename, + 'renumber': renumber, + 'custom_dev_instance': custom_dev_instance, + 'use_custom_mac': use_custom_mac, + 'mac_address': mac_address, + 'tag': tag + }) + + def delete_vhost_user_if( + self, + sw_if_index): + """ + :param sw_if_index: interface the operation is applied to + """ + return self.api(self.papi.delete_vhost_user_if, + {'sw_if_index': sw_if_index, }) + + def sw_interface_vhost_user_dump( + self): + """ + + """ + return self.api(self.papi.sw_interface_vhost_user_dump, + {}) + + def abf_policy_add_del(self, is_add, policy): + return self.api( + self.papi.abf_policy_add_del, + {'is_add': is_add, + 'policy': policy}) + + def abf_itf_attach_add_del(self, is_add, attach): + return self.api( + self.papi.abf_itf_attach_add_del, + {'is_add': is_add, + 'attach': attach}) + + def abf_policy_dump(self): + return self.api( + self.papi.abf_policy_dump, {}) + + def abf_itf_attach_dump(self): + return self.api( + self.papi.abf_itf_attach_dump, {})