From bd8ed88219178bb3b810d290b4ef9ba885baaf61 Mon Sep 17 00:00:00 2001 From: selias Date: Fri, 9 Dec 2016 18:35:11 +0100 Subject: [PATCH] CSIT-484: HC Test: Lisp - add Lisp test suite - add Lisp test data - add keywords and methods used in Lisp tests Change-Id: Ie7819e20cf48e7dac106d60cce316ce69ab75786 Signed-off-by: selias --- resources/libraries/python/LispUtil.py | 14 + resources/libraries/python/honeycomb/Lisp.py | 269 ++++++++++++++++++++ resources/libraries/robot/honeycomb/lisp.robot | 324 ++++++++++++++++++++++++ resources/templates/honeycomb/config_lisp.url | 1 + resources/templates/honeycomb/oper_lisp.url | 1 + resources/templates/vat/lisp/show_lisp_pitr.vat | 1 + resources/test_data/honeycomb/lisp.py | 172 +++++++++++++ tests/func/honeycomb/100_lisp.robot | 159 ++++++++++++ 8 files changed, 941 insertions(+) create mode 100644 resources/libraries/python/honeycomb/Lisp.py create mode 100644 resources/libraries/robot/honeycomb/lisp.robot create mode 100644 resources/templates/honeycomb/config_lisp.url create mode 100644 resources/templates/honeycomb/oper_lisp.url create mode 100644 resources/templates/vat/lisp/show_lisp_pitr.vat create mode 100644 resources/test_data/honeycomb/lisp.py create mode 100644 tests/func/honeycomb/100_lisp.robot diff --git a/resources/libraries/python/LispUtil.py b/resources/libraries/python/LispUtil.py index 2926d01dfb..82341d123e 100644 --- a/resources/libraries/python/LispUtil.py +++ b/resources/libraries/python/LispUtil.py @@ -88,6 +88,20 @@ class LispUtil(object): vat.execute_script_json_out('lisp/show_lisp_map_resolver.vat', node) return JsonParser().parse_data(vat.get_script_stdout()) + @staticmethod + def vpp_show_lisp_pitr(node): + """Get Lisp PITR feature config from VPP node. + + :param node: VPP node. + :type node: dict + :returns: Lisp PITR config data. + :rtype: dict + """ + + vat = VatExecutor() + vat.execute_script_json_out('lisp/show_lisp_pitr.vat', node) + return JsonParser().parse_data(vat.get_script_stdout()) + @staticmethod def lisp_should_be_equal(lisp_val1, lisp_val2): """Fail if the lisp values are not equal. diff --git a/resources/libraries/python/honeycomb/Lisp.py b/resources/libraries/python/honeycomb/Lisp.py new file mode 100644 index 0000000000..7ec259347c --- /dev/null +++ b/resources/libraries/python/honeycomb/Lisp.py @@ -0,0 +1,269 @@ +# Copyright (c) 2016 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. + +"""This module implements keywords to manipulate Lisp data structures using +Honeycomb REST API.""" + +from resources.libraries.python.HTTPRequest import HTTPCodes +from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError +from resources.libraries.python.honeycomb.HoneycombUtil \ + import HoneycombUtil as HcUtil +from resources.libraries.python.honeycomb.HoneycombUtil \ + import DataRepresentation + + +class LispKeywords(object): + """Implementation of keywords which make it possible to: + - enable/disable Lisp feature + - configure Lisp mappings + - configure locator sets + - configure map resolver + - configure Lisp PITR feature + - read operational data for all of the above + """ + + def __init__(self): + """Initializer.""" + pass + + @staticmethod + def _set_lisp_properties(node, path, data=None): + """Set Lisp properties and check the return code. + + :param node: Honeycomb node. + :param path: Path which is added to the base path to identify the data. + :param data: The new data to be set. If None, the item will be removed. + :type node: dict + :type path: str + :type data: dict + :returns: Content of response. + :rtype: bytearray + :raises HoneycombError: If the status code in response to PUT is not + 200 = OK or 201 = ACCEPTED. + """ + + if data: + status_code, resp = HcUtil.\ + put_honeycomb_data(node, "config_lisp", data, path, + data_representation=DataRepresentation.JSON) + else: + status_code, resp = HcUtil.\ + delete_honeycomb_data(node, "config_lisp", path) + + if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED): + raise HoneycombError( + "Lisp configuration unsuccessful. " + "Status code: {0}.".format(status_code)) + else: + return resp + + @staticmethod + def get_lisp_operational_data(node): + """Retrieve Lisp properties from Honeycomb operational data. + + :param node: Honeycomb node. + :type node: dict + :returns: List operational data. + :rtype: bytearray + """ + + status_code, resp = HcUtil.get_honeycomb_data(node, "oper_lisp") + + if status_code != HTTPCodes.OK: + raise HoneycombError("Could not retrieve Lisp operational data." + "Status code: {0}.".format(status_code)) + else: + # get rid of empty vni-table entry + resp["lisp-state"]["lisp-feature-data"]["eid-table"][ + "vni-table"].remove( + { + "virtual-network-identifier": 0, + "vrf-subtable": {"table-id": 0} + } + ) + return resp + + @staticmethod + def set_lisp_state(node, state): + """Enable or disable the Lisp feature. + + :param node: Honeycomb node. + :param state: Desired Lisp state, enable or disable. + :type node: dict + :type state: str + :returns: Content of response. + :rtype: bytearray + """ + + data = { + "lisp": { + "enable": True if state.lower() == "enable" else False + } + } + + return LispKeywords._set_lisp_properties(node, '', data) + + @staticmethod + def add_locator(node, interface, locator_set, priority=1, weight=1): + """Configure a new Lisp locator set. + + :param node: Honeycomb node. + :param interface: An interface on the node. + :param locator_set: Name for the new locator set. + :param priority: Priority parameter for the locator. + :param weight. Weight parameter for the locator. + :type node: dict + :type interface: str + :type locator_set: str + :type priority: int + :type weight: int + :returns: Content of response. + :rtype: bytearray + """ + + path = "/lisp-feature-data/locator-sets/locator-set" \ + "/{0}".format(locator_set) + + data = { + "locator-set": { + "name": locator_set, + "interface": { + "interface-ref": interface, + "priority": priority, + "weight": weight + } + } + } + + return LispKeywords._set_lisp_properties(node, path, data) + + @staticmethod + def configure_lisp_mapping(node, data): + """Modify eid-table configuration to the data provided. + + :param node: Honeycomb node. + :param data: Settings for the Lisp mappings. + :type node: dict + :type data: dict + :returns: Content of response. + :rtype: bytearray + """ + + path = "/lisp-feature-data/eid-table" + return LispKeywords._set_lisp_properties(node, path, data) + + @staticmethod + def add_lisp_adjacency(node, vni_id, map_name, adjacency_name, data): + """Add an adjacency to an existing Lisp mapping. + + :param node: Honeycomb node. + :param vni_id: vni_id of the mapping. + :param map_name: Name of the mapping. + :param adjacency_name: Name for the new adjacency. + :param data: Adjacency settings. + :type node: dict + :type vni_id: int + :type map_name: str + :type adjacency_name: str + :type data: dict + :returns: Content of response. + :rtype: bytearray + """ + + path = ( + "/lisp-feature-data/eid-table/vni-table/{vni_id}/" + "vrf-subtable/remote-mappings/remote-mapping/{map_name}/" + "adjacencies/adjacency/{adjacency_name}" + ) + path = path.format( + vni_id=vni_id, + map_name=map_name, + adjacency_name=adjacency_name + ) + + return LispKeywords._set_lisp_properties(node, path, data) + + @staticmethod + def add_map_resolver(node, ip_address): + """Configure map resolver with the specified IP address. + + :param node: Honeycomb node. + :param ip_address: IP address to configure map resolver with. + :type node: dict + :type ip_address: str + :returns: Content of response. + :rtype: bytearray + """ + + path = "/lisp-feature-data/map-resolvers/map-resolver/{0}".format( + ip_address) + + data = { + "map-resolver": { + "ip-address": ip_address + } + } + + return LispKeywords._set_lisp_properties(node, path, data) + + @staticmethod + def delete_map_resolver(node): + """Delete an existing map resolver. + + :param node: Honeycomb node + :type node: dict + :returns: Content of response + :rtype: bytearray + """ + + path = "/lisp-feature-data/map-resolvers" + + return LispKeywords._set_lisp_properties(node, path) + + @staticmethod + def configure_pitr(node, locator_set=None): + """Configure PITR feature with the specified locator set. If not locator + set is specified, disable PITR instead. + + :param node: Honeycomb node. + :param locator_set: Name of a locator set. Optional. + :type node: dict + :type locator_set: str + :returns: Content of response. + :rtype: bytearray + """ + + path = "/lisp-feature-data/pitr-cfg" + + if locator_set: + data = { + "pitr-cfg": { + "locator-set": locator_set + } + } + else: + data = None + + return LispKeywords._set_lisp_properties(node, path, data) + + @staticmethod + def disable_lisp(node): + """Remove all Lisp settings on the node. + + :param node: Honeycomb node. + :type node: dict + :returns: Content of response. + :rtype: bytearray + """ + + return LispKeywords._set_lisp_properties(node, "") diff --git a/resources/libraries/robot/honeycomb/lisp.robot b/resources/libraries/robot/honeycomb/lisp.robot new file mode 100644 index 0000000000..f490769c6f --- /dev/null +++ b/resources/libraries/robot/honeycomb/lisp.robot @@ -0,0 +1,324 @@ +# Copyright (c) 2016 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.Lisp.LispKeywords +| Library | resources.libraries.python.LispUtil +| Documentation | Keywords used to test Honeycomb Lisp features. + +*** Keywords *** +| Honeycomb enables Lisp +| | [Documentation] | Uses Honeycomb API to enable Lisp. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb enables Lisp \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | ... +| | Set Lisp state | ${node} | enable + +| Honeycomb adds locator set +| | [Documentation] | Uses Honeycomb API to enable Lisp. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - interface - Name of an interface on the node. Type: string +| | ... | - locator_set - Name for the new locator set. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb enables Lisp \| ${nodes['DUT1']} \| GigabitEthernet0/8/0\ +| | ... | \| loc_01 \| +| | [Arguments] | ${node} | ${interface} | ${locator_set} +| | Add locator | ${node} | ${interface} | ${locator_set} + +| Honeycomb adds Lisp mapping +| | [Documentation] | Uses Honeycomb API to configure a Lisp mapping. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - data - Lisp settings to use. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb adds Lisp mapping \| ${nodes['DUT1']} \| ${data} \| +| | [Arguments] | ${node} | ${data} +| | Configure lisp mapping | ${node} | ${data} + +| Honeycomb removes all Lisp mappings +| | [Documentation] | Uses Honeycomb API to clear the eid-table. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb removes all Lisp mappings \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | Configure lisp mapping | ${node} | ${NONE} + +| Lisp should not be configured +| | [Documentation] | Retrieves Lisp configuration from Honeycomb operational\ +| | ... | data, and expects an empty dictionary. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Lisp should not be configured \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | ... +| | ${data}= | Get Lisp operational data | ${node} +| | Should be equal as strings | ${data['lisp-state']['enable']} | False +| | ${data}= | Set Variable | ${data['lisp-state']['lisp-feature-data']} +| | Should match | ${data['pitr-cfg']['locator-set']} | N/A +| | Variable should not exist | ${data['eid-table']['vni-table'][0]} + +| Lisp state From Honeycomb Should Be +| | [Documentation] | Retrieves Lisp state from Honeycomb operational\ +| | ... | data, and compares Lisp state with expected value. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - state - Expected Lisp state. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Lisp state From Honeycomb Should Be \| ${nodes['DUT1']} \ +| | ... | \| enabled \| +| | [Arguments] | ${node} | ${state} +| | ${data}= | Get Lisp operational data | ${node} +| | Run keyword if | $state == 'enabled' +| | ... | Should be equal as strings +| | ... | ${data['lisp-state']['enable']} | ${True} +| | Run keyword if | $state == 'disabled' +| | ... | Should be equal as strings +| | ... | ${data['lisp-state']['enable']} | ${False} + +| Lisp state From VAT Should Be +| | [Documentation] | Retrieves Lisp state from VAT,\ +| | ... | and compares Lisp state with expected value. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - state - Expected Lisp state. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Lisp state From VAT Should Be \| ${nodes['DUT1']} \| enabled \| +| | [Arguments] | ${node} | ${state} +| | ${status}= | VPP show Lisp State | ${node} +| | Should match | ${status['feature_status']} | ${state} + +| Lisp mapping From Honeycomb Should Be +| | [Documentation] | Retrieves Lisp mapping from Honeycomb operational\ +| | ... | data, and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - settings - Expected Lisp mapping data. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Lisp mapping From Honeycomb Should Be \| ${nodes['DUT1']} \ +| | ... | \| ${settings} \| +| | [Arguments] | ${node} | ${settings} +| | ${data}= | Get Lisp operational data | ${node} +| | ${data}= | Set Variable | ${data['lisp-state']['lisp-feature-data']} +| | ${data}= | Set Variable | ${data['eid-table']['vni-table'][0]} +| | Compare data structures | ${data} | ${settings} + +| Lisp mapping From VAT Should Be +| | [Documentation] | Retrieves Lisp mapping from VAT,\ +| | ... | and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - settings - Expected Lisp mapping data. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Lisp mapping From VAT Should Be \| ${nodes['DUT1']} \ +| | ... | \| ${settings} \| +| | [Arguments] | ${node} | ${settings} +| | ${data}= | VPP show Lisp eid table | ${node} +| | Compare data structures | ${data[0]} | ${settings} + +| Lisp mappings from Honeycomb should not exist +| | [Documentation] | Retrieves Lisp mappings from operational\ +| | ... | data, and expects to find none. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Lisp mappings from Honeycomb should not exist \ +| | ... | \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | ${data}= | Get Lisp operational data | ${node} +| | ${data}= | Set Variable | ${data['lisp-state']['lisp-feature-data']} +| | Should be empty | ${data['eid-table']['vni-table']} + +| Lisp mappings from VAT should not exist +| | [Documentation] | Retrieves Lisp mappings from VAT,\ +| | ... | and expects to receive an empty list. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Lisp mappings from VAT should not exist \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | ${data}= | VPP show Lisp eid table | ${node} +| | Should be empty | ${data} + +| Locator set from Honeycomb should be +| | [Documentation] | Retrieves Lisp locator set from Honeycomb operational\ +| | ... | data, and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - interface - Interface that should be referenced by locator.\ +| | ... | Type: dictionary +| | ... | - locator_set - Expected locator set name. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Locator set From Honeycomb Should Be \| ${nodes['DUT1']} \ +| | ... | \| GigabitEthernet0/8/0 \| loc01 \| +| | [Arguments] | ${node} | ${interface} | ${locator_set} +| | ${data}= | Get Lisp operational data | ${node} +| | ${loc_data}= | Set Variable +| | ... | ${data['lisp-state']['lisp-feature-data']['locator-sets']} +| | Should be equal +| | ... | ${loc_data['locator-set'][0]['name']} +| | ... | ${locator_set} +| | Should be equal +| | ... | ${loc_data['locator-set'][0]['interface'][0]['interface-ref']} +| | ... | ${interface} + +| Honeycomb adds Lisp adjacency +| | [Documentation] | Uses Honeycomb API to configure Lisp adjacency. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - vni - Virtual network identifier number. Type: integer +| | ... | - map - Name of an existing remote mapping. Type: string +| | ... | - adjacency - Name for the new adjacency. Type: string +| | ... | - data - Lisp adjacency settings to use. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb adds Lisp adjacency \| ${nodes['DUT1']} \| ${1} \| map1\ +| | ... | \| adj1 \| ${data} \| +| | [Arguments] | ${node} | ${vni} | ${map} | ${adjacency} | ${data} +| | Add Lisp adjacency +| | ... | ${node} | ${vni} | ${map} | ${adjacency} | ${data} + +| Honeycomb adds Lisp Map resolver +| | [Documentation] | Uses Honeycomb API to configure Lisp map resolver. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - ip_address - IP address for the map resolver. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb adds Lisp Map resolver \| ${nodes['DUT1']} \ +| | ... | \| 192.168.0.2 \| +| | [Arguments] | ${node} | ${ip_address} +| | Add map resolver | ${node} | ${ip_address} + +| Map resolver from Honeycomb should be +| | [Documentation] | Retrieves Lisp map resolver from Honeycomb operational\ +| | ... | data, and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - ip_address - IP address that should be referenced in map resolver.\ +| | ... | Type: string +| | ... +| | ... | *Example:* +| | ... | \| Map resolver From Honeycomb Should Be \| ${nodes['DUT1']} \ +| | ... | \| 192.168.1.2 \| +| | [Arguments] | ${node} | ${ip_address} +| | ${data}= | Get Lisp operational data | ${node} +| | ${data}= | Set Variable | ${data['lisp-state']['lisp-feature-data']} +| | ${data}= | Set Variable | ${data['map-resolvers']['map-resolver'][0]} +| | Should be equal | ${data['ip-address']} | ${ip_address} + +| Map resolver from VAT should be +| | [Documentation] | Retrieves Lisp mapping from VAT,\ +| | ... | and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - ip_address - IP address that should be referenced in map resolver.\ +| | ... | Type: string +| | ... +| | ... | *Example:* +| | ... | \| Map resolver From VAT Should Be \| ${nodes['DUT1']} \ +| | ... | \| 192.168.1.2 \| +| | [Arguments] | ${node} | ${ip_address} +| | ${data}= | Vpp show Lisp map resolver | ${node} +| | Should be equal | ${data[0]['map resolver']} | ${ip_address} + +| Honeycomb enables Lisp PITR feature +| | [Documentation] | Uses Honeycomb API to configure Lisp PITR feature. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - locator_set - Name of an existing locator set. Type: string +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb enables Lisp PITR feature \| ${nodes['DUT1']} \| loc1 \| +| | [Arguments] | ${node} | ${locator_set} +| | Configure PITR | ${node} | ${locator_set} + +| PITR config from Honeycomb should be +| | [Documentation] | Retrieves PITR config from Honeycomb operational\ +| | ... | data, and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - locator_set - Name of locator set that should be referenced\ +| | ... | in PITR config. Type: string +| | ... +| | ... | *Example:* +| | ... | \| PITR config from Honeycomb should be \| ${nodes['DUT1']} \ +| | ... | \| loc01 \| +| | [Arguments] | ${node} | ${locator_set} +| | ${data}= | Get Lisp operational data | ${node} +| | ${data}= | Set Variable | ${data['lisp-state']['lisp-feature-data']} +| | ${data}= | Set Variable | ${data['pitr-cfg']} +| | Should be equal | ${data['locator-set']} | ${locator_set} + +| PITR config from VAT should be +| | [Documentation] | Retrieves PITR config from VAT,\ +| | ... | and compares with expected data. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - locator_set - Name of locator set that should be referenced\ +| | ... | in PITR config. Type: string +| | ... +| | ... | *Example:* +| | ... | \| PITR config from VAT should be \| ${nodes['DUT1']} \ +| | ... | \| loc01 \| +| | [Arguments] | ${node} | ${locator_set} +| | ${data}= | VPP show Lisp PITR | ${node} +| | Should be equal | ${data['status']} | enabled +| | Should be equal | ${data['locator_set']} | ${locator_set} + +| Honeycomb disables all Lisp features +| | [Documentation] | Uses Honeycomb API to remove all Lisp configuration. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... +| | ... | *Example:* +| | ... | \| Honeycomb disables all Lisp features \| ${nodes['DUT1']} \| +| | [Arguments] | ${node} +| | Disable Lisp | ${node} \ No newline at end of file diff --git a/resources/templates/honeycomb/config_lisp.url b/resources/templates/honeycomb/config_lisp.url new file mode 100644 index 0000000000..69e3d512e6 --- /dev/null +++ b/resources/templates/honeycomb/config_lisp.url @@ -0,0 +1 @@ +/restconf/config/lisp:lisp \ No newline at end of file diff --git a/resources/templates/honeycomb/oper_lisp.url b/resources/templates/honeycomb/oper_lisp.url new file mode 100644 index 0000000000..850d3174a1 --- /dev/null +++ b/resources/templates/honeycomb/oper_lisp.url @@ -0,0 +1 @@ +/restconf/operational/lisp:lisp-state \ No newline at end of file diff --git a/resources/templates/vat/lisp/show_lisp_pitr.vat b/resources/templates/vat/lisp/show_lisp_pitr.vat new file mode 100644 index 0000000000..e1280d16ba --- /dev/null +++ b/resources/templates/vat/lisp/show_lisp_pitr.vat @@ -0,0 +1 @@ +show_lisp_pitr \ No newline at end of file diff --git a/resources/test_data/honeycomb/lisp.py b/resources/test_data/honeycomb/lisp.py new file mode 100644 index 0000000000..049d222b7b --- /dev/null +++ b/resources/test_data/honeycomb/lisp.py @@ -0,0 +1,172 @@ +# Copyright (c) 2016 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 LISP test suite.""" + +from copy import deepcopy + +locator_set = "loc01" + +remote_bd_subtable = { + "virtual-network-identifier": 3, + "bridge-domain-subtable": { + "bridge-domain-ref": "bd_lisp", + "remote-mappings": { + "remote-mapping": [{ + "id": "remote_map_l2", + "eid": { + "virtual-network-id": 3, + "address-type": "ietf-lisp-address-types:mac-afi", + "mac": "aa:aa:aa:aa:aa:ab", + }, + "rlocs": { + "locator": [{ + "address": "192.168.0.3", + "priority": 1, + "weight": 1 + }] + }, + }] + }, + } +} + +remote_vrf_subtable = { + "virtual-network-identifier": 4, + "vrf-subtable": { + "table-id": 1, + "remote-mappings": { + "remote-mapping": [{ + "id": "remote_map_vrf", + "eid": { + "virtual-network-id": 4, + "address-type": "ietf-lisp-address-types:ipv4-afi", + "ipv4": "192.168.0.2" + }, + "rlocs": { + "locator": [{ + "address": "192.168.0.3", + "priority": 1, + "weight": 1 + }] + }, + + }] + }, + } +} + +local_bd_subtable = { + "virtual-network-identifier": 5, + "bridge-domain-subtable": { + "bridge-domain-ref": "bd2_lisp", + "local-mappings": { + "local-mapping": [{ + "id": "local_map_l2", + "eid": { + "address-type": "ietf-lisp-address-types:mac-afi", + "virtual-network-id": 5, + "mac": "ba:aa:aa:aa:aa:aa" + }, + "locator-set": locator_set + }] + }, + } +} + +local_vrf_subtable = { + "virtual-network-identifier": 6, + "vrf-subtable": { + "table-id": 2, + "local-mappings": { + "local-mapping": [{ + "id": "local_map_vrf", + "eid": { + "virtual-network-id": 6, + "address-type": "ietf-lisp-address-types:ipv4-afi", + "ipv4": "192.168.1.1" + }, + "locator-set": locator_set + }] + }, + } +} + +lisp_settings_enable = { + "lisp": { + "enable": True + } +} + +remote_vrf_adjacency = { + "adjacency": { + "id": "adj01", + "local-eid": { + "virtual-network-id": 4, + "address-type": "ietf-lisp-address-types:ipv4-afi", + "ipv4": "192.168.1.1" + }, + "remote-eid": { + "virtual-network-id": 4, + "address-type": "ietf-lisp-address-types:ipv4-afi", + "ipv4": "192.168.0.2" + }, + } + } + +remote_adj_subtable = deepcopy(remote_vrf_subtable) +remote_adj_subtable["vrf-subtable"]["remote-mappings"]\ + ["remote-mapping"][0]["adjacencies"] = {}.update(remote_vrf_adjacency) + + +def create_settings_dict(subtable): + settings = { + "eid-table": { + "vni-table": [subtable] + } + } + + return settings + +lisp_settings_remote_bd = create_settings_dict(remote_bd_subtable) +lisp_settings_remote_vrf = create_settings_dict(remote_vrf_subtable) +lisp_settings_local_bd = create_settings_dict(local_bd_subtable) +lisp_settings_local_vrf = create_settings_dict(local_vrf_subtable) + +vat_remote_bd = { + "is_local": 0, + "vni": remote_bd_subtable["virtual-network-identifier"], + "eid": remote_bd_subtable["bridge-domain-subtable"]["remote-mappings"][ + "remote-mapping"][0]["eid"]["mac"], +} + +vat_remote_vrf = { + "is_local": 0, + "vni": remote_vrf_subtable["virtual-network-identifier"], + "eid": remote_vrf_subtable["vrf-subtable"]["remote-mappings"][ + "remote-mapping"][0]["eid"]["ipv4"]+"/32", +} + +vat_local_bd = { + "is_local": 1, + "vni": local_bd_subtable["virtual-network-identifier"], + "eid": local_bd_subtable["bridge-domain-subtable"]["local-mappings"][ + "local-mapping"][0]["eid"]["mac"] +} + +vat_local_vrf = { + "is_local": 1, + "vni": local_vrf_subtable["virtual-network-identifier"], + "eid": local_vrf_subtable["vrf-subtable"]["local-mappings"][ + "local-mapping"][0]["eid"]["ipv4"]+"/32" +} diff --git a/tests/func/honeycomb/100_lisp.robot b/tests/func/honeycomb/100_lisp.robot new file mode 100644 index 0000000000..5f602c5780 --- /dev/null +++ b/tests/func/honeycomb/100_lisp.robot @@ -0,0 +1,159 @@ +# Copyright (c) 2016 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}= | ${node['interfaces']['port1']['name']} +| ${bd_name}= | bd_lisp +| ${bd2_name}= | bd2_lisp +| &{bd_settings}= | flood=${True} | forward=${True} | learn=${True} +| ... | unknown-unicast-flood=${True} | arp-termination=${True} + +*** Settings *** +| Resource | resources/libraries/robot/default.robot +| Resource | resources/libraries/robot/honeycomb/honeycomb.robot +| Resource | resources/libraries/robot/honeycomb/lisp.robot +| Resource | resources/libraries/robot/honeycomb/bridge_domain.robot +| Variables | resources/test_data/honeycomb/lisp.py +| Documentation | *Honeycomb Lisp test suite.* +| Suite Teardown | Run Keyword If Any Tests Failed +| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node} +| Force Tags | honeycomb_sanity + +*** Test Cases *** +| TC01: Honeycomb enables Lisp feature +| | [Documentation] | Check if Honeycomb can enable the Lisp feature. +| | Given Lisp Should Not Be Configured | ${node} +| | When Honeycomb Enables Lisp | ${node} +| | Then Lisp state From Honeycomb Should Be | ${node} | enabled +| | And Lisp state From VAT Should Be | ${node} | enabled + +| TC02: Honeycomb adds locator set and locator +| | [Documentation] | Check if Honeycomb can configure a locator set. +| | Given Lisp state From Honeycomb Should Be | ${node} | enabled +| | When Honeycomb adds locator set | ${node} | ${interface} | ${locator_set} +| | Then Locator Set From Honeycomb Should Be +| | ... | ${node} | ${interface} | ${locator_set} + +| TC03: Honeycomb configures Lisp - remote mapping - Bridge Domain +| | [Documentation] | Check if Honeycomb can configure a remote Lisp mapping\ +| | ... | with a bridge domain. +| | Given Lisp state From Honeycomb Should Be | ${node} | enabled +| | And Honeycomb creates first l2 bridge domain +| | ... | ${node} | ${bd_name} | ${bd_settings} +| | When Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_remote_bd} +| | Then Lisp mapping From Honeycomb Should Be +| | ... | ${node} | ${remote_bd_subtable} +| | And Lisp mapping From VAT Should Be +| | ... | ${node} | ${vat_remote_bd} + +| TC04: Honeycomb can remove Lisp mapping +| | [Documentation] | Check if Honeycomb can remove a configured Lisp mapping. +| | Given Lisp mapping From Honeycomb Should Be +| | ... | ${node} | ${remote_bd_subtable} +| | And Lisp mapping From VAT Should Be +| | ... | ${node} | ${vat_remote_bd} +| | When Honeycomb removes all lisp mappings | ${node} +| | Then Lisp mappings from Honeycomb should not exist +| | ... | ${node} +| | And Lisp mappings from VAT should not exist +| | ... | ${node} + +| TC05: Honeycomb configures Lisp - remote mapping - VRF +| | [Documentation] | Check if Honeycomb can configure a remote Lisp mapping\ +| | ... | with VRF. +| | [Teardown] | Honeycomb removes all lisp mappings | ${node} +| | Given Lisp mappings from Honeycomb should not exist +| | ... | ${node} +| | And Lisp mappings from VAT should not exist +| | ... | ${node} +| | When Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_remote_vrf} +| | Then Lisp mapping From Honeycomb Should Be +| | ... | ${node} | ${remote_vrf_subtable} +| | And Lisp mapping From VAT Should Be | ${node} | ${vat_remote_vrf} + +| TC06: Honeycomb configures Lisp - local mapping - Bridge Domain +| | [Documentation] | Check if Honeycomb can configure a local Lisp mapping\ +| | ... | with a bridge domain. +| | [Teardown] | Honeycomb removes all lisp mappings | ${node} +| | Given Locator Set From Honeycomb Should Be +| | ... | ${node} | ${interface} | ${locator_set} +| | And Lisp mappings from Honeycomb should not exist +| | ... | ${node} +| | And Lisp mappings from VAT should not exist +| | ... | ${node} +| | And Honeycomb creates first l2 bridge domain +| | ... | ${node} | ${bd2_name} | ${bd_settings} +| | When Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_local_bd} +| | Then Lisp mapping From Honeycomb Should Be | ${node} | ${local_bd_subtable} +| | And Lisp mapping From VAT Should Be | ${node} | ${vat_local_bd} + +| TC07: Honeycomb configures Lisp - local mapping - VRF +| | [Documentation] | Check if Honeycomb can configure a local Lisp mapping\ +| | ... | with VRF. +| | [Teardown] | Honeycomb removes all lisp mappings | ${node} +| | Given Locator Set From Honeycomb Should Be +| | ... | ${node} | ${interface} | ${locator_set} +| | And Lisp mappings from Honeycomb should not exist +| | ... | ${node} +| | And Lisp mappings from VAT should not exist +| | ... | ${node} +| | When Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_local_vrf} +| | Then Lisp mapping From Honeycomb Should Be | ${node} | ${local_vrf_subtable} +| | And Lisp mapping From VAT Should Be | ${node} | ${vat_local_vrf} + +| TC08: Honeycomb configures Lisp mapping with adjacency +| | [Documentation] | Check if Honeycomb can configure local and remote Lisp\ +| | ... | mappings with VRF, and configure adjacency. +| | [Tags] | EXPECTED_FAILING +# Requests below "vrf-subtable" level fail on table-id lookup (HONEYCOMB-290) +| | [Teardown] | Honeycomb removes all lisp mappings | ${node} +| | Given Locator Set From Honeycomb Should Be +| | ... | ${node} | ${interface} | ${locator_set} +| | And Honeycomb creates first l2 bridge domain +| | ... | ${node} | ${bd2_name} | ${bd_settings} +| | And Lisp mappings from Honeycomb should not exist +| | ... | ${node} +| | And Lisp mappings from VAT should not exist +| | ... | ${node} +| | And Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_local_vrf} +| | And Honeycomb adds Lisp mapping | ${node} | ${lisp_settings_remote_vrf} +| | When Honeycomb adds Lisp adjacency | ${node} | ${4} | remote_map_vrf +| | ... | adj01 | ${remote_vrf_adjacency} +| | Then Lisp mapping from Honeycomb should be +| | ... | ${node} | ${remote_adj_subtable} + +| TC09: Honeycomb configures Lisp map resolver +| | [Documentation] | Check if Honeycomb can configure a Lisp map resolver. +| | Given Lisp state From Honeycomb Should Be | ${node} | enabled +| | And Lisp state From VAT Should Be | ${node} | enabled +| | When Honeycomb adds Lisp Map resolver | ${node} | 192.168.0.4 +| | Then Map resolver from Honeycomb should be | ${node} | 192.168.0.4 +| | And Map resolver from VAT should be | ${node} | 192.168.0.4 + +| TC10: Honeycomb enabled Lisp PITR feature +| | [Documentation] | Check if Honeycomb can configure the Lisp PITR feature. +| | Given Locator Set From Honeycomb Should Be +| | ... | ${node} | ${interface} | ${locator_set} +| | When Honeycomb enables Lisp PITR feature | ${node} | ${locator_set} +| | Then PITR config from Honeycomb should be | ${node} | ${locator_set} +| | And PITR config from VAT should be | ${node} | ${locator_set} + +| TC11: Honeycomb can remove configuration of Lisp features +| | [Documentation] | Check if Honeycomb can disable all Lisp features. +| | [Tags] | EXPECTED_FAILING +# Delete operation fails due to incorrect write order(HONEYCOMB-296), +# but returns code 200: OK (HONEYCOMB-297) +| | Given Map resolver from Honeycomb should be | ${node} | 192.168.0.4 +| | And PITR config from Honeycomb should be | ${node} | ${locator_set} +| | When Honeycomb disables all Lisp features | ${node} +| | Then Lisp Should Not Be Configured | ${node} -- 2.16.6