diff --git a/install/cl_install.py b/install/cl_install.py index 615a886..23f14d4 100644 --- a/install/cl_install.py +++ b/install/cl_install.py @@ -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')) diff --git a/install/variables/autopartition.py b/install/variables/autopartition.py index 72680a6..ce6b05d 100644 --- a/install/variables/autopartition.py +++ b/install/variables/autopartition.py @@ -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( diff --git a/install/variables/disk.py b/install/variables/disk.py index 99671d4..0de3d9e 100644 --- a/install/variables/disk.py +++ b/install/variables/disk.py @@ -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','') diff --git a/install/variables/lvm.py b/install/variables/lvm.py index 7ddb5f7..3a1e128 100644 --- a/install/variables/lvm.py +++ b/install/variables/lvm.py @@ -49,7 +49,6 @@ class VariableOsLvmData(ReadonlyTableVariable,LvmHelper): """ Information about disk devices """ - type = 'table' source = ['os_lvm_lvname', 'os_lvm_vgname', 'os_lvm_pvname']