[PATCH] Add --mkfsoptions to btrfs, logvol, partition, and raid commands.

Chris Lumens clumens at redhat.com
Wed Jun 17 17:40:06 UTC 2015


Only ext* supports filesystem profiles, so we need some other way to let
users provide arbitrary arguments when making filesystems.

Resolves: rhbz#1218260
---
 pykickstart/commands/btrfs.py     | 34 ++++++++++++++++++++++++++++++++++
 pykickstart/commands/logvol.py    | 34 ++++++++++++++++++++++++++++++++--
 pykickstart/commands/partition.py | 32 ++++++++++++++++++++++++++++++++
 pykickstart/commands/raid.py      | 33 +++++++++++++++++++++++++++++++++
 pykickstart/handlers/rhel7.py     | 14 +++++++-------
 tests/commands/btrfs.py           | 12 ++++++++++++
 tests/commands/logvol.py          | 12 +++++++++++-
 tests/commands/partition.py       | 11 +++++++++++
 tests/commands/raid.py            | 12 ++++++++++++
 9 files changed, 184 insertions(+), 10 deletions(-)

diff --git a/pykickstart/commands/btrfs.py b/pykickstart/commands/btrfs.py
index 6c33344..4dc53bf 100644
--- a/pykickstart/commands/btrfs.py
+++ b/pykickstart/commands/btrfs.py
@@ -76,6 +76,22 @@ class F17_BTRFSData(BaseData):
         retval += self._getArgsAsStr()
         return retval + " " + " ".join(self.devices) + "\n"
 
+class RHEL7_BTRFSData(F17_BTRFSData):
+    removedKeywords = F17_BTRFSData.removedKeywords
+    removedAttrs = F17_BTRFSData.removedAttrs
+
+    def __init__(self, *args, **kwargs):
+        F17_BTRFSData.__init__(self, *args, **kwargs)
+        self.mkfsopts = kwargs.get("mkfsoptions", "")
+
+    def _getArgsAsStr(self):
+        retval = F17_BTRFSData._getArgsAsStr(self)
+
+        if self.mkfsopts != "":
+            retval += " --mkfsoptions=\"%s\"" % self.mkfsopts
+
+        return retval
+
 class F17_BTRFS(KickstartCommand):
     removedKeywords = KickstartCommand.removedKeywords
     removedAttrs = KickstartCommand.removedAttrs
@@ -164,3 +180,21 @@ class F17_BTRFS(KickstartCommand):
 
     def dataList(self):
         return self.btrfsList
+
+class RHEL7_BTRFS(F17_BTRFS):
+    removedKeywords = F17_BTRFS.removedKeywords
+    removedAttrs = F17_BTRFS.removedAttrs
+
+    def _getParser(self):
+        op = F17_BTRFS._getParser(self)
+        op.add_option("--mkfsoptions", dest="mkfsopts")
+
+        return op
+
+    def parse(self, args):
+        data = F17_BTRFS.parse(self, args)
+
+        if (data.preexist or not data.format) and data.mkfsopts:
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=_("--mkfsoptions with --noformat or --useexisting has no effect.")))
+
+        return data
diff --git a/pykickstart/commands/logvol.py b/pykickstart/commands/logvol.py
index ae7e7e0..4398ce7 100644
--- a/pykickstart/commands/logvol.py
+++ b/pykickstart/commands/logvol.py
@@ -274,7 +274,21 @@ class F21_LogVolData(F20_LogVolData):
 
         return retval
 
-RHEL7_LogVolData = F21_LogVolData
+class RHEL7_LogVolData(F21_LogVolData):
+    removedKeywords = F21_LogVolData.removedKeywords
+    removedAttrs = F21_LogVolData.removedAttrs
+
+    def __init__(self, *args, **kwargs):
+        F21_LogVolData.__init__(self, *args, **kwargs)
+        self.mkfsopts = kwargs.get("mkfsoptions", "")
+
+    def _getArgsAsStr(self):
+        retval = F21_LogVolData._getArgsAsStr(self)
+
+        if self.mkfsopts:
+            retval += " --mkfsoptions=\"%s\"" % self.mkfsopts
+
+        return retval
 
 class FC3_LogVol(KickstartCommand):
     removedKeywords = KickstartCommand.removedKeywords
@@ -515,4 +529,20 @@ class F21_LogVol(F20_LogVol):
 
         return retval
 
-RHEL7_LogVol = F21_LogVol
+class RHEL7_LogVol(F21_LogVol):
+    removedKeywords = F21_LogVol.removedKeywords
+    removedAttrs = F21_LogVol.removedAttrs
+
+    def _getParser(self):
+        op = F21_LogVol._getParser(self)
+        op.add_option("--mkfsoptions", dest="mkfsopts")
+
+        return op
+
+    def parse(self, args):
+        retval = F21_LogVol.parse(self, args)
+
+        if not retval.format and retval.mkfsopts:
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=_("--mkfsoptions with --noformat has no effect.")))
+
+        return retval
diff --git a/pykickstart/commands/partition.py b/pykickstart/commands/partition.py
index 437347c..4db6425 100644
--- a/pykickstart/commands/partition.py
+++ b/pykickstart/commands/partition.py
@@ -240,6 +240,20 @@ class F18_PartData(F17_PartData):
 
         return retval
 
+class RHEL7_PartData(F18_PartData):
+    def __init__(self, *args, **kwargs):
+        F18_PartData.__init__(self, *args, **kwargs)
+
+        self.mkfsopts = kwargs.get("mkfsoptions", "")
+
+    def _getArgsAsStr(self):
+        retval = F18_PartData._getArgsAsStr(self)
+
+        if self.mkfsopts != "":
+            retval += " --mkfsoptions=\"%s\"" % self.mkfsopts
+
+        return retval
+
 class FC3_Partition(KickstartCommand):
     removedKeywords = KickstartCommand.removedKeywords
     removedAttrs = KickstartCommand.removedAttrs
@@ -471,3 +485,21 @@ class F20_Partition(F18_Partition):
                 raise KickstartParseError(formatErrorMsg(self.lineno, msg=errorMsg)) 
 
         return retval
+
+class RHEL7_Partition(F20_Partition):
+    removedKeywords = F20_Partition.removedKeywords
+    removedAttrs = F20_Partition.removedAttrs
+
+    def _getParser(self):
+        op = F20_Partition._getParser(self)
+        op.add_option("--mkfsoptions", dest="mkfsopts")
+
+        return op
+
+    def parse(self, args):
+        retval = F20_Partition.parse(self, args)
+
+        if not retval.format and retval.mkfsopts:
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=_("--mkfsoptions with --noformat has no effect.")))
+
+        return retval
diff --git a/pykickstart/commands/raid.py b/pykickstart/commands/raid.py
index b0f1ffd..2a5b76d 100644
--- a/pykickstart/commands/raid.py
+++ b/pykickstart/commands/raid.py
@@ -234,6 +234,22 @@ class F18_RaidData(F15_RaidData):
 
         return retval
 
+class RHEL7_RaidData(F18_RaidData):
+    removedKeywords = F18_RaidData.removedKeywords
+    removedAttrs = F18_RaidData.removedAttrs
+
+    def __init__(self, *args, **kwargs):
+        F18_RaidData.__init__(self, *args, **kwargs)
+        self.mkfsopts = kwargs.get("mkfsoptions", "")
+
+    def _getArgsAsStr(self):
+        retval = F18_RaidData._getArgsAsStr(self)
+
+        if self.mkfsopts:
+            retval += " --mkfsoptions=\"%s\"" % self.mkfsopts
+
+        return retval
+
 class FC3_Raid(KickstartCommand):
     removedKeywords = KickstartCommand.removedKeywords
     removedAttrs = KickstartCommand.removedAttrs
@@ -470,3 +486,20 @@ class F20_Raid(F19_Raid):
             errorMsg = _("The raid and autopart commands can't be used at the same time")
             raise KickstartParseError(formatErrorMsg(self.lineno, msg=errorMsg))
         return retval
+
+class RHEL7_Raid(F20_Raid):
+    removedKeywords = F20_Raid.removedKeywords
+    removedAttrs = F20_Raid.removedAttrs
+
+    def _getParser(self):
+        op = F20_Raid._getParser(self)
+        op.add_option("--mkfsoptions", dest="mkfsopts")
+        return op
+
+    def parse(self, args):
+        retval = F20_Raid.parse(self, args)
+
+        if not retval.format and retval.mkfsopts:
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=_("--mkfsoptions with --noformat has no effect.")))
+
+        return retval
diff --git a/pykickstart/handlers/rhel7.py b/pykickstart/handlers/rhel7.py
index 7bb3e7b..d6ab35f 100644
--- a/pykickstart/handlers/rhel7.py
+++ b/pykickstart/handlers/rhel7.py
@@ -32,7 +32,7 @@ class RHEL7Handler(BaseHandler):
         "autopart": commands.autopart.RHEL7_AutoPart,
         "autostep": commands.autostep.FC3_AutoStep,
         "bootloader": commands.bootloader.RHEL7_Bootloader,
-        "btrfs": commands.btrfs.F17_BTRFS,
+        "btrfs": commands.btrfs.RHEL7_BTRFS,
         "cdrom": commands.cdrom.FC3_Cdrom,
         "clearpart": commands.clearpart.F21_ClearPart,
         "cmdline": commands.displaymode.FC3_DisplayMode,
@@ -63,10 +63,10 @@ class RHEL7Handler(BaseHandler):
         "network": commands.network.RHEL7_Network,
         "nfs": commands.nfs.FC6_NFS,
         "ostreesetup": commands.ostreesetup.RHEL7_OSTreeSetup,
-        "part": commands.partition.F20_Partition,
-        "partition": commands.partition.F20_Partition,
+        "part": commands.partition.RHEL7_Partition,
+        "partition": commands.partition.RHEL7_Partition,
         "poweroff": commands.reboot.RHEL7_Reboot,
-        "raid": commands.raid.F20_Raid,
+        "raid": commands.raid.RHEL7_Raid,
         "realm": commands.realm.F19_Realm,
         "reboot": commands.reboot.RHEL7_Reboot,
         "repo": commands.repo.RHEL7_Repo,
@@ -93,7 +93,7 @@ class RHEL7Handler(BaseHandler):
     }
 
     dataMap = {
-        "BTRFSData": commands.btrfs.F17_BTRFSData,
+        "BTRFSData": commands.btrfs.RHEL7_BTRFSData,
         "DriverDiskData": commands.driverdisk.F14_DriverDiskData,
         "DeviceData": commands.device.F8_DeviceData,
         "DmRaidData": commands.dmraid.FC6_DmRaidData,
@@ -103,8 +103,8 @@ class RHEL7Handler(BaseHandler):
         "LogVolData": commands.logvol.RHEL7_LogVolData,
         "MultiPathData": commands.multipath.FC6_MultiPathData,
         "NetworkData": commands.network.RHEL7_NetworkData,
-        "PartData": commands.partition.F18_PartData,
-        "RaidData": commands.raid.F18_RaidData,
+        "PartData": commands.partition.RHEL7_PartData,
+        "RaidData": commands.raid.RHEL7_RaidData,
         "RepoData": commands.repo.RHEL7_RepoData,
         "SshPwData": commands.sshpw.F13_SshPwData,
         "UserData": commands.user.F19_UserData,
diff --git a/tests/commands/btrfs.py b/tests/commands/btrfs.py
index c0755d6..4c3e1bb 100644
--- a/tests/commands/btrfs.py
+++ b/tests/commands/btrfs.py
@@ -105,5 +105,17 @@ class F17_TestCase(CommandTest):
         self.assertEqual(self.assert_parse("btrfs / part.01"), self.assert_parse("btrfs / part.02"))
         self.assertNotEqual(self.assert_parse("btrfs / part.01"), self.assert_parse("btrfs /home part.01"))
 
+class RHEL7_TestCase(F17_TestCase):
+    def runTest(self):
+        F17_TestCase.runTest(self)
+
+        # pass
+        self.assert_parse("btrfs / --mkfsoptions=some,thing part.01",
+                          "btrfs / --mkfsoptions=\"some,thing\" part.01\n")
+
+        # can't use --mkfsoptions if you're not formatting
+        self.assert_parse_error("btrfs / --useexisting --mkfsoptions=whatever", KickstartValueError)
+        self.assert_parse_error("btrfs / --noformat --mkfsoptions=whatever", KickstartValueError)
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/tests/commands/logvol.py b/tests/commands/logvol.py
index 37d0ab9..507dcce 100644
--- a/tests/commands/logvol.py
+++ b/tests/commands/logvol.py
@@ -308,7 +308,17 @@ class F21_TestCase(F20_TestCase):
 
         self.assert_parse_error("logvol /home --name=home --vgname=vg --size=2 --percent=30")
 
-RHEL7_TestCase = F21_TestCase
+class RHEL7_TestCase(F21_TestCase):
+    def runTest(self):
+        F21_TestCase.runTest(self)
+
+        # pass
+        self.assert_parse("logvol / --size=4096 --name=LVNAME --vgname=VGNAME --mkfsoptions=some,thing",
+                          "logvol /  --size=4096 --mkfsoptions=\"some,thing\" --name=LVNAME --vgname=VGNAME\n")
+
+        # can't use --mkfsoptions if you're not formatting
+        self.assert_parse_error("logvol / --size=4096 --name=LVNAME --vgname=VGNAME --mkfsoptions=some,thing --noformat",
+                                KickstartValueError)
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tests/commands/partition.py b/tests/commands/partition.py
index 6c81b9e..93a1f70 100644
--- a/tests/commands/partition.py
+++ b/tests/commands/partition.py
@@ -206,5 +206,16 @@ class F18_TestCase(F17_TestCase):
 
         self.assert_parse_error("part / --cipher")
 
+class RHEL7_TestCase(F18_TestCase):
+    def runTest(self):
+        F18_TestCase.runTest(self)
+
+        # pass
+        self.assert_parse("part / --size=4096 --mkfsoptions=some,thing",
+                          "part / --size=4096 --mkfsoptions=\"some,thing\"\n")
+
+        # can't use --mkfsoptions if you're not formatting
+        self.assert_parse_error("part / --size=4096 --mkfsoptions=some,thing --noformat", KickstartValueError)
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/tests/commands/raid.py b/tests/commands/raid.py
index 1346340..8566c80 100644
--- a/tests/commands/raid.py
+++ b/tests/commands/raid.py
@@ -257,5 +257,17 @@ class F19_TestCase(F18_TestCase):
         F18_TestCase.__init__(self, *kargs, **kwargs)
         self.minorBasedDevice = False
 
+class RHEL7_TestCase(F19_TestCase):
+    def runTest(self):
+        F19_TestCase.runTest(self)
+
+        # pass
+        self.assert_parse("raid / --device=md0 --level=1 --mkfsoptions=some,thing raid.01 raid.02",
+                          "raid / --device=0 --level=RAID1 --mkfsoptions=\"some,thing\" raid.01 raid.02\n")
+
+        # can't use --mkfsoptions if you're not formatting
+        self.assert_parse_error("raid / --device=md0 --level=1 --mkfsoptions=some,thing --noformat raid.01 raid.02",
+                                KickstartValueError)
+
 if __name__ == "__main__":
     unittest.main()
-- 
2.4.3



More information about the anaconda-patches mailing list