diff options
Diffstat (limited to 'resources/libraries/python/VatJsonUtil.py')
-rw-r--r-- | resources/libraries/python/VatJsonUtil.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/resources/libraries/python/VatJsonUtil.py b/resources/libraries/python/VatJsonUtil.py new file mode 100644 index 0000000000..36c50533fc --- /dev/null +++ b/resources/libraries/python/VatJsonUtil.py @@ -0,0 +1,102 @@ +# 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. + +"""Utilities to work with JSON data format from VAT.""" + +from robot.api import logger + +from resources.libraries.python.parsers.JsonParser import JsonParser + + +class VatJsonUtil(object): + """Utilities to work with JSON data format from VAT.""" + + @staticmethod + def _convert_mac_to_number_list(mac_address): + """Convert MAC address string to list of decimal numbers. + + Converts a ":" separated MAC address to decimal number list as used + in JSON interface dump. + + :param mac_address: MAC address. + :type mac_address: str + :return: List representation of MAC address. + :rtype: list + """ + list_mac = [] + for num in mac_address.split(":"): + list_mac.append(int(num, 16)) + return list_mac + + @staticmethod + def get_vpp_interface_by_mac(interfaces_list, mac_address): + """Return interface dictionary from interface_list by MAC address. + + Extracts interface dictionary from all of the interfaces in interfaces + list parsed from json according to mac_address of the interface. + + :param interfaces_list: Interfaces parsed from JSON. + :param mac_address: MAC address of interface we are looking for. + :type interfaces_list: dict + :type mac_address: str + :return: Interface from JSON. + :rtype: dict + """ + interface_dict = {} + list_mac_address = VatJsonUtil._convert_mac_to_number_list(mac_address) + logger.trace("MAC address {0} converted to list {1}." + .format(mac_address, list_mac_address)) + for interface in interfaces_list: + # TODO: create vat json integrity checking and move there + if "l2_address" not in interface: + raise KeyError( + "key l2_address not found in interface dict." + "Probably input list is not parsed from correct VAT " + "json output.") + if "l2_address_length" not in interface: + raise KeyError( + "key l2_address_length not found in interface " + "dict. Probably input list is not parsed from correct " + "VAT json output.") + mac_from_json = interface["l2_address"][:6] + if mac_from_json == list_mac_address: + if interface["l2_address_length"] != 6: + raise ValueError("l2_address_length value is not 6.") + interface_dict = interface + break + return interface_dict + + @staticmethod + def update_vpp_interface_data_from_json(node, interface_dump_json): + """Update vpp node data in node__DICT from json interface dump. + + This method updates vpp interface names and sw if indexes according to + interface MAC addresses found in interface_dump_json. + + :param node: Node dictionary. + :param interface_dump_json: JSON output from dump_interface_list VAT + command. + :type node: dict + :type interface_dump_json: str + """ + interface_list = JsonParser().parse_data(interface_dump_json) + for ifc in node['interfaces'].values(): + if_mac = ifc['mac_address'] + interface_dict = VatJsonUtil.get_vpp_interface_by_mac( + interface_list, if_mac) + if not interface_dict: + raise Exception('Interface {0} not found by MAC {1}' + .format(ifc, if_mac)) + ifc['name'] = interface_dict["interface_name"] + ifc['vpp_sw_index'] = interface_dict["sw_if_index"] + ifc['mtu'] = interface_dict["mtu"] |