From 0c4d0080a1488e2aeaa2d0abe9bbcb37c5bfe7c3 Mon Sep 17 00:00:00 2001 From: "jan.hradil" Date: Thu, 30 Mar 2017 09:55:30 +0200 Subject: CSIT-529 HC Test: SLAAC Change-Id: I14525a36d614372b7b418f1c10f95c371b7b8545 Signed-off-by: jan.hradil --- resources/libraries/python/honeycomb/Routing.py | 74 +++++++++++++++++ resources/libraries/robot/honeycomb/slaac.robot | 106 ++++++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 resources/libraries/robot/honeycomb/slaac.robot (limited to 'resources/libraries') 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} -- cgit 1.2.3-korg