aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries')
-rw-r--r--resources/libraries/python/InterfaceUtil.py33
-rw-r--r--resources/libraries/python/L2Util.py30
-rw-r--r--resources/libraries/robot/l2_traffic.robot36
-rw-r--r--resources/libraries/robot/tagging.robot166
4 files changed, 198 insertions, 67 deletions
diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py
index 2e44e913aa..2eea8e6f1b 100644
--- a/resources/libraries/python/InterfaceUtil.py
+++ b/resources/libraries/python/InterfaceUtil.py
@@ -580,28 +580,41 @@ class InterfaceUtil(object):
return {}
@staticmethod
- def create_subinterface(node, interface, sub_id, outer_vlan_id,
- inner_vlan_id, type_subif):
- """Create sub-interface on node.
+ def create_subinterface(node, interface, sub_id, outer_vlan_id=None,
+ inner_vlan_id=None, type_subif=None):
+ """Create sub-interface on node. It is possible to set required
+ sub-interface type and VLAN tag(s).
:param node: Node to add sub-interface.
:param interface: Interface name on which create sub-interface.
:param sub_id: ID of the sub-interface to be created.
- :param outer_vlan_id: Outer VLAN ID.
- :param inner_vlan_id: Inner VLAN ID.
- :param type_subif: Type of sub-interface.
+ :param outer_vlan_id: Optional outer VLAN ID.
+ :param inner_vlan_id: Optional inner VLAN ID.
+ :param type_subif: Optional type of sub-interface. Values supported by
+ VPP: [no_tags] [one_tag] [two_tags] [dot1ad] [exact_match] [default_sub]
:type node: dict
:type interface: str or int
:type sub_id: int
:type outer_vlan_id: int
:type inner_vlan_id: int
:type type_subif: str
- :return: name and index of created sub-interface
+ :return: Name and index of created sub-interface.
:rtype: tuple
+ :raises RuntimeError: If it is not possible to create sub-interface.
"""
+ outer_vlan_id = 'outer_vlan_id {0}'.format(outer_vlan_id)\
+ if outer_vlan_id else ''
+
+ inner_vlan_id = 'inner_vlan_id {0}'.format(inner_vlan_id)\
+ if inner_vlan_id else ''
+
+ if type_subif is None:
+ type_subif = ''
+
if isinstance(interface, basestring):
- sw_if_index = Topology.get_interface_sw_index(node, interface)
+ iface_key = Topology.get_interface_by_name(node, interface)
+ sw_if_index = Topology.get_interface_sw_index(node, iface_key)
else:
sw_if_index = interface
@@ -617,10 +630,10 @@ class InterfaceUtil(object):
logger.trace('Created subinterface with index {}'
.format(sw_subif_index))
else:
- raise RuntimeError('Unable to create subinterface on node {}'
+ raise RuntimeError('Unable to create sub-interface on node {}'
.format(node['host']))
- with VatTerminal(node) as vat:
+ with VatTerminal(node, json_param=False) as vat:
vat.vat_terminal_exec_cmd('exec show interfaces')
name = '{}.{}'.format(interface, sub_id)
diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py
index db550f0640..af4735fdf8 100644
--- a/resources/libraries/python/L2Util.py
+++ b/resources/libraries/python/L2Util.py
@@ -280,33 +280,43 @@ class L2Util(object):
return data
@staticmethod
- def l2_tag_rewrite(node, interface, tag_rewrite_method, tag1_id=None):
- """Rewrite tags in frame.
+ def l2_vlan_tag_rewrite(node, interface, tag_rewrite_method,
+ push_dot1q=True, tag1_id=None, tag2_id=None):
+ """Rewrite tags in ethernet frame.
:param node: Node to rewrite tags.
:param interface: Interface on which rewrite tags.
:param tag_rewrite_method: Method of tag rewrite.
+ :param push_dot1q: Optional parameter to disable to push dot1q tag
+ instead of dot1ad.
:param tag1_id: Optional tag1 ID for VLAN.
+ :param tag2_id: Optional tag2 ID for VLAN.
:type node: dict
:type interface: str or int
- :type tag_rewrite_method : str
+ :type tag_rewrite_method: str
+ :type push_dot1q: bool
:type tag1_id: int
+ :type tag2_id: int
"""
- if tag1_id is None:
- tag1_id = ''
- else:
- tag1_id = 'tag1 {0}'.format(tag1_id)
+ push_dot1q = 'push_dot1q 0' if not push_dot1q else ''
+
+ tag1_id = 'tag1 {0}'.format(tag1_id) if tag1_id else ''
+ tag2_id = 'tag2 {0}'.format(tag2_id) if tag2_id else ''
+
if isinstance(interface, basestring):
- sw_if_index = Topology.get_interface_sw_index(node, interface)
+ iface_key = Topology.get_interface_by_name(node, interface)
+ sw_if_index = Topology.get_interface_sw_index(node, iface_key)
else:
sw_if_index = interface
with VatTerminal(node) as vat:
- vat.vat_terminal_exec_cmd_from_template("l2_tag_rewrite.vat",
+ vat.vat_terminal_exec_cmd_from_template("l2_vlan_tag_rewrite.vat",
sw_if_index=sw_if_index,
tag_rewrite_method=
tag_rewrite_method,
- tag1_optional=tag1_id)
+ push_dot1q=push_dot1q,
+ tag1_optional=tag1_id,
+ tag2_optional=tag2_id)
@staticmethod
def delete_bridge_domain_vat(node, bd_id):
diff --git a/resources/libraries/robot/l2_traffic.robot b/resources/libraries/robot/l2_traffic.robot
index d8e24b8420..156497efaa 100644
--- a/resources/libraries/robot/l2_traffic.robot
+++ b/resources/libraries/robot/l2_traffic.robot
@@ -12,14 +12,15 @@
# limitations under the License.
*** Settings ***
-| Documentation | Keywords for send and receive different types of traffic through L2 network.
+| Documentation | Keywords to send and receive different types of traffic \
+| ... | through L2 network.
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.TrafficScriptExecutor
*** Keywords ***
| Send and receive ICMP Packet
-| | [Documentation] | Send ICMPv4/ICMPv6 echo request from source interface to
-| | ... | destination interface.
+| | [Documentation] | Send ICMPv4/ICMPv6 echo request from source interface to \
+| | ... | destination interface. Dot1q or Dot1ad tag(s) can be set.
| | ...
| | ... | *Arguments:*
| | ...
@@ -28,6 +29,9 @@
| | ... | - dst_int - Destination interface. Type: string
| | ... | - src_ip - Source IP address (Optional). Type: string
| | ... | - dst_ip - Destination IP address (Optional). Type: string
+| | ... | - encaps - Encapsulation: Dot1q or Dot1ad (Optional). Type: string
+| | ... | - vlan1 - VLAN (outer) tag (Optional). Type: integer
+| | ... | - vlan2 - VLAN inner tag (Optional). Type: integer
| | ...
| | ... | *Return:*
| | ...
@@ -39,15 +43,27 @@
| | ...
| | ... | \| Send and receive ICMP Packet \| ${nodes['TG']} \
| | ... | \| ${tg_to_dut_if1} \| ${tg_to_dut_if2} \|
-| | ...
-| | [Arguments] | ${tg_node} | ${src_int} | ${dst_int} |
-| | ... | ${src_ip}=192.168.100.1 | ${dst_ip}=192.168.100.2
+| | ... | \| Send and receive ICMP Packet \| ${nodes['TG']} \| ${tg_to_dut1} \
+| | ... | \| ${tg_to_dut2} \| encaps=Dot1q \| vlan1=100 \|
+| | ... | \| Send and receive ICMP Packet \| ${nodes['TG']} \| ${tg_to_dut1} \
+| | ... | \| ${tg_to_dut2} \| encaps=Dot1ad \| vlan1=110 \| vlan2=220 \|
+| | ...
+| | [Arguments] | ${tg_node} | ${src_int} | ${dst_int}
+| | ... | ${src_ip}=192.168.100.1 | ${dst_ip}=192.168.100.2 | ${encaps}=${EMPTY}
+| | ... | ${vlan1}=${EMPTY} | ${vlan2}=${EMPTY}
| | ${src_mac}= | Get Interface Mac | ${tg_node} | ${src_int}
| | ${dst_mac}= | Get Interface Mac | ${tg_node} | ${dst_int}
| | ${src_int_name}= | Get interface name | ${tg_node} | ${src_int}
| | ${dst_int_name}= | Get interface name | ${tg_node} | ${dst_int}
-| | ${args}= | Traffic Script Gen Arg | ${dst_int_name} | ${src_int_name} | ${src_mac}
-| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip}
+| | ${args}= | Traffic Script Gen Arg | ${dst_int_name} | ${src_int_name}
+| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip}
+| | ${args1}= | Run Keyword Unless | '${encaps}' == '${EMPTY}' | Catenate
+| | ... | --encaps ${encaps} | --vlan1 ${vlan1}
+| | ${args2}= | Run Keyword Unless | '${vlan2}' == '${EMPTY}' | Set Variable
+| | ... | --vlan2 ${vlan2}
+| | ${args}= | Run Keyword If | '${args1}' == 'None' | Set Variable | ${args}
+| | ... | ELSE IF | '${args2}' == 'None' | Catenate | ${args} | ${args1}
+| | ... | ELSE | Catenate | ${args} | ${args1} | ${args2}
| | Run Traffic Script On Node | send_ip_icmp.py | ${tg_node} | ${args}
| Send and receive ICMP Packet should failed
@@ -80,8 +96,8 @@
| | ${dst_mac}= | Get Interface Mac | ${tg_node} | ${dst_int}
| | ${src_int_name}= | Get interface name | ${tg_node} | ${src_int}
| | ${dst_int_name}= | Get interface name | ${tg_node} | ${dst_int}
-| | ${args}= | Traffic Script Gen Arg | ${dst_int_name} | ${src_int_name} | ${src_mac}
-| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip}
+| | ${args}= | Traffic Script Gen Arg | ${dst_int_name} | ${src_int_name}
+| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip}
| | Run Keyword And Expect Error | ICMP echo Rx timeout |
| | ... | Run Traffic Script On Node | send_ip_icmp.py | ${tg_node} | ${args}
diff --git a/resources/libraries/robot/tagging.robot b/resources/libraries/robot/tagging.robot
index 7d1d2feb81..363ac58f98 100644
--- a/resources/libraries/robot/tagging.robot
+++ b/resources/libraries/robot/tagging.robot
@@ -27,27 +27,29 @@
| | [Documentation] | *Create two subinterfaces on DUTs.*
| | ...
| | ... | *Arguments:*
-| | ... | - ${DUT1} - Node to add sub-interface.
-| | ... | - ${INT1} - Interface name on which create sub-interface.
-| | ... | - ${DUT2} - Node to add sub-interface.
-| | ... | - ${INT2} - Interface name on which create sub-interface.
-| | ... | - ${SUB_ID} - ID of the sub-interface to be created.
-| | ... | - ${OUTER_VLAN_ID} - Outer VLAN ID.
-| | ... | - ${INNER_VLAN_ID} - Inner VLAN ID.
-| | ... | - ${TYPE_SUBIF} - Type of sub-interface.
+| | ... | - DUT1 - Node to add sub-interface.
+| | ... | - INT1 - Interface name on which create sub-interface.
+| | ... | - DUT2 - Node to add sub-interface.
+| | ... | - INT2 - Interface name on which create sub-interface.
+| | ... | - SUB_ID - ID of the sub-interface to be created.
+| | ... | - OUTER_VLAN_ID - Outer VLAN ID.
+| | ... | - INNER_VLAN_ID - Inner VLAN ID.
+| | ... | - TYPE_SUBIF - Type of sub-interface.
| | ...
| | ... | _Set testcase variables with name and index of created interfaces:_
-| | ... | - ${subif_name_1}
-| | ... | - ${subif_index_1}
-| | ... | - ${subif_name_2}
-| | ... | - ${subif_index_2}
+| | ... | - subif_name_1
+| | ... | - subif_index_1
+| | ... | - subif_name_2
+| | ... | - subif_index_2
| | ...
+| | ${INT1_name}= | Get interface name | ${DUT1} | ${INT1}
| | ${subif_name_1} | ${subif_index_1}= | Create subinterface | ${DUT1}
-| | ... | ${INT1} | ${SUB_ID}
+| | ... | ${INT1_name} | ${SUB_ID}
| | ... | ${OUTER_VLAN_ID} | ${INNER_VLAN_ID}
| | ... | ${TYPE_SUBIF}
+| | ${INT2_name}= | Get interface name | ${DUT1} | ${INT2}
| | ${subif_name_2} | ${subif_index_2}= | Create subinterface | ${DUT2}
-| | ... | ${INT2} | ${SUB_ID}
+| | ... | ${INT2_name} | ${SUB_ID}
| | ... | ${OUTER_VLAN_ID} | ${INNER_VLAN_ID}
| | ... | ${TYPE_SUBIF}
| | Set Interface State | ${DUT1} | ${subif_index_1} | up
@@ -62,17 +64,17 @@
| | [Documentation] | *Create two dot1q subinterfaces on DUTs.*
| | ...
| | ... | *Arguments:*
-| | ... | - ${DUT1} - Node to add sub-interface.
-| | ... | - ${INT1} - Interface name on which create VLAN sub-interface.
-| | ... | - ${DUT2} - Node to add sub-interface.
-| | ... | - ${INT2} - Interface name on which create VLAN sub-interface.
-| | ... | - ${SUB_ID} - ID of the sub-interface to be created.
+| | ... | - DUT1 - Node to add sub-interface.
+| | ... | - INT1 - Interface name on which create VLAN sub-interface.
+| | ... | - DUT2 - Node to add sub-interface.
+| | ... | - INT2 - Interface name on which create VLAN sub-interface.
+| | ... | - SUB_ID - ID of the sub-interface to be created.
| | ...
| | ... | _Set testcase variables with name and index of created interfaces:_
-| | ... | - ${subif_name_1}
-| | ... | - ${subif_index_1}
-| | ... | - ${subif_name_2}
-| | ... | - ${subif_index_2}
+| | ... | - subif_name_1
+| | ... | - subif_index_1
+| | ... | - subif_name_2
+| | ... | - subif_index_2
| | ...
| | ... | *Example:*
| | ...
@@ -99,14 +101,14 @@
| | [Documentation] | *Setup tag rewrite on sub-interfaces on DUTs.*
| | ...
| | ... | *Arguments:*
-| | ... | - ${DUT1} - Node to rewrite tags.
-| | ... | - ${SUB_INT1} - Interface on which rewrite tags.
-| | ... | - ${DUT2} - Node to rewrite tags.
-| | ... | - ${SUB_INT2} - Interface on which rewrite tags.
-| | ... | - ${TAG_REWRITE_METHOD} - Method of tag rewrite.
-| | ...
-| | L2 tag rewrite | ${DUT1} | ${SUB_INT1} | ${TAG_REWRITE_METHOD}
-| | L2 tag rewrite | ${DUT2} | ${SUB_INT2} | ${TAG_REWRITE_METHOD}
+| | ... | - DUT1 - Node to rewrite tags.
+| | ... | - SUB_INT1 - Interface on which rewrite tags.
+| | ... | - DUT2 - Node to rewrite tags.
+| | ... | - SUB_INT2 - Interface on which rewrite tags.
+| | ... | - TAG_REWRITE_METHOD - Method of tag rewrite.
+| | ...
+| | L2 Vlan tag rewrite | ${DUT1} | ${SUB_INT1} | ${TAG_REWRITE_METHOD}
+| | L2 Vlan tag rewrite | ${DUT2} | ${SUB_INT2} | ${TAG_REWRITE_METHOD}
| Interfaces and VLAN sub-interfaces inter-connected using L2-xconnect
| | [Arguments] | ${DUT1} | ${INT1} | ${SUB_INT1}
@@ -115,12 +117,102 @@
| | ... | L2-xconnect on DUTs.*
| | ...
| | ... | *Arguments:*
-| | ... | - ${DUT1} - Node to add bidirectional cross-connect.
-| | ... | - ${INT1} - Interface to add to the cross-connect.
-| | ... | - ${SUB_INT1} - Sub-interface to add to the cross-connect.
-| | ... | - ${DUT2} - Node to add bidirectional cross-connect.
-| | ... | - ${INT2} - Interface to add to the cross-connect.
-| | ... | - ${SUB_INT2} - Sub-interface to add to the cross-connect.
+| | ... | - DUT1 - Node to add bidirectional cross-connect.
+| | ... | - INT1 - Interface to add to the cross-connect.
+| | ... | - SUB_INT1 - Sub-interface to add to the cross-connect.
+| | ... | - DUT2 - Node to add bidirectional cross-connect.
+| | ... | - INT2 - Interface to add to the cross-connect.
+| | ... | - SUB_INT2 - Sub-interface to add to the cross-connect.
| | ...
| | L2 setup xconnect on DUT | ${DUT1} | ${INT1} | ${SUB_INT1}
| | L2 setup xconnect on DUT | ${DUT2} | ${INT2} | ${SUB_INT2}
+
+| Vlan Subinterface Created
+| | [Documentation] | Create VLAN sub-interface on DUT.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node to add VLAN sub-intreface. Type: dictionary
+| | ... | - interface - Interface to create VLAN sub-interface. Type: string
+| | ... | - vlan_id - VLAN ID. Type: integer
+| | ...
+| | ... | *Return:*
+| | ... | - vlan_name - VLAN sub-interface name. Type: string
+| | ... | - vlan_index - VLAN sub-interface SW index. Type: integer
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Vlan Subinterface Created \| ${nodes['DUT1']} \| port3 \| 100 \|
+| | ...
+| | [Arguments] | ${dut_node} | ${interface} | ${vlan_id}
+| | [Return] | ${vlan_name} | ${vlan_index}
+| | ${interface_name}= | Get interface name | ${dut_node} | ${interface}
+| | ${vlan_name} | ${vlan_index}= | Create Vlan Subinterface
+| | ... | ${dut_node} | ${interface_name} | ${vlan_id}
+
+| Tagged Subinterface Created
+| | [Documentation] | Create tagged sub-interface on DUT. Type of tagged \
+| | ... | sub-intreface depends on type_subif value:
+| | ... | - one_tag -> VLAN
+| | ... | - two_tags -> QinQ VLAN
+| | ... | - two_tags dot1ad - DOT1AD
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node to add VLAN sub-intreface. Type: dictionary
+| | ... | - interface - Interface to create tagged sub-interface. Type: string
+| | ... | - subif_id - Sub-interface ID. Type: integer
+| | ... | - outer_vlan_id - VLAN (outer) ID (Optional). Type: integer
+| | ... | - inner_vlan_id - VLAN inner ID (Optional). Type: integer
+| | ... | - type_subif - Sub-interface type (Optional). Type: string
+| | ...
+| | ... | *Return:*
+| | ... | - subif_name - Sub-interface name. Type: string
+| | ... | - subif_index - Sub-interface SW index. Type: integer
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Tagged Subinterface Created \| ${nodes['DUT1']} \| port1 \| 10 \
+| | ... | \| outer_vlan_id=100 \| inner_vlan_id=200 \
+| | ... | \| type_subif=two_tags dot1ad \|
+| | ...
+| | [Arguments] | ${dut_node} | ${interface} | ${subif_id}
+| | ... | ${outer_vlan_id}=${None} | ${inner_vlan_id}=${None}
+| | ... | ${type_subif}=${None}
+| | [Return] | ${subif_name} | ${subif_index}
+| | ${interface_name}= | Get interface name | ${dut_node} | ${interface}
+| | ${subif_name} | ${subif_index}= | Create Subinterface
+| | ... | ${dut_node} | ${interface_name} | ${subif_id}
+| | ... | outer_vlan_id=${outer_vlan_id} | inner_vlan_id=${inner_vlan_id}
+| | ... | type_subif=${type_subif}
+
+| L2 Tag Rewrite Method Is Set On Interface
+| | [Documentation] | Set L2 tag rewrite on (sub-)interface on DUT
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node to set L2 tag rewrite method. Type: dictionary
+| | ... | - interface - (Sub-)interface name or SW index to set L2 tag rewrite
+| | ... | method. Type: string or integer
+| | ... | - tag_rewrite_method - Tag rewrite method. Type: string
+| | ... | - push_dot1q - True to push tags as Dot1q, False to push tags as
+| | ... | Dot1ad (Optional). Type: boolean
+| | ... | - tag1_id - VLAN tag1 ID (Optional). Type: integer
+| | ... | - tag2_id - VLAN tag2 ID (Optional). Type: integer
+| | ...
+| | ... | *Return:*
+| | ...
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| L2 Tag Rewrite Method Is Set On Interface \| ${nodes['DUT1']} \
+| | ... | \| 9 \| pop-1 \|
+| | ... | \| L2 Tag Rewrite Method Is Set On Interface \| ${nodes['DUT2']} \
+| | ... | \| 10 \| translate-1-2 \| push_dot1q=${False} \| tag1_id=10 \
+| | ... | \| tag1_id=20 \|
+| | ...
+| | [Arguments] | ${dut_node} | ${interface} | ${tag_rewrite_method}
+| | ... | ${push_dot1q}=${True} | ${tag1_id}=${None} | ${tag2_id}=${None}
+| | ${result}= | Evaluate | isinstance($interface, int)
+| | ${interface_name}= | Run Keyword If | ${result} | Set Variable | ${interface}
+| | ... | ELSE | Get interface name | ${dut_node} | ${interface}
+| | L2 Vlan Tag Rewrite | ${dut_node} | ${interface_name} | ${tag_rewrite_method}
+| | ... | push_dot1q=${push_dot1q} | tag1_id=${tag1_id} | tag2_id=${tag2_id}