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': if self.clVars.Get('cl_autopartition_set') == 'auto':
self.startTask(_("Creating new partition table"), self.startTask(_("Creating new partition table"),
progress=True) 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_table'),
self.clVars.Get('cl_autopartition_device'), devices,
self.clVars.Get('cl_autopartition_disk_data'), self.clVars.Get('cl_autopartition_disk_data'),
self.clVars.GetBool('cl_autopartition_lvm_set'), self.clVars.GetBool('cl_autopartition_lvm_set'),
self.clVars.Get('cl_autopartition_lvm_vgname')) self.clVars.Get('cl_autopartition_lvm_vgname'))

@ -194,25 +194,44 @@ class AutoPartition:
pvRemoveProg = getProgPath('/sbin/pvremove') pvRemoveProg = getProgPath('/sbin/pvremove')
lvRemoveProg = getProgPath('/sbin/lvremove') lvRemoveProg = getProgPath('/sbin/lvremove')
disks = dv.Select('os_disk_dev',where='os_disk_parent',_in=devices) 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'], for group, pair in groupby(dv.Select(['os_lvm_vgname','os_lvm_lvname'],
where='os_lvm_pvname',_in=disks), where='os_lvm_pvname',_in=disks,
key=operator.itemgetter(0)): sort="ASC/1"),
operator.itemgetter(0)):
for vgname,lvname in pair: for vgname,lvname in pair:
process(lvRemoveProg,"%s/%s"%(vgname,lvname),"-f").success() failed |= process(lvRemoveProg,
process(vgRemoveProg,group,"-f").success() "%s/%s"%(vgname,lvname),"-f").failed()
failed |= process(vgRemoveProg,group,"-f").failed()
for pvname in list(set(disks)&set(dv.Get('os_lvm_pvname'))): 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): def recreateLvm(self,table,devices,data,vgname):
""" """
Create GPT partition table by /sbin/gdisk Create GPT partition table by /sbin/gdisk
""" """
self._removeVolumeGroup(vgname)
for device in devices: for device in devices:
self.recreatePartitionTable(table,[device],[['','','','allfree']]) self.recreatePartitionTable(table,[device],[['','','','allfree']])
@ -349,30 +368,52 @@ class VariableClAutopartitionDevice(AutopartitionHelper,Variable):
deviceParentMap.get(x,_("Unknown")))), deviceParentMap.get(x,_("Unknown")))),
self.Get('os_device_dev')) 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): def check(self,valuelist):
if self.Get('cl_autopartition_set') == "auto": if self.Get('cl_autopartition_set') == "auto":
if not valuelist: if not valuelist:
raise VariableError(_("For autopartition need select install" raise VariableError(_("For autopartition need select install"
" device")) " device"))
useDisks = self.Select('os_disk_parent', useDisks = self.Select('os_disk_parent',
where='os_disk_mount', where='os_disk_mount',ne='')
ne='')
for value in valuelist: for value in valuelist:
if value in useDisks: if value in useDisks:
raise VariableError( raise VariableError(
_("Device %s already is used by current system")%value) _("Device %s already is used by current system")%value)
disks = self.Select('os_disk_dev', self.checkOnLvm(valuelist)
where='os_disk_parent',_in=valuelist) self.checkOnRaid(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))
if len(valuelist) > 1 and \ if len(valuelist) > 1 and \
self.Get('cl_autopartition_lvm_set') == 'off': self.Get('cl_autopartition_lvm_set') == 'off':
raise VariableError( raise VariableError(

@ -377,12 +377,28 @@ class VariableOsDiskType(ReadonlyVariable):
map(forMember, map(forMember,
types)) 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): class VariableOsDiskUuid(ReadonlyVariable,DeviceHelper):
""" """
List uudi for partition devices List uudi for partition devices
""" """
type = "list" type = "list"
def get(self): def get(self):
return self.mapUdevProperty('os_disk_dev','ID_FS_UUID','') return self.mapUdevProperty('os_disk_dev','ID_FS_UUID','')

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

Loading…
Cancel
Save