diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index 4d999f13add7d3303a36d1dfef345cd1bc849024..7807913c1cc73cd2b3b551e14bde4fef5d3695a3 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -32,6 +32,8 @@ from cStringIO import StringIO from ganeti import utils from ganeti import constants from ganeti import errors +from ganeti import serializer +from ganeti import objects from ganeti.hypervisor import hv_base @@ -70,6 +72,12 @@ class KVMHypervisor(hv_base.BaseHypervisor): """ return '%s/%s.serial' % (self._CTRL_DIR, instance_name) + def _InstanceKVMRuntime(self, instance_name): + """Returns the instance KVM runtime filename + + """ + return '%s/%s.runtime' % (self._CONF_DIR, instance_name) + def _WriteNetScript(self, instance, seq, nic): """Write a script to connect a net interface to the proper bridge. @@ -237,6 +245,45 @@ class KVMHypervisor(hv_base.BaseHypervisor): return (kvm_cmd, kvm_nics) + def _WriteKVMRuntime(self, instance_name, data): + """Write an instance's KVM runtime + + """ + try: + utils.WriteFile(self._InstanceKVMRuntime(instance_name), + data=data) + except IOError, 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 IOError, 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 = kvm_runtime + serialized_nics = [nic.ToDict() for nic in kvm_nics] + serialized_form = serializer.Dump((kvm_cmd, serialized_nics)) + self._WriteKVMRuntime(instance.name, serialized_form) + + def _LoadKVMRuntime(self, instance): + """Load an instance's KVM runtime + + """ + serialized_form = self._ReadKVMRuntime(instance.name) + loaded_runtime = serializer.Load(serialized_form) + kvm_cmd, serialized_nics = loaded_runtime + kvm_nics = [objects.NIC.FromDict(snic) for snic in serialized_nics] + return (kvm_cmd, kvm_nics) + def _ExecuteKVMRuntime(self, instance, kvm_runtime): """Execute a KVM cmd, after completing it with some last minute data @@ -283,6 +330,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): (instance.name, "already running")) kvm_runtime = self._GenerateKVMRuntime(instance, block_devices, extra_args) + self._SaveKVMRuntime(instance, kvm_runtime) self._ExecuteKVMRuntime(instance, kvm_runtime) def StopInstance(self, instance, force=False): @@ -309,6 +357,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): utils.RemoveFile(pid_file) utils.RemoveFile(self._InstanceMonitor(instance.name)) utils.RemoveFile(self._InstanceSerial(instance.name)) + utils.RemoveFile(self._InstanceKVMRuntime(instance.name)) def RebootInstance(self, instance): """Reboot an instance.