diff options
author | selias <samelias@cisco.com> | 2016-12-09 18:35:11 +0100 |
---|---|---|
committer | Samuel Eliáš <samelias@cisco.com> | 2016-12-16 11:14:41 +0000 |
commit | bd8ed88219178bb3b810d290b4ef9ba885baaf61 (patch) | |
tree | 23f323a4f92156a965cbb3917f13ea54c63cb5e2 /resources/libraries | |
parent | 1813672eb9f6988046bc65167235ae37b088298c (diff) |
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 <samelias@cisco.com>
Diffstat (limited to 'resources/libraries')
-rw-r--r-- | resources/libraries/python/LispUtil.py | 14 | ||||
-rw-r--r-- | resources/libraries/python/honeycomb/Lisp.py | 269 | ||||
-rw-r--r-- | resources/libraries/robot/honeycomb/lisp.robot | 324 |
3 files changed, 607 insertions, 0 deletions
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 @@ -89,6 +89,20 @@ class LispUtil(object): 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 |