Update all of the dracutSetupData() methods to return lists of dicts containing kernel parameter information. The KernelArguments.get() method in booty will iterate over the list and create the kernel parameter string based on the dict entries. Structure of the data returned from dracutSetupData(): [{'option': STRING, 'value': STRING}, {'option': STRING, 'value': STRING}, ...] The dicts in the list must at least provide an 'option' key. Value can be None, in which case just the 'option' part is added to the kernel args list. If option and value both exist, you'll get option=value written to the kernel arg list. In the future, the dicts may contain a 'combine' boolean and a 'delimiter' string. Explanation is in the docstrings for dracutSetupData in storage/devices.py. --- booty/bootloaderInfo.py | 37 +++++++++++++++++++++++++++++-------- language.py | 4 ++-- network.py | 16 ++++++++-------- storage/devices.py | 38 ++++++++++++++++++++++++++++++++------ 4 files changed, 71 insertions(+), 24 deletions(-) diff --git a/booty/bootloaderInfo.py b/booty/bootloaderInfo.py index 3c3fd7e..0f5d9b8 100644 --- a/booty/bootloaderInfo.py +++ b/booty/bootloaderInfo.py @@ -89,18 +89,39 @@ class KernelArguments: def get(self): args = self.args root = self.id.storage.rootDevice + params = [] + newargs = [] + for d in self.id.storage.devices: if root.dependsOn(d): - dracutSetupData = d.dracutSetupData() - if len(dracutSetupData): - args += " %s" % dracutSetupData + params += d.dracutSetupData() + import storage if isinstance(d, storage.devices.NetworkStorageDevice): - args += " " - args += self.id.network.dracutSetupData(d) + params += self.id.network.dracutSetupData(d) + + params += self.id.instLanguage.dracutSetupData() + + # XXX: need to patch s-c-keyboard + #params += self.id.keyboard.dracutSetupData() + if args: + args.append(self.id.keyboard.dracutSetupString()) + else: + args = self.id.keyboard.dracutSetupString() - args += self.id.instLanguage.dracutSetupData() - args += self.id.keyboard.dracutSetupData() + for param in params: + if not param.has_key('option') or not param.has_key('value'): + continue + + if not param['value']: + newargs.append(param['option']) + else: + newargs.append("%s=%s" % (param['option'], param['value'],)) + + if args: + args += " " + " ".join(newargs) + else: + args = " ".join(newargs) if args and self.appendArgs: args += " " diff --git a/language.py b/language.py index cfcc92e..b96ae37 100644 --- a/language.py +++ b/language.py @@ -200,11 +200,11 @@ class Language(object): return self.nativeLangNames.keys() def dracutSetupData(self): - args="" + args = [] for (key, val) in self.info.iteritems(): if val != None: - args += " %s=%s" % (key, val) + args.append({'option': key, 'value': val}) return args diff --git a/network.py b/network.py index c51d3af..2a91a4f 100644 --- a/network.py +++ b/network.py @@ -794,7 +794,7 @@ class Network: # get a kernel cmdline string for dracut needed for access to host host def dracutSetupData(self, networkStorageDevice): - netargs="" + netargs = [] if networkStorageDevice.nic: # Storage bound to a specific nic (ie FCoE) @@ -823,7 +823,7 @@ class Network: if networkStorageDevice.host_address: if dev.get('bootproto').lower() == 'dhcp': - netargs += "ip=%s:dhcp" % nic + netargs.append({'option': 'ip', 'value': "%s:dhcp" % (nic,)}) else: if dev.get('GATEWAY'): gateway = dev.get('GATEWAY') @@ -835,14 +835,14 @@ class Network: else: hostname = "" - netargs += "ip=%s::%s:%s:%s:%s:none" % (dev.get('ipaddr'), - gateway, dev.get('netmask'), hostname, nic) + val = "%s::%s:%s:%s:%s:none" % (dev.get('ipaddr'), gateway, + dev.get('netmask'), hostname, + nic,) + netargs.append({'option': 'ip', 'value': val}) hwaddr = dev.get("HWADDR") if hwaddr: - if netargs != "": - netargs += " " - - netargs += "ifname=%s:%s" % (nic, hwaddr.lower()) + val = "%s:%s" % (nic, hwaddr.lower(),) + netargs.append({'option': 'ifname', 'value': val}) return netargs diff --git a/storage/devices.py b/storage/devices.py index 4d11932..c20d3f6 100644 --- a/storage/devices.py +++ b/storage/devices.py @@ -326,7 +326,26 @@ class Device(object): return False def dracutSetupData(self): - return "" + """ Return a list of dicts containing kernel parameters for dracut. + Valid dict keys: + + option Name of the kernel parameter (e.g., "acpi") + value Data for the kernel parameter (e.g., "off") + combine If True, all parameters with the same option + will have their value entries joined in to a + string separated by delimimeter. + delimiter Only used if combine is True (e.g., ",") + filter Optional callback function used when combine + is True. The callback function takes a list + of all values for this option, performs a + filtering operation, then returns a list of + values. + + The option and value keys are required. They will be written + out to dracut as option=value. The combine boolean will allow + you to reduce identical options to a single value. + """ + return [] @property def status(self): @@ -3003,9 +3022,11 @@ class iScsiDiskDevice(DiskDevice, NetworkStorageDevice): def dracutSetupData(self): if self.ibft: - return "iscsi_firmware" + return [{'option': 'iscsi_firmware', 'value': None}] - netroot="netroot=iscsi:" + args = [] + entry = {'option': 'netroot'} + netroot = "iscsi:" auth = self.node.getAuth() if auth: netroot += "%s:%s" % (auth.username, auth.password) @@ -3016,9 +3037,13 @@ class iScsiDiskDevice(DiskDevice, NetworkStorageDevice): netroot += "@%s::%d::%s" % (self.node.address, self.node.port, self.node.name) - netroot += " iscsi_initiator=%s" % self.initiator + entry['value'] = netroot + args.append(entry) + + args.append({'option': 'iscsi_initiator', + 'value': "%s" % (self.initiator,)}) - return netroot + return args class FcoeDiskDevice(DiskDevice, NetworkStorageDevice): """ An FCoE disk. """ @@ -3033,7 +3058,8 @@ class FcoeDiskDevice(DiskDevice, NetworkStorageDevice): log.debug("created new fcoe disk %s @ %s" % (device, self.nic)) def dracutSetupData(self): - return "netroot=fcoe:%s:nodcb" % self.nic + return [{'option': 'netroot', + 'value': "fcoe:%s:nodcb" % (self.nic,)}] class OpticalDevice(StorageDevice): -- 1.6.2.5 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list