From 1875bec8d6876563df9019c4fb1d77cd691cc0df Mon Sep 17 00:00:00 2001 From: David Lehman Date: Wed, 14 Aug 2013 15:56:44 -0500 Subject: [PATCH 8/9] Move lvm/md data functions out of udev since the data isn't from udev. --- blivet/devicelibs/lvm.py | 84 +++++++++++++++++++++++++++++++++++++++ blivet/devicelibs/mdraid.py | 18 +++++++++ blivet/devices.py | 2 +- blivet/devicetree.py | 78 ++++++++++++++++++------------------ blivet/udev.py | 96 --------------------------------------------- 5 files changed, 142 insertions(+), 136 deletions(-) diff --git a/blivet/devicelibs/lvm.py b/blivet/devicelibs/lvm.py index 5bc189c..005460f 100644 --- a/blivet/devicelibs/lvm.py +++ b/blivet/devicelibs/lvm.py @@ -490,3 +490,87 @@ def thinlvpoolname(vg_name, lv_name): pool = '' return pool + +## +## functions for retrieving specific data from pvinfo, vginfo, lvs return values +## +def info_get_vg_name(info): + return info['LVM2_VG_NAME'] + +def info_get_lv_vg_name(info): + return info['DM_VG_NAME'] + +def info_get_vg_uuid(info): + return info['LVM2_VG_UUID'] + +def info_get_vg_size(info): + # lvm's decmial precision is not configurable, so we tell it to use + # KB and convert to MB here + return float(info['LVM2_VG_SIZE']) / 1024 + +def info_get_vg_free(info): + # lvm's decmial precision is not configurable, so we tell it to use + # KB and convert to MB here + return float(info['LVM2_VG_FREE']) / 1024 + +def info_get_vg_extent_size(info): + # lvm's decmial precision is not configurable, so we tell it to use + # KB and convert to MB here + return float(info['LVM2_VG_EXTENT_SIZE']) / 1024 + +def info_get_vg_extent_count(info): + return int(info['LVM2_VG_EXTENT_COUNT']) + +def info_get_vg_free_extents(info): + return int(info['LVM2_VG_FREE_COUNT']) + +def info_get_vg_pv_count(info): + return int(info['LVM2_PV_COUNT']) + +def info_get_pv_pe_start(info): + # lvm's decmial precision is not configurable, so we tell it to use + # KB and convert to MB here + return float(info['LVM2_PE_START']) / 1024 + +def info_get_lv_names(info): + names = info['LVM2_LV_NAME'] + if not names: + names = [] + elif not isinstance(names, list): + names = [names] + return names + +def info_get_lv_uuids(info): + uuids = info['LVM2_LV_UUID'] + if not uuids: + uuids = [] + elif not isinstance(uuids, list): + uuids = [uuids] + return uuids + +def info_get_lv_sizes(info): + # lvm's decmial precision is not configurable, so we tell it to use + # KB and convert to MB here + sizes = info['LVM2_LV_SIZE'] + if not sizes: + sizes = [] + elif not isinstance(sizes, list): + sizes = [sizes] + + return [float(s) / 1024 for s in sizes] + +def info_get_lv_attr(info): + attr = info['LVM2_LV_ATTR'] + if not attr: + attr = [] + elif not isinstance(attr, list): + attr = [attr] + return attr + +def info_get_lv_types(info): + segtypes = info['LVM2_SEGTYPE'] + if not segtypes: + segtypes = [] + elif not isinstance(segtypes, list): + segtypes = [segtypes] + return segtypes diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py index 9c827e1..84f8c70 100644 --- a/blivet/devicelibs/mdraid.py +++ b/blivet/devicelibs/mdraid.py @@ -279,3 +279,21 @@ def name_from_md_node(node): log.debug("returning %s" % name) return name + +## +## functions for retrieving specific data from the mdexamine return value +## +def info_get_md_level(info): + return info.get("MD_LEVEL") + +def info_get_md_devices(info): + return int(info["MD_DEVICES"]) + +def info_get_md_uuid(info): + return info["MD_UUID"] + +def info_get_md_container(info): + return info.get("MD_CONTAINER") + +def info_get_md_name(info): + return info.get("MD_DEVNAME") diff --git a/blivet/devices.py b/blivet/devices.py index f47178a..e3b94c4 100644 --- a/blivet/devices.py +++ b/blivet/devices.py @@ -3589,7 +3589,7 @@ class MDRaidArrayDevice(StorageDevice): # update our uuid attribute with the new array's UUID info = mdraid.mdexamine(self.parents[0].path) - self.uuid = udev_device_get_md_uuid(info) + self.uuid = mdraid.info_get_md_uuid(info) for member in self.devices: member.mdUuid = self.uuid diff --git a/blivet/devicetree.py b/blivet/devicetree.py index ebeb910..a530eb3 100644 --- a/blivet/devicetree.py +++ b/blivet/devicetree.py @@ -712,13 +712,13 @@ class DeviceTree(object): # the filter ui. Note that making the ui use md names instead is not # possible as the md names are simpy md# and we cannot predict the # if udev_device_is_md(info) and \ - udev_device_get_md_level(info) == "container": + devicelibs.mdraid.info_get_md_level(info) == "container": return False - if udev_device_get_md_container(info) and \ + if devicelibs.mdraid.info_get_md_container(info) and \ udev_device_is_md(info) and \ - udev_device_get_md_name(info): - md_name = udev_device_get_md_name(info) + devicelibs.mdraid.info_get_md_name(info): + md_name = devicelibs.mdraid.info_get_md_name(info) # mdadm may have appended _+ if the current hostname # does not match the one in the array metadata alt_name = re.sub("_\d+$", "", md_name) @@ -774,7 +774,7 @@ class DeviceTree(object): udev_device_is_dm_lvm(info) or udev_device_is_dm_crypt(info) or (udev_device_is_md(info) and - not udev_device_get_md_container(info)))) + not devicelibs.mdraid.info_get_md_container(info)))) def addUdevLVDevice(self, info): name = udev_device_get_name(info) @@ -782,7 +782,7 @@ class DeviceTree(object): uuid = udev_device_get_uuid(info) sysfs_path = udev_device_get_sysfs_path(info) - vg_name = udev_device_get_lv_vg_name(info) + vg_name = devicelibs.lvm.info_get_lv_vg_name(info) device = self.getDeviceByName(vg_name, hidden=True) if device and not isinstance(device, LVMVolumeGroupDevice): log.warning("found non-vg device with name %s" % vg_name) @@ -797,7 +797,7 @@ class DeviceTree(object): pv_info = udev_get_device(pv_sysfs_path) self.addUdevDevice(pv_info) - vg_name = udev_device_get_lv_vg_name(info) + vg_name = devicelibs.lvm.info_get_lv_vg_name(info) device = self.getDeviceByName(vg_name) if not device: log.error("failed to find vg '%s' after scanning pvs" % vg_name) @@ -948,7 +948,7 @@ class DeviceTree(object): return device def addUdevMDDevice(self, info): - name = udev_device_get_md_name(info) + name = devicelibs.mdraid.info_get_md_name(info) log_method_call(self, name=name) uuid = udev_device_get_uuid(info) sysfs_path = udev_device_get_sysfs_path(info) @@ -1120,10 +1120,10 @@ class DeviceTree(object): kwargs["nic"] = udev_device_get_fcoe_nic(info) kwargs["identifier"] = udev_device_get_fcoe_identifier(info) log.info("%s is an fcoe disk" % name) - elif udev_device_get_md_container(info): - name = udev_device_get_md_name(info) + elif devicelibs.mdraid.info_get_md_container(info): + name = devicelibs.mdraid.info_get_md_name(info) diskType = MDRaidArrayDevice - parentPath = udev_device_get_md_container(info) + parentPath = devicelibs.mdraid.info_get_md_container(info) parentName = devicePathToName(parentPath) container = self.getDeviceByName(parentName) if not container: @@ -1142,9 +1142,9 @@ class DeviceTree(object): return kwargs["parents"] = [container] - kwargs["level"] = udev_device_get_md_level(info) - kwargs["memberDevices"] = int(udev_device_get_md_devices(info)) - kwargs["uuid"] = udev_device_get_md_uuid(info) + kwargs["level"] = devicelibs.mdraid.info_get_md_level(info) + kwargs["memberDevices"] = int(devicelibs.mdraid.info_get_md_devices(info)) + kwargs["uuid"] = devicelibs.mdraid.info_get_md_uuid(info) kwargs["exists"] = True del kwargs["serial"] del kwargs["vendor"] @@ -1255,7 +1255,7 @@ class DeviceTree(object): log.info("scanning %s (%s)..." % (name, sysfs_path)) device = self.getDeviceByName(name) if device is None and udev_device_is_md(info): - device = self.getDeviceByName(udev_device_get_md_name(info)) + device = self.getDeviceByName(devicelibs.mdraid.info_get_md_name(info)) if device and not isinstance(device, MDRaidArrayDevice): # make sure any device we found is an md device device = None @@ -1283,7 +1283,7 @@ class DeviceTree(object): elif udev_device_is_dm(info): log.info("%s is a device-mapper device" % name) device = self.addUdevDMDevice(info) - elif udev_device_is_md(info) and not udev_device_get_md_container(info): + elif udev_device_is_md(info) and not devicelibs.mdraid.info_get_md_container(info): log.info("%s is an md device" % name) if uuid: # try to find the device by uuid @@ -1596,8 +1596,8 @@ class DeviceTree(object): # lookup/create the VG and LVs try: - vg_name = udev_device_get_vg_name(pvInfo) - vg_uuid = udev_device_get_vg_uuid(pvInfo) + vg_name = devicelibs.lvm.info_get_vg_name(pvInfo) + vg_uuid = devicelibs.lvm.info_get_vg_uuid(pvInfo) except KeyError: # no vg name means no vg -- we're done with this pv return @@ -1611,12 +1611,12 @@ class DeviceTree(object): vg_device._addDevice(device) else: try: - vg_size = udev_device_get_vg_size(pvInfo) - vg_free = udev_device_get_vg_free(pvInfo) - pe_size = udev_device_get_vg_extent_size(pvInfo) - pe_count = udev_device_get_vg_extent_count(pvInfo) - pe_free = udev_device_get_vg_free_extents(pvInfo) - pv_count = udev_device_get_vg_pv_count(pvInfo) + vg_size = devicelibs.lvm.info_get_vg_size(pvInfo) + vg_free = devicelibs.lvm.info_get_vg_free(pvInfo) + pe_size = devicelibs.lvm.info_get_vg_extent_size(pvInfo) + pe_count = devicelibs.lvm.info_get_vg_extent_count(pvInfo) + pe_free = devicelibs.lvm.info_get_vg_free_extents(pvInfo) + pv_count = devicelibs.lvm.info_get_vg_pv_count(pvInfo) except (KeyError, ValueError) as e: log.warning("invalid data for %s: %s" % (device.name, e)) return @@ -1639,11 +1639,11 @@ class DeviceTree(object): # do this for all pvs as pvs only contain lv info for lvs which they # contain themselves try: - lv_names = udev_device_get_lv_names(lv_info) - lv_uuids = udev_device_get_lv_uuids(lv_info) - lv_sizes = udev_device_get_lv_sizes(lv_info) - lv_attr = udev_device_get_lv_attr(lv_info) - lv_types = udev_device_get_lv_types(lv_info) + lv_names = devicelibs.lvm.info_get_lv_names(lv_info) + lv_uuids = devicelibs.lvm.info_get_lv_uuids(lv_info) + lv_sizes = devicelibs.lvm.info_get_lv_sizes(lv_info) + lv_attr = devicelibs.lvm.info_get_lv_attr(lv_info) + lv_types = devicelibs.lvm.info_get_lv_types(lv_info) except KeyError as e: log.warning("invalid data for %s: %s" % (device.name, e)) return @@ -1681,9 +1681,9 @@ class DeviceTree(object): # create the array with just this one member try: # level is reported as, eg: "raid1" - md_level = udev_device_get_md_level(mdInfo) - md_devices = int(udev_device_get_md_devices(mdInfo)) - md_uuid = udev_device_get_md_uuid(mdInfo) + md_level = devicelibs.mdraid.info_get_md_level(mdInfo) + md_devices = int(devicelibs.mdraid.info_get_md_devices(mdInfo)) + md_uuid = devicelibs.mdraid.info_get_md_uuid(mdInfo) except (KeyError, ValueError) as e: log.warning("invalid data for %s: %s" % (name, e)) return @@ -1698,8 +1698,8 @@ class DeviceTree(object): continue try: - dev_uuid = udev_device_get_md_uuid(dev) - dev_level = udev_device_get_md_level(dev) + dev_uuid = devicelibs.mdraid.info_get_md_uuid(dev) + dev_level = devicelibs.mdraid.info_get_md_level(dev) except KeyError: continue @@ -1707,7 +1707,7 @@ class DeviceTree(object): continue if dev_uuid == md_uuid and dev_level == md_level: - md_name = udev_device_get_md_name(dev) + md_name = devicelibs.mdraid.info_get_md_name(dev) md_metadata = dev.get("MD_METADATA") if not md_name: # containers don't typically have names and they also @@ -1897,7 +1897,7 @@ class DeviceTree(object): # mdraid try: - kwargs["mdUuid"] = udev_device_get_md_uuid(md_info) + kwargs["mdUuid"] = devicelibs.mdraid.info_get_md_uuid(md_info) except KeyError: log.warning("mdraid member %s has no md uuid" % name) kwargs["biosraid"] = udev_device_is_biosraid_member(info) @@ -1906,15 +1906,15 @@ class DeviceTree(object): pv_info = devicelibs.lvm.pvinfo(device.path) try: - kwargs["vgName"] = udev_device_get_vg_name(pv_info) + kwargs["vgName"] = devicelibs.lvm.info_get_vg_name(pv_info) except KeyError as e: log.warning("PV %s has no vg_name" % name) try: - kwargs["vgUuid"] = udev_device_get_vg_uuid(pv_info) + kwargs["vgUuid"] = devicelibs.lvm.info_get_vg_uuid(pv_info) except KeyError: log.warning("PV %s has no vg_uuid" % name) try: - kwargs["peStart"] = udev_device_get_pv_pe_start(pv_info) + kwargs["peStart"] = devicelibs.lvm.info_get_pv_pe_start(pv_info) except KeyError: log.warning("PV %s has no pe_start" % name) elif format_type == "vfat": diff --git a/blivet/udev.py b/blivet/udev.py index c0e77df..eb33afa 100644 --- a/blivet/udev.py +++ b/blivet/udev.py @@ -306,102 +306,6 @@ def udev_device_get_major(info): def udev_device_get_minor(info): return int(info["MINOR"]) -def udev_device_get_md_level(info): - return info.get("MD_LEVEL") - -def udev_device_get_md_devices(info): - return int(info["MD_DEVICES"]) - -def udev_device_get_md_uuid(info): - return info["MD_UUID"] - -def udev_device_get_md_container(info): - return info.get("MD_CONTAINER") - -def udev_device_get_md_name(info): - return info.get("MD_DEVNAME") - -def udev_device_get_vg_name(info): - return info['LVM2_VG_NAME'] - -def udev_device_get_lv_vg_name(info): - return info['DM_VG_NAME'] - -def udev_device_get_vg_uuid(info): - return info['LVM2_VG_UUID'] - -def udev_device_get_vg_size(info): - # lvm's decmial precision is not configurable, so we tell it to use - # KB and convert to MB here - return float(info['LVM2_VG_SIZE']) / 1024 - -def udev_device_get_vg_free(info): - # lvm's decmial precision is not configurable, so we tell it to use - # KB and convert to MB here - return float(info['LVM2_VG_FREE']) / 1024 - -def udev_device_get_vg_extent_size(info): - # lvm's decmial precision is not configurable, so we tell it to use - # KB and convert to MB here - return float(info['LVM2_VG_EXTENT_SIZE']) / 1024 - -def udev_device_get_vg_extent_count(info): - return int(info['LVM2_VG_EXTENT_COUNT']) - -def udev_device_get_vg_free_extents(info): - return int(info['LVM2_VG_FREE_COUNT']) - -def udev_device_get_vg_pv_count(info): - return int(info['LVM2_PV_COUNT']) - -def udev_device_get_pv_pe_start(info): - # lvm's decmial precision is not configurable, so we tell it to use - # KB and convert to MB here - return float(info['LVM2_PE_START']) / 1024 - -def udev_device_get_lv_names(info): - names = info['LVM2_LV_NAME'] - if not names: - names = [] - elif not isinstance(names, list): - names = [names] - return names - -def udev_device_get_lv_uuids(info): - uuids = info['LVM2_LV_UUID'] - if not uuids: - uuids = [] - elif not isinstance(uuids, list): - uuids = [uuids] - return uuids - -def udev_device_get_lv_sizes(info): - # lvm's decmial precision is not configurable, so we tell it to use - # KB and convert to MB here - sizes = info['LVM2_LV_SIZE'] - if not sizes: - sizes = [] - elif not isinstance(sizes, list): - sizes = [sizes] - - return [float(s) / 1024 for s in sizes] - -def udev_device_get_lv_attr(info): - attr = info['LVM2_LV_ATTR'] - if not attr: - attr = [] - elif not isinstance(attr, list): - attr = [attr] - return attr - -def udev_device_get_lv_types(info): - segtypes = info['LVM2_SEGTYPE'] - if not segtypes: - segtypes = [] - elif not isinstance(segtypes, list): - segtypes = [segtypes] - return segtypes - def udev_device_dm_subsystem_match(info, subsystem): """ Return True if the device matches a given device-mapper subsystem. """ uuid = info.get("DM_UUID", "") -- 1.8.1.4