diff options
Diffstat (limited to 'resources/libraries')
-rw-r--r-- | resources/libraries/python/GBP.py | 346 | ||||
-rw-r--r-- | resources/libraries/robot/features/gbp.robot | 100 | ||||
-rw-r--r-- | resources/libraries/robot/shared/default.robot | 1 |
3 files changed, 0 insertions, 447 deletions
diff --git a/resources/libraries/python/GBP.py b/resources/libraries/python/GBP.py deleted file mode 100644 index 9d56d4475b..0000000000 --- a/resources/libraries/python/GBP.py +++ /dev/null @@ -1,346 +0,0 @@ -# Copyright (c) 2020 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""GBP utilities library.""" - -from enum import IntEnum - -from ipaddress import ip_address - -from resources.libraries.python.IPAddress import IPAddress -from resources.libraries.python.L2Util import L2Util -from resources.libraries.python.PapiExecutor import PapiSocketExecutor - - -class GBPEndpointFlags(IntEnum): - """GBP Endpoint Flags.""" - GBP_API_ENDPOINT_FLAG_NONE = 0 - GBP_API_ENDPOINT_FLAG_BOUNCE = 1 - GBP_API_ENDPOINT_FLAG_REMOTE = 2 - GBP_API_ENDPOINT_FLAG_LEARNT = 4 - GBP_API_ENDPOINT_FLAG_EXTERNAL = 8 - - -class GBPBridgeDomainFlags(IntEnum): - """GBP Bridge Domain Flags.""" - GBP_BD_API_FLAG_NONE = 0 - GBP_BD_API_FLAG_DO_NOT_LEARN = 1 - GBP_BD_API_FLAG_UU_FWD_DROP = 2 - GBP_BD_API_FLAG_MCAST_DROP = 4 - GBP_BD_API_FLAG_UCAST_ARP = 8 - - -class GBPSubnetType(IntEnum): - """GBP Subnet Type.""" - GBP_API_SUBNET_TRANSPORT = 1 - # TODO: Names too long for pylint, fix in VPP. - GBP_API_SUBNET_STITCHED_INTERNAL = 2 - GBP_API_SUBNET_STITCHED_EXTERNAL = 3 - GBP_API_SUBNET_L3_OUT = 4 - GBP_API_SUBNET_ANON_L3_OUT = 5 - - -class GBPExtItfFlags(IntEnum): - """GBP External Interface Flags.""" - GBP_API_EXT_ITF_F_NONE = 0 - GBP_API_EXT_ITF_F_ANON = 1 - - -class GBPRuleAction(IntEnum): - """GBP Rule Action.""" - GBP_API_RULE_PERMIT = 1 - GBP_API_RULE_DENY = 2 - GBP_API_RULE_REDIRECT = 3 - - -class GBPHashMode(IntEnum): - """GBP Hash Mode.""" - GBP_API_HASH_MODE_SRC_IP = 1 - GBP_API_HASH_MODE_DST_IP = 2 - GBP_API_HASH_MODE_SYMETRIC = 3 - - -class GBP: - """GBP utilities.""" - - @staticmethod - def gbp_route_domain_add( - node, rd_id=1, ip4_table_id=1, ip6_table_id=0, - ip4_uu_sw_if_index=0xffffffff, ip6_uu_sw_if_index=0xffffffff): - """Add GBP route domain. - - :param node: Node to add GBP route domain on. - :param rd_id: GBP route domain ID. - :param ip4_table_id: IPv4 table. - :param ip6_table_id: IPv6 table. - :param ip4_uu_sw_if_index: IPv4 unicast interface index. - :param ip6_uu_sw_if_index: IPv6 unicast interface index. - :type node: dict - :type rd_id: int - :type ip4_table_id: int - :type ip6_table_id: int - :type ip4_uu_sw_if_index: int - :type ip6_uu_sw_if_index: int - """ - cmd = u"gbp_route_domain_add" - err_msg = f"Failed to add GBP route domain on {node[u'host']}!" - - args_in = dict( - rd=dict( - rd_id=rd_id, - ip4_table_id=ip4_table_id, - ip6_table_id=ip6_table_id, - ip4_uu_sw_if_index=ip4_uu_sw_if_index, - ip6_uu_sw_if_index=ip6_uu_sw_if_index - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_bridge_domain_add( - node, bvi_sw_if_index, bd_id=1, rd_id=1, - uu_fwd_sw_if_index=0xffffffff, bm_flood_sw_if_index=0xffffffff): - """Add GBP bridge domain. - - :param node: Node to add GBP bridge domain on. - :param bvi_sw_if_index: SW index of BVI/loopback interface. - :param bd_id: GBP bridge domain ID. - :param rd_id: GBP route domain ID. - :param uu_fwd_sw_if_index: Unicast forward interface index. - :param bm_flood_sw_if_index: Bcast/Mcast flood interface index. - :type node: dict - :type bvi_sw_if_index: int - :type bd_id: int - :type rd_id: int - :type uu_fwd_sw_if_index: int - :type bm_flood_sw_if_index: int - """ - cmd = u"gbp_bridge_domain_add" - err_msg = f"Failed to add GBP bridge domain on {node[u'host']}!" - - args_in = dict( - bd=dict( - flags=getattr( - GBPBridgeDomainFlags, u"GBP_BD_API_FLAG_NONE" - ).value, - bvi_sw_if_index=bvi_sw_if_index, - uu_fwd_sw_if_index=uu_fwd_sw_if_index, - bm_flood_sw_if_index=bm_flood_sw_if_index, - bd_id=bd_id, - rd_id=rd_id - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_endpoint_group_add( - node, sclass, bd_id=1, rd_id=1, vnid=1, - uplink_sw_if_index=0xffffffff, remote_ep_timeout=0xffffffff): - """Add GBP endpoint group. - - :param node: Node to add GBP endpoint group on. - :param sclass: Source CLASS. - :param bd_id: GBP bridge domain ID. - :param rd_id: GBP route domain ID. - :param uplink_sw_if_index: Uplink interface index. - :param remote_ep_timeout: Remote endpoint interface index. - :param vnid: VNID. - :type node: dict - :type sclass: int - :type bd_id: int - :type rd_id: int - :type vnid: int - :type uplink_sw_if_index: int - :type remote_ep_timeout: int - """ - cmd = u"gbp_endpoint_group_add" - err_msg = f"Failed to add GBP endpoint group on {node[u'host']}!" - - args_in = dict( - epg=dict( - uplink_sw_if_index=uplink_sw_if_index, - bd_id=bd_id, - rd_id=rd_id, - vnid=vnid, - sclass=sclass, - retention=dict( - remote_ep_timeout=remote_ep_timeout - ) - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_endpoint_add(node, sw_if_index, ip_addr, mac_addr, sclass): - """Add GBP endpoint. - - :param node: Node to add GBP endpoint on. - :param sw_if_index: SW index of interface. - :param ip_addr: GBP route domain ID. - :param mac_addr: MAC address. - :param sclass: Source CLASS. - :type node: dict - :type sw_if_index: int - :type ip_addr: str - :type mac_addr: str - :type sclass: int - """ - cmd = u"gbp_endpoint_add" - err_msg = f"Failed to add GBP endpoint on {node[u'host']}!" - - ips = list() - ips.append(IPAddress.create_ip_address_object(ip_address(ip_addr))) - tun_src = IPAddress.create_ip_address_object(ip_address(u"0.0.0.0")) - tun_dst = IPAddress.create_ip_address_object(ip_address(u"0.0.0.0")) - - args_in = dict( - endpoint=dict( - sw_if_index=sw_if_index, - ips=ips, - n_ips=len(ips), - mac=L2Util.mac_to_bin(mac_addr), - sclass=sclass, - flags=getattr( - GBPEndpointFlags, u"GBP_API_ENDPOINT_FLAG_EXTERNAL" - ).value, - tun=dict( - src=tun_src, - dst=tun_dst - ) - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_ext_itf_add_del(node, sw_if_index, bd_id=1, rd_id=1): - """Add external interface to GBP. - - :param node: Node to add external GBP interface on. - :param sw_if_index: SW index of interface. - :param bd_id: GBP bridge domain ID. - :param rd_id: GBP route domain ID. - :type node: dict - :type sw_if_index: int - :type bd_id: int - :type rd_id: int - """ - cmd = u"gbp_ext_itf_add_del" - err_msg = u"Failed to add external GBP interface on {node[u'host']}!" - - args_in = dict( - is_add=True, - ext_itf=dict( - sw_if_index=sw_if_index, - bd_id=bd_id, - rd_id=rd_id, - flags=getattr(GBPExtItfFlags, u"GBP_API_EXT_ITF_F_NONE").value - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_subnet_add_del( - node, address, subnet_length, sclass, rd_id=1, - sw_if_index=0xffffffff): - """Add external interface to GBP. - - :param node: Node to add GBP subnet on. - :param address: IPv4 adddress. - :param subnet_length: IPv4 address subnet. - :param sclass: Source CLASS. - :param rd_id: GBP route domain ID. - :param sw_if_index: Interface index. - :type node: dict - :type address: int - :type subnet_length: int - :type sclass: int - :type rd_id: int - :type sw_if_index: int - """ - cmd = u"gbp_subnet_add_del" - err_msg = f"Failed to add GBP subnet on {node[u'host']}!" - - args_in = dict( - is_add=True, - subnet=dict( - type=getattr(GBPSubnetType, u"GBP_API_SUBNET_L3_OUT").value, - sw_if_index=sw_if_index, - sclass=sclass, - prefix=dict( - address=IPAddress.create_ip_address_object( - ip_address(address) - ), - len=int(subnet_length) - ), - rd_id=rd_id - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) - - @staticmethod - def gbp_contract_add_del(node, sclass, dclass, acl_index=0, hash_mode=None): - """Add GBP contract. - - :param node: Node to add GBP contract on. - :param sclass: Source CLASS. - :param dclass: Destination CLASS. - :param acl_index: Index of ACL rule. - :param hash_mode: GBP contract hash mode. - :type node: dict - :type sclass: int - :type dclass: int - :type acl_index: int - :type hash_mode: str - """ - cmd = u"gbp_contract_add_del" - err_msg = f"Failed to add GBP contract on {node[u'host']}!" - - hash_mode = u"GBP_API_HASH_MODE_SRC_IP" if hash_mode is None \ - else hash_mode - rule_permit = dict( - action=getattr(GBPRuleAction, u"GBP_API_RULE_PERMIT").value, - nh_set=dict( - hash_mode=getattr(GBPHashMode, hash_mode).value, - n_nhs=8, - nhs=[dict()]*8, - ) - ) - rules = [rule_permit, rule_permit] - - args_in = dict( - is_add=True, - contract=dict( - acl_index=acl_index, - sclass=sclass, - dclass=dclass, - n_rules=len(rules), - rules=rules, - n_ether_types=16, - allowed_ethertypes=[0x800, 0x86dd] + [0]*14 - ) - ) - - with PapiSocketExecutor(node) as papi_exec: - papi_exec.add(cmd, **args_in).get_reply(err_msg) diff --git a/resources/libraries/robot/features/gbp.robot b/resources/libraries/robot/features/gbp.robot deleted file mode 100644 index fc1c9faba4..0000000000 --- a/resources/libraries/robot/features/gbp.robot +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (c) 2020 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -*** Settings *** -| Library | resources.libraries.python.GBP -| -| Documentation | GBP keywords. - -*** Keywords *** -| Initialize GBP routing domains on node -| | [Documentation] -| | ... | Initialize GBP routing domains on node. -| | -| | ... | *Arguments:* -| | ... | - dut - DUT node. Type: string -| | ... | - count - Number of baseline interface variables. Type: integer -| | -| | ... | *Example:* -| | -| | ... | \| Initialize GBP routing domains on node \| DUT1 \| 1 \| -| | -| | [Arguments] | ${dut} | ${count}=${1} -| | -| | FOR | ${id} | IN RANGE | 1 | ${count} + 1 -| | | ${hexa_id}= | Convert To Hex | ${id} | length=2 | lowercase=yes -| | | ${dut_lo}= | VPP Create Loopback | ${nodes['${dut}']} -| | | ... | mac=ba:dc:00:ff:ee:${hexa_id} -| | | Set Interface State -| | | ... | ${nodes['${dut}']} | ${dut_lo} | up -| | | Add Fib Table -| | | ... | ${nodes['${dut}']} | ${id} -| | | GBP Route Domain Add -| | | ... | ${nodes['${dut}']} | rd_id=${id} -| | | Assign Interface To Fib Table -| | | ... | ${nodes['${dut}']} | ${dut_lo} | ${id} -| | | Create L2 BD -| | | ... | ${nodes['${dut}']} | ${id} | arp_term=${1} -| | | GBP Bridge Domain Add -| | | ... | ${nodes['${dut}']} | ${dut_lo} | bd_id=${id} -| | | GBP Endpoint Group Add -| | | ... | ${nodes['${dut}']} | ${100} | bd_id=${id} | rd_id=${id} -| | | VPP Interface Set IP Address -| | | ... | ${nodes['${dut}']} | ${dut_lo} | 1.1.1.1 | 24 -| | | GBP Subnet Add Del -| | | ... | ${nodes['${dut}']} | 1.1.1.0 | 24 | ${100} | rd_id=${id} -| | | GBP Ext Itf Add Del -| | | ... | ${nodes['${dut}']} | ${dut_lo} | bd_id=${id} | rd_id=${id} -| | | GBP Endpoint Add -| | | ... | ${nodes['${dut}']} | ${${dut}_${int}1_${id}}[0] -| | | ... | 1.1.1.100 | ${TG_pf1_mac}[0] | ${100} -| | | GBP Endpoint Add -| | | ... | ${nodes['${dut}']} | ${${dut}_${int}2_${id}}[0] -| | | ... | 1.1.1.200 | ${TG_pf2_mac}[0] | ${100} -| | | VPP Route Add -| | | ... | ${nodes['${dut}']} | 10.10.10.0 | 24 | gateway=1.1.1.100 -| | | ... | interface=${dut_lo} | vrf=${1} -| | | VPP Route Add -| | | ... | ${nodes['${dut}']} | 20.20.20.0 | 24 | gateway=1.1.1.200 -| | | ... | interface=${dut_lo} | vrf=${1} -| | | GBP Subnet Add Del -| | | ... | ${nodes['${dut}']} | 10.10.10.0 | 24 | ${200} | rd_id=${id} -| | | GBP Subnet Add Del -| | | ... | ${nodes['${dut}']} | 20.20.20.0 | 24 | ${300} | rd_id=${id} -| | | Add Replace Acl Multi Entries -| | | ... | ${nodes['${dut}']} -| | | ... | rules="ipv4 permit src 0.0.0.0/0 dst 0.0.0.0/0 proto 61" -| | | ... | tag="gbp-permit-200-300" -| | | GBP Contract Add Del -| | | ... | ${nodes['${dut}']} | ${200} | ${300} | acl_index=${0} -| | | GBP Contract Add Del -| | | ... | ${nodes['${dut}']} | ${300} | ${200} | acl_index=${0} -| | END - -| Initialize GBP routing domains -| | [Documentation] -| | ... | Initialize GBP routing domains on all DUTs. -| | -| | ... | *Arguments:* -| | ... | - count - Number of GBP routing domains. Type: integer -| | -| | ... | *Example:* -| | -| | ... | \| Initialize GBP routing domains \| 1 \| -| | -| | [Arguments] | ${count}=${1} -| | -| | FOR | ${dut} | IN | @{duts} -| | | Initialize GBP routing domains on node | ${dut} | count=${count} -| | END -| | Set interfaces in path up diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index 4f83d1c193..641cfa5cb1 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -44,7 +44,6 @@ | Resource | resources/libraries/robot/lb/load_balancer.robot | Resource | resources/libraries/robot/crypto/ipsec.robot | Resource | resources/libraries/robot/features/acl.robot -| Resource | resources/libraries/robot/features/gbp.robot | Resource | resources/libraries/robot/features/policer.robot | Resource | resources/libraries/robot/ip/ip4.robot | Resource | resources/libraries/robot/ip/ip6.robot |