test-framework: Add device type autodetection for TestFramework

Signed-off-by: Jan Musial <jan.musial@huawei.com>
This commit is contained in:
Jan Musial 2023-07-31 14:07:19 +02:00 committed by Kamil Gierszewski
parent 95fbb5fcf0
commit e1401fda34
No known key found for this signature in database

View File

@ -173,10 +173,18 @@ class Disk(Device):
disk_type: DiskType, disk_type: DiskType,
serial_number, serial_number,
block_size): block_size):
if disk_type is DiskType.nand or disk_type is DiskType.optane:
return NvmeDisk(path, disk_type, serial_number, block_size) resolved_disk_type = None
else: for resolved_disk_type in [NvmeDisk, SataDisk, VirtioDisk]:
return SataDisk(path, disk_type, serial_number, block_size) try:
resolved_disk_type.get_unplug_path()
except:
continue
if resolved_disk_type is None:
raise Exception(f"Unrecognized device type for {path}")
return resolved_disk_type(path, disk_type, serial_number, block_size)
class NvmeDisk(Disk): class NvmeDisk(Disk):
@ -204,6 +212,20 @@ class NvmeDisk(Disk):
def get_lba_format_in_use(self): def get_lba_format_in_use(self):
return nvme_cli.get_lba_format_in_use(self) return nvme_cli.get_lba_format_in_use(self)
@classmethod
def get_unplug_path(cls, device_id):
base = f"/sys/block/{device_id}/device"
for suffix in ["/remove", "/device/remove"]:
try:
output = fs_utils.ls_item(base + suffix)
fs_utils.parse_ls_output(output)[0]
except:
continue
return base + suffix
raise Exception(f"Couldn't create unplug path for {device_id}")
class SataDisk(Disk): class SataDisk(Disk):
plug_all_command = "for i in $(find -H /sys/devices/ -path '*/scsi_host/*/scan' -type f); " \ plug_all_command = "for i in $(find -H /sys/devices/ -path '*/scsi_host/*/scan' -type f); " \
@ -213,9 +235,10 @@ class SataDisk(Disk):
Disk.__init__(self, path, disk_type, serial_number, block_size) Disk.__init__(self, path, disk_type, serial_number, block_size)
self.plug_command = SataDisk.plug_all_command self.plug_command = SataDisk.plug_all_command
self.unplug_command = \ self.unplug_command = \
f"echo 1 > {self.get_sysfs_properties(self.get_device_id()).full_path}/device/delete" f"echo 1 > {self.get_unplug_path(self.get_device_id())}"
def get_sysfs_properties(self, device_id): @classmethod
def get_unplug_path(cls, device_id):
ls_command = f"$(find -H /sys/devices/ -name {device_id} -type d)" ls_command = f"$(find -H /sys/devices/ -name {device_id} -type d)"
output = fs_utils.ls_item(f"{ls_command}") output = fs_utils.ls_item(f"{ls_command}")
sysfs_addr = fs_utils.parse_ls_output(output)[0] sysfs_addr = fs_utils.parse_ls_output(output)[0]
@ -223,18 +246,14 @@ class SataDisk(Disk):
raise Exception(f"Failed to find sysfs address: ls -l {ls_command}") raise Exception(f"Failed to find sysfs address: ls -l {ls_command}")
dirs = sysfs_addr.full_path.split('/') dirs = sysfs_addr.full_path.split('/')
scsi_address = dirs[-3] scsi_address = dirs[-3]
matches = re.search( try:
r"^(?P<controller>\d+)[-:](?P<port>\d+)[-:](?P<target>\d+)[-:](?P<lun>\d+)$", re.search(
scsi_address) r"^\d+[-:]\d+[-:]\d+[-:]\d+$",
controller_id = matches["controller"] scsi_address)
port_id = matches["port"] except:
target_id = matches["target"] raise Exception(f"Failed to find controller for {device_id}")
lun = matches["lun"]
host_path = "/".join(itertools.takewhile(lambda x: not x.startswith("host"), dirs)) return sysfs_addr.full_path + "/device/delete"
self.plug_command = f"echo '{port_id} {target_id} {lun}' > " \
f"{host_path}/host{controller_id}/scsi_host/host{controller_id}/scan"
return sysfs_addr
class VirtioDisk(Disk): class VirtioDisk(Disk):
@ -244,11 +263,10 @@ class VirtioDisk(Disk):
Disk.__init__(self, path, disk_type, serial_number, block_size) Disk.__init__(self, path, disk_type, serial_number, block_size)
self.plug_command = VirtioDisk.plug_all_command self.plug_command = VirtioDisk.plug_all_command
self.unplug_command = \ self.unplug_command = \
f"echo 1 > {self.get_unplug_path()}" f"echo 1 > {self.get_unplug_path(self.get_device_id())}"
def get_unplug_path(self):
device_id = self.get_device_id()
@classmethod
def get_unplug_path(cls, device_id):
ls_command = f"$(find -H /sys/devices/ -name {device_id} -type d)" ls_command = f"$(find -H /sys/devices/ -name {device_id} -type d)"
output = fs_utils.ls_item(f"{ls_command}") output = fs_utils.ls_item(f"{ls_command}")
sysfs_addr = fs_utils.parse_ls_output(output)[0] sysfs_addr = fs_utils.parse_ls_output(output)[0]