diff options
author | Tim <timothyasir@gluster.com> | 2011-09-16 14:49:02 +0530 |
---|---|---|
committer | Tim <timothyasir@gluster.com> | 2011-09-16 15:37:16 +0530 |
commit | aa72c3755fbc9d0004a9a5fe9e386f7071d0055c (patch) | |
tree | 8febb6b0779afc3705574a35cd2a3e4e45ca23e0 /src/com.gluster.storage.management.gateway.scripts/src/backend | |
parent | 0efb5564a3dc64c58f875642a362b176db622c8c (diff) |
Disk details are probed using sysfs, even when HAL found.
Signed-off-by: Tim <timothyasir@gluster.com>
Diffstat (limited to 'src/com.gluster.storage.management.gateway.scripts/src/backend')
-rw-r--r-- | src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py | 426 | ||||
-rwxr-xr-x | src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py | 155 |
2 files changed, 239 insertions, 342 deletions
diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py index b28ab0f7..5d7b0b4a 100644 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/DiskUtils.py @@ -96,17 +96,6 @@ def getDiskPartitionLabel(device): return False -def readFile(fileName): - lines = None - try: - fp = open(fileName) - lines = fp.readlines() - fp.close() - except IOError, e: - Utils.log("failed to read file %s: %s" % (file, str(e))) - return lines - - def getRootPartition(fsTabFile=Globals.FSTAB_FILE): fsTabEntryList = FsTabUtils.readFsTab(fsTabFile) for fsTabEntry in fsTabEntryList: @@ -120,26 +109,6 @@ def getRootPartition(fsTabFile=Globals.FSTAB_FILE): return getDeviceName(fsTabEntry["Device"]) return None -def getMountInfo(): - mountInfo = {} - for line in readFile("/proc/mounts"): - str = line.strip() - if str.startswith("/dev/"): - tokens = str.split() - device = {} - mountPoint = tokens[1].strip() - device["MountPoint"] = mountPoint - device["FsType"] = tokens[2].strip() - device["Uuid"] = getDiskPartitionUuid(tokens[0].strip()) - device["Status"] = "INITIALIZED" - if mountPoint: - if mountPoint in ["/", "/boot"]: - device["Type"] = "BOOT" - else: - device["Type"] = "DATA" - mountInfo[tokens[0].strip()] = device - return mountInfo - def getRaidDisk(): array = [] arrayList = [] @@ -199,194 +168,75 @@ def getOsDisk(): Utils.log("WARNING: getOsDisk() is deprecated by getRootPartition()") return getRootPartition() -def getAMIDiskInfo(): - diskInfo = {} - diskList = [] +def getDiskInfo(diskNameList=None): + procPartitionsDict = getProcPartitions() + diskDict = {} + for name, values in procPartitionsDict.iteritems(): + values["Description"] = None + values["Uuid"] = None + values["FsType"] = None + values["MountPoint"] = None + values["SpaceInUse"] = None + values["Member"] = None + ## extras ?!?! + values["Init"] = False + values["Status"] = None + values["Interface"] = None + values["DriveType"] = None + values["Type"] = None + values["FsVersion"] = None + values["ReadOnlyAccess"] = None + + device = getDevice(name) + values["Uuid"] = getUuidByDiskPartition(device) + rv = Utils.runCommand("blkid -c /dev/null -o value %s" % device, output=True, root=True) + if rv["Status"] == 0: + lines = rv["Stdout"].strip().split("\n") + values["FsType"] = lines[-1].strip() + values["MountPoint"] = getDeviceMountPoint(device) + if values["FsType"]: + values["Init"] = True + if values["MountPoint"]: + rv = Utils.runCommand(["df", values["MountPoint"]], output=True) + if rv["Status"] == 0: + try: + values["SpaceInUse"] = long(rv["Stdout"].split("\n")[1].split()[2]) + except IndexError, e: + pass + except ValueError, e: + pass + if os.path.isdir("/sys/block/%s" % name): + model = Utils.readFile("/sys/block/%s/device/model" % name) + vendor = Utils.readFile("/sys/block/%s/device/vendor" % name) + values["Description"] = "%s %s" % (model.strip(), vendor.strip()) + values["Partitions"] = {} + diskDict[name] = values + + for diskName in diskDict.keys(): + del procPartitionsDict[diskName] + for partName, values in procPartitionsDict.iteritems(): + if os.path.isdir("/sys/block/%s/%s" % (diskName, partName)): + diskDict[diskName]["Partitions"][partName] = values + + procMdstatDict = getProcMdstat() + for name, values in procMdstatDict.iteritems(): + try: + diskDict[name]["Description"] = "Software Raid Array - %s - %s" % (values["Type"], values["Status"]) + diskDict[name]["Member"] = values["Member"] + except KeyError, e: + pass - # In AMI instances, HAL does not provide the required information. - # So that, the /proc/partitions is used to retrieve the required parameters. - for line in readFile("/proc/partitions")[2:]: - disk = {} - tokens = line.split() - # In Gluster-AMI instances supports (recommends) only raid disks. - if tokens[3].startswith("md"): - continue - disk["Device"] = tokens[3] - disk["Description"] = None - disk["Size"] = long(tokens[2]) / 1024 - disk["Status"] = None - disk["Interface"] = None - disk["DriveType"] = None - disk["Uuid"] = None - disk["Init"] = False - disk["Type"] = None - disk["FsType"] = None - disk["FsVersion"] = None - disk["MountPoint"] = None - disk["ReadOnlyAccess"] = None - disk["SpaceInUse"] = None - disk["Partitions"] = [] - diskList.append(disk) - diskInfo["disks"] = diskList - return diskInfo - - -def getDiskInfo(diskDeviceList=None): - if Utils.runCommand("wget -t 1 -T 1 -q -O /dev/null %s" % Globals.AWS_WEB_SERVICE_URL) == 0: # AMI instance - return getAMIDiskInfo() - - diskDeviceList = getDevice(diskDeviceList) - if Utils.isString(diskDeviceList): - diskDeviceList = [diskDeviceList] - - dbusSystemBus = dbus.SystemBus() - halObj = dbusSystemBus.get_object("org.freedesktop.Hal", - "/org/freedesktop/Hal/Manager") - halManager = dbus.Interface(halObj, "org.freedesktop.Hal.Manager") - storageUdiList = halManager.FindDeviceByCapability("storage") - - diskInfo = {} - diskList = [] - mountInfo = getMountInfo() - for udi in storageUdiList: # on every disk storage - halDeviceObj = dbusSystemBus.get_object("org.freedesktop.Hal", udi) - halDevice = dbus.Interface(halDeviceObj, - "org.freedesktop.Hal.Device") - if halDevice.GetProperty("storage.drive_type") in ["cdrom", "floppy"] or \ - halDevice.GetProperty("block.is_volume"): - continue - disk = {} - disk["Device"] = str(halDevice.GetProperty('block.device')) - if diskDeviceList and disk["Device"] not in diskDeviceList: - continue - disk["Description"] = str(halDevice.GetProperty('storage.vendor')) + " " + str(halDevice.GetProperty('storage.model')) - if halDevice.GetProperty('storage.removable'): - disk["Size"] = long(halDevice.GetProperty('storage.removable.media_size')) - else: - disk["Size"] = long(halDevice.GetProperty('storage.size')) / 1024**2 - disk["Interface"] = str(halDevice.GetProperty('storage.bus')) - disk["DriveType"] = str(halDevice.GetProperty('storage.drive_type')) - disk["Status"] = None - disk["Uuid"] = None - disk["Init"] = False - disk["Type"] = None - disk["FsType"] = None - disk["FsVersion"] = None - disk["MountPoint"] = None - disk["ReadOnlyAccess"] = None - disk["SpaceInUse"] = None - - partitionUdiList = halManager.FindDeviceStringMatch("info.parent", udi) - if isDiskInFormatting(disk["Device"]): - disk["Status"] = "INITIALIZING" - else: - if partitionUdiList: - disk["Status"] = "INITIALIZED" - else: - disk["Status"] = "UNINITIALIZED" - disk["Type"] = "UNKNOWN" - - partitionList = [] - diskSpaceInUse = 0 - for partitionUdi in partitionUdiList: - used = 0 - partitionHalDeviceObj = dbusSystemBus.get_object("org.freedesktop.Hal", partitionUdi) - partitionHalDevice = dbus.Interface(partitionHalDeviceObj, "org.freedesktop.Hal.Device") - if not partitionHalDevice.GetProperty("block.is_volume"): - continue - partitionDevice = str(partitionHalDevice.GetProperty('block.device')) - if partitionHalDevice.GetProperty("volume.is_mounted"): - rv = Utils.runCommand(["df", str(partitionHalDevice.GetProperty('volume.mount_point'))], output=True) - if rv["Status"] == 0: - try: - used = long(rv["Stdout"].split("\n")[1].split()[2]) / 1024 - diskSpaceInUse += used - except IndexError, e: - pass - except ValueError, e: - pass - - if disk["Device"] == partitionDevice: - disk["Uuid"] = str(partitionHalDevice.GetProperty('volume.uuid')) - disk["Init"] = True - disk["Status"] = "INITIALIZED" - mountPoint = str(partitionHalDevice.GetProperty('volume.mount_point')) - if mountPoint: - if mountPoint in ["/", "/boot"]: - disk["Type"] = "BOOT" - else: - disk["Type"] = "DATA" - disk["FsType"] = str(partitionHalDevice.GetProperty('volume.fstype')) - if disk["FsType"] and "UNINITIALIZED" == disk["Status"]: - disk["Status"] = "INITIALIZED" - disk["FsVersion"] = str(partitionHalDevice.GetProperty('volume.fsversion')) - disk["MountPoint"] = str(partitionHalDevice.GetProperty('volume.mount_point')) - disk["ReadOnlyAccess"] = str(partitionHalDevice.GetProperty('volume.is_mounted_read_only')) - if not disk["Size"]: - disk["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - continue + diskNameList = getDeviceName(diskNameList) + if Utils.isString(diskNameList): + diskNameList = [diskNameList] - partition = {} - partition["Init"] = False - partition["Type"] = "UNKNOWN" - partition["Device"] = partitionDevice - partition["Uuid"] = str(partitionHalDevice.GetProperty('volume.uuid')) - partition["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - partition["FsType"] = str(partitionHalDevice.GetProperty('volume.fstype')) - partition["FsVersion"] = str(partitionHalDevice.GetProperty('volume.fsversion')) - partition["Label"] = str(partitionHalDevice.GetProperty('volume.label')) - partition["MountPoint"] = str(partitionHalDevice.GetProperty('volume.mount_point')) - partition["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2 - - if isDiskInFormatting(partitionDevice): - partition["Status"] = "INITIALIZING" - else: - if partition["FsType"]: - partition["Status"] = "INITIALIZED" - else: - partition["Status"] = "UNINITIALIZED" - - partition["SpaceInUse"] = used - if partition["MountPoint"] or isDataDiskPartitionFormatted(partitionDevice): - partition["Init"] = True - partition["Status"] = "INITIALIZED" - if partition["MountPoint"]: - if partition["MountPoint"] in ["/", "/boot"]: - partition["Type"] = "BOOT" - else: - partition["Type"] = "DATA" - else: - if "SWAP" == partition["FsType"].strip().upper(): - partition["Type"] = "SWAP" - partition["ReadOnlyAccess"] = str(partitionHalDevice.GetProperty('volume.is_mounted_read_only')) - partitionList.append(partition) - disk["Partitions"] = partitionList - if not disk["SpaceInUse"]: - disk["SpaceInUse"] = diskSpaceInUse - - # In a paravirtualized server environment, HAL does not provide all the required information. - # The missing details are replaced using /proc/mounts data or 'df' command. - if not (mountInfo and mountInfo.has_key(disk["Device"])): - diskList.append(disk) - continue - if not disk["Uuid"]: - disk["Uuid"] = mountInfo[disk["Device"]]["Uuid"] - if not disk["Type"]: - disk["Type"] = mountInfo[disk["Device"]]["Type"] - if not disk["Status"] or "UNKNOWN" == disk["Status"]: - disk["Status"] = mountInfo[disk["Device"]]["Status"] - if not disk["FsType"]: - disk["FsType"] = mountInfo[disk["Device"]]["FsType"] - if not disk["MountPoint"]: - disk["MountPoint"] = mountInfo[disk["Device"]]["MountPoint"] - if not disk["SpaceInUse"] and disk["MountPoint"]: - disk["SpaceInUse"] = getDeviceUsedSpace(disk["Device"]) - else: - disk["SpaceInUse"] = None - diskList.append(disk) + if not diskNameList: + return diskDict - diskInfo["disks"] = diskList - return diskInfo + outputDict = {} + for diskName in list(set(diskDict.keys()).intersection(set(diskNameList))): + outputDict[diskName] = diskDict[diskName] + return outputDict def getDiskList(diskDeviceList=None): @@ -514,115 +364,6 @@ def isDataDiskPartitionFormatted(device): return False -def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None): - diskDeviceList = getDevice(diskDeviceList) - if Utils.isString(diskDeviceList): - diskDeviceList = [diskDeviceList] - - if skipDisk: - skipDisk = getDevice(skipDisk) - if Utils.isString(skipDisk): - skipDisk = [skipDisk] - - diskInfo = getDiskInfo(diskDeviceList) - diskList = diskInfo["disks"] - if not diskList: - return None - - raidPartitions = {} - raidDisk = getRaidDisk() - - for k, v in raidDisk.iteritems(): - for i in v['Disks']: - raidPartitions[i] = k - - diskDom = Protocol.XDOM() - disksTag = diskDom.createTag("disks", None) - raidDisks = {} - if not bootPartition: - bootPartition = getRootPartition() - for disk in diskList: - if skipDisk and disk["Device"] in skipDisk: - continue - diskTag = diskDom.createTag("disk", None) - diskDevice = getDeviceName(disk["Device"]) - diskTag.appendChild(diskDom.createTag("name", diskDevice)) - diskTag.appendChild(diskDom.createTag("description", disk["Description"])) - diskTag.appendChild(diskDom.createTag("uuid", disk["Uuid"])) - diskTag.appendChild(diskDom.createTag("status", disk["Status"])) - diskTag.appendChild(diskDom.createTag("interface", disk["Interface"])) - diskTag.appendChild(diskDom.createTag("type", disk["Type"])) - diskTag.appendChild(diskDom.createTag("fsType", disk["FsType"])) - diskTag.appendChild(diskDom.createTag("fsVersion", disk["FsVersion"])) - diskTag.appendChild(diskDom.createTag("mountPoint", disk["MountPoint"])) - diskTag.appendChild(diskDom.createTag("size", disk["Size"])) - diskTag.appendChild(diskDom.createTag("spaceInUse", disk["SpaceInUse"])) - partitionsTag = diskDom.createTag("partitions", None) - if raidPartitions.has_key(diskDevice): - rdList = {} - rdList[diskDevice] = [deepcopy(diskTag)] - if not raidDisks.has_key(raidPartitions[diskDevice]): - raidDisks[raidPartitions[diskDevice]] = [] - raidDisks[raidPartitions[diskDevice]] += [rdList] - continue - for partition in disk["Partitions"]: - partitionTag = diskDom.createTag("partition", None) - device = getDeviceName(partition["Device"]) - partitionTag.appendChild(diskDom.createTag("name", device)) - if partition["Uuid"]: - partitionTag.appendChild(diskDom.createTag("uuid", partition["Uuid"])) - else: - partitionTag.appendChild(diskDom.createTag("uuid", getUuidByDiskPartition("/dev/" + device))) - partitionTag.appendChild(diskDom.createTag("status", partition["Status"])) - partitionTag.appendChild(diskDom.createTag("type", str(partition["Type"]))) - partitionTag.appendChild(diskDom.createTag("fsType", partition["FsType"])) - partitionTag.appendChild(diskDom.createTag("mountPoint", partition['MountPoint'])) - partitionTag.appendChild(diskDom.createTag("size", partition["Size"])) - partitionTag.appendChild(diskDom.createTag("spaceInUse", partition["SpaceInUse"])) - if raidPartitions.has_key(device): - tempPartitionTag = diskDom.createTag("partitions", None) - if raidDisks.has_key(raidPartitions[device]): - rdList = raidDisks[raidPartitions[device]] - for rdItem in rdList: - if not rdItem.has_key(diskDevice): - rdItem[diskDevice] = [deepcopy(diskTag), tempPartitionTag] - rdItem[diskDevice][0].appendChild(tempPartitionTag) - rdItem[diskDevice][-1].appendChild(partitionTag) - continue - rdList = {} - rdList[diskDevice] = [deepcopy(diskTag), tempPartitionTag] - tempPartitionTag.appendChild(partitionTag) - rdList[diskDevice][0].appendChild(tempPartitionTag) - raidDisks[raidPartitions[device]] = [rdList] - continue - partitionsTag.appendChild(partitionTag) - diskTag.appendChild(partitionsTag) - disksTag.appendChild(diskTag) - - for rdisk in raidDisk.keys(): - raidDiskTag = diskDom.createTag("disk", None) - raidDiskTag.appendChild(diskDom.createTag("name", rdisk)) - raidDiskTag.appendChild(diskDom.createTag("description")) - raidDiskTag.appendChild(diskDom.createTag("uuid", raidDisk[rdisk]['Uuid'])) - raidDiskTag.appendChild(diskDom.createTag("type", raidDisk[rdisk]['Type'])) - raidDiskTag.appendChild(diskDom.createTag("mountPoint", raidDisk[rdisk]['MountPoint'])) - raidDiskTag.appendChild(diskDom.createTag("status", raidDisk[rdisk]['Status'])) - raidDiskTag.appendChild(diskDom.createTag("interface", raidDisk[rdisk]['Interface'])) - raidDiskTag.appendChild(diskDom.createTag("fsType", raidDisk[rdisk]['FsType'])) - raidDiskTag.appendChild(diskDom.createTag("fsVersion")) - raidDiskTag.appendChild(diskDom.createTag("size", raidDisk[rdisk]['Size'])) - raidDiskTag.appendChild(diskDom.createTag("spaceInUse", raidDisk[rdisk]['SpaceInUse'])) - raidDisksTag = diskDom.createTag("raidDisks", None) - if raidDisks.has_key(rdisk): - for item in raidDisks[rdisk]: - for diskTag in item.values(): - raidDisksTag.appendChild(diskTag[0]) - raidDiskTag.appendChild(raidDisksTag) - disksTag.appendChild(raidDiskTag) - diskDom.addTag(disksTag) - return diskDom - - def isDiskInFormatting(device): DEVICE_FORMAT_LOCK_FILE = "/var/lock/%s.lock" % device return os.path.exists(DEVICE_FORMAT_LOCK_FILE) @@ -634,12 +375,29 @@ def isDiskInFormat(device): def getDeviceMountPoint(device): - try: - fp = open("/proc/mounts") - for token in [line.strip().split() for line in fp.readlines()]: - if token and len(token) > 2 and token[0] == device: - return token[1] - fp.close() - except IOError, e: - Utils.log("failed to read file %s: %s" % ("/proc/mounts", str(e))) - return None + lines = Utils.readFile("/proc/mounts", lines=True) + uuid = getUuidByDiskPartition(device) + for line in lines: + tokens = line.split() + if tokens[0] == device or (uuid and tokens[0].endswith(uuid)): + return tokens[1] + return None + +def getProcPartitions(): + procPartitionsDict = {} + s = Utils.readFile("/proc/partitions", lines=True) + for line in s[2:]: + tokens = line.strip().split() + procPartitionsDict[tokens[3]] = {"Size" : long(tokens[2])} + return procPartitionsDict + +def getProcMdstat(): + raidArrayDict = {} + lines = Utils.readFile("/proc/mdstat", lines=True) + for line in lines[1:]: + tokens = line.strip().split() + if not tokens: + continue + if tokens[0].startswith("md"): + raidArrayDict[tokens[0]] = {"Status" : tokens[2], "Type" : tokens[3], "Member" : [token.split('[')[0] for token in tokens[4:]]} + return raidArrayDict diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py index da396ad9..5c5b4c4a 100755 --- a/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py +++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/get_server_details.py @@ -15,6 +15,7 @@ import dbus import socket import re import Utils +import Protocol import DiskUtils from NetworkUtils import * from Disk import * @@ -22,10 +23,153 @@ from XmlHandler import ResponseXml from optparse import OptionParser +def getDiskDom(): + diskInfo = DiskUtils.getDiskInfo() + if not diskInfo: + return None + procMdstat = DiskUtils.getProcMdstat() + diskDom = Protocol.XDOM() + disksTag = diskDom.createTag("disks", None) + diskTagDict = {} + raidDisksTag = diskDom.createTag("raidDisks", None) + for raidDiskName, raidDisk in procMdstat.iteritems(): + raidDiskTag = diskDom.createTag("disk", None) + raidDiskTag.appendChild(diskDom.createTag("name", raidDiskName)) + raidDiskTag.appendChild(diskDom.createTag("description", diskInfo[raidDiskName]['Description'])) + raidDiskTag.appendChild(diskDom.createTag("uuid", diskInfo[raidDiskName]['Uuid'])) + raidDiskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + raidDiskTag.appendChild(diskDom.createTag("mountPoint", diskInfo[raidDiskName]['MountPoint'])) + raidDiskTag.appendChild(diskDom.createTag("fsType", diskInfo[raidDiskName]['FsType'])) + if diskInfo[raidDiskName]['FsType']: + raidDiskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + else: + raidDiskTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + raidDiskTag.appendChild(diskDom.createTag("interface")) + raidDiskTag.appendChild(diskDom.createTag("fsVersion")) + raidDiskTag.appendChild(diskDom.createTag("size", diskInfo[raidDiskName]['Size'] / 1024.0)) + raidDiskTag.appendChild(diskDom.createTag("spaceInUse", diskInfo[raidDiskName]['SpaceInUse'])) + raidDisksTag.appendChild(raidDiskTag) + for raidMember in raidDisk['Member']: + # Case1: Raid array member is a disk. The following code will add the disk details under a disk tag + if diskInfo.has_key(raidMember): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", raidMember)) + diskTag.appendChild(diskDom.createTag("description", diskInfo[raidMember]["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", diskInfo[raidMember]["Uuid"])) + if DiskUtils.isDiskInFormatting(raidMember): + diskTag.appendChild(diskDom.createTag("status", "INITIALIZING")) + else: + if diskInfo[raidMember]["FsType"]: + diskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + else: + diskTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + diskTag.appendChild(diskDom.createTag("interface", diskInfo[raidMember]["Interface"])) + diskTag.appendChild(diskDom.createTag("mountPoint", diskInfo[raidMember]["MountPoint"])) + if diskInfo[raidMember]["FsType"]: + diskTag.appendChild(diskDom.createTag("type", "DATA")) + else: + diskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + diskTag.appendChild(diskDom.createTag("fsType", diskInfo[raidMember]["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", diskInfo[raidMember]["FsVersion"])) + diskTag.appendChild(diskDom.createTag("size", diskInfo[raidMember]["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", diskInfo[raidMember]["SpaceInUse"])) + raidDiskTag.appendChild(diskTag) + del diskInfo[raidMember] + continue + # Case2: Raid array member is a partition. The following code will add the partition and its corresponding disk its belong to. + for disk, item in diskInfo.iteritems(): + if not item['Partitions'].has_key(raidMember): + continue + if not diskTagDict.has_key(disk): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", disk)) + diskTag.appendChild(diskDom.createTag("description", item["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", item["Uuid"])) + diskTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + diskTag.appendChild(diskDom.createTag("interface", item["Interface"])) + diskTag.appendChild(diskDom.createTag("mountPoint")) + diskTag.appendChild(diskDom.createTag("type", "DATA")) + diskTag.appendChild(diskDom.createTag("fsType", item["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", item["FsVersion"])) + diskTag.appendChild(diskDom.createTag("size", item["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", item["SpaceInUse"])) + partitionsTag = diskDom.createTag("partitions", None) + diskTag.appendChild(partitionsTag) + raidDiskTag.appendChild(diskTag) + # Constructed disk tag will be added to the dictonary. + # This will be used to keep add all the corresponding partitions tags of the disk to the disk tag. + diskTagDict[disk] = {'diskTag': diskTag, 'partitionsTag': partitionsTag} + # adding partition details under this disk tag + partitionTag = diskDom.createTag("partition", None) + partitionTag.appendChild(diskDom.createTag("name", raidMember)) + partitionTag.appendChild(diskDom.createTag("uuid", item['Partitions'][raidMember]["Uuid"])) + partitionTag.appendChild(diskDom.createTag("fsType", item['Partitions'][raidMember]["FsType"])) + if item['Partitions'][raidMember]["FsType"]: + partitionTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "DATA")) + else: + partitionTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + partitionTag.appendChild(diskDom.createTag("mountPoint", item['Partitions'][raidMember]['MountPoint'])) + partitionTag.appendChild(diskDom.createTag("size", item['Partitions'][raidMember]["Size"] / 1024.0)) + partitionTag.appendChild(diskDom.createTag("spaceInUse", item['Partitions'][raidMember]["SpaceInUse"])) + diskTagDict[disk]['partitionsTag'].appendChild(partitionTag) + # deleting partition entry of a raid member from diskInfo (item['Partitions']) + del item['Partitions'][raidMember] + del diskInfo[raidDiskName] + disksTag.appendChild(raidDisksTag) + for diskName, value in diskInfo.iteritems(): + diskTag = diskDom.createTag("disk", None) + diskTag.appendChild(diskDom.createTag("name", diskName)) + diskTag.appendChild(diskDom.createTag("description", value["Description"])) + diskTag.appendChild(diskDom.createTag("uuid", value["Uuid"])) + if DiskUtils.isDiskInFormatting(diskName): + status = "INITIALIZING" + else: + if value["FsType"]: + status = "INITIALIZED" + else: + status = "UNINITIALIZED" + diskTag.appendChild(diskDom.createTag("status", status)) + diskTag.appendChild(diskDom.createTag("interface", value["Interface"])) + if value["MountPoint"] and value["MountPoint"] in ["/", "/boot"]: + diskTag.appendChild(diskDom.createTag("type", "BOOT")) + elif "UNINITIALIZED" == status: + diskTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + else: + diskTag.appendChild(diskDom.createTag("type", "DATA")) + diskTag.appendChild(diskDom.createTag("fsType", value["FsType"])) + diskTag.appendChild(diskDom.createTag("fsVersion", value["FsVersion"])) + diskTag.appendChild(diskDom.createTag("mountPoint", value["MountPoint"])) + diskTag.appendChild(diskDom.createTag("size", value["Size"] / 1024.0)) + diskTag.appendChild(diskDom.createTag("spaceInUse", value["SpaceInUse"])) + partitionsTag = diskDom.createTag("partitions", None) + diskTag.appendChild(partitionsTag) + for partName, partValues in value['Partitions'].iteritems(): + partitionTag = diskDom.createTag("partition", None) + partitionTag.appendChild(diskDom.createTag("name", partName)) + partitionTag.appendChild(diskDom.createTag("uuid", partValues["Uuid"])) + partitionTag.appendChild(diskDom.createTag("fsType", partValues["FsType"])) + if partValues["FsType"]: + partitionTag.appendChild(diskDom.createTag("status", "INITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "DATA")) + else: + partitionTag.appendChild(diskDom.createTag("status", "UNINITIALIZED")) + partitionTag.appendChild(diskDom.createTag("type", "UNKNOWN")) + partitionTag.appendChild(diskDom.createTag("mountPoint", partValues['MountPoint'])) + partitionTag.appendChild(diskDom.createTag("size", partValues["Size"] / 1024.0)) + partitionTag.appendChild(diskDom.createTag("spaceInUse", partValues["SpaceInUse"])) + partitionsTag.appendChild(partitionTag) + continue + disksTag.appendChild(diskTag) + diskDom.addTag(disksTag) + return diskDom + + def getServerDetails(listall): serverName = socket.getfqdn() - meminfo = getMeminfo() - cpu = getCpuUsageAvg() + meminfo = Utils.getMeminfo() + cpu = Utils.getCpuUsageAvg() nameServerList, domain, searchDomain = readResolvConfFile() if not domain: domain = [None] @@ -88,12 +232,7 @@ def getServerDetails(listall): responseDom.appendTag(serverTag) serverTag.appendChild(responseDom.createTag("numOfCPUs", int(os.sysconf('SC_NPROCESSORS_ONLN')))) - try: - diskDom = DiskUtils.getDiskDom() - except dbus.dbus_bindings.DBusException, e: - sys.stderr.write("%s. Please check if HAL services are running\n" % str(e)) - Utils.log("failed to get disk details :%s" % str(e)) - sys.exit(1) + diskDom = getDiskDom() if not diskDom: sys.stderr.write("No disk found!") Utils.log("Failed to get disk details") |