summaryrefslogtreecommitdiffstats
path: root/commands/storage/lmi
diff options
context:
space:
mode:
authorJan Safranek <jsafrane@redhat.com>2013-09-02 15:52:05 +0200
committerJan Safranek <jsafrane@redhat.com>2013-09-02 17:02:38 +0200
commitfbb605c79ec8e902fc044e19ac78ca84aff34f8c (patch)
tree649b84a726927d9a31b6dc3824bb0bfa2064b1f5 /commands/storage/lmi
parent38828189c26bb9a38f3ac839e94bc7c61fefe03c (diff)
downloadopenlmi-scripts-fbb605c79ec8e902fc044e19ac78ca84aff34f8c.tar.gz
openlmi-scripts-fbb605c79ec8e902fc044e19ac78ca84aff34f8c.tar.xz
openlmi-scripts-fbb605c79ec8e902fc044e19ac78ca84aff34f8c.zip
Fixed 'device tree', 'device depends' and 'device provides' with logical partitions.
Before: $ device depends /dev/sda5 DeviceID Name ElementName /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-4 /dev/sda4 sda4 $ device tree /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0 /dev/sda sda 1024M MS-DOS partition table ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part1 /dev/sda1 sda1 94M ext4 ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part2 /dev/sda2 sda2 95M Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part3 /dev/sda3 sda3 94M Unknown └─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part4 /dev/sda4 sda4 1024 Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part5 /dev/sda5 sda5 93M Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part6 /dev/sda6 sda6 95M Unknown └─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part7 /dev/sda7 sda7 94M Unknown After: $ device depends /dev/sda5 DeviceID Name ElementName /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0 /dev/sda sda $ device tree /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0 /dev/sda sda 1024M MS-DOS partition table ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part1 /dev/sda1 sda1 94M ext4 ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part2 /dev/sda2 sda2 95M Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part3 /dev/sda3 sda3 94M Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part4 /dev/sda4 sda4 1024 Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part5 /dev/sda5 sda5 93M Unknown ├─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part6 /dev/sda6 sda6 95M Unknown └─/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-part7 /dev/sda7 sda7 94M Unknown
Diffstat (limited to 'commands/storage/lmi')
-rw-r--r--commands/storage/lmi/scripts/storage/common.py34
-rw-r--r--commands/storage/lmi/scripts/storage/device_cmd.py33
-rw-r--r--commands/storage/lmi/scripts/storage/fs.py2
-rw-r--r--commands/storage/lmi/scripts/storage/lvm.py1
4 files changed, 67 insertions, 3 deletions
diff --git a/commands/storage/lmi/scripts/storage/common.py b/commands/storage/lmi/scripts/storage/common.py
index aea65f2..367f6ef 100644
--- a/commands/storage/lmi/scripts/storage/common.py
+++ b/commands/storage/lmi/scripts/storage/common.py
@@ -274,9 +274,11 @@ def get_devices(ns, devices=None):
:rtype: list of LMIInstance/CIM_StorageExtent.
"""
if devices:
+ LOG().debug("get_devices: Loading list of selected devices.")
for dev in devices:
yield str2device(ns, dev)
else:
+ LOG().debug("get_devices: Loading list of all devices.")
for dev in ns.CIM_StorageExtent.instances():
yield dev
@@ -330,7 +332,21 @@ def get_parents(ns, obj, deep=False):
# Try usual BasedOn next
parents = obj.associators(AssocClass="CIM_BasedOn", Role="Dependent")
for parent in parents:
- yield parent
+ # Be careful with logical partitions - they are BasedOn extended
+ # partition, but we want to return appropriate disk instead.
+ logical = ns.LMI_DiskPartition.PartitionTypeValues.Logical
+ extended = ns.LMI_DiskPartition.PartitionTypeValues.Extended
+ if (lmi_isinstance(parent, ns.CIM_DiskPartition)
+ and lmi_isinstance(obj, ns.CIM_DiskPartition)
+ and obj.PartitionType == logical
+ and parent.PartitionType == extended):
+ LOG().debug("Looking for disk instead of extended partition %s"
+ % (parent.DeviceID))
+ for p in get_parents(ns, parent, False):
+ yield p
+ else:
+ # It is not logical partition
+ yield parent
elif lmi_isinstance(obj, ns.CIM_StoragePool):
# find physical volumes of the VG
@@ -395,10 +411,26 @@ def get_children(ns, obj, deep=False):
yield child
return
+ # Extended partition don't have children
+ extended = ns.LMI_DiskPartition.PartitionTypeValues.Extended
+ if (lmi_isinstance(obj, ns.CIM_DiskPartition)
+ and obj.PartitionType == extended):
+ return
+
# try usual BasedOn next
children = obj.associators(AssocClass="CIM_BasedOn", Role="Antecedent")
for child in children:
yield child
+ # Be careful with logical partitions - they are BasedOn extended
+ # partition, but we want to have them as children of appropriate
+ # disk instead.
+ if (lmi_isinstance(child, ns.CIM_DiskPartition)
+ and child.PartitionType == extended):
+ LOG().debug("Looking for logical partitions on %s"
+ % (child.DeviceID))
+ for c in child.associators(AssocClass="CIM_BasedOn",
+ Role="Antecedent"):
+ yield c
elif lmi_isinstance(obj, ns.CIM_StoragePool):
# find LVs allocated from the VG
diff --git a/commands/storage/lmi/scripts/storage/device_cmd.py b/commands/storage/lmi/scripts/storage/device_cmd.py
index 0e4dede..d250d56 100644
--- a/commands/storage/lmi/scripts/storage/device_cmd.py
+++ b/commands/storage/lmi/scripts/storage/device_cmd.py
@@ -79,7 +79,8 @@ from lmi.scripts.storage.common import (size2str, get_devices, get_children,
get_parents, str2device)
from lmi.scripts.storage.lvm import get_vgs
from lmi.shell.LMIUtil import lmi_isinstance
-from lmi.scripts.common import formatter
+from lmi.scripts.common import formatter, get_logger
+LOG = get_logger(__name__)
def get_device_info(ns, device, human_friendly):
"""
@@ -90,11 +91,12 @@ def get_device_info(ns, device, human_friendly):
else:
size = 'N/A'
+ fslabel = fs.get_device_format_label(ns, device)
return (device.DeviceID,
device.Name,
device.ElementName,
size,
- fs.get_device_format_label(ns, device))
+ fslabel)
def get_pool_info(_ns, pool, human_friendly):
"""
@@ -257,17 +259,44 @@ class Tree(command.LmiLister):
# Load all dependencies, calling get_children iteratively is slow
# Add CIM_BasedOn dependencies (and omit LMI_LVBasedOn, we need
# LMI_LVAllocatedFromStoragePool instead)
+ LOG().debug("Loading list of CIM_BasedOn associations.")
deps = [(self.get_obj_id(ns, i.Antecedent),
self.get_obj_id(ns, i.Dependent))
for i in ns.CIM_BasedOn.instances()
if not lmi_isinstance(i, ns.LMI_LVBasedOn)]
+ # Be careful with logical partitions - they are BasedOn on appropriate
+ # extended partition, but we want to draw them as children of
+ # appropriate disk.
+ LOG().debug("Reworking BasedOn associations for logical partitions.")
+ logical = ns.LMI_DiskPartition.PartitionTypeValues.Logical
+ extended = ns.LMI_DiskPartition.PartitionTypeValues.Extended
+ for i in xrange(len(deps)):
+ dev = devices[deps[i][0]]
+ child = devices[deps[i][1]]
+ LOG().debug("Inspecting %s - %s" % deps[i])
+ if ("PartitionType" in dev.properties()
+ and "PartitionType" in child.properties()
+ and dev.PartitionType == extended
+ and child.PartitionType == logical):
+ # We found ext. partition - logical partition dependency
+ # Find the disk
+ disk_id = None
+ for (d, c) in deps:
+ if c == deps[i][0]:
+ disk_id = d
+ # Replace the extended->logical dependency with disk->logical
+ deps[i] = (disk_id, deps[i][1])
+ LOG().debug("--- Replaced with %s - %s" % deps[i])
+
# Add VG-LV dependencies from LMI_LVAllocatedFromStoragePool association
+ LOG().debug("Loading LVAllocatedFromStoragePool associations.")
deps += [(self.get_obj_id(ns, i.Antecedent),
self.get_obj_id(ns, i.Dependent))
for i in ns.LMI_LVAllocatedFromStoragePool.instances()]
# Add PV-VG dependencies from LMI_VGAssociatedComponentExtent
+ LOG().debug("Loading VGAssociatedComponentExtent associations.")
deps += [
(self.get_obj_id(ns, i.PartComponent),
self.get_obj_id(ns, i.GroupComponent))
diff --git a/commands/storage/lmi/scripts/storage/fs.py b/commands/storage/lmi/scripts/storage/fs.py
index f20cc86..9176504 100644
--- a/commands/storage/lmi/scripts/storage/fs.py
+++ b/commands/storage/lmi/scripts/storage/fs.py
@@ -247,6 +247,8 @@ def get_device_format_label(ns, device):
:rtype: string
"""
+ LOG().debug("get_device_format_label: Loading filesystem information for %s"
+ % (device.DeviceID))
fmt = get_format_on_device(ns, device)
if fmt:
return get_format_label(ns, fmt)
diff --git a/commands/storage/lmi/scripts/storage/lvm.py b/commands/storage/lmi/scripts/storage/lvm.py
index da4ee4d..0d788ad 100644
--- a/commands/storage/lmi/scripts/storage/lvm.py
+++ b/commands/storage/lmi/scripts/storage/lvm.py
@@ -110,6 +110,7 @@ def get_vgs(ns):
:rtype: list of LMIInstance/LMI_VGStoragePool
"""
+ LOG().debug("get_vgs: Loading list of all volume groups.")
for vg in ns.LMI_VGStoragePool.instances():
yield vg