X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/f49a5e02550839b4970ce0fb575d17684e2af8a9..9388dc6da96f98744b50e263d72667f2c38db060:/lib/backend.py diff --git a/lib/backend.py b/lib/backend.py index 7d02da8..406a7f9 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -210,19 +210,31 @@ def GetVolumeList(vg_name): """Compute list of logical volumes and their size. Returns: - dictionary of all partions (key) with their size: - test1: 20.06MiB + dictionary of all partions (key) with their size (in MiB), inactive + and online status: + {'test1': ('20.06', True, True)} """ - result = utils.RunCmd(["lvs", "--noheadings", "--units=m", - "-oname,size", vg_name]) + lvs = {} + sep = '|' + result = utils.RunCmd(["lvs", "--noheadings", "--units=m", "--nosuffix", + "--separator=%s" % sep, + "-olv_name,lv_size,lv_attr", vg_name]) if result.failed: logger.Error("Failed to list logical volumes, lvs output: %s" % result.output) - return {} + return result.output - lvlist = [line.split() for line in result.stdout.splitlines()] - return dict(lvlist) + for line in result.stdout.splitlines(): + line = line.strip().rstrip(sep) + name, size, attr = line.split(sep) + if len(attr) != 6: + attr = '------' + inactive = attr[4] == '-' + online = attr[5] == 'o' + lvs[name] = (size, inactive, online) + + return lvs def ListVolumeGroups(): @@ -261,7 +273,7 @@ def NodeVolumes(): 'vg': line[3].strip(), } - return [map_line(line.split('|')) for line in result.output.splitlines()] + return [map_line(line.split('|')) for line in result.stdout.splitlines()] def BridgesExist(bridges_list): @@ -399,11 +411,10 @@ def AddOSToInstance(instance, os_disk, swap_disk): logfile) result = utils.RunCmd(command) - if result.failed: - logger.Error("os create command '%s' returned error: %s" + logger.Error("os create command '%s' returned error: %s, logfile: %s," " output: %s" % - (command, result.fail_reason, result.output)) + (command, result.fail_reason, logfile, result.output)) return False return True @@ -480,20 +491,32 @@ def _GetVGInfo(vg_name): vg_free is the free size of the volume group in MiB pv_count are the number of physical disks in that vg + If an error occurs during gathering of data, we return the same dict + with keys all set to None. + """ + retdic = dict.fromkeys(["vg_size", "vg_free", "pv_count"]) + retval = utils.RunCmd(["vgs", "-ovg_size,vg_free,pv_count", "--noheadings", "--nosuffix", "--units=m", "--separator=:", vg_name]) if retval.failed: errmsg = "volume group %s not present" % vg_name logger.Error(errmsg) - raise errors.LVMError(errmsg) - valarr = retval.stdout.strip().split(':') - retdic = { - "vg_size": int(round(float(valarr[0]), 0)), - "vg_free": int(round(float(valarr[1]), 0)), - "pv_count": int(valarr[2]), - } + return retdic + valarr = retval.stdout.strip().rstrip(':').split(':') + if len(valarr) == 3: + try: + retdic = { + "vg_size": int(round(float(valarr[0]), 0)), + "vg_free": int(round(float(valarr[1]), 0)), + "pv_count": int(valarr[2]), + } + except ValueError, err: + logger.Error("Fail to parse vgs output: %s" % str(err)) + else: + logger.Error("vgs output has the wrong number of fields (expected" + " three): %s" % str(valarr)) return retdic @@ -642,8 +665,6 @@ def CreateBlockDevice(disk, size, owner, on_primary, info): # we need the children open in case the device itself has to # be assembled crdev.Open() - else: - crdev.Close() clist.append(crdev) try: device = bdev.FindDevice(disk.dev_type, disk.physical_id, clist) @@ -743,8 +764,6 @@ def _RecursiveAssembleBD(disk, owner, as_primary): result = r_dev if as_primary or disk.OpenOnSecondary(): r_dev.Open() - else: - r_dev.Close() DevCacheManager.UpdateCache(r_dev.dev_path, owner, as_primary, disk.iv_name) @@ -910,8 +929,11 @@ def UploadFile(file_name, data, mode, uid, gid, atime, mtime): file_name) return False - allowed_files = [constants.CLUSTER_CONF_FILE, "/etc/hosts", - constants.SSH_KNOWN_HOSTS_FILE] + allowed_files = [ + constants.CLUSTER_CONF_FILE, + constants.ETC_HOSTS, + constants.SSH_KNOWN_HOSTS_FILE, + ] allowed_files.extend(ssconf.SimpleStore().GetFileList()) if file_name not in allowed_files: logger.Error("Filename passed to UploadFile not in allowed" @@ -1230,6 +1252,7 @@ def FinalizeExport(instance, snap_disks): config.set(constants.INISECT_INS, 'nic%d_mac' % nic_count, '%s' % nic.mac) config.set(constants.INISECT_INS, 'nic%d_ip' % nic_count, '%s' % nic.ip) + config.set(constants.INISECT_INS, 'nic%d_bridge' % nic_count, '%s' % nic.bridge) # TODO: redundant: on load can read nics until it doesn't exist config.set(constants.INISECT_INS, 'nic_count' , '%d' % nic_count) @@ -1444,7 +1467,7 @@ class HooksRunner(object): fdstdin = open("/dev/null", "r") child = subprocess.Popen([script], stdin=fdstdin, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True, - shell=False, cwd="/",env=env) + shell=False, cwd="/", env=env) output = "" try: output = child.stdout.read(4096)