diff options
-rw-r--r-- | resources/libraries/python/honeycomb/Routing.py | 74 | ||||
-rw-r--r-- | resources/libraries/robot/honeycomb/slaac.robot | 106 | ||||
-rw-r--r-- | resources/templates/honeycomb/config_slaac.url | 1 | ||||
-rw-r--r-- | resources/test_data/honeycomb/slaac_variables.py | 64 | ||||
-rw-r--r-- | tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot | 119 |
5 files changed, 364 insertions, 0 deletions
diff --git a/resources/libraries/python/honeycomb/Routing.py b/resources/libraries/python/honeycomb/Routing.py index d0f23892af..c39031d920 100644 --- a/resources/libraries/python/honeycomb/Routing.py +++ b/resources/libraries/python/honeycomb/Routing.py @@ -16,6 +16,7 @@ Honeycomb REST API.""" 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 \ @@ -199,3 +200,76 @@ class RoutingKeywords(object): 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 index 0000000000..87abf3c34f --- /dev/null +++ b/resources/libraries/robot/honeycomb/slaac.robot @@ -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 index 0000000000..568ec765e6 --- /dev/null +++ b/resources/templates/honeycomb/config_slaac.url @@ -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 index 0000000000..c260eae0ff --- /dev/null +++ b/resources/test_data/honeycomb/slaac_variables.py @@ -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 index 0000000000..23370f0043 --- /dev/null +++ b/tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot @@ -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} |