Fix recreate LVM

master3.3
Mike Hiretsky 12 years ago
parent 31e4f5553e
commit 8ed78708a4

@ -686,9 +686,13 @@ class Install(color_print):
if self.clVars.Get('cl_autopartition_set') == 'auto':
self.startTask(_("Creating new partition table"),
progress=True)
AutoPartition().recreateSpace(
ap = AutoPartition()
devices = self.clVars.Get('cl_autopartition_device')
ap.clearLvm(devices,self.clVars)
ap.clearRaid(devices,self.clVars)
ap.recreateSpace(
self.clVars.Get('cl_autopartition_table'),
self.clVars.Get('cl_autopartition_device'),
devices,
self.clVars.Get('cl_autopartition_disk_data'),
self.clVars.GetBool('cl_autopartition_lvm_set'),
self.clVars.Get('cl_autopartition_lvm_vgname'))

@ -194,25 +194,44 @@ class AutoPartition:
pvRemoveProg = getProgPath('/sbin/pvremove')
lvRemoveProg = getProgPath('/sbin/lvremove')
disks = dv.Select('os_disk_dev',where='os_disk_parent',_in=devices)
failed = False
for group, pair in groupby(dv.Select(['os_lvm_vgname','os_lvm_lvname'],
where='os_lvm_pvname',_in=disks),
key=operator.itemgetter(0)):
where='os_lvm_pvname',_in=disks,
sort="ASC/1"),
operator.itemgetter(0)):
for vgname,lvname in pair:
process(lvRemoveProg,"%s/%s"%(vgname,lvname),"-f").success()
process(vgRemoveProg,group,"-f").success()
failed |= process(lvRemoveProg,
"%s/%s"%(vgname,lvname),"-f").failed()
failed |= process(vgRemoveProg,group,"-f").failed()
for pvname in list(set(disks)&set(dv.Get('os_lvm_pvname'))):
process(pvRemoveProg,pvname,"-ffy")
failed |= process(pvRemoveProg,pvname,"-ffy").failed()
return not failed
def clearRaid(self,devices):
def clearRaid(self,devices,dv):
"""
Remove raid physical volumes from devices
Remove raid from devices
"""
mdAdmProg = getProgPath('/sbin/mdadm')
failed = False
for disktype,grouped in groupby(
dv.Select(['os_disk_type','os_disk_dev'],
where='os_disk_parent',
_in=['/dev/sda','/dev/sdb'],
sort="ASC/1"),
operator.itemgetter(0)):
if disktype.endswith('-raid'):
for disk_type, disk_dev in grouped:
failed |= process(mdAdmProg,'-S',disk_dev).success()
if "raidmember" in disktype:
for disk_type, disk_dev in grouped:
failed |= process(mdAdmProg,
'--zero-superblock',disk_dev).success()
return not failed
def recreateLvm(self,table,devices,data,vgname):
"""
Create GPT partition table by /sbin/gdisk
"""
self._removeVolumeGroup(vgname)
for device in devices:
self.recreatePartitionTable(table,[device],[['','','','allfree']])
@ -349,30 +368,52 @@ class VariableClAutopartitionDevice(AutopartitionHelper,Variable):
deviceParentMap.get(x,_("Unknown")))),
self.Get('os_device_dev'))
def checkNeeded(self,valuelist,usedDevices,agregationType):
needDevices = list(set(usedDevices) - set(valuelist))
if needDevices:
raise VariableError(_("Disks {selecteddisk} is {agrtype} part.\n"
"You need use also {needdisk} or clear {agrtype} manualy")
.format(selecteddisk=",".join(
list(set(usedDevices)&set(valuelist))),
needdisk=",".join(needDevices),
agrtype=agregationType))
def checkOnLvm(self,valuelist):
disks = self.Select('os_disk_dev',
where='os_disk_parent',_in=valuelist)
vgroups = self.Select('os_lvm_vgname',
where='os_lvm_pvname',_in=disks)
lvmDisks = self.Select('os_lvm_pvname',
where='os_lvm_vgname',_in=vgroups)
lvmDevices = self.Select('os_disk_parent',where='os_disk_dev',
_in=lvmDisks)
self.checkNeeded(valuelist,lvmDevices,"LVM")
def checkOnRaid(self,valuelist):
disks = self.Select('os_disk_dev',
where='os_disk_parent',_in=valuelist)
raids = filter(None,self.Select('os_disk_raid',
where='os_disk_dev',_in=disks))
raidDisks = self.Select('os_disk_dev',where='os_disk_raid',_in=raids)
raidDevices = self.Select('os_disk_parent',
where='os_disk_dev',
_in=raidDisks)
self.checkNeeded(valuelist,raidDevices,"RAID")
def check(self,valuelist):
if self.Get('cl_autopartition_set') == "auto":
if not valuelist:
raise VariableError(_("For autopartition need select install"
" device"))
useDisks = self.Select('os_disk_parent',
where='os_disk_mount',
ne='')
where='os_disk_mount',ne='')
for value in valuelist:
if value in useDisks:
raise VariableError(
_("Device %s already is used by current system")%value)
disks = self.Select('os_disk_dev',
where='os_disk_parent',_in=valuelist)
vgroups = self.Select('os_lvm_vgname',
where='os_lvm_pvname',_in=disks)
lvmDisks = self.Select('os_lvm_pvname',
where='os_lvm_vgname',_in=vgroups)
lvmDevices = self.Select('os_disk_parent',where='os_disk_dev',
_in=lvmDisks)
needDevices = list(set(lvmDevices) - set(valuelist))
if needDevices:
raise VariableError(_("For recreate current LVM you need"
" to add %s devices")%",".join(needDevices))
self.checkOnLvm(valuelist)
self.checkOnRaid(valuelist)
if len(valuelist) > 1 and \
self.Get('cl_autopartition_lvm_set') == 'off':
raise VariableError(

@ -377,12 +377,28 @@ class VariableOsDiskType(ReadonlyVariable):
map(forMember,
types))
class VariableOsDiskRaid(ReadonlyVariable):
"""
Raids which this partition constructed
"""
type = "list"
def generateRaid(self):
for disktype in self.Get('os_disk_type'):
if "raidmember" in disktype:
yield disktype.rpartition('(')[2][:-1]
else:
yield ""
def get(self):
return list(self.generateRaid())
class VariableOsDiskUuid(ReadonlyVariable,DeviceHelper):
"""
List uudi for partition devices
"""
type = "list"
type = "list"
def get(self):
return self.mapUdevProperty('os_disk_dev','ID_FS_UUID','')

@ -49,7 +49,6 @@ class VariableOsLvmData(ReadonlyTableVariable,LvmHelper):
"""
Information about disk devices
"""
type = 'table'
source = ['os_lvm_lvname',
'os_lvm_vgname',
'os_lvm_pvname']

Loading…
Cancel
Save