constants.HV_ROOT_PATH,
constants.HV_ACPI,
constants.HV_SERIAL_CONSOLE,
+ constants.HV_VNC_BIND_ADDRESS,
+ constants.HV_VNC_TLS,
+ constants.HV_VNC_X509,
+ constants.HV_VNC_X509_VERIFY,
+ constants.HV_CDROM_IMAGE_PATH,
+ constants.HV_BOOT_ORDER,
]
_MIGRATION_STATUS_RE = re.compile('Migration\s+status:\s+(\w+)',
for name in os.listdir(self._PIDS_DIR):
filename = "%s/%s" % (self._PIDS_DIR, name)
if utils.IsProcessAlive(utils.ReadPidFile(filename)):
- data.append(self.GetInstanceInfo(name))
+ try:
+ info = self.GetInstanceInfo(name)
+ except errors.HypervisorError, err:
+ continue
+ if info:
+ data.append(info)
return data
if not instance.hvparams[constants.HV_ACPI]:
kvm_cmd.extend(['-no-acpi'])
- boot_drive = True
+ boot_disk = (instance.hvparams[constants.HV_BOOT_ORDER] == "disk")
+ boot_cdrom = (instance.hvparams[constants.HV_BOOT_ORDER] == "cdrom")
for cfdev, dev_path in block_devices:
if cfdev.mode != constants.DISK_RDWR:
raise errors.HypervisorError("Instance has read-only disks which"
" are not supported by KVM")
# TODO: handle FD_LOOP and FD_BLKTAP (?)
- if boot_drive:
+ if boot_disk:
+ kvm_cmd.extend(['-boot', 'c'])
boot_val = ',boot=on'
- boot_drive = False
+ boot_disk = False
else:
boot_val = ''
drive_val = 'file=%s,format=raw%s%s' % (dev_path, if_val, boot_val)
kvm_cmd.extend(['-drive', drive_val])
+ iso_image = instance.hvparams[constants.HV_CDROM_IMAGE_PATH]
+ if iso_image:
+ options = ',format=raw,media=cdrom'
+ if boot_cdrom:
+ kvm_cmd.extend(['-boot', 'd'])
+ options = '%s,boot=on' % options
+ else:
+ options = '%s,if=virtio' % options
+ drive_val = 'file=%s%s' % (iso_image, options)
+ kvm_cmd.extend(['-drive', drive_val])
+
kernel_path = instance.hvparams[constants.HV_KERNEL_PATH]
if kernel_path:
kvm_cmd.extend(['-kernel', kernel_path])
else:
kvm_cmd.extend(['-append', root_append])
- #"hvm_boot_order",
- #"hvm_cdrom_image_path",
+ # FIXME: handle vnc password
+ vnc_bind_address = instance.hvparams[constants.HV_VNC_BIND_ADDRESS]
+ if vnc_bind_address:
+ kvm_cmd.extend(['-usbdevice', 'tablet'])
+ if utils.IsValidIP(vnc_bind_address):
+ if instance.network_port > constants.HT_HVM_VNC_BASE_PORT:
+ display = instance.network_port - constants.HT_HVM_VNC_BASE_PORT
+ if vnc_bind_address == '0.0.0.0':
+ vnc_arg = ':%d' % (display)
+ else:
+ vnc_arg = '%s:%d' % (constants.HV_VNC_BIND_ADDRESS, display)
+ else:
+ logging.error("Network port is not a valid VNC display (%d < %d)."
+ " Not starting VNC" %
+ (instance.network_port,
+ constants.HT_HVM_VNC_BASE_PORT))
+ vnc_arg = 'none'
+
+ # Only allow tls and other option when not binding to a file, for now.
+ # kvm/qemu gets confused otherwise about the filename to use.
+ vnc_append = ''
+ if instance.hvparams[constants.HV_VNC_TLS]:
+ vnc_append = '%s,tls' % vnc_append
+ if instance.hvparams[constants.HV_VNC_X509_VERIFY]:
+ vnc_append = '%s,x509verify=%s' % (vnc_append,
+ instance.hvparams[constants.HV_VNC_X509])
+ elif instance.hvparams[constants.HV_VNC_X509]:
+ vnc_append = '%s,x509=%s' % (vnc_append,
+ instance.hvparams[constants.HV_VNC_X509])
+ vnc_arg = '%s%s' % (vnc_arg, vnc_append)
+
+ else:
+ vnc_arg = 'unix:%s/%s.vnc' % (vnc_bind_address, instance.name)
+
+ kvm_cmd.extend(['-vnc', vnc_arg])
+ else:
+ kvm_cmd.extend(['-nographic'])
- kvm_cmd.extend(['-nographic'])
- # FIXME: handle vnc, if needed
- # How do we decide whether to have it or not?? :(
- #"vnc_bind_address",
- #"network_port"
monitor_dev = 'unix:%s,server,nowait' % \
self._InstanceMonitor(instance.name)
kvm_cmd.extend(['-monitor', monitor_dev])
except EnvironmentError, err:
raise errors.HypervisorError("Failed to list node info: %s" % err)
result['cpu_total'] = cpu_total
+ # FIXME: export correct data here
+ result['cpu_nodes'] = 1
+ result['cpu_sockets'] = 1
return result
utils.ShellQuote(cls._InstanceSerial(instance.name))))
else:
shell_command = "echo 'No serial shell for instance %s'" % instance.name
+
+ vnc_bind_address = hvparams[constants.HV_VNC_BIND_ADDRESS]
+ if vnc_bind_address:
+ if instance.network_port > constants.HT_HVM_VNC_BASE_PORT:
+ display = instance.network_port - constants.HT_HVM_VNC_BASE_PORT
+ vnc_command = ("echo 'Instance has VNC listening on %s:%d"
+ " (display: %d)'" % (vnc_bind_address,
+ instance.network_port,
+ display))
+ shell_command = "%s; %s" % (vnc_command, shell_command)
+
return shell_command
def Verify(self):
raise errors.HypervisorError("The initrd path must an absolute path"
", if defined")
+ vnc_bind_address = hvparams[constants.HV_VNC_BIND_ADDRESS]
+ if vnc_bind_address:
+ if not utils.IsValidIP(vnc_bind_address):
+ if not os.path.isabs(vnc_bind_address):
+ raise errors.HypervisorError("The VNC bind address must be either"
+ " a valid IP address or an absolute"
+ " pathname. '%s' given" %
+ vnc_bind_address)
+
+ if hvparams[constants.HV_VNC_X509_VERIFY] and \
+ not hvparams[constants.HV_VNC_X509]:
+ raise errors.HypervisorError("%s must be defined, if %s is" %
+ (constants.HV_VNC_X509,
+ constants.HV_VNC_X509_VERIFY))
+
+ if hvparams[constants.HV_VNC_X509]:
+ if not os.path.isabs(hvparams[constants.HV_VNC_X509]):
+ raise errors.HypervisorError("The vnc x509 path must an absolute path"
+ ", if defined")
+
+ iso_path = hvparams[constants.HV_CDROM_IMAGE_PATH]
+ if iso_path and not os.path.isabs(iso_path):
+ raise errors.HypervisorError("The path to the CDROM image must be"
+ " an absolute path, if defined")
+
+ boot_order = hvparams[constants.HV_BOOT_ORDER]
+ if boot_order not in ('cdrom', 'disk'):
+ raise errors.HypervisorError("The boot order must be 'cdrom' or 'disk'")
+
+ if boot_order == 'cdrom' and not iso_path:
+ raise errors.HypervisorError("Cannot boot from cdrom without an ISO path")
+
def ValidateParameters(self, hvparams):
"""Check the given parameters for validity.
if initrd_path and not os.path.isfile(initrd_path):
raise errors.HypervisorError("Instance initrd '%s' not found or"
" not a file" % initrd_path)
+
+ vnc_bind_address = hvparams[constants.HV_VNC_BIND_ADDRESS]
+ if vnc_bind_address and not utils.IsValidIP(vnc_bind_address) and \
+ not os.path.isdir(vnc_bind_address):
+ raise errors.HypervisorError("Instance vnc bind address must be either"
+ " an ip address or an existing directory")
+
+ vnc_x509 = hvparams[constants.HV_VNC_X509]
+ if vnc_x509 and not os.path.isdir(vnc_x509):
+ raise errors.HypervisorError("Instance vnc x509 path '%s' not found"
+ " or not a directory" % vnc_x509)
+
+ iso_path = hvparams[constants.HV_CDROM_IMAGE_PATH]
+ if iso_path and not os.path.isfile(iso_path):
+ raise errors.HypervisorError("Instance cdrom image '%s' not found or"
+ " not a file" % iso_path)