ptf/config/port_config_ini_loader.py (69 lines of code) (raw):

# Copyright (c) 2021 Microsoft Open Technologies, Inc. # # 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 # # THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT # LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS # FOR A PARTICULAR PURPOSE, MERCHANTABILITY OR NON-INFRINGEMENT. # # See the Apache Version 2.0 License for specific language governing # permissions and limitations under the License. # # Microsoft would like to thank the following companies for their review and # assistance with these files: Intel Corporation, Mellanox Technologies Ltd, # Dell Products, L.P., Facebook, Inc., Marvell International Ltd. # # from collections import OrderedDict import os from os.path import exists from typing import TYPE_CHECKING from typing import List, Dict from data_module.data_obj import auto_str from data_module.port_config import PortConfig DEFAULT_CONFIG_DB = "../resources/port_config.ini" class PortConfigInILoader(): ''' Read config from port_config.ini. Load the data from a port_config.ini file. ''' def __init__(self, file_path: str = None): """ Init the ConfigDBLoader. Args: file_path: port_config.ini file path """ self.file_path = self.__validate_file_path__(file_path) self.ports_config: Dict = None """ ports_config dict, use to compatiable with old data module """ self.portConfigs: List[PortConfig] = None """ PortConfig object list """ def __validate_file_path__(self, file_path): """ Validate if the file exists. Return: A validated file path """ config_path = None if file_path: config_path = file_path print("port_config.ini path is {}".format(config_path)) else: config_path = os.path.join(os.path.dirname(__file__), DEFAULT_CONFIG_DB) print("port_config.ini uses default path {}".format(config_path)) file_exists = exists(config_path) if not file_exists: raise FileNotFoundError("File not found:{}. Please refer to {} for how to set it.".format( config_path, "https://github.com/opencomputeproject/SAI/blob/master/ptf/docs/SAI-PTFv2Overview.md#run-test")) return config_path def parse_port_config(self): """ Parse port_config.ini file Example of supported format for port_config.ini: # name lanes alias index speed autoneg fec Ethernet0 0 Ethernet0 1 25000 off none Ethernet1 1 Ethernet1 1 25000 off none Ethernet2 2 Ethernet2 1 25000 off none Ethernet3 3 Ethernet3 1 25000 off none Ethernet4 4 Ethernet4 2 25000 off none Ethernet5 5 Ethernet5 2 25000 off none Ethernet6 6 Ethernet6 2 25000 off none Ethernet7 7 Ethernet7 2 25000 off none Ethernet8 8 Ethernet8 3 25000 off none Ethernet9 9 Ethernet9 3 25000 off none Ethernet10 10 Ethernet10 3 25000 off none Ethernet11 11 Ethernet11 3 25000 off none etc Returns: dict and PortConfig: port configuation from file Raises: e: exit if file not found """ ports = OrderedDict() portConfigs = OrderedDict() try: index = 0 with open(self.file_path) as conf: for line in conf: if line.startswith('#'): if "name" in line: titles = line.strip('#').split() continue tokens = line.split() if len(tokens) < 2: continue name_index = titles.index('name') name = tokens[name_index] data = {} for i, item in enumerate(tokens): if i == name_index: continue data[titles[i]] = item data['lanes'] = [int(lane) for lane in data['lanes'].split(',')] data['speed'] = int(data['speed']) ports[name] = data portConfig = PortConfig() portConfig.lanes = data['lanes'] portConfig.speed = data['speed'] portConfig.name = name portConfigs[index] = portConfig index = index + 1 index = index + 1 self.ports_config = ports self.portConfigs = portConfigs return ports, portConfigs except Exception as e: raise e