Merge pull request #26 from katlapinka/kasiat/lvm-api-update

LVM API refactor
This commit is contained in:
Katarzyna Treder 2024-11-07 10:54:25 +01:00 committed by GitHub
commit 775036de91
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,16 +1,15 @@
# #
# Copyright(c) 2022 Intel Corporation # Copyright(c) 2022 Intel Corporation
# Copyright(c) 2024 Huawei Technologies Co., Ltd.
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
import threading
import threading
from typing import Union from typing import Union
from api.cas.core import Core
from core.test_run import TestRun from core.test_run import TestRun
from storage_devices.device import Device from storage_devices.device import Device
from storage_devices.disk import Disk, NvmeDisk from storage_devices.disk import Disk
from storage_devices.partition import Partition
from test_tools.fs_utils import readlink from test_tools.fs_utils import readlink
from test_utils.disk_finder import resolve_to_by_id_link from test_utils.disk_finder import resolve_to_by_id_link
from test_utils.filesystem.symlink import Symlink from test_utils.filesystem.symlink import Symlink
@ -29,16 +28,12 @@ class LvmConfiguration:
lvm_filters: [] = None, lvm_filters: [] = None,
pv_num: int = None, pv_num: int = None,
vg_num: int = None, vg_num: int = None,
lv_num: int = None, lv_num: int = None
cache_num: int = None,
cas_dev_num: int = None
): ):
self.lvm_filters = lvm_filters self.lvm_filters = lvm_filters
self.pv_num = pv_num self.pv_num = pv_num
self.vg_num = vg_num self.vg_num = vg_num
self.lv_num = lv_num self.lv_num = lv_num
self.cache_num = cache_num
self.cas_dev_num = cas_dev_num
@staticmethod @staticmethod
def __read_definition_from_lvm_config( def __read_definition_from_lvm_config(
@ -122,7 +117,7 @@ class LvmConfiguration:
return cls.__read_definition_from_lvm_config(global_filter_prototype_regex) return cls.__read_definition_from_lvm_config(global_filter_prototype_regex)
@classmethod @classmethod
def add_block_devices_to_lvm_config( def add_block_device_to_lvm_config(
cls, cls,
device_type: str device_type: str
): ):
@ -137,45 +132,20 @@ class LvmConfiguration:
filters: [] filters: []
): ):
if filters is None: if filters is None:
TestRun.LOGGER.error(f"Lvm filters for lvm config not provided.") raise ValueError(f"Lvm filters for lvm config not provided.")
for f in filters: for f in filters:
cls.__add_filter_to_lvm_config(f) cls.__add_filter_to_lvm_config(f)
@classmethod
def configure_dev_types_in_config(
cls,
devices: ([Device], Device)
):
if isinstance(devices, list):
devs = []
for device in devices:
dev = device.parent_device if isinstance(device, Partition) else device
devs.append(dev)
if any(isinstance(dev, Core) for dev in devs):
cls.add_block_devices_to_lvm_config("cas")
if any(isinstance(dev, NvmeDisk) for dev in devs):
cls.add_block_devices_to_lvm_config("nvme")
else:
dev = devices.parent_device if isinstance(devices, Partition) else devices
if isinstance(dev, Core):
cls.add_block_devices_to_lvm_config("cas")
if isinstance(dev, NvmeDisk):
cls.add_block_devices_to_lvm_config("nvme")
@classmethod @classmethod
def configure_filters( def configure_filters(
cls, cls,
lvm_filters: [], lvm_filters: [],
devices: ([Device], Device)
): ):
if lvm_filters: if lvm_filters:
TestRun.LOGGER.info(f"Preparing configuration for LVMs - filters.") TestRun.LOGGER.info(f"Preparing configuration for LVMs - filters.")
LvmConfiguration.add_filters_to_lvm_config(lvm_filters) LvmConfiguration.add_filters_to_lvm_config(lvm_filters)
cls.configure_dev_types_in_config(devices)
@staticmethod @staticmethod
def remove_global_filter_from_config(): def remove_global_filter_from_config():
cmd = f"sed -i '/{global_filter_prototype_regex}/d' {lvm_config_path}" cmd = f"sed -i '/{global_filter_prototype_regex}/d' {lvm_config_path}"
@ -186,6 +156,12 @@ class LvmConfiguration:
cmd = f"sed -i '/{filter_prototype_regex}/d' {lvm_config_path}" cmd = f"sed -i '/{filter_prototype_regex}/d' {lvm_config_path}"
TestRun.executor.run(cmd) TestRun.executor.run(cmd)
@staticmethod
def set_use_devices_file(use_devices_file=False):
cmd = (fr"sed -i 's/^\s*#*\s*\(use_devicesfile\).*/\t\1 = "
fr"{1 if use_devices_file else 0}/' {lvm_config_path}")
TestRun.executor.run(cmd)
class VolumeGroup: class VolumeGroup:
__unique_vg_id = 0 __unique_vg_id = 0
@ -266,7 +242,7 @@ class VolumeGroup:
if vg_name in volume_groups: if vg_name in volume_groups:
return cls(vg_name) return cls(vg_name)
else: else:
TestRun.LOGGER.error("Had not found newly created VG.") raise Exception("Had not found newly created VG.")
@staticmethod @staticmethod
def remove(vg_name: str): def remove(vg_name: str):
@ -332,13 +308,10 @@ class Lvm(Disk):
@classmethod @classmethod
def configure_global_filter( def configure_global_filter(
cls, cls,
dev_first: Device,
lv_amount: int, lv_amount: int,
pv_devs: ([Device], Device) pv_devs: ([Device], Device)
): ):
device_first = dev_first.parent_device if isinstance(dev_first, Partition) else dev_first if lv_amount > 1:
if lv_amount > 1 and isinstance(device_first, Core):
global_filter_def = LvmConfiguration.read_global_filter_definition_from_lvm_config() global_filter_def = LvmConfiguration.read_global_filter_definition_from_lvm_config()
if not isinstance(pv_devs, list): if not isinstance(pv_devs, list):
pv_devs = [pv_devs] pv_devs = [pv_devs]
@ -388,13 +361,13 @@ class Lvm(Disk):
cls, cls,
devices: ([Device], Device), devices: ([Device], Device),
lvm_configuration: LvmConfiguration, lvm_configuration: LvmConfiguration,
lvm_as_core: bool = False global_filter: bool = False
): ):
pv_per_vg = int(lvm_configuration.pv_num / lvm_configuration.vg_num) pv_per_vg = int(lvm_configuration.pv_num / lvm_configuration.vg_num)
lv_per_vg = int(lvm_configuration.lv_num / lvm_configuration.vg_num) lv_per_vg = int(lvm_configuration.lv_num / lvm_configuration.vg_num)
lv_size_percentage = int(100 / lv_per_vg) lv_size_percentage = int(100 / lv_per_vg)
LvmConfiguration.configure_filters(lvm_configuration.lvm_filters, devices) LvmConfiguration.configure_filters(lvm_configuration.lvm_filters)
logical_volumes = [] logical_volumes = []
@ -405,17 +378,15 @@ class Lvm(Disk):
end_range = start_range + pv_per_vg end_range = start_range + pv_per_vg
for i in range(start_range, end_range): for i in range(start_range, end_range):
pv_devs.append(devices[i]) pv_devs.append(devices[i])
device_first = devices[0]
else: else:
pv_devs = devices pv_devs = devices
device_first = devices
for j in range(lv_per_vg): for j in range(lv_per_vg):
lv = cls.create(lv_size_percentage, pv_devs) lv = cls.create(lv_size_percentage, pv_devs)
logical_volumes.append(lv) logical_volumes.append(lv)
if lvm_as_core: if global_filter:
cls.configure_global_filter(device_first, lv_per_vg, pv_devs) cls.configure_global_filter(lv_per_vg, pv_devs)
return logical_volumes return logical_volumes
@ -431,7 +402,7 @@ class Lvm(Disk):
elif isinstance(volume_size_or_percent, int): elif isinstance(volume_size_or_percent, int):
size_cmd = f"--extents {volume_size_or_percent}%VG" size_cmd = f"--extents {volume_size_or_percent}%VG"
else: else:
TestRun.LOGGER.error(f"Incorrect type of the first argument (volume_size_or_percent).") raise ValueError(f"Incorrect type of the first argument (volume_size_or_percent).")
if not name: if not name:
name = cls.__get_unique_lv_name() name = cls.__get_unique_lv_name()