def __init__(self):
hv_base.BaseHypervisor.__init__(self)
- if not os.path.exists(self._ROOT_DIR):
- os.mkdir(self._ROOT_DIR)
- if not os.path.isdir(self._ROOT_DIR):
- raise HypervisorError("Needed path %s is not a directory" %
- self._ROOT_DIR)
+ utils.EnsureDirs([(self._ROOT_DIR, constants.RUN_DIRS_MODE)])
@staticmethod
def _IsDirLive(path):
def _GetMountSubdirs(path):
"""Return the list of mountpoints under a given path.
- This function is Linux-specific.
-
"""
- #TODO(iustin): investigate and document non-linux options
- #(e.g. via mount output)
- data = []
- fh = open("/proc/mounts", "r")
- try:
- for line in fh:
- _, mountpoint, _ = line.split(" ", 2)
- if (mountpoint.startswith(path) and
- mountpoint != path):
- data.append(mountpoint)
- finally:
- fh.close()
- data.sort(key=lambda x: x.count("/"), reverse=True)
- return data
+ result = []
+ for _, mountpoint, _, _ in utils.GetMounts():
+ if (mountpoint.startswith(path) and
+ mountpoint != path):
+ result.append(mountpoint)
+
+ result.sort(key=lambda x: x.count("/"), reverse=True)
+ return result
@classmethod
def _InstanceDir(cls, instance_name):
raise HypervisorError("Can't stop the processes using the chroot")
return
+ def CleanupInstance(self, instance_name):
+ """Cleanup after a stopped instance
+
+ """
+ root_dir = self._InstanceDir(instance_name)
+
+ if not os.path.exists(root_dir):
+ return
+
+ if self._IsDirLive(root_dir):
+ raise HypervisorError("Processes are still using the chroot")
+
for mpath in self._GetMountSubdirs(root_dir):
utils.RunCmd(["umount", mpath])
result = utils.RunCmd(["umount", root_dir])
- if result.failed and force:
+ if result.failed:
msg = ("Processes still alive in the chroot: %s" %
utils.RunCmd("fuser -vm %s" % root_dir).output)
logging.error(msg)