From 7548396c4753cdb85c5a86784c0c22bf5389cecf Mon Sep 17 00:00:00 2001 From: Guido Trotter <ultrotter@google.com> Date: Mon, 19 Apr 2010 16:30:45 +0100 Subject: [PATCH] KVM: add an instance uid file concept If this file exists, for an instance, we release the uid contained inside back to the uid pool, at instance shutdown. Signed-off-by: Guido Trotter <ultrotter@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/hypervisor/hv_kvm.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index cc8152130..a696a41fa 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -45,9 +45,10 @@ class KVMHypervisor(hv_base.BaseHypervisor): _ROOT_DIR = constants.RUN_GANETI_DIR + "/kvm-hypervisor" _PIDS_DIR = _ROOT_DIR + "/pid" # contains live instances pids + _UIDS_DIR = _ROOT_DIR + "/uid" # contains instances reserved uids _CTRL_DIR = _ROOT_DIR + "/ctrl" # contains instances control sockets _CONF_DIR = _ROOT_DIR + "/conf" # contains instances startup data - _DIRS = [_ROOT_DIR, _PIDS_DIR, _CTRL_DIR, _CONF_DIR] + _DIRS = [_ROOT_DIR, _PIDS_DIR, _UIDS_DIR, _CTRL_DIR, _CONF_DIR] PARAMETERS = { constants.HV_KERNEL_PATH: hv_base.OPT_FILE_CHECK, @@ -109,6 +110,13 @@ class KVMHypervisor(hv_base.BaseHypervisor): """ return utils.PathJoin(cls._PIDS_DIR, instance_name) + @classmethod + def _InstanceUidFile(cls, instance_name): + """Returns the instance uidfile. + + """ + return utils.PathJoin(cls._UIDS_DIR, instance_name) + @classmethod def _InstancePidInfo(cls, pid): """Check pid file for instance information. @@ -217,6 +225,22 @@ class KVMHypervisor(hv_base.BaseHypervisor): """ return utils.PathJoin(cls._CONF_DIR, "%s.runtime" % instance_name) + @classmethod + def _TryReadUidFile(cls, uid_file): + """Try to read a uid file + + """ + if os.path.exists(uid_file): + try: + uid = int(utils.ReadFile(uid_file)) + except EnvironmentError: + logging.warning("Can't read uid file", exc_info=True) + return None + except (TypeError, ValueError): + logging.warning("Can't parse uid file contents", exc_info=True) + return None + return uid + @classmethod def _RemoveInstanceRuntimeFiles(cls, pidfile, instance_name): """Removes an instance's rutime sockets/files. @@ -226,6 +250,11 @@ class KVMHypervisor(hv_base.BaseHypervisor): utils.RemoveFile(cls._InstanceMonitor(instance_name)) utils.RemoveFile(cls._InstanceSerial(instance_name)) utils.RemoveFile(cls._InstanceKVMRuntime(instance_name)) + uid_file = cls._InstanceUidFile(instance_name) + uid = cls._TryReadUidFile(uid_file) + utils.RemoveFile(uid_file) + if uid is not None: + uidpool.ReleaseUid(uid) def _WriteNetScript(self, instance, seq, nic): """Write a script to connect a net interface to the proper bridge. -- GitLab