From: "Brian C. Lane" bcl@redhat.com
I moved doStorageKickstart into kickstart.py, if that's not ok I can skip that.
This adds kickstart execute calls for btrfs, raid, lvm pv and vg's and partitioning. Currently only bare partitions has been tested and it does work with this:
bootloader --location=mbr zerombr clearpart --all part biosboot --size=1 part / --fstype="ext4" --size=4000 part swap --size=1000
These patches are all for newui.
Brian C. Lane (3): refactor doKickstartStorage slightly add execute methods for partition related ks classes setup bootloader and partitioning for kickstart
pyanaconda/kickstart.py | 46 +++++++++++++++++++++++++++++++++++ pyanaconda/storage/__init__.py | 9 +++---- pyanaconda/ui/gui/spokes/storage.py | 12 +++++++- 3 files changed, 60 insertions(+), 7 deletions(-)
From: "Brian C. Lane" bcl@redhat.com
--- pyanaconda/kickstart.py | 7 +++++++ pyanaconda/storage/__init__.py | 5 ----- pyanaconda/ui/gui/spokes/storage.py | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py index de46e38..d0ddf50 100644 --- a/pyanaconda/kickstart.py +++ b/pyanaconda/kickstart.py @@ -1478,3 +1478,10 @@ def selectPackages(ksdata, payload): payload.deselectGroup(grp.name) except NoSuchGroup: continue + +def doKickstartStorage(storage, ksdata, instclass): + """ Setup storage state from the kickstart data """ + ksdata.clearpart.execute(storage, ksdata, instclass) + ksdata.bootloader.execute(storage, ksdata, instclass) + ksdata.autopart.execute(storage, ksdata, instclass) + diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py index 88038a1..16d3e71 100644 --- a/pyanaconda/storage/__init__.py +++ b/pyanaconda/storage/__init__.py @@ -2804,8 +2804,3 @@ def parseFSTab(devicetree, chroot=None):
return (mounts, swaps)
-def doKickstartStorage(storage, ksdata, instclass, checker): - ksdata.clearpart.execute(storage, ksdata, instclass) - ksdata.bootloader.execute(storage, ksdata, instclass) - ksdata.autopart.execute(storage, ksdata, instclass) - checker.run() diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py index 7a156a4..924bce2 100644 --- a/pyanaconda/ui/gui/spokes/storage.py +++ b/pyanaconda/ui/gui/spokes/storage.py @@ -47,7 +47,7 @@ from pyanaconda.ui.gui.spokes.lib.cart import SelectedDisksDialog from pyanaconda.ui.gui.categories.storage import StorageCategory from pyanaconda.ui.gui.utils import enlightbox, gdk_threaded
-from pyanaconda.storage import doKickstartStorage +from pyanaconda.kickstart import doKickstartStorage from pyanaconda.storage.size import Size from pyanaconda.product import productName from pyanaconda.flags import flags @@ -317,7 +317,8 @@ class StorageSpoke(NormalSpoke, StorageChecker): self.data.bootloader.bootDrive = self.storage.bootloader.disks[0].name
def execute(self): - doKickstartStorage(self.storage, self.data, self.instclass, self) + doKickstartStorage(self.storage, self.data, self.instclass) + self.run()
@property def completed(self):
From: "Brian C. Lane" bcl@redhat.com
Iterate over the kickstart filesystem and partition data. --- pyanaconda/kickstart.py | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py index d0ddf50..2fe0729 100644 --- a/pyanaconda/kickstart.py +++ b/pyanaconda/kickstart.py @@ -289,6 +289,11 @@ class Bootloader(commands.bootloader.F18_Bootloader): if self.leavebootorder: flags.leavebootorder = True
+class BTRFS(commands.btrfs.F17_BTRFS): + def execute(self, storage, ksdata, instClass): + for b in self.btrfsList: + b.execute(storage, ksdata, instClass) + class BTRFSData(commands.btrfs.F17_BTRFSData): def execute(self, storage, ksdata, instClass): devicetree = storage.devicetree @@ -497,6 +502,11 @@ class IscsiName(commands.iscsiname.FC6_IscsiName): storage.iscsi.iscsi().initiator = self.iscsiname return retval
+class LogVol(commands.logvol.F17_LogVol): + def execute(self, storage, ksdata, instClass): + for l in self.lvList: + l.execute(storage, ksdata, instClass) + class LogVolData(commands.logvol.F17_LogVolData): def execute(self, storage, ksdata, instClass): devicetree = storage.devicetree @@ -790,6 +800,11 @@ class DmRaid(commands.dmraid.FC6_DmRaid): def parse(self, args): raise NotImplementedError("The dmraid kickstart command is not currently supported")
+class Partition(commands.partition.F17_Partition): + def execute(self, storage, ksdata, instClass): + for p in self.partitions: + p.execute(storage, ksdata, instClass) + class PartitionData(commands.partition.F17_PartData): def execute(self, storage, ksdata, instClass): devicetree = storage.devicetree @@ -1011,6 +1026,11 @@ class PartitionData(commands.partition.F17_PartData): parents=request) storage.createDevice(luksdev)
+class Raid(commands.raid.F15_Raid): + def execute(self, storage, ksdata, instClass): + for r in self.raidList: + r.execute(storage, ksdata, instClass) + class RaidData(commands.raid.F15_RaidData): def execute(self, storage, ksdata, instClass): raidmems = [] @@ -1182,6 +1202,11 @@ class Timezone(commands.timezone.F18_Timezone): ntp.save_servers_to_config(self.ntpservers, conf_file_path=chronyd_conf_path)
+class VolGroup(commands.volgroup.FC16_VolGroup): + def execute(self, storage, ksdata, instClass): + for v in self.vgList: + v.execute(storage, ksdata, instClass) + class VolGroupData(commands.volgroup.FC16_VolGroupData): def execute(self, storage, ksdata, instClass): pvs = [] @@ -1263,6 +1288,7 @@ class Keyboard(commands.keyboard.F18_Keyboard): # classes we're overriding in place of the defaults. commandMap = { "autopart": AutoPart, + "btrfs": BTRFS, "bootloader": Bootloader, "clearpart": ClearPart, "dmraid": DmRaid, @@ -1273,9 +1299,14 @@ commandMap = { "iscsiname": IscsiName, "keyboard": Keyboard, "logging": Logging, + "logvol": LogVol, "multipath": MultiPath, + "part": Partition, + "partition": Partition, + "raid": Raid, "services": Services, "timezone": Timezone, + "volgroup": VolGroup, "xconfig": XConfig, "zfcp": ZFCP, } @@ -1479,9 +1510,14 @@ def selectPackages(ksdata, payload): except NoSuchGroup: continue
-def doKickstartStorage(storage, ksdata, instclass): +def doKickstartStorage(storage, ksdata, instClass): """ Setup storage state from the kickstart data """ - ksdata.clearpart.execute(storage, ksdata, instclass) - ksdata.bootloader.execute(storage, ksdata, instclass) - ksdata.autopart.execute(storage, ksdata, instclass) + ksdata.clearpart.execute(storage, ksdata, instClass) + ksdata.bootloader.execute(storage, ksdata, instClass) + ksdata.autopart.execute(storage, ksdata, instClass) + ksdata.btrfs.execute(storage, ksdata, instClass) + ksdata.raid.execute(storage, ksdata, instClass) + ksdata.volgroup.execute(storage, ksdata, instClass) + ksdata.logvol.execute(storage, ksdata, instClass) + ksdata.partition.execute(storage, ksdata, instClass)
From: "Brian C. Lane" bcl@redhat.com
after executing the kickstart commands setup the bootloader and partitions before continuing. Also add logging of any errors found by storage.sanityCheck --- pyanaconda/kickstart.py | 3 +++ pyanaconda/storage/__init__.py | 4 ++++ pyanaconda/ui/gui/spokes/storage.py | 7 +++++++ 3 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py index 2fe0729..1683d20 100644 --- a/pyanaconda/kickstart.py +++ b/pyanaconda/kickstart.py @@ -24,6 +24,7 @@ from storage.devices import LUKSDevice from storage.devicelibs.lvm import getPossiblePhysicalExtents from storage.devicelibs.mpath import MultipathConfigWriter, MultipathTopology from storage.formats import getFormat +from storage.partitioning import doPartitioning import storage.iscsi import storage.fcoe import storage.zfcp @@ -1520,4 +1521,6 @@ def doKickstartStorage(storage, ksdata, instClass): ksdata.volgroup.execute(storage, ksdata, instClass) ksdata.logvol.execute(storage, ksdata, instClass) ksdata.partition.execute(storage, ksdata, instClass) + storage.setUpBootLoader() + doPartitioning(storage)
diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py index 16d3e71..284d482 100644 --- a/pyanaconda/storage/__init__.py +++ b/pyanaconda/storage/__init__.py @@ -97,6 +97,10 @@ def storageInitialize(storage, ksdata, protected): if not storage.disks: raise NoDisksError
+ # kickstart uses all the disks + if flags.automatedInstall: + ksdata.ignoredisk.onlyuse = [d.name for d in storage.disks] + # dispatch.py helper function def storageComplete(anaconda): if anaconda.dir == DISPATCH_BACK: diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py index 924bce2..888de2c 100644 --- a/pyanaconda/ui/gui/spokes/storage.py +++ b/pyanaconda/ui/gui/spokes/storage.py @@ -60,6 +60,9 @@ _ = lambda x: gettext.ldgettext("anaconda", x) N_ = lambda x: x P_ = lambda x, y, z: gettext.ldngettext("anaconda", x, y, z)
+import logging +log = logging.getLogger("anaconda") + __all__ = ["StorageSpoke"]
class FakeDiskLabel(object): @@ -246,6 +249,10 @@ class StorageChecker(object): (StorageChecker.errors, StorageChecker.warnings) = self.storage.sanityCheck() communication.send_ready(self._mainSpokeClass, justUpdate=True) + for e in self.errors: + log.error(e) + for w in self.warnings: + log.warn(w)
class StorageSpoke(NormalSpoke, StorageChecker): builderObjects = ["storageWindow"]
I'm conflicted on it, as I see that kickstart.py might start to get a little out of control. However, it's fine for now.
Actually, I was a little hasty. dlehman brought up a good point about how a strict ordering of kickstart partitioning commands may not work. Let's discuss this in IRC.
- Chris
anaconda-patches@lists.fedorahosted.org