X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/f078c799ae06525e04af29049eef5bc2f4c29fc0..8ef418bb92:/lib/hypervisor/hv_lxc.py?ds=sidebyside diff --git a/lib/hypervisor/hv_lxc.py b/lib/hypervisor/hv_lxc.py index d7deee8..819df79 100644 --- a/lib/hypervisor/hv_lxc.py +++ b/lib/hypervisor/hv_lxc.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2010 Google Inc. +# Copyright (C) 2010, 2013 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -149,25 +149,27 @@ class LXCHypervisor(hv_base.BaseHypervisor): cgroup = cls._GetCgroupMountPoint() try: memory = int(utils.ReadFile(utils.PathJoin(cgroup, 'lxc', - instance_name, - "memory.limit_in_bytes"))) + instance_name, + "memory.limit_in_bytes"))) except EnvironmentError: # memory resource controller may be disabled, ignore memory = 0 return memory - def ListInstances(self): + def ListInstances(self, hvparams=None): """Get the list of running instances. """ - return [ iinfo[0] for iinfo in self.GetAllInstancesInfo() ] + return [iinfo[0] for iinfo in self.GetAllInstancesInfo()] - def GetInstanceInfo(self, instance_name): + def GetInstanceInfo(self, instance_name, hvparams=None): """Get instance properties. @type instance_name: string @param instance_name: the instance name + @type hvparams: dict of strings + @param hvparams: hvparams to be used with this instance @rtype: tuple of strings @return: (name, id, memory, vcpus, stat, times) @@ -189,9 +191,11 @@ class LXCHypervisor(hv_base.BaseHypervisor): memory = self._GetCgroupMemoryLimit(instance_name) / (1024 ** 2) return (instance_name, 0, memory, len(cpu_list), 0, 0) - def GetAllInstancesInfo(self): + def GetAllInstancesInfo(self, hvparams=None): """Get properties of all instances. + @type hvparams: dict of strings + @param hvparams: hypervisor parameter @return: [(name, id, memory, vcpus, stat, times),...] """ @@ -249,12 +253,12 @@ class LXCHypervisor(hv_base.BaseHypervisor): # Conditionally enable, memory resource controller might be disabled cgroup = self._GetCgroupMountPoint() if os.path.exists(utils.PathJoin(cgroup, 'memory.limit_in_bytes')): - out.append("lxc.cgroup.memory.limit_in_bytes = %dM" % - instance.beparams[constants.BE_MAXMEM]) + out.append("lxc.cgroup.memory.limit_in_bytes = %dM" % + instance.beparams[constants.BE_MAXMEM]) if os.path.exists(utils.PathJoin(cgroup, 'memory.memsw.limit_in_bytes')): - out.append("lxc.cgroup.memory.memsw.limit_in_bytes = %dM" % - instance.beparams[constants.BE_MAXMEM]) + out.append("lxc.cgroup.memory.memsw.limit_in_bytes = %dM" % + instance.beparams[constants.BE_MAXMEM]) # Device control # deny direct device access @@ -355,7 +359,7 @@ class LXCHypervisor(hv_base.BaseHypervisor): result.output) if not os.path.ismount(root_dir): - return + return for mpath in self._GetMountSubdirs(root_dir): result = utils.RunCmd(["umount", mpath]) @@ -393,11 +397,14 @@ class LXCHypervisor(hv_base.BaseHypervisor): # Currently lxc instances don't have memory limits pass - def GetNodeInfo(self): + def GetNodeInfo(self, hvparams=None): """Return information about the node. This is just a wrapper over the base GetLinuxNodeInfo method. + @type hvparams: dict of strings + @param hvparams: hypervisor parameters, not used in this class + @return: a dict with the following keys (values in MiB): - memory_total: the total memory size on the node - memory_free: the available memory on the node for instances @@ -417,23 +424,37 @@ class LXCHypervisor(hv_base.BaseHypervisor): user=constants.SSH_CONSOLE_USER, command=["lxc-console", "-n", instance.name]) - def Verify(self): + def Verify(self, hvparams=None): """Verify the hypervisor. For the LXC manager, it just checks the existence of the base dir. + @type hvparams: dict of strings + @param hvparams: hypervisor parameters to be verified against; not used here + @return: Problem description if something is wrong, C{None} otherwise """ - if os.path.exists(self._ROOT_DIR): - return None - else: - return "The required directory '%s' does not exist" % self._ROOT_DIR + msgs = [] + + if not os.path.exists(self._ROOT_DIR): + msgs.append("The required directory '%s' does not exist" % + self._ROOT_DIR) + + try: + self._GetCgroupMountPoint() + except errors.HypervisorError, err: + msgs.append(str(err)) + + return self._FormatVerifyResults(msgs) @classmethod - def PowercycleNode(cls): + def PowercycleNode(cls, hvparams=None): """LXC powercycle, just a wrapper over Linux powercycle. + @type hvparams: dict of strings + @param hvparams: hypervisor params to be used on this node + """ cls.LinuxPowercycle()