-# Copyright (c) 2021 Cisco and/or its affiliates.
+# Copyright (c) 2023 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:
from robot.api import logger
from resources.libraries.python.Constants import Constants
-from resources.libraries.python.ssh import SSH, exec_cmd, exec_cmd_no_error
+from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error
from resources.libraries.python.topology import NodeType, Topology
:type node: dict
:type service: str
"""
- command = u"cat /tmp/*supervisor*.log"\
- if DUTSetup.running_in_container(node) \
- else f"journalctl --no-pager _SYSTEMD_INVOCATION_ID=$(systemctl " \
- f"show -p InvocationID --value {service})"
-
+ if DUTSetup.running_in_container(node):
+ command = u"cat /var/log/vpp/vpp.log"
+ else:
+ command = (
+ f"journalctl --no-pager _SYSTEMD_INVOCATION_ID=$(systemctl "
+ f"show -p InvocationID --value {service})"
+ )
message = f"Node {node[u'host']} failed to get logs from unit {service}"
exec_cmd_no_error(
:type node: dict
:type service: str
"""
- command = f"supervisorctl restart {service}" \
- if DUTSetup.running_in_container(node) \
- else f"service {service} restart"
+ if DUTSetup.running_in_container(node):
+ command = f"supervisorctl restart {service}"
+ else:
+ command = f"systemctl restart {service}"
message = f"Node {node[u'host']} failed to restart service {service}"
exec_cmd_no_error(
:type node: dict
:type service: str
"""
- # TODO: change command to start once all parent function updated.
- command = f"supervisorctl restart {service}" \
- if DUTSetup.running_in_container(node) \
- else f"service {service} restart"
+ if DUTSetup.running_in_container(node):
+ command = f"supervisorctl restart {service}"
+ else:
+ command = f"systemctl restart {service}"
message = f"Node {node[u'host']} failed to start service {service}"
exec_cmd_no_error(
"""
DUTSetup.get_service_logs(node, service)
- command = f"supervisorctl stop {service}" \
- if DUTSetup.running_in_container(node) \
- else f"service {service} stop"
+ if DUTSetup.running_in_container(node):
+ command = f"supervisorctl stop {service}"
+ else:
+ command = f"systemctl stop {service}"
message = f"Node {node[u'host']} failed to stop service {service}"
exec_cmd_no_error(
exec_cmd_no_error(node, cmd, message=f"{program} is not installed")
@staticmethod
- def get_pid(node, process):
+ def get_pid(node, process, retries=3):
"""Get PID of running process.
:param node: DUT node.
:param process: process name.
+ :param retries: How many times to retry on failure.
:type node: dict
:type process: str
+ :type retries: int
:returns: PID
:rtype: int
:raises RuntimeError: If it is not possible to get the PID.
"""
- ssh = SSH()
- ssh.connect(node)
-
- retval = None
- for i in range(3):
- logger.trace(f"Try {i}: Get {process} PID")
- ret_code, stdout, stderr = ssh.exec_command(f"pidof {process}")
-
- if int(ret_code):
- raise RuntimeError(
- f"Not possible to get PID of {process} process on node: "
- f"{node[u'host']}\n {stdout + stderr}"
- )
-
- pid_list = stdout.split()
- if len(pid_list) == 1:
- return [int(stdout)]
- if not pid_list:
- logger.debug(f"No {process} PID found on node {node[u'host']}")
- continue
- logger.debug(f"More than one {process} PID found " \
- f"on node {node[u'host']}")
- retval = [int(pid) for pid in pid_list]
-
- return retval
+ cmd = f"pidof {process}"
+ stdout, _ = exec_cmd_no_error(
+ node, cmd, retries=retries,
+ message=f"No {process} PID found on node {node[u'host']}")
+ pid_list = stdout.split()
+ return [int(pid) for pid in pid_list]
@staticmethod
def get_vpp_pids(nodes):
initialize or remove VFs on QAT.
:param node: DUT node.
- :crypto_type: Crypto device type - HW_DH895xcc or HW_C3xxx.
+ :crypto_type: Crypto device type - HW_DH895xcc, HW_C3xxx or HW_C4xxx.
:param numvfs: Number of VFs to initialize, 0 - disable the VFs.
:param force_init: If True then try to initialize to specific value.
:type node: dict
"""Init Crypto QAT device virtual functions on DUT.
:param node: DUT node.
- :crypto_type: Crypto device type - HW_DH895xcc or HW_C3xxx.
+ :crypto_type: Crypto device type - HW_DH895xcc, HW_C3xxx or HW_C4xxx.
:param numvfs: Number of VFs to initialize, 0 - disable the VFs.
:type node: dict
:type crypto_type: string
elif crypto_type == u"HW_C3xxx":
kernel_mod = u"qat_c3xxx"
kernel_drv = u"c3xxx"
+ elif crypto_type == u"HW_C4xxx":
+ kernel_mod = u"qat_c4xxx"
+ kernel_drv = u"c4xxx"
else:
raise RuntimeError(
f"Unsupported crypto device type on {node[u'host']}"
)
@staticmethod
- def pci_driver_unbind_list(node, *pci_addrs):
- """Unbind PCI devices from current driver on node.
+ def unbind_pci_devices_from_other_driver(node, driver, *pci_addrs):
+ """Unbind PCI devices from driver other than input driver on node.
:param node: DUT node.
+ :param driver: Driver to not unbind from. If None or empty string,
+ will attempt to unbind from the current driver.
:param pci_addrs: PCI device addresses.
:type node: dict
+ :type driver: str
:type pci_addrs: list
"""
for pci_addr in pci_addrs:
- DUTSetup.pci_driver_unbind(node, pci_addr)
+ cur_driver = DUTSetup.get_pci_dev_driver(node, pci_addr)
+ if not cur_driver:
+ return
+ if not driver or cur_driver != driver:
+ DUTSetup.pci_driver_unbind(node, pci_addr)
@staticmethod
def pci_driver_bind(node, pci_addr, driver):