"""
if args:
msg = msg % args
- if "exc" in kwargs and kwargs["exc"]:
- logging.exception(msg)
- else:
- logging.error(msg)
+ if "log" not in kwargs or kwargs["log"]: # if we should log this error
+ if "exc" in kwargs and kwargs["exc"]:
+ logging.exception(msg)
+ else:
+ logging.error(msg)
raise RPCFail(msg)
"""
_CleanDirectory(constants.QUEUE_DIR, exclude=[constants.JOB_QUEUE_LOCK_FILE])
_CleanDirectory(constants.JOB_QUEUE_ARCHIVE_DIR)
- return True, None
def GetMasterInfo():
for consumption here or from the node daemon.
@rtype: tuple
- @return: True, (master_netdev, master_ip, master_name) in case of success
+ @return: master_netdev, master_ip, master_name
@raise RPCFail: in case of errors
"""
master_ip = cfg.GetMasterIP()
master_node = cfg.GetMasterNode()
except errors.ConfigurationError, err:
- _Fail("Cluster configuration incomplete", exc=True)
- return True, (master_netdev, master_ip, master_node)
+ _Fail("Cluster configuration incomplete: %s", err, exc=True)
+ return master_netdev, master_ip, master_node
def StartMaster(start_daemons):
based on the start_daemons parameter.
@type start_daemons: boolean
- @param start_daemons: whther to also start the master
+ @param start_daemons: whether to also start the master
daemons (ganeti-masterd and ganeti-rapi)
@rtype: None
"""
# GetMasterInfo will raise an exception if not able to return data
- master_netdev, master_ip, _ = GetMasterInfo()[1]
+ master_netdev, master_ip, _ = GetMasterInfo()
payload = []
if utils.TcpPing(master_ip, constants.DEFAULT_NODED_PORT):
logging.error(msg)
payload.append(msg)
- return not payload, "; ".join(payload)
+ if payload:
+ _Fail("; ".join(payload))
def StopMaster(stop_daemons):
# need to decide in which case we fail the RPC for this
# GetMasterInfo will raise an exception if not able to return data
- master_netdev, master_ip, _ = GetMasterInfo()[1]
+ master_netdev, master_ip, _ = GetMasterInfo()
result = utils.RunCmd(["ip", "address", "del", "%s/32" % master_ip,
"dev", master_netdev])
for daemon in constants.RAPI_PID, constants.MASTERD_PID:
utils.KillProcess(utils.ReadPidFile(utils.DaemonPidFileName(daemon)))
- return True, None
-
def AddNode(dsa, dsapub, rsa, rsapub, sshkey, sshpub):
"""Joins this node to the cluster.
utils.RunCmd([constants.SSH_INITD_SCRIPT, "restart"])
- return (True, "Node added successfully")
-
def LeaveCluster():
"""Cleans up and remove the current node.
finally:
f.close()
- return True, outputarray
+ return outputarray
def VerifyNode(what, cluster_name):
used_minors = str(err)
result[constants.NV_DRBDLIST] = used_minors
- return True, result
+ return result
def GetVolumeList(vg_name):
size of the volume
"""
- return True, utils.ListVolumeGroups()
+ return utils.ListVolumeGroups()
def NodeVolumes():
'vg': line[3].strip(),
}
- return True, [map_line(line.split('|'))
- for line in result.stdout.splitlines()
- if line.count('|') >= 3]
+ return [map_line(line.split('|')) for line in result.stdout.splitlines()
+ if line.count('|') >= 3]
def BridgesExist(bridges_list):
missing.append(bridge)
if missing:
- return False, "Missing bridges %s" % (", ".join(missing),)
-
- return True, None
+ _Fail("Missing bridges %s", ", ".join(missing))
def GetInstanceList(hypervisor_list):
output['state'] = iinfo[4]
output['time'] = iinfo[5]
- return True, output
+ return output
def GetInstanceMigratable(instance):
"""
hyper = hypervisor.GetHypervisor(instance.hypervisor)
- if instance.name not in hyper.ListInstances():
- return (False, 'not running')
+ iname = instance.name
+ if iname not in hyper.ListInstances():
+ _Fail("Instance %s is not running", iname)
for idx in range(len(instance.disks)):
- link_name = _GetBlockDevSymlinkPath(instance.name, idx)
+ link_name = _GetBlockDevSymlinkPath(iname, idx)
if not os.path.islink(link_name):
- return (False, 'not restarted since ganeti 1.2.5')
-
- return (True, '')
+ _Fail("Instance %s was not restarted since ganeti 1.2.5", iname)
def GetAllInstancesInfo(hypervisor_list):
for hname in hypervisor_list:
iinfo = hypervisor.GetHypervisor(hname).GetAllInstancesInfo()
if iinfo:
- for name, inst_id, memory, vcpus, state, times in iinfo:
+ for name, _, memory, vcpus, state, times in iinfo:
value = {
'memory': memory,
'vcpus': vcpus,
" with different parameters", name)
output[name] = value
- return True, output
+ return output
def InstanceOsAdd(instance, reinstall):
@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
+ @rtype: None
"""
inst_os = OSFromDisk(instance.os)
-
create_env = OSEnvironment(instance)
if reinstall:
create_env['INSTANCE_REINSTALL'] = "1"
result.output)
lines = [utils.SafeEncode(val)
for val in utils.TailFile(logfile, lines=20)]
- return (False, "OS create script failed (%s), last lines in the"
- " log file:\n%s" % (result.fail_reason, "\n".join(lines)))
-
- return (True, "Successfully installed")
+ _Fail("OS create script failed (%s), last lines in the"
+ " log file:\n%s", result.fail_reason, "\n".join(lines), log=False)
def RunRenameInstance(instance, old_name):
result.cmd, result.fail_reason, result.output)
lines = [utils.SafeEncode(val)
for val in utils.TailFile(logfile, lines=20)]
- return (False, "OS rename script failed (%s), last lines in the"
- " log file:\n%s" % (result.fail_reason, "\n".join(lines)))
-
- return (True, "Rename successful")
+ _Fail("OS rename script failed (%s), last lines in the"
+ " log file:\n%s", result.fail_reason, "\n".join(lines), log=False)
def _GetVGInfo(vg_name):
"pv_count": int(valarr[2]),
}
except ValueError, err:
- logging.exception("Fail to parse vgs output")
+ logging.exception("Fail to parse vgs output: %s", err)
else:
logging.error("vgs output has the wrong number of fields (expected"
" three): %s", str(valarr))
"""Remove the block device symlinks belonging to the given instance.
"""
- for idx, disk in enumerate(disks):
+ for idx, _ in enumerate(disks):
link_name = _GetBlockDevSymlinkPath(instance_name, idx)
if os.path.islink(link_name):
try:
@type instance: L{objects.Instance}
@param instance: the instance object
- @rtype: boolean
- @return: whether the startup was successful or not
+ @rtype: None
"""
running_instances = GetInstanceList([instance.hypervisor])
if instance.name in running_instances:
- return (True, "Already running")
+ logging.info("Instance %s already running, not starting", instance.name)
+ return
try:
block_devices = _GatherAndLinkBlockDevs(instance)
_RemoveBlockDevLinks(instance.name, instance.disks)
_Fail("Hypervisor error: %s", err, exc=True)
- return (True, "Instance started successfully")
-
def InstanceShutdown(instance):
"""Shut an instance down.
@type instance: L{objects.Instance}
@param instance: the instance object
- @rtype: boolean
- @return: whether the startup was successful or not
+ @rtype: None
"""
hv_name = instance.hypervisor
running_instances = GetInstanceList([hv_name])
+ iname = instance.name
- if instance.name not in running_instances:
- return (True, "Instance already stopped")
+ if iname not in running_instances:
+ logging.info("Instance %s not running, doing nothing", iname)
+ return
hyper = hypervisor.GetHypervisor(hv_name)
try:
hyper.StopInstance(instance)
except errors.HypervisorError, err:
- _Fail("Failed to stop instance %s: %s", instance.name, err)
+ _Fail("Failed to stop instance %s: %s", iname, err)
# test every 10secs for 2min
time.sleep(10)
else:
# the shutdown did not succeed
- logging.error("Shutdown of '%s' unsuccessful, using destroy",
- instance.name)
+ logging.error("Shutdown of '%s' unsuccessful, using destroy", iname)
try:
hyper.StopInstance(instance, force=True)
except errors.HypervisorError, err:
- _Fail("Failed to force stop instance %s: %s", instance.name, err)
+ _Fail("Failed to force stop instance %s: %s", iname, err)
time.sleep(1)
if instance.name in GetInstanceList([hv_name]):
- _Fail("Could not shutdown instance %s even by destroy", instance.name)
-
- _RemoveBlockDevLinks(instance.name, instance.disks)
+ _Fail("Could not shutdown instance %s even by destroy", iname)
- return (True, "Instance has been shutdown successfully")
+ _RemoveBlockDevLinks(iname, instance.disks)
def InstanceReboot(instance, reboot_type):
- the other reboot type (L{constants.INSTANCE_REBOOT_HARD})
is not accepted here, since that mode is handled
differently
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
running_instances = GetInstanceList([instance.hypervisor])
_Fail("Failed to soft reboot instance %s: %s", instance.name, err)
elif reboot_type == constants.INSTANCE_REBOOT_HARD:
try:
- stop_result = InstanceShutdown(instance)
- if not stop_result[0]:
- return stop_result
+ InstanceShutdown(instance)
return StartInstance(instance)
except errors.HypervisorError, err:
_Fail("Failed to hard reboot instance %s: %s", instance.name, err)
else:
_Fail("Invalid reboot_type received: %s", reboot_type)
- return (True, "Reboot successful")
-
def MigrationInfo(instance):
"""Gather information about an instance to be migrated.
info = hyper.MigrationInfo(instance)
except errors.HypervisorError, err:
_Fail("Failed to fetch migration information: %s", err, exc=True)
- return (True, info)
+ return info
def AcceptInstance(instance, info, target):
hyper.AcceptInstance(instance, info, target)
except errors.HypervisorError, err:
_Fail("Failed to accept instance: %s", err, exc=True)
- return (True, "Accept successfull")
def FinalizeMigration(instance, info, success):
hyper.FinalizeMigration(instance, info, success)
except errors.HypervisorError, err:
_Fail("Failed to finalize migration: %s", err, exc=True)
- return (True, "Migration Finalized")
def MigrateInstance(instance, target, live):
hyper.MigrateInstance(instance.name, target, live)
except errors.HypervisorError, err:
_Fail("Failed to migrate instance: %s", err, exc=True)
- return (True, "Migration successfull")
def BlockdevCreate(disk, size, owner, on_primary, info):
clist.append(crdev)
try:
- device = bdev.Create(disk.dev_type, disk.physical_id, clist, size)
+ device = bdev.Create(disk.dev_type, disk.physical_id, clist, disk.size)
except errors.BlockDeviceError, err:
_Fail("Can't create block device: %s", err)
device.SetInfo(info)
- physical_id = device.unique_id
- return True, physical_id
+ return device.unique_id
def BlockdevRemove(disk):
"""
msgs = []
- result = True
try:
rdev = _RecursiveFindBD(disk)
except errors.BlockDeviceError, err:
rdev.Remove()
except errors.BlockDeviceError, err:
msgs.append(str(err))
- result = False
- if result:
+ if not msgs:
DevCacheManager.RemoveCache(r_path)
if disk.children:
for child in disk.children:
- c_status, c_msg = BlockdevRemove(child)
- result = result and c_status
- if c_msg: # not an empty message
- msgs.append(c_msg)
+ try:
+ BlockdevRemove(child)
+ except RPCFail, err:
+ msgs.append(str(err))
- return (result, "; ".join(msgs))
+ if msgs:
+ _Fail("; ".join(msgs))
def _RecursiveAssembleBD(disk, owner, as_primary):
children.append(cdev)
if as_primary or disk.AssembleOnSecondary():
- r_dev = bdev.Assemble(disk.dev_type, disk.physical_id, children)
+ r_dev = bdev.Assemble(disk.dev_type, disk.physical_id, children, disk.size)
r_dev.SetSyncSpeed(constants.SYNC_SPEED)
result = r_dev
if as_primary or disk.OpenOnSecondary():
C{True} for secondary nodes
"""
- status = True
- result = "no error information"
try:
result = _RecursiveAssembleBD(disk, owner, as_primary)
if isinstance(result, bdev.BlockDev):
result = result.dev_path
except errors.BlockDeviceError, err:
- result = "Error while assembling disk: %s" % str(err)
- status = False
- return (status, result)
+ _Fail("Error while assembling disk: %s", err, exc=True)
+
+ return result
def BlockdevShutdown(disk):
@type disk: L{objects.Disk}
@param disk: the description of the disk we should
shutdown
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
msgs = []
- result = True
r_dev = _RecursiveFindBD(disk)
if r_dev is not None:
r_path = r_dev.dev_path
DevCacheManager.RemoveCache(r_path)
except errors.BlockDeviceError, err:
msgs.append(str(err))
- result = False
if disk.children:
for child in disk.children:
- c_status, c_msg = BlockdevShutdown(child)
- result = result and c_status
- if c_msg: # not an empty message
- msgs.append(c_msg)
+ try:
+ BlockdevShutdown(child)
+ except RPCFail, err:
+ msgs.append(str(err))
- return (result, "; ".join(msgs))
+ if msgs:
+ _Fail("; ".join(msgs))
def BlockdevAddchildren(parent_cdev, new_cdevs):
@param parent_cdev: the disk to which we should add children
@type new_cdevs: list of L{objects.Disk}
@param new_cdevs: the list of children which we should add
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
parent_bdev = _RecursiveFindBD(parent_cdev)
if new_bdevs.count(None) > 0:
_Fail("Can't find new device(s) to add: %s:%s", new_bdevs, new_cdevs)
parent_bdev.AddChildren(new_bdevs)
- return (True, None)
def BlockdevRemovechildren(parent_cdev, new_cdevs):
@param parent_cdev: the disk from which we should remove children
@type new_cdevs: list of L{objects.Disk}
@param new_cdevs: the list of children which we should remove
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
parent_bdev = _RecursiveFindBD(parent_cdev)
else:
devs.append(rpath)
parent_bdev.RemoveChildren(devs)
- return (True, None)
def BlockdevGetmirrorstatus(disks):
if rbd is None:
_Fail("Can't find device %s", dsk)
stats.append(rbd.CombinedSyncStatus())
- return True, stats
+ return stats
def _RecursiveFindBD(disk):
for chdisk in disk.children:
children.append(_RecursiveFindBD(chdisk))
- return bdev.FindDevice(disk.dev_type, disk.physical_id, children)
+ return bdev.FindDevice(disk.dev_type, disk.physical_id, children, disk.size)
def BlockdevFind(disk):
except errors.BlockDeviceError, err:
_Fail("Failed to find device: %s", err, exc=True)
if rbd is None:
- return (True, None)
- return (True, (rbd.dev_path, rbd.major, rbd.minor) + rbd.GetSyncStatus())
+ return None
+ return (rbd.dev_path, rbd.major, rbd.minor) + rbd.GetSyncStatus()
def UploadFile(file_name, data, mode, uid, gid, atime, mtime):
@param atime: the atime to set on the file (can be None)
@type mtime: float
@param mtime: the mtime to set on the file (can be None)
- @rtype: boolean
- @return: the success of the operation; errors are logged
- in the node daemon log
+ @rtype: None
"""
if not os.path.isabs(file_name):
utils.WriteFile(file_name, data=raw_data, mode=mode, uid=uid, gid=gid,
atime=atime, mtime=mtime)
- return (True, "success")
def WriteSsconfFiles(values):
"""
ssconf.SimpleStore().WriteFiles(values)
- return True, None
def _ErrnoOrStr(err):
try:
f_names = utils.ListVisibleFiles(dir_name)
except EnvironmentError, err:
- logging.exception("Can't list the OS directory %s", dir_name)
+ logging.exception("Can't list the OS directory %s: %s", dir_name, err)
break
for name in f_names:
os_path = os.path.sep.join([dir_name, name])
diagnose = os_inst
result.append((name, os_path, status, diagnose))
- return True, result
+ return result
def _TryOSFromDisk(name, base_dir=None):
result['NIC_%d_FRONTEND_TYPE' % idx] = \
instance.hvparams[constants.HV_NIC_TYPE]
+ for source, kind in [(instance.beparams, "BE"), (instance.hvparams, "HV")]:
+ for key, value in source.items():
+ result["INSTANCE_%s_%s" % (kind, key)] = str(value)
+
return result
def BlockdevGrow(disk, amount):
"""
r_dev = _RecursiveFindBD(disk)
if r_dev is None:
- return False, "Cannot find block device %s" % (disk,)
+ _Fail("Cannot find block device %s", disk)
try:
r_dev.Grow(amount)
except errors.BlockDeviceError, err:
_Fail("Failed to grow block device: %s", err, exc=True)
- return True, None
-
def BlockdevSnapshot(disk):
"""Create a snapshot copy of a block device.
r_dev = _RecursiveFindBD(disk)
if r_dev is not None:
# let's stay on the safe side and ask for the full size, for now
- return True, r_dev.Snapshot(disk.size)
+ return r_dev.Snapshot(disk.size)
else:
_Fail("Cannot find block device %s", disk)
else:
@type idx: int
@param idx: the index of the disk in the instance's disk list,
used to export to the OS scripts environment
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
export_env = OSEnvironment(instance)
_Fail("OS snapshot export command '%s' returned error: %s"
" output: %s", command, result.fail_reason, result.output)
- return (True, None)
-
def FinalizeExport(instance, snap_disks):
"""Write out the export configuration information.
@param snap_disks: list of snapshot block devices, which
will be used to get the actual name of the dump file
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
destdir = os.path.join(constants.EXPORT_DIR, instance.name + ".new")
shutil.rmtree(finaldestdir, True)
shutil.move(destdir, finaldestdir)
- return True, None
-
def ExportInfo(dest):
"""Get export configuration information.
not config.has_section(constants.INISECT_INS)):
_Fail("Export info file doesn't have the required fields")
- return True, config.Dumps()
+ return config.Dumps()
def ImportOSIntoInstance(instance, src_node, src_images, cluster_name):
(idx, result.fail_reason, result.output[-100]))
if final_result:
- return False, "; ".join(final_result)
- return True, None
+ _Fail("; ".join(final_result), log=False)
def ListExports():
"""
if os.path.isdir(constants.EXPORT_DIR):
- return True, utils.ListVisibleFiles(constants.EXPORT_DIR)
+ return utils.ListVisibleFiles(constants.EXPORT_DIR)
else:
- return False, "No exports directory"
+ _Fail("No exports directory")
def RemoveExport(export):
@type export: str
@param export: the name of the export to remove
- @rtype: boolean
- @return: the success of the operation
+ @rtype: None
"""
target = os.path.join(constants.EXPORT_DIR, export)
except EnvironmentError, err:
_Fail("Error while removing the export: %s", err, exc=True)
- return True, None
-
def BlockdevRename(devlist):
"""Rename a list of block devices.
(dev, unique_id, err))
logging.exception("Can't rename device '%s' to '%s'", dev, unique_id)
result = False
- return (result, "; ".join(msgs))
+ if not result:
+ _Fail("; ".join(msgs))
def _TransformFileStorageDir(file_storage_dir):
except OSError, err:
_Fail("Cannot create file storage directory '%s': %s",
file_storage_dir, err, exc=True)
- return True, None
def RemoveFileStorageDir(file_storage_dir):
if not os.path.isdir(file_storage_dir):
_Fail("Specified Storage directory '%s' is not a directory",
file_storage_dir)
- # deletes dir only if empty, otherwise we want to return False
+ # deletes dir only if empty, otherwise we want to fail the rpc call
try:
os.rmdir(file_storage_dir)
except OSError, err:
_Fail("Cannot remove file storage directory '%s': %s",
file_storage_dir, err)
- return True, None
-
def RenameFileStorageDir(old_file_storage_dir, new_file_storage_dir):
"""Rename the file storage directory.
if os.path.exists(old_file_storage_dir):
_Fail("Cannot rename '%s' to '%s': both locations exist",
old_file_storage_dir, new_file_storage_dir)
- return True, None
def _EnsureJobQueueFile(file_name):
# Write and replace the file atomically
utils.WriteFile(file_name, data=_Decompress(content))
- return True, None
-
def JobQueueRename(old, new):
"""Renames a job queue file.
utils.RenameFile(old, new, mkdir=True)
- return True, None
-
def JobQueueSetDrainFlag(drain_flag):
"""Set the drain flag for the queue.
else:
utils.RemoveFile(constants.JOB_QUEUE_DRAIN_FILE)
- return True, None
-
def BlockdevClose(instance_name, disks):
"""Closes the given block devices.
except errors.BlockDeviceError, err:
msg.append(str(err))
if msg:
- return (False, "Can't make devices secondary: %s" % ",".join(msg))
+ _Fail("Can't make devices secondary: %s", ",".join(msg))
else:
if instance_name:
_RemoveBlockDevLinks(instance_name, disks)
- return (True, "All devices secondary")
def ValidateHVParams(hvname, hvparams):
@param hvname: the hypervisor name
@type hvparams: dict
@param hvparams: the hypervisor parameters to be validated
- @rtype: tuple (success, message)
- @return: a tuple of success and message, where success
- indicates the succes of the operation, and message
- which will contain the error details in case we
- failed
+ @rtype: None
"""
try:
hv_type = hypervisor.GetHypervisor(hvname)
hv_type.ValidateParameters(hvparams)
- return (True, "Validation passed")
except errors.HypervisorError, err:
- return (False, str(err))
+ _Fail(str(err), log=False)
def DemoteFromMC():
# try to ensure we're not the master by mistake
master, myself = ssconf.GetMasterAndMyself()
if master == myself:
- return (False, "ssconf status shows I'm the master node, will not demote")
+ _Fail("ssconf status shows I'm the master node, will not demote")
pid_file = utils.DaemonPidFileName(constants.MASTERD_PID)
if utils.IsProcessAlive(utils.ReadPidFile(pid_file)):
- return (False, "The master daemon is running, will not demote")
+ _Fail("The master daemon is running, will not demote")
try:
utils.CreateBackup(constants.CLUSTER_CONF_FILE)
except EnvironmentError, err:
if err.errno != errno.ENOENT:
- return (False, "Error while backing up cluster file: %s" % str(err))
+ _Fail("Error while backing up cluster file: %s", err, exc=True)
utils.RemoveFile(constants.CLUSTER_CONF_FILE)
- return (True, "Done")
def _FindDisks(nodes_ip, disks):
except errors.BlockDeviceError, err:
_Fail("Can't change network configuration to standalone mode: %s",
err, exc=True)
- return (True, "All disks are now disconnected")
def DrbdAttachNet(nodes_ip, disks, instance_name, multimaster):
# standalone, even though this should not happen with the
# new staged way of changing disk configs
try:
- rd.ReAttachNet(multimaster)
+ rd.AttachNet(multimaster)
except errors.BlockDeviceError, err:
_Fail("Can't change network configuration: %s", err)
if all_connected:
time.sleep(sleep_time)
sleep_time = min(5, sleep_time * 1.5)
if not all_connected:
- return (False, "Timeout in disk reconnecting")
+ _Fail("Timeout in disk reconnecting")
if multimaster:
# change to primary mode
for rd in bdevs:
rd.Open()
except errors.BlockDeviceError, err:
_Fail("Can't change to primary mode: %s", err)
- if multimaster:
- msg = "multi-master and primary"
- else:
- msg = "single-master"
- return (True, "Disks are now configured as %s" % msg)
def DrbdWaitSync(nodes_ip, disks):
min_resync = 100
alldone = True
- failure = False
for rd in bdevs:
stats = rd.GetProcStatus()
if not (stats.is_connected or stats.is_in_resync):
- failure = True
- break
+ _Fail("DRBD device %s is not in sync: stats=%s", rd, stats)
alldone = alldone and (not stats.is_in_resync)
if stats.sync_percent is not None:
min_resync = min(min_resync, stats.sync_percent)
- return (not failure, (alldone, min_resync))
+
+ return (alldone, min_resync)
def PowercycleNode(hypervisor_type):
hyper = hypervisor.GetHypervisor(hypervisor_type)
try:
pid = os.fork()
- except OSError, err:
+ except OSError:
# if we can't fork, we'll pretend that we're in the child process
pid = 0
if pid > 0:
- return (True, "Reboot scheduled in 5 seconds")
+ return "Reboot scheduled in 5 seconds"
time.sleep(5)
hyper.PowercycleNode()
dir_name = "%s/%s" % (self._BASE_DIR, subdir)
try:
dir_contents = utils.ListVisibleFiles(dir_name)
- except OSError, err:
+ except OSError:
# FIXME: must log output in case of failures
- return True, rr
+ return rr
# we use the standard python sort order,
# so 00name is the recommended naming scheme
rrval = constants.HKR_SUCCESS
rr.append(("%s/%s" % (subdir, relname), rrval, output))
- return True, rr
+ return rr
class IAllocatorRunner(object):
finally:
os.unlink(fin_name)
- return True, result.stdout
+ return result.stdout
class DevCacheManager(object):
try:
utils.WriteFile(fpath, data=fdata)
except EnvironmentError, err:
- logging.exception("Can't update bdev cache for %s", dev_path)
+ logging.exception("Can't update bdev cache for %s: %s", dev_path, err)
@classmethod
def RemoveCache(cls, dev_path):
try:
utils.RemoveFile(fpath)
except EnvironmentError, err:
- logging.exception("Can't update bdev cache for %s", dev_path)
+ logging.exception("Can't update bdev cache for %s: %s", dev_path, err)