88 lines
2.3 KiB
Python
88 lines
2.3 KiB
Python
#
|
|
# Copyright(c) 2019-2022 Intel Corporation
|
|
# Copyright(c) 2023-2024 Huawei Technologies Co., Ltd.
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
from core.test_run import TestRun
|
|
from storage_devices.device import Device
|
|
from test_tools.device_mapper import DmTable, DeviceMapper
|
|
from test_utils.disk_finder import resolve_to_by_id_link
|
|
|
|
|
|
class ErrorDevice(Device):
|
|
def __init__(self, name: str, base_device: Device, table: DmTable = None):
|
|
self.device = base_device
|
|
self.mapper = DeviceMapper(name)
|
|
self.name = name
|
|
self.table = DmTable.passthrough_table(base_device) if not table else table
|
|
self.active = False
|
|
self.start()
|
|
self.path = resolve_to_by_id_link(self.mapper.get_path().replace('/dev/', ''))
|
|
|
|
@property
|
|
def system_path(self):
|
|
if self.active:
|
|
output = TestRun.executor.run_expect_success(f"realpath {self.mapper.get_path()}")
|
|
|
|
return output.stdout
|
|
|
|
return None
|
|
|
|
@property
|
|
def size(self):
|
|
if self.active:
|
|
return self.table.get_size()
|
|
|
|
return None
|
|
|
|
def start(self):
|
|
self.mapper.create(self.table)
|
|
self.active = True
|
|
|
|
def stop(self):
|
|
self.mapper.remove()
|
|
self.active = False
|
|
|
|
def change_table(self, table: DmTable, permanent=True):
|
|
if self.active:
|
|
self.mapper.suspend()
|
|
|
|
self.mapper.reload(table)
|
|
|
|
self.mapper.resume()
|
|
|
|
if permanent:
|
|
self.table = table
|
|
|
|
def suspend_errors(self):
|
|
empty_table = DmTable.passthrough_table(self.device)
|
|
TestRun.LOGGER.info(f"Suspending issuing errors for error device '{self.name}'")
|
|
|
|
self.change_table(empty_table, False)
|
|
|
|
def resume_errors(self):
|
|
TestRun.LOGGER.info(f"Resuming issuing errors for error device '{self.name}'")
|
|
|
|
self.change_table(self.table, False)
|
|
|
|
def suspend(self):
|
|
if not self.active:
|
|
TestRun.LOGGER.warning(
|
|
f"cannot suspend error device '{self.name}'! It's already running"
|
|
)
|
|
|
|
self.mapper.suspend()
|
|
|
|
self.active = False
|
|
|
|
def resume(self):
|
|
if self.active:
|
|
TestRun.LOGGER.warning(
|
|
f"cannot resume error device '{self.name}'! It's already running"
|
|
)
|
|
|
|
self.mapper.resume()
|
|
|
|
self.active = True
|