def __handleMellanoxDut(self): ''' Handle Mellanox DUT reboot when upgrading from SONiC-OS-201803 to SONiC-OS-201811 ''' if self.newSonicImage is not None and \ self.rebootType == 'fast-reboot' and \ isMellanoxDevice(self.duthost): logger.info('Handle Mellanox platform') nextImage = self.duthost.shell('sonic_installer list | grep Next | cut -f2 -d " "')['stdout'] if 'SONiC-OS-201803' in self.currentImage and 'SONiC-OS-201811' in nextImage: self.__runScript(['upgrade_mlnx_fw.sh'], self.duthost)
def get_vxlan_srcport_range_enabled(duthost): if not isMellanoxDevice(duthost): return False dut_platform = duthost.facts["platform"] dut_hwsku = duthost.facts["hwsku"] sai_profile = "/usr/share/sonic/device/%s/%s/sai.profile" % (dut_platform, dut_hwsku) cmd = "grep SAI_VXLAN_SRCPORT_RANGE_ENABLE {} | cut -d'=' -f2".format( sai_profile) vxlan_srcport_range_enabled = duthost.shell(cmd)["stdout"].strip() == "1" return vxlan_srcport_range_enabled
def dutConfig(self, request, duthosts, rand_one_dut_hostname): """ Build DUT host config pertaining to QoS SAI tests Args: request (Fixture): pytest request object duthost (AnsibleHost): Device Under Test (DUT) Returns: dutConfig (dict): Map of DUT config containing dut interfaces, test port IDs, test port IPs, and test ports """ duthost = duthosts[rand_one_dut_hostname] dutLagInterfaces = [] mgFacts = duthost.minigraph_facts( host=duthost.hostname)["ansible_facts"] for _, lag in mgFacts["minigraph_portchannels"].items(): for intf in lag["members"]: dutLagInterfaces.append( mgFacts["minigraph_port_indices"][intf]) testPortIds = set(mgFacts["minigraph_port_indices"][port] for port in mgFacts["minigraph_ports"].keys()) testPortIds -= set(dutLagInterfaces) if isMellanoxDevice(duthost): # The last port is used for up link from DUT switch testPortIds -= {len(mgFacts["minigraph_port_indices"]) - 1} testPortIds = sorted(testPortIds) # get current DUT port IPs dutPortIps = {} for portConfig in mgFacts["minigraph_interfaces"]: if ipaddress.ip_interface(portConfig['peer_addr']).ip.version == 4: portIndex = mgFacts["minigraph_port_indices"][ portConfig["attachto"]] if portIndex in testPortIds: dutPortIps.update({portIndex: portConfig["peer_addr"]}) testPortIps = self.__assignTestPortIps(mgFacts) # restore currently assigned IPs testPortIps.update(dutPortIps) testPorts = self.__buildTestPorts(request, testPortIds, testPortIps) yield { "dutInterfaces": { index: port for port, index in mgFacts["minigraph_port_indices"].items() }, "testPortIds": testPortIds, "testPortIps": testPortIps, "testPorts": testPorts, }
def fake_storm(request, duthosts, rand_one_dut_hostname): """ Enable/disable fake storm based on platform and input parameters Args: request: pytest request object duthosts: AnsibleHost instance for multi DUT rand_one_dut_hostname: hostname of DUT Returns: fake_storm: False/True """ duthost = duthosts[rand_one_dut_hostname] return request.config.getoption('--fake-storm') if not isMellanoxDevice(duthost) else False
def disablePacketAging(self, duthost, stopServices): """ disable packet aging on DUT host Args: duthost (AnsibleHost): Device Under Test (DUT) stopServices (Fxiture): stopServices fixture is required to run prior to disabling packet aging Returns: None """ if isMellanoxDevice(duthost): logger.info("Disable Mellanox packet aging") duthost.copy(src="qos/files/mellanox/packets_aging.py", dest="/tmp") duthost.command("docker cp /tmp/packets_aging.py syncd:/") duthost.command("docker exec syncd python /packets_aging.py disable") yield if isMellanoxDevice(duthost): logger.info("Enable Mellanox packet aging") duthost.command("docker exec syncd python /packets_aging.py enable") duthost.command("docker exec syncd rm -rf /packets_aging.py")
def enable_packet_aging(duthost): """ Enable packet aging feature (only on MLNX switches) Args: duthost (AnsibleHost): Device Under Test (DUT) Returns: N/A """ if isMellanoxDevice(duthost): duthost.copy(src="qos/files/mellanox/packets_aging.py", dest="/tmp") duthost.command("docker cp /tmp/packets_aging.py syncd:/") duthost.command("docker exec syncd python /packets_aging.py enable") duthost.command("docker exec syncd rm -rf /packets_aging.py")
def dutQosConfig(self, duthosts, enum_frontend_asic_index, rand_one_dut_hostname, dutConfig, ingressLosslessProfile, ingressLossyProfile, egressLosslessProfile, egressLossyProfile, sharedHeadroomPoolSize, tbinfo): """ Prepares DUT host QoS configuration Args: duthost (AnsibleHost): Device Under Test (DUT) ingressLosslessProfile (Fxiture): ingressLosslessProfile fixture is required to run prior to collecting QoS configuration Returns: QoSConfig (dict): Map containing DUT host QoS configuration """ duthost = duthosts[rand_one_dut_hostname] dut_asic = duthost.asic_instance(enum_frontend_asic_index) mgFacts = duthost.get_extended_minigraph_facts(tbinfo) pytest_assert("minigraph_hwsku" in mgFacts, "Could not find DUT SKU") profileName = ingressLosslessProfile["profileName"] if self.isBufferInApplDb(dut_asic): profile_pattern = "^BUFFER_PROFILE_TABLE\:pg_lossless_(.*)_profile$" else: profile_pattern = "^BUFFER_PROFILE\|pg_lossless_(.*)_profile" m = re.search(profile_pattern, profileName) pytest_assert(m.group(1), "Cannot find port speed/cable length") portSpeedCableLength = m.group(1) qosConfigs = {} with open(r"qos/files/qos.yml") as file: qosConfigs = yaml.load(file, Loader=yaml.FullLoader) vendor = duthost.facts["asic_type"] hostvars = duthost.host.options['variable_manager']._hostvars[ duthost.hostname] dutAsic = None for asic in self.SUPPORTED_ASIC_LIST: vendorAsic = "{0}_{1}_hwskus".format(vendor, asic) if vendorAsic in hostvars.keys( ) and mgFacts["minigraph_hwsku"] in hostvars[vendorAsic]: dutAsic = asic break pytest_assert(dutAsic, "Cannot identify DUT ASIC type") if isMellanoxDevice(duthost): current_file_dir = os.path.dirname(os.path.realpath(__file__)) sub_folder_dir = os.path.join(current_file_dir, "files/mellanox/") if sub_folder_dir not in sys.path: sys.path.append(sub_folder_dir) import qos_param_generator qpm = qos_param_generator.QosParamMellanox( qosConfigs['qos_params']['mellanox'], dutAsic, portSpeedCableLength, dutConfig, ingressLosslessProfile, ingressLossyProfile, egressLosslessProfile, egressLossyProfile, sharedHeadroomPoolSize) qosParams = qpm.run() else: qosParams = qosConfigs['qos_params'][dutAsic] yield { "param": qosParams, "portSpeedCableLength": portSpeedCableLength, }
def dutConfig(self, request, duthosts, rand_one_dut_hostname, tbinfo, enum_frontend_asic_index): """ Build DUT host config pertaining to QoS SAI tests Args: request (Fixture): pytest request object duthost (AnsibleHost): Device Under Test (DUT) Returns: dutConfig (dict): Map of DUT config containing dut interfaces, test port IDs, test port IPs, and test ports """ duthost = duthosts[rand_one_dut_hostname] dut_asic = duthost.asic_instance(enum_frontend_asic_index) dutLagInterfaces = [] dutPortIps = {} testPortIps = {} mgFacts = duthost.get_extended_minigraph_facts(tbinfo) topo = tbinfo["topo"]["name"] testPortIds = [] # LAG ports in T1 TOPO need to be removed in Mellanox devices if topo in self.SUPPORTED_T0_TOPOS or isMellanoxDevice(duthost): pytest_assert(not duthost.sonichost.is_multi_asic, "Fixture not supported on T0 multi ASIC") for _, lag in mgFacts["minigraph_portchannels"].items(): for intf in lag["members"]: dutLagInterfaces.append( mgFacts["minigraph_ptf_indices"][intf]) testPortIds = set(mgFacts["minigraph_ptf_indices"][port] for port in mgFacts["minigraph_ports"].keys()) testPortIds -= set(dutLagInterfaces) if isMellanoxDevice(duthost): # The last port is used for up link from DUT switch testPortIds -= {len(mgFacts["minigraph_ptf_indices"]) - 1} testPortIds = sorted(testPortIds) # get current DUT port IPs dutPortIps = {} for portConfig in mgFacts["minigraph_interfaces"]: if ipaddress.ip_interface( portConfig['peer_addr']).ip.version == 4: portIndex = mgFacts["minigraph_ptf_indices"][ portConfig["attachto"]] if portIndex in testPortIds: dutPortIps.update({portIndex: portConfig["peer_addr"]}) testPortIps = self.__assignTestPortIps(mgFacts) elif topo in self.SUPPORTED_T1_TOPOS: for iface, addr in dut_asic.get_active_ip_interfaces().items(): if iface.startswith("Ethernet"): portIndex = mgFacts["minigraph_ptf_indices"][iface] dutPortIps.update({portIndex: addr["peer_ipv4"]}) elif iface.startswith("PortChannel"): portName = next( iter(mgFacts["minigraph_portchannels"][iface] ["members"])) portIndex = mgFacts["minigraph_ptf_indices"][portName] dutPortIps.update({portIndex: addr["peer_ipv4"]}) testPortIds = sorted(dutPortIps.keys()) else: raise Exception("Unsupported testbed type - {}".format(topo)) # restore currently assigned IPs testPortIps.update(dutPortIps) testPorts = self.__buildTestPorts(request, testPortIds, testPortIps) yield { "dutInterfaces": { index: port for port, index in mgFacts["minigraph_ptf_indices"].items() }, "testPortIds": testPortIds, "testPortIps": testPortIps, "testPorts": testPorts, }
def ptf_params(duthost, creds, tbinfo, upgrade_type): reboot_command = get_reboot_command(duthost, upgrade_type) if duthost.facts['platform'] == 'x86_64-kvm_x86_64-r0': reboot_limit_in_seconds = 200 elif 'warm-reboot' in reboot_command: if isMellanoxDevice(duthost): reboot_limit_in_seconds = 1 else: reboot_limit_in_seconds = 0 else: reboot_limit_in_seconds = 30 mg_facts = duthost.get_extended_minigraph_facts(tbinfo) lo_v6_prefix = "" for intf in mg_facts["minigraph_lo_interfaces"]: ipn = ipaddr.IPNetwork(intf['addr']) if ipn.version == 6: lo_v6_prefix = str( ipaddr.IPNetwork(intf['addr'] + '/64').network) + '/64' break mgFacts = duthost.get_extended_minigraph_facts(tbinfo) vm_hosts = [ attr['mgmt_addr'] for dev, attr in mgFacts['minigraph_devices'].items() if attr['hwsku'] == 'Arista-VM' ] sonicadmin_alt_password = duthost.host.options[ 'variable_manager']._hostvars[duthost.hostname].get( "ansible_altpassword") vlan_ip_range = dict() for vlan in mgFacts['minigraph_vlan_interfaces']: if type(ipaddress.ip_network(vlan['subnet'])) is ipaddress.IPv4Network: vlan_ip_range[vlan['attachto']] = vlan['subnet'] ptf_params = { "verbose": False, "dut_username": creds.get('sonicadmin_user'), "dut_password": creds.get('sonicadmin_password'), "alt_password": sonicadmin_alt_password, "dut_hostname": duthost.host.options['inventory_manager'].get_host( duthost.hostname).vars['ansible_host'], "reboot_limit_in_seconds": reboot_limit_in_seconds, "reboot_type": reboot_command, "portchannel_ports_file": TMP_VLAN_PORTCHANNEL_FILE, "vlan_ports_file": TMP_VLAN_FILE, "ports_file": TMP_PORTS_FILE, "dut_mac": duthost.facts["router_mac"], "default_ip_range": "192.168.100.0/18", "vlan_ip_range": json.dumps(vlan_ip_range), "lo_v6_prefix": lo_v6_prefix, "arista_vms": vm_hosts, "setup_fdb_before_test": True, "target_version": "Unknown" } return ptf_params