+ if hvp[constants.HV_SERIAL_CONSOLE]:
+ serial_dev = ('unix:%s,server,nowait' %
+ self._InstanceSerial(instance.name))
+ kvm_cmd.extend(['-serial', serial_dev])
+ else:
+ kvm_cmd.extend(['-serial', 'none'])
+
+ # Save the current instance nics, but defer their expansion as parameters,
+ # as we'll need to generate executable temp files for them.
+ kvm_nics = instance.nics
+ hvparams = hvp
+
+ return (kvm_cmd, kvm_nics, hvparams)
+
+ def _WriteKVMRuntime(self, instance_name, data):
+ """Write an instance's KVM runtime
+
+ """
+ try:
+ utils.WriteFile(self._InstanceKVMRuntime(instance_name),
+ data=data)
+ except EnvironmentError, err:
+ raise errors.HypervisorError("Failed to save KVM runtime file: %s" % err)
+
+ def _ReadKVMRuntime(self, instance_name):
+ """Read an instance's KVM runtime
+
+ """
+ try:
+ file_content = utils.ReadFile(self._InstanceKVMRuntime(instance_name))
+ except EnvironmentError, err:
+ raise errors.HypervisorError("Failed to load KVM runtime file: %s" % err)
+ return file_content
+
+ def _SaveKVMRuntime(self, instance, kvm_runtime):
+ """Save an instance's KVM runtime
+
+ """
+ kvm_cmd, kvm_nics, hvparams = kvm_runtime
+ serialized_nics = [nic.ToDict() for nic in kvm_nics]
+ serialized_form = serializer.Dump((kvm_cmd, serialized_nics, hvparams))
+ self._WriteKVMRuntime(instance.name, serialized_form)
+
+ def _LoadKVMRuntime(self, instance, serialized_runtime=None):
+ """Load an instance's KVM runtime
+
+ """
+ if not serialized_runtime:
+ serialized_runtime = self._ReadKVMRuntime(instance.name)
+ loaded_runtime = serializer.Load(serialized_runtime)
+ kvm_cmd, serialized_nics, hvparams = loaded_runtime
+ kvm_nics = [objects.NIC.FromDict(snic) for snic in serialized_nics]
+ return (kvm_cmd, kvm_nics, hvparams)
+
+ def _ExecuteKVMRuntime(self, instance, kvm_runtime, incoming=None):
+ """Execute a KVM cmd, after completing it with some last minute data
+
+ @type incoming: tuple of strings
+ @param incoming: (target_host_ip, port)
+
+ """
+ pidfile, pid, alive = self._InstancePidAlive(instance.name)
+ if alive:
+ raise errors.HypervisorError("Failed to start instance %s: %s" %
+ (instance.name, "already running"))
+
+ temp_files = []
+
+ kvm_cmd, kvm_nics, hvparams = kvm_runtime
+
+ if not kvm_nics:
+ kvm_cmd.extend(['-net', 'none'])
+ else:
+ nic_type = hvparams[constants.HV_NIC_TYPE]
+ if nic_type == constants.HT_NIC_PARAVIRTUAL:
+ nic_model = "model=virtio"
+ else:
+ nic_model = "model=%s" % nic_type
+
+ for nic_seq, nic in enumerate(kvm_nics):
+ nic_val = "nic,macaddr=%s,%s" % (nic.mac, nic_model)
+ script = self._WriteNetScript(instance, nic_seq, nic)
+ kvm_cmd.extend(['-net', nic_val])
+ kvm_cmd.extend(['-net', 'tap,script=%s' % script])
+ temp_files.append(script)
+
+ if incoming:
+ target, port = incoming
+ kvm_cmd.extend(['-incoming', 'tcp:%s:%s' % (target, port)])