summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.gateway.scripts/src/backend
diff options
context:
space:
mode:
authorTim <timothyasir@gluster.com>2011-08-30 12:06:02 +0530
committerTim <timothyasir@gluster.com>2011-09-16 15:37:06 +0530
commit0cd2d5bfe5758e79632345e41fe8944298bb250b (patch)
tree3e3aefa46df166967ad4905edf1c8c2ff06ca962 /src/com.gluster.storage.management.gateway.scripts/src/backend
parent980ee07d32b90037048fa991048f918354bd8a6c (diff)
Code cleanup done for DiskUtils.py
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.py254
1 files changed, 72 insertions, 182 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 deebb388..8edcd36d 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
@@ -120,8 +120,8 @@ def getRootPartition(fsTabFile=Globals.FSTAB_FILE):
return getDeviceName(fsTabEntry["Device"])
return None
-def getMounts():
- mounts = {}
+def getMountInfo():
+ mountInfo = {}
for line in readFile("/proc/mounts"):
str = line.strip()
if str.startswith("/dev/"):
@@ -137,8 +137,8 @@ def getMounts():
device["Type"] = "BOOT"
else:
device["Type"] = "DATA"
- mounts[tokens[0].strip()] = device
- return mounts
+ mountInfo[tokens[0].strip()] = device
+ return mountInfo
def getRaidDisk():
array = []
@@ -199,16 +199,46 @@ def getOsDisk():
Utils.log("WARNING: getOsDisk() is deprecated by getRootPartition()")
return getRootPartition()
+def getAMIDiskInfo():
+ diskInfo = {}
+ diskList = []
+
+ # 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]
- mounts = getMounts()
- if Utils.runCommand("/usr/bin/lshal") != 0:
- Utils.log("failed running /usr/bin/lshal")
-
dbusSystemBus = dbus.SystemBus()
halObj = dbusSystemBus.get_object("org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager")
@@ -217,7 +247,8 @@ def getDiskInfo(diskDeviceList=None):
diskInfo = {}
diskList = []
- for udi in storageUdiList:
+ 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")
@@ -243,6 +274,7 @@ def getDiskInfo(diskDeviceList=None):
disk["FsVersion"] = None
disk["MountPoint"] = None
disk["ReadOnlyAccess"] = None
+ disk["SpaceInUse"] = None
partitionUdiList = halManager.FindDeviceStringMatch("info.parent", udi)
if isDiskInFormatting(disk["Device"]):
@@ -254,26 +286,12 @@ def getDiskInfo(diskDeviceList=None):
disk["Status"] = "UNINITIALIZED"
disk["Type"] = "UNKNOWN"
- if mounts and mounts.has_key(disk["Device"]):
- disk["Uuid"] = mounts[disk["Device"]]["Uuid"]
- disk["Type"] = mounts[disk["Device"]]["Type"]
- disk["Status"] = mounts[disk["Device"]]["Status"]
- disk["FsType"] = mounts[disk["Device"]]["FsType"]
- disk["MountPoint"] = mounts[disk["Device"]]["MountPoint"]
-
- if disk["MountPoint"]:
- disk["SpaceInUse"] = getDeviceUsedSpace(disk["Device"])
- else:
- disk["SpaceInUse"] = None
-
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")
+ 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'))
@@ -290,7 +308,7 @@ def getDiskInfo(diskDeviceList=None):
if disk["Device"] == partitionDevice:
disk["Uuid"] = str(partitionHalDevice.GetProperty('volume.uuid'))
- disk["Init"] = True # TODO: use isDataDiskPartitionFormatted function to cross verify this
+ disk["Init"] = True
disk["Status"] = "INITIALIZED"
mountPoint = str(partitionHalDevice.GetProperty('volume.mount_point'))
if mountPoint:
@@ -306,9 +324,8 @@ def getDiskInfo(diskDeviceList=None):
disk["ReadOnlyAccess"] = str(partitionHalDevice.GetProperty('volume.is_mounted_read_only'))
if not disk["Size"]:
disk["Size"] = long(partitionHalDevice.GetProperty('volume.size')) / 1024**2
- #disk["SpaceInUse"] = used
continue
-
+
partition = {}
partition["Init"] = False
partition["Type"] = "UNKNOWN"
@@ -346,36 +363,32 @@ def getDiskInfo(diskDeviceList=None):
disk["Partitions"] = partitionList
if not disk["SpaceInUse"]:
disk["SpaceInUse"] = diskSpaceInUse
- diskList.append(disk)
- diskInfo["disks"] = diskList
- if diskList:
- return diskInfo
- for line in readFile("/proc/partitions")[2:]:
- disk = {}
- tokens = line.split()
- if tokens[3].startswith("md"):
+
+ # 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
- disk["Device"] = tokens[3]
- ## if diskDeviceList and disk["Device"] not in diskDeviceList:
- ## continue
- 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"] = []
+ 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)
+
diskInfo["disks"] = diskList
return diskInfo
+
def getDiskList(diskDeviceList=None):
return diskInfo["disks"]
@@ -383,8 +396,9 @@ def getDiskList(diskDeviceList=None):
def checkDiskMountPoint(diskMountPoint):
try:
fstabEntries = open(Globals.FSTAB_FILE).readlines()
- except IOError:
+ except IOError, e:
fstabEntries = []
+ Utils.log("failed to read file %s: %s" % (Globals.FSTAB_FILE, str(e)))
found = False
for entry in fstabEntries:
entry = entry.strip()
@@ -400,8 +414,9 @@ def getMountPointByUuid(partitionUuid):
# check uuid in etc/fstab
try:
fstabEntries = open(Globals.FSTAB_FILE).readlines()
- except IOError:
+ except IOError, e:
fstabEntries = []
+ Utils.log("failed to read file %s: %s" % (Globals.FSTAB_FILE, str(e)))
found = False
for entry in fstabEntries:
entry = entry.strip()
@@ -478,7 +493,6 @@ def getDiskSizeInfo(partition):
def isDataDiskPartitionFormatted(device):
- #Todo: Proper label needs to be added for data partition
#if getDiskPartitionLabel(device) != Globals.DATA_PARTITION_LABEL:
# return False
device = getDeviceName(device)
@@ -523,9 +537,6 @@ def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None):
for i in v['Disks']:
raidPartitions[i] = k
- #for partition in raidDisk.values():
- # raidDiskPartitions += partition['disks']
-
diskDom = Protocol.XDOM()
disksTag = diskDom.createTag("disks", None)
raidDisks = {}
@@ -541,14 +552,10 @@ def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None):
diskTag.appendChild(diskDom.createTag("uuid", disk["Uuid"]))
diskTag.appendChild(diskDom.createTag("status", disk["Status"]))
diskTag.appendChild(diskDom.createTag("interface", disk["Interface"]))
-
- #if not disk["Partitions"]:
diskTag.appendChild(diskDom.createTag("type", disk["Type"]))
- #diskTag.appendChild(diskDom.createTag("init", str(disk["Init"]).lower()))
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)
@@ -563,12 +570,11 @@ def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None):
partitionTag = diskDom.createTag("partition", None)
device = getDeviceName(partition["Device"])
partitionTag.appendChild(diskDom.createTag("name", device))
- if partition["Uuid"]: #TODO: Move this verification and findings to getDiskInfo function
+ 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("init", str(partition["Init"]).lower()))
partitionTag.appendChild(diskDom.createTag("type", str(partition["Type"])))
partitionTag.appendChild(diskDom.createTag("fsType", partition["FsType"]))
partitionTag.appendChild(diskDom.createTag("mountPoint", partition['MountPoint']))
@@ -618,122 +624,6 @@ def getDiskDom(diskDeviceList=None, bootPartition=None, skipDisk=None):
return diskDom
-def initializeDisk(disk, boot=False, startSize=0, sudo=False):
- if boot and startSize > 0:
- return False
-
- disk = getDevice(disk)
- diskObj = getDiskList(disk)[0]
-
- if boot or startSize == 0:
- command = "dd if=/dev/zero of=%s bs=1024K count=1" % diskObj["Device"]
- if runCommandFG(command, root=sudo) != 0:
- if boot:
- Utils.log("failed to clear boot sector of disk %s" % diskObj["Device"])
- return False
- Utils.log("failed to clear boot sector of disk %s. ignoring" % diskObj["Device"])
-
- command = "parted -s %s mklabel gpt" % diskObj["Device"]
- if runCommandFG(command, root=sudo) != 0:
- return False
-
- if boot:
- command = "parted -s %s mkpart primary ext3 0MB %sMB" % (diskObj["Device"], Globals.OS_PARTITION_SIZE)
- if runCommandFG(command, root=sudo) != 0:
- return False
- command = "parted -s %s set 1 boot on" % (diskObj["Device"])
- if runCommandFG(command, root=sudo) != 0:
- return False
- startSize = Globals.OS_PARTITION_SIZE
-
- size = (diskObj["Size"] / ONE_MB_SIZE) - startSize
- while size > Globals.MAX_PARTITION_SIZE:
- endSize = startSize + Globals.MAX_PARTITION_SIZE
- command = "parted -s %s mkpart primary ext3 %sMB %sMB" % (diskObj["Device"], startSize, endSize)
- if runCommandFG(command, root=sudo) != 0:
- return False
- size -= Globals.MAX_PARTITION_SIZE
- startSize = endSize
-
- if size:
- command = "parted -s %s mkpart primary ext3 %sMB 100%%" % (diskObj["Device"], startSize)
- if runCommandFG(command, root=sudo) != 0:
- return False
-
- if runCommandFG("udevadm settle", root=sudo) != 0:
- if runCommandFG("udevadm settle", root=sudo) != 0:
- Utils.log("udevadm settle for disk %s failed. ignoring" % diskObj["Device"])
- time.sleep(1)
-
- if runCommandFG("partprobe %s" % diskObj["Device"], root=sudo) != 0:
- Utils.log("partprobe %s failed" % diskObj["Device"])
- return False
-
- if runCommandFG("gptsync %s" % diskObj["Device"], root=sudo) != 0:
- Utils.log("gptsync %s failed. ignoring" % diskObj["Device"])
-
- # wait forcefully to appear devices in /dev
- time.sleep(2)
- return True
-
-
-def initializeOsDisk(diskObj):
- Utils.log("WARNING: initializeOsDisk() is deprecated by initializeDisk(boot=True)")
- return initializeDisk(diskObj, boot=True)
-
-
-def initializeDataDisk(diskObj):
- Utils.log("WARNING: initializeDataDisk() is deprecated by initializeDisk()")
- return initializeDisk(diskObj)
-
-def getBootPartition(serverName):
- diskDom = XDOM()
- diskDom.parseFile("%s/%s/disk.xml" % (Globals.SERVER_VOLUME_CONF_DIR, serverName))
- if not diskDom:
- return None
- partitionDom = XDOM()
- partitionUuid = None
- partitionName = None
- for partitionTag in diskDom.getElementsByTagRoute("disk.partition"):
- partitionDom.setDomObj(partitionTag)
- boot = partitionDom.getTextByTagRoute("boot")
- if boot and boot.strip().upper() == 'YES':
- partitionUuid = partitionDom.getTextByTagRoute("uuid")
- partitionName = partitionDom.getTextByTagRoute("device")
- break
- if not (partitionUuid and partitionName):
- return None
-
- # check device label name
- deviceBaseName = os.path.basename(partitionName)
- process = runCommandBG(['sudo', 'e2label', partitionName])
- if type(process) == type(True):
- return None
- if process.wait() != 0:
- return None
- output = process.communicate()
- deviceLabel = output[0].split()[0]
- if deviceLabel != Globals.BOOT_PARTITION_LABEL:
- return None
-
- # check uuid in etc/fstab
- try:
- fstabEntries = open(Globals.FSTAB_FILE).readlines()
- except IOError:
- fstabEntries = []
- found = False
- for entry in fstabEntries:
- entry = entry.strip()
- if not entry:
- continue
- if entry.split()[0] == "UUID=" + partitionUuid:
- found = True
- break
- if not found:
- return None
- return partitionName
-
-
def isDiskInFormatting(device):
DEVICE_FORMAT_LOCK_FILE = "/var/lock/%s.lock" % device
return os.path.exists(DEVICE_FORMAT_LOCK_FILE)
@@ -752,5 +642,5 @@ def getDeviceMountPoint(device):
return token[1]
fp.close()
except IOError, e:
+ Utils.log("failed to read file %s: %s" % ("/proc/mounts", str(e)))
return None
-