CSIT-529 HC Test: SLAAC 43/6043/13
authorjan.hradil <jan.hradil@pantheon.tech>
Thu, 30 Mar 2017 07:55:30 +0000 (09:55 +0200)
committerTibor Frank <tifrank@cisco.com>
Tue, 11 Apr 2017 10:36:54 +0000 (10:36 +0000)
Change-Id: I14525a36d614372b7b418f1c10f95c371b7b8545
Signed-off-by: jan.hradil <jan.hradil@pantheon.tech>
resources/libraries/python/honeycomb/Routing.py
resources/libraries/robot/honeycomb/slaac.robot [new file with mode: 0644]
resources/templates/honeycomb/config_slaac.url [new file with mode: 0644]
resources/test_data/honeycomb/slaac_variables.py [new file with mode: 0644]
tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot [new file with mode: 0644]

index d0f2389..c39031d 100644 (file)
@@ -16,6 +16,7 @@ Honeycomb REST API."""
 
 from robot.api import logger
 
 
 from robot.api import logger
 
+from resources.libraries.python.topology import Topology
 from resources.libraries.python.HTTPRequest import HTTPCodes
 from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
 from resources.libraries.python.honeycomb.HoneycombUtil \
 from resources.libraries.python.HTTPRequest import HTTPCodes
 from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
 from resources.libraries.python.honeycomb.HoneycombUtil \
@@ -199,3 +200,76 @@ class RoutingKeywords(object):
 
         with VatTerminal(node) as vat:
             vat.vat_terminal_exec_cmd("ip_fib_dump")
 
         with VatTerminal(node) as vat:
             vat.vat_terminal_exec_cmd("ip_fib_dump")
+
+    @staticmethod
+    def configure_interface_slaac(node, interface, slaac_data=None):
+        """Configure SLAAC on the specified interfaces.
+
+        :param node: Honeycomb node.
+        :param interface: Interface to configure SLAAC.
+        :param slaac_data: Dictionary of configurations to apply. \
+        If it is None then the existing configuration is removed.
+        :type node: dict
+        :type interface: str
+        :type slaac_data: dict of dicts
+        :returns: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If RA could not be configured.
+        """
+
+        interface = Topology.convert_interface_reference(
+            node, interface, 'name')
+        interface_orig = interface
+        interface = interface.replace('/', '%2F')
+        path = 'interface/' + interface
+
+        if not slaac_data:
+            status_code, _ = HcUtil.delete_honeycomb_data(
+                node, 'config_slaac', path)
+        else:
+            data = {
+                'interface': [
+                    {
+                        'name': interface_orig,
+                        'ipv6-router-advertisements': slaac_data
+                    }
+                ]
+            }
+
+            status_code, _ = HcUtil.put_honeycomb_data(
+                node, 'config_slaac', data, path)
+
+        if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
+            raise HoneycombError(
+                'Configuring SLAAC failed. Status code:{0}'.format(status_code))
+
+    @staticmethod
+    def get_interface_slaac_oper_data(node, interface):
+        """Get operational data about SLAAC table present on the node.
+
+        :param node: Honeycomb node.
+        :param interface: Interface SLAAC data are retrieved from.
+        :type node: dict
+        :type interface: str
+        :returns: dict of SLAAC operational data.
+        :rtype: dict
+        :raises HoneycombError: If status code differs from successful.
+        """
+        interface = Topology.convert_interface_reference(
+            node, interface, 'name')
+        interface = interface.replace('/', '%2F')
+        path = 'interface/' + interface
+
+        status_code, resp = HcUtil.\
+            get_honeycomb_data(node, "config_slaac", path)
+
+        if status_code != HTTPCodes.OK:
+            raise HoneycombError(
+                "Not possible to get operational information about SLAAC. "
+                "Status code: {0}.".format(status_code))
+        try:
+            dict_of_str = resp['interface'][0][
+                'hc2vpp-ietf-ipv6-unicast-routing:ipv6-router-advertisements']
+            return {k: str(v) for k, v in dict_of_str.items()}
+        except (KeyError, TypeError):
+            return {}
diff --git a/resources/libraries/robot/honeycomb/slaac.robot b/resources/libraries/robot/honeycomb/slaac.robot
new file mode 100644 (file)
index 0000000..87abf3c
--- /dev/null
@@ -0,0 +1,106 @@
+# Copyright (c) 2017 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.honeycomb.Routing.RoutingKeywords
+| Library | resources.libraries.python.Trace
+| Documentation | Keywords used to test SLAAC using Honeycomb.
+
+*** Keywords ***
+| Honeycomb Configures SLAAC
+| | [Documentation] | Uses Honeycomb API to configure SLAAC on the specified\
+| | ... | interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the node. Type: string
+| | ... | - slaac_data - data needed to configure SLAAC. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Honeycomb Configures SLAAC \| ${node} \| ${interface} \
+| | ... | \| ${slaac_data} \|
+| | ...
+| | [Arguments] | ${node} | ${interface} | ${slaac_data}
+| | Configure interface SLAAC
+| | ... | ${node} | ${interface} | ${slaac_data}
+
+| SLAAC configuration from Honeycomb should be
+| | [Documentation] | Retrieves SLAAC operational data and verifies that\
+| | ... | SLAAC is configured with the provided interfaces.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the node. Type: string
+| | ... | - slaac_data - data to compare configuration SLAAC with.\
+| | ... | Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| SLAAC configuration from Honeycomb should be \
+| | ... | \| ${node} \| ${interface} \| ${slaac_data} \|
+| | ...
+| | [Arguments] | ${node} | ${interface} | ${slaac_data}
+| | ${data}= | Get interface SLAAC oper data | ${node} | ${interface}
+| | Dictionaries should be equal | ${data} | ${slaac_data}
+
+| SLAAC configuration from Honeycomb should be empty
+| | [Documentation] | Checks whether SLAAC configuration from Honeycomb \
+| | ... | is empty.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the node. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| SLAAC configuration from Honeycomb should be empty \
+| | ... | \| ${node} \| ${interface} \|
+| | ...
+| | [Arguments] | ${node} | ${interface}
+| | Run keyword and expect error | HoneycombError*404*
+| | ... | Get interface SLAAC oper data | ${node} | ${interface}
+
+| Honeycomb removes SLAAC configuration
+| | [Documentation] | Uses Honeycomb API to remove SLAAC confirugation\
+| | ... | from the specified interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the node. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Honeycomb removes SLAAC configuration \
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \|
+| | ...
+| | [Arguments] | ${node} | ${interface}
+| | Configure interface SLAAC | ${node} | ${interface}
+
+| SLAAC test teardown
+| | [Documentation] | Uses Honeycomb API to remove SLAAC confirugation\
+| | ... | and reset interface state.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the node. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Honeycomb removes SLAAC configuration \
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \|
+| | ...
+| | [Arguments] | ${node} | ${interface}
+| | Honeycomb removes SLAAC configuration | ${node} | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | down
+| | Honeycomb removes interface ipv6 addresses | ${node} | ${interface}
diff --git a/resources/templates/honeycomb/config_slaac.url b/resources/templates/honeycomb/config_slaac.url
new file mode 100644 (file)
index 0000000..568ec76
--- /dev/null
@@ -0,0 +1 @@
+/restconf/config/hc2vpp-ietf-routing:routing/routing-instance/vpp-routing-instance/interfaces/
\ No newline at end of file
diff --git a/resources/test_data/honeycomb/slaac_variables.py b/resources/test_data/honeycomb/slaac_variables.py
new file mode 100644 (file)
index 0000000..c260eae
--- /dev/null
@@ -0,0 +1,64 @@
+# Copyright (c) 2017 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.
+
+"""Test variables for SLAAC test suite."""
+
+
+def get_variables():
+    """Create and return a dictionary of test variables for the specified
+    test case.
+
+    :returns: Dictionary of test variables - settings for Honeycomb's SLAAC.
+    :rtype: dict
+    """
+    slaac_data = {
+        "address": "10::10",
+        "prefix": 64,
+        "slaac_data": {
+            "send-advertisements": "True",
+            "min-rtr-adv-interval": "15",
+            "max-rtr-adv-interval": "100",
+            "default-lifetime": "601",
+            "vpp-routing-ra:suppress-link-layer": "False",
+            "vpp-routing-ra:initial-count": "3",
+            "vpp-routing-ra:initial-interval": "5"
+        },
+        "slaac_data_01": {
+            "send-advertisements": "True",
+            "min-rtr-adv-interval": "3",
+            "max-rtr-adv-interval": "4",
+            "default-lifetime": "8",
+            "vpp-routing-ra:suppress-link-layer": "True",
+            "vpp-routing-ra:initial-count": "1",
+            "vpp-routing-ra:initial-interval": "1"
+        },
+        "slaac_data_02": {
+            "send-advertisements": "False",
+            "min-rtr-adv-interval": "3",
+            "max-rtr-adv-interval": "4",
+            "default-lifetime": "5",
+            "vpp-routing-ra:suppress-link-layer": "False",
+            "vpp-routing-ra:initial-count": "1",
+            "vpp-routing-ra:initial-interval": "1"
+        },
+        "slaac_data_03": {
+            "send-advertisements": "False",
+            "min-rtr-adv-interval": "1350",
+            "max-rtr-adv-interval": "1800",
+            "default-lifetime": "9000",
+            "vpp-routing-ra:suppress-link-layer": "True",
+            "vpp-routing-ra:initial-count": "3",
+            "vpp-routing-ra:initial-interval": "16"
+        },
+    }
+    return slaac_data
diff --git a/tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot b/tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot
new file mode 100644 (file)
index 0000000..23370f0
--- /dev/null
@@ -0,0 +1,119 @@
+# Copyright (c) 2017 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.
+
+*** Variables ***
+# Interface to run tests on.
+| ${interface}= | ${node['interfaces']['port1']['name']}
+
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/honeycomb/honeycomb.robot
+| Resource | resources/libraries/robot/honeycomb/interfaces.robot
+| Resource | resources/libraries/robot/honeycomb/slaac.robot
+| Resource | resources/libraries/robot/testing_path.robot
+| Resource | resources/libraries/robot/traffic.robot
+| Suite Teardown
+| ... | Run Keyword If Any Tests Failed
+| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | honeycomb_sanity | honeycomb_odl
+| Documentation | *Honeycomb SLAAC management test suite.*
+| Variables | resources/test_data/honeycomb/slaac_variables.py
+
+*** Test Cases ***
+| TC01: Honeycomb can configure SLAAC
+| | [Documentation] | Checks if Honeycomb can congigure SLAAC.
+| | Given SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface ipv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
+| | Then SLAAC configuration from Honeycomb should be | ${node}
+| | ... | ${interface} | ${slaac_data}
+
+| TC02: Honeycomb can disable SLAAC
+| | [Documentation] | Checks if Honeycomb can disable SLAAC.
+| | Given SLAAC configuration from Honeycomb should be | ${node}
+| | ... | ${interface} | ${slaac_data}
+| | When Honeycomb removes SLAAC configuration | ${node} | ${interface}
+| | Then SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+
+| TC03: Honeycomb can configure SLAAC with suppress link layer disabled
+| | [Documentation] | Checks if Honeycomb can congigure SLAAC.
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | Given SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface ipv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
+| | Then SLAAC configuration from Honeycomb should be | ${node}
+| | ... | ${interface} | ${slaac_data}
+
+| TC04: Honeycomb can configure SLAAC with sending RA packets disabled
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | Given SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface ipv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_01}
+| | Then SLAAC configuration from Honeycomb should be | ${node} | ${interface}
+| | ... | ${slaac_data_01}
+
+| TC05: Honeycomb can configure SLAAC with min interval values
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | Given SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface ipv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_02}
+| | Then SLAAC configuration from Honeycomb should be | ${node} | ${interface}
+| | ... | ${slaac_data_02}
+
+| TC06: Honeycomb can configure SLAAC with max interval values
+| | [Documentation] | Checks if Honeycomb can configure SLAAC\
+| | ... | with given settings.
+| | [Teardown] | SLAAC test teardown | ${node} | ${interface}
+| | Given SLAAC configuration from Honeycomb should be empty | ${node}
+| | ... | ${interface}
+| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb sets interface ipv6 address | ${node} | ${interface}
+| | ... | ${address} | ${prefix}
+| | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_03}
+| | Then SLAAC configuration from Honeycomb should be | ${node} | ${interface}
+| | ... | ${slaac_data_03}
+
+| TC07: DUT retransmits RA on IPv6 enabled interface after a set interval
+| | [Documentation]
+| | ... | [Top] TG-DUT1-DUT2-TG.
+| | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG.
+| | ... | [Ver] Make TG wait for two IPv6 Router Advertisement packets\
+| | ... | to be sent by DUT1 and verify the received RA packets are correct.
+| | [Teardown] | SLAAC test teardown | ${dut_node} | ${dut_to_tg_if1}
+| | Given Path for 2-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Honeycomb sets interface ipv6 address
+| | ... | ${dut_node} | ${dut_to_tg_if1} | ${address} | ${prefix}
+| | And Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if1} | up
+| | When Honeycomb configures SLAAC | ${dut_node} | ${dut_to_tg_if1}
+| | ... | ${slaac_data}
+| | :FOR | ${n} | IN RANGE | ${2}
+| | | Then Receive And Check Router Advertisement Packet
+| | | ... | ${tg_node} | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac} | ${5}