aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--resources/libraries/python/honeycomb/Routing.py74
-rw-r--r--resources/libraries/robot/honeycomb/slaac.robot106
-rw-r--r--resources/templates/honeycomb/config_slaac.url1
-rw-r--r--resources/test_data/honeycomb/slaac_variables.py64
-rw-r--r--tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot119
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}