X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/1fae010f2b0bd66e1e3ccb5b33f981b2f7f4d9d3..e2078d280d462ce583288ecd6279e22b198cb652:/lib/backend.py diff --git a/lib/backend.py b/lib/backend.py index 1c9cfdb..183286b 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -437,9 +437,9 @@ def VerifyNode(what, cluster_name): if constants.NV_DRBDLIST in what: try: used_minors = bdev.DRBD8.GetUsedDevs().keys() - except errors.BlockDeviceError: + except errors.BlockDeviceError, err: logging.warning("Can't get used minors list", exc_info=True) - used_minors = [] + used_minors = str(err) result[constants.NV_DRBDLIST] = used_minors return result @@ -575,7 +575,6 @@ def GetInstanceList(hypervisor_list): results.extend(names) except errors.HypervisorError, err: logging.exception("Error enumerating instances for hypevisor %s", hname) - # FIXME: should we somehow not propagate this to the master? raise return results @@ -661,19 +660,26 @@ def GetAllInstancesInfo(hypervisor_list): 'state': state, 'time': times, } - if name in output and output[name] != value: - raise errors.HypervisorError("Instance %s running duplicate" - " with different parameters" % name) + if name in output: + # we only check static parameters, like memory and vcpus, + # and not state and time which can change between the + # invocations of the different hypervisors + for key in 'memory', 'vcpus': + if value[key] != output[name][key]: + raise errors.HypervisorError("Instance %s is running twice" + " with different parameters" % name) output[name] = value return output -def InstanceOsAdd(instance): +def InstanceOsAdd(instance, reinstall): """Add an OS to an instance. @type instance: L{objects.Instance} @param instance: Instance whose OS is to be installed + @type reinstall: boolean + @param reinstall: whether this is an instance reinstall @rtype: boolean @return: the success of the operation @@ -689,6 +695,8 @@ def InstanceOsAdd(instance): (os_name, os_dir, os_err)) create_env = OSEnvironment(instance) + if reinstall: + create_env['INSTANCE_REINSTALL'] = "1" logfile = "%s/add-%s-%s-%d.log" % (constants.LOG_OS_DIR, instance.os, instance.name, int(time.time())) @@ -857,7 +865,7 @@ def _GatherAndLinkBlockDevs(instance): return block_devices -def StartInstance(instance, extra_args): +def StartInstance(instance): """Start an instance. @type instance: L{objects.Instance} @@ -874,7 +882,7 @@ def StartInstance(instance, extra_args): try: block_devices = _GatherAndLinkBlockDevs(instance) hyper = hypervisor.GetHypervisor(instance.hypervisor) - hyper.StartInstance(instance, block_devices, extra_args) + hyper.StartInstance(instance, block_devices) except errors.BlockDeviceError, err: logging.exception("Failed to start instance") return (False, "Block device error: %s" % str(err)) @@ -942,7 +950,7 @@ def InstanceShutdown(instance): return (True, "Instance has been shutdown successfully") -def InstanceReboot(instance, reboot_type, extra_args): +def InstanceReboot(instance, reboot_type): """Reboot an instance. @type instance: L{objects.Instance} @@ -978,8 +986,10 @@ def InstanceReboot(instance, reboot_type, extra_args): return (False, msg) elif reboot_type == constants.INSTANCE_REBOOT_HARD: try: - InstanceShutdown(instance) - StartInstance(instance, extra_args) + stop_result = InstanceShutdown(instance) + if not stop_result[0]: + return stop_result + return StartInstance(instance) except errors.HypervisorError, err: msg = "Failed to hard reboot instance %s: %s" % (instance.name, err) logging.error(msg) @@ -1666,7 +1676,6 @@ def OSEnvironment(instance, debug=0): str(disk)) real_disk.Open() result['DISK_%d_PATH' % idx] = real_disk.dev_path - # FIXME: When disks will have read-only mode, populate this result['DISK_%d_ACCESS' % idx] = disk.mode if constants.HV_DISK_TYPE in instance.hvparams: result['DISK_%d_FRONTEND_TYPE' % idx] = \