Добавлены проверки использования дисков для разметки

* добавлена проверка попытки использованить RAID основанный на LVM
* добавлена проверка попытки разметить RAID, используемый в текущей
системе (например из него сделан LVM)
master-3.5
parent 24712fc9f1
commit 23a5389c01

@ -266,13 +266,14 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable):
def checkNeeded(self, valuelist, usedDevices, agregationType):
needDevices = list(set(usedDevices) - set(valuelist))
if needDevices:
raise VariableError(_("Disks {selecteddisk} are part of "
"{agrtype}\nYou need to use {needdisk} as well or "
"clear {agrtype} manually")
.format(selecteddisk=",".join(
list(set(usedDevices) & set(valuelist))),
needdisk=",".join(needDevices),
agrtype=agregationType))
raise VariableError(
_("Disks {selecteddisk} are part of "
"{agrtype}\nYou need to use {needdisk} as well or "
"clear {agrtype} manually").format(
selecteddisk=",".join(
list(set(usedDevices) & set(valuelist))),
needdisk=",".join(needDevices),
agrtype=agregationType))
def checkOnLvm(self, valuelist):
disks = self.Select('os_disk_dev',
@ -317,18 +318,31 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable):
device=",".join(common),
selected=device))
def checkSelectedRaid(self, valuelist):
"""
Проверить схемы RAID, чтобы исключить базирование их на lvm
"""
typecheck = re.compile("lvm.*raid")
for dev, fulltype in self.ZipVars("os_device_dev",
"os_device_fulltype"):
if dev in valuelist:
if typecheck.search(fulltype):
raise VariableError(_("RAID %s is wrong") % dev)
def check(self, valuelist):
if self.Get('cl_autopartition_set') == "on":
if not valuelist:
raise VariableError(
_("For autopartition, please select the device"))
useDisks = self.Select('os_disk_parent',
where='os_disk_mount', ne='')
for value in valuelist:
useDisks = set(traverse(x.split(',') for x in self.Select(
'os_disk_parent', where='os_disk_mount', ne='')))
selected_raid_devices = self.Get('cl_autopartition_raid_parent')
for value in chain(valuelist, selected_raid_devices):
if value in useDisks:
raise VariableError(
_("Device %s is already in use by the current "
"system") % value)
self.checkSelectedRaid(valuelist)
self.checkOnSelectParentAndChild(valuelist)
self.checkOnLvm(valuelist)
self.checkOnRaid(valuelist)
@ -781,7 +795,7 @@ class VariableClAutopartitionDiskSizeFull(ReadonlyVariable):
class VariableClAutopartitionRaid(ReadonlyVariable):
"""
Список выбранных устройств для разметки, которые являются RAID
Список выбранных для разметки RAID устройств
"""
type = "list"
@ -789,9 +803,22 @@ class VariableClAutopartitionRaid(ReadonlyVariable):
selected_dev = self.Get('cl_autopartition_device')
return [
dev for dev, _type in self.ZipVars(
"cl_autopartition_device_dev", "cl_autopartition_device_type")
"cl_autopartition_device_dev", "cl_autopartition_device_type")
if dev in selected_dev and _type == "raid"]
class VariableClAutopartitionRaidParent(ReadonlyVariable):
"""
Список физических устройств, из которых построены выбранные RAID
"""
type = "list"
def get(self):
selected_raid = set(self.Get('cl_autopartition_raid'))
return list(set(traverse(
parents.split(',')
for parents in self.select('os_device_parent',
os_device_dev__in=selected_raid))))
class VariableClAutopartitionMbr(ReadonlyVariable):
"""
Диски на которые будет установлен загрузчик
@ -802,12 +829,7 @@ class VariableClAutopartitionMbr(ReadonlyVariable):
if self.GetBool('cl_autopartition_uefi_set'):
return []
selected_raid = self.Get('cl_autopartition_raid')
selected_raid_devices = set(traverse(
parents.split(',')
for parents in self.select('os_device_parent',
os_device_dev__in=selected_raid)))
selected_raid_devices = self.Get('cl_autopartition_raid_parent')
mbr = (mbr for mbr in self.select(
'os_device_mbr', os_device_dev__in=selected_raid_devices)
@ -827,12 +849,7 @@ class VariableClAutopartitionEfi(ReadonlyVariable):
if not self.GetBool('cl_autopartition_uefi_set'):
return []
selected_raid = self.Get('cl_autopartition_raid')
selected_raid_devices = set(traverse(
parents.split(',')
for parents in self.select('os_device_parent',
os_device_dev__in=selected_raid)))
selected_raid_devices = self.Get('cl_autopartition_raid_parent')
efi = (efi for efi in self.select(
'os_device_efi', os_device_dev__in=selected_raid_devices)

@ -106,9 +106,10 @@ class VariableOsDeviceData(ReadonlyTableVariable):
'os_device_map',
'os_device_syspath',
'os_device_name',
'os_device_size'
'os_device_size',
'os_device_mbr',
'os_device_efi']
'os_device_efi',
'os_device_fulltype']
class VariableOsDeviceInvalidator(ReadonlyVariable):
@ -132,6 +133,7 @@ class VariableOsDeviceInvalidator(ReadonlyVariable):
os.close(slave)
fl = fcntl.fcntl(self.master, fcntl.F_GETFL)
fcntl.fcntl(self.master, fcntl.F_SETFL, fl | os.O_NONBLOCK)
return "Device invalidator"
def close(self):
try:
@ -155,6 +157,7 @@ class VariableOsDeviceInvalidator(ReadonlyVariable):
except OSError as e:
pass
class VariableOsDeviceDev(DeviceHelper, ReadonlyVariable):
"""
Disk devices
@ -179,6 +182,18 @@ class VariableOsDeviceDev(DeviceHelper, ReadonlyVariable):
return list(sorted((x for x in devnames),
key=self.separateDevice))
class VariableOsDeviceFulltype(ReadonlyVariable):
"""
Полный тип
"""
type = "list"
def get(self):
"""Get device /dev name"""
return [
device.udev.get_device_type(x)
for x in self.Get('os_device_syspath')
]
class VariableOsDeviceType(ReadonlyVariable):

Loading…
Cancel
Save