iinfo = hypervisor.GetHypervisor(hname).GetAllInstancesInfo()
if iinfo:
for name, inst_id, memory, vcpus, state, times in iinfo:
- if name in output:
- raise errors.HypervisorError("Instance %s running duplicate" % name)
- output[name] = {
+ value = {
'memory': memory,
'vcpus': vcpus,
'state': state,
'time': times,
}
+ if name in output and output[name] != value:
+ raise errors.HypervisorError("Instance %s running duplicate"
+ " with different parameters" % name)
+ output[name] = value
return output
-def AddOSToInstance(instance, os_disk, swap_disk):
+def AddOSToInstance(instance):
"""Add an OS to an instance.
- Args:
- instance: the instance object
- os_disk: the instance-visible name of the os device
- swap_disk: the instance-visible name of the swap device
+ @type instance: L{objects.Instance}
+ @param instance: Instance whose OS is to be installed
"""
inst_os = OSFromDisk(instance.os)
create_script = inst_os.create_script
-
- os_device = instance.FindDisk(os_disk)
- if os_device is None:
- logging.error("Can't find this device-visible name '%s'", os_disk)
- return False
-
- swap_device = instance.FindDisk(swap_disk)
- if swap_device is None:
- logging.error("Can't find this device-visible name '%s'", swap_disk)
- return False
-
- real_os_dev = _RecursiveFindBD(os_device)
- if real_os_dev is None:
- raise errors.BlockDeviceError("Block device '%s' is not set up" %
- str(os_device))
- real_os_dev.Open()
-
- real_swap_dev = _RecursiveFindBD(swap_device)
- if real_swap_dev is None:
- raise errors.BlockDeviceError("Block device '%s' is not set up" %
- str(swap_device))
- real_swap_dev.Open()
+ create_env = OSEnvironment(instance)
logfile = "%s/add-%s-%s-%d.log" % (constants.LOG_OS_DIR, instance.os,
instance.name, int(time.time()))
if not os.path.exists(constants.LOG_OS_DIR):
os.mkdir(constants.LOG_OS_DIR, 0750)
- command = utils.BuildShellCmd("cd %s && %s -i %s -b %s -s %s &>%s",
- inst_os.path, create_script, instance.name,
- real_os_dev.dev_path, real_swap_dev.dev_path,
- logfile)
- env = {'HYPERVISOR': instance.hypervisor}
+ command = utils.BuildShellCmd("cd %s && %s &>%s",
+ inst_os.path, create_script, logfile)
- result = utils.RunCmd(command, env=env)
+ result = utils.RunCmd(command, env=create_env)
if result.failed:
logging.error("os create command '%s' returned error: %s, logfile: %s,"
" output: %s", command, result.fail_reason, logfile,
return True
-def RunRenameInstance(instance, old_name, os_disk, swap_disk):
+def RunRenameInstance(instance, old_name):
"""Run the OS rename script for an instance.
- Args:
- instance: the instance object
- old_name: the old name of the instance
- os_disk: the instance-visible name of the os device
- swap_disk: the instance-visible name of the swap device
+ @type instance: objects.Instance
+ @param instance: Instance whose OS is to be installed
+ @type old_name: string
+ @param old_name: previous instance name
"""
inst_os = OSFromDisk(instance.os)
script = inst_os.rename_script
-
- os_device = instance.FindDisk(os_disk)
- if os_device is None:
- logging.error("Can't find this device-visible name '%s'", os_disk)
- return False
-
- swap_device = instance.FindDisk(swap_disk)
- if swap_device is None:
- logging.error("Can't find this device-visible name '%s'", swap_disk)
- return False
-
- real_os_dev = _RecursiveFindBD(os_device)
- if real_os_dev is None:
- raise errors.BlockDeviceError("Block device '%s' is not set up" %
- str(os_device))
- real_os_dev.Open()
-
- real_swap_dev = _RecursiveFindBD(swap_device)
- if real_swap_dev is None:
- raise errors.BlockDeviceError("Block device '%s' is not set up" %
- str(swap_device))
- real_swap_dev.Open()
+ rename_env = OSEnvironment(instance)
+ rename_env['OLD_INSTANCE_NAME'] = old_name
logfile = "%s/rename-%s-%s-%s-%d.log" % (constants.LOG_OS_DIR, instance.os,
old_name,
if not os.path.exists(constants.LOG_OS_DIR):
os.mkdir(constants.LOG_OS_DIR, 0750)
- command = utils.BuildShellCmd("cd %s && %s -o %s -n %s -b %s -s %s &>%s",
- inst_os.path, script, old_name, instance.name,
- real_os_dev.dev_path, real_swap_dev.dev_path,
- logfile)
+ command = utils.BuildShellCmd("cd %s && %s &>%s",
+ inst_os.path, script, logfile)
- result = utils.RunCmd(command)
+ result = utils.RunCmd(command, env=rename_env)
if result.failed:
logging.error("os create command '%s' returned error: %s output: %s",
`errors.InvalidOS` exception, detailing why this is not a valid
OS.
- Args:
- os_dir: Directory containing the OS scripts. Defaults to a search
- in all the OS_SEARCH_PATH directories.
+ @type base_dir: string
+ @keyword base_dir: Base directory containing OS installations.
+ Defaults to a search in all the OS_SEARCH_PATH dirs.
"""
% (api_versions, constants.OS_API_VERSION))
# OS Scripts dictionary, we will populate it with the actual script names
- os_scripts = {'create': '', 'export': '', 'import': '', 'rename': ''}
+ os_scripts = dict.fromkeys(constants.OS_SCRIPTS)
for script in os_scripts:
os_scripts[script] = os.path.sep.join([os_dir, script])
return objects.OS(name=name, path=os_dir, status=constants.OS_VALID_STATUS,
- create_script=os_scripts['create'],
- export_script=os_scripts['export'],
- import_script=os_scripts['import'],
- rename_script=os_scripts['rename'],
+ create_script=os_scripts[constants.OS_SCRIPT_CREATE],
+ export_script=os_scripts[constants.OS_SCRIPT_EXPORT],
+ import_script=os_scripts[constants.OS_SCRIPT_IMPORT],
+ rename_script=os_scripts[constants.OS_SCRIPT_RENAME],
api_versions=api_versions)
+def OSEnvironment(instance, debug=0):
+ """Calculate the environment for an os script.
+
+ @type instance: instance object
+ @param instance: target instance for the os script run
+ @type debug: integer
+ @param debug: debug level (0 or 1, for os api 10)
+ @rtype: dict
+ @return: dict of environment variables
+
+ """
+ result = {}
+ result['OS_API_VERSION'] = '%d' % constants.OS_API_VERSION
+ result['INSTANCE_NAME'] = instance.name
+ result['HYPERVISOR'] = instance.hypervisor
+ result['DISK_COUNT'] = '%d' % len(instance.disks)
+ result['NIC_COUNT'] = '%d' % len(instance.nics)
+ result['DEBUG_LEVEL'] = '%d' % debug
+ for idx, disk in enumerate(instance.disks):
+ real_disk = _RecursiveFindBD(disk)
+ if real_disk is None:
+ raise errors.BlockDeviceError("Block device '%s' is not set up" %
+ 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] = 'W'
+ if constants.HV_DISK_TYPE in instance.hvparams:
+ result['DISK_%d_FRONTEND_TYPE' % idx] = \
+ instance.hvparams[constants.HV_DISK_TYPE]
+ if disk.dev_type in constants.LDS_BLOCK:
+ result['DISK_%d_BACKEND_TYPE' % idx] = 'block'
+ elif disk.dev_type == constants.LD_FILE:
+ result['DISK_%d_BACKEND_TYPE' % idx] = \
+ 'file:%s' % disk.physical_id[0]
+ for idx, nic in enumerate(instance.nics):
+ result['NIC_%d_MAC' % idx] = nic.mac
+ if nic.ip:
+ result['NIC_%d_IP' % idx] = nic.ip
+ result['NIC_%d_BRIDGE' % idx] = nic.bridge
+ if constants.HV_NIC_TYPE in instance.hvparams:
+ result['NIC_%d_FRONTEND_TYPE' % idx] = \
+ instance.hvparams[constants.HV_NIC_TYPE]
+
+ return result
def GrowBlockDevice(disk, amount):
"""Grow a stack of block devices.
True if successful, False otherwise.
"""
+ # TODO(ultrotter): Import/Export still to be converted to OS API 10
+ logging.error("Import/Export still to be converted to OS API 10")
+ return False
+
inst_os = OSFromDisk(instance.os)
export_script = inst_os.export_script
config.add_section(constants.INISECT_INS)
config.set(constants.INISECT_INS, 'name', instance.name)
- config.set(constants.INISECT_INS, 'memory', '%d' % instance.memory)
- config.set(constants.INISECT_INS, 'vcpus', '%d' % instance.vcpus)
+ config.set(constants.INISECT_INS, 'memory', '%d' %
+ instance.beparams[constants.BE_MEMORY])
+ config.set(constants.INISECT_INS, 'vcpus', '%d' %
+ instance.beparams[constants.BE_VCPUS])
config.set(constants.INISECT_INS, 'disk_template', instance.disk_template)
nic_count = 0
False in case of error, True otherwise.
"""
+ # TODO(ultrotter): Import/Export still to be converted to OS API 10
+ logging.error("Import/Export still to be converted to OS API 10")
+ return False
+
inst_os = OSFromDisk(instance.os)
import_script = inst_os.import_script
return True
+def JobQueueSetDrainFlag(drain_flag):
+ """Set the drain flag for the queue.
+
+ This will set or unset the queue drain flag.
+
+ @type drain_flag: bool
+ @param drain_flag: if True, will set the drain flag, otherwise reset it.
+
+ """
+ if drain_flag:
+ utils.WriteFile(constants.JOB_QUEUE_DRAIN_FILE, data="", close=True)
+ else:
+ utils.RemoveFile(constants.JOB_QUEUE_DRAIN_FILE)
+
+ return True
+
+
def CloseBlockDevices(disks):
"""Closes the given block devices.
return (True, "All devices secondary")
+def ValidateHVParams(hvname, hvparams):
+ """Validates the given hypervisor parameters.
+
+ @type hvname: string
+ @param hvname: the hypervisor name
+ @type hvparams: dict
+ @param hvparams: the hypervisor parameters to be validated
+ @rtype: tuple (bool, str)
+ @return: tuple of (success, message)
+
+ """
+ try:
+ hv_type = hypervisor.GetHypervisor(hvname)
+ hv_type.ValidateParameters(hvparams)
+ return (True, "Validation passed")
+ except errors.HypervisorError, err:
+ return (False, str(err))
+
+
class HooksRunner(object):
"""Hook runner.