Read the cputime(usage) of the LXC instance from the cpuacct.usage cgroup parameter and include it as the "time" field of the return value of the GetInstanceInfo. This commit also discards the TODO comment about something which is already not accurate.
Signed-off-by: Yuto KAWAMURA(kawamuray) <[email protected]> --- lib/hypervisor/hv_lxc.py | 18 +++++++++++++++--- test/py/ganeti.hypervisor.hv_lxc_unittest.py | 3 ++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/hypervisor/hv_lxc.py b/lib/hypervisor/hv_lxc.py index 9d1f12a..54a3612 100644 --- a/lib/hypervisor/hv_lxc.py +++ b/lib/hypervisor/hv_lxc.py @@ -359,6 +359,19 @@ class LXCHypervisor(hv_base.BaseHypervisor): return utils.ParseCpuMask(cpumask) @classmethod + def _GetCgroupCpuUsage(cls, instance_name): + """Return the CPU usage of an instance. + + """ + try: + cputime_ns = cls._GetCgroupInstanceValue(instance_name, "cpuacct.usage") + except EnvironmentError, err: + raise HypervisorError("Failed to get the cpu usage of %s: %s" % + (instance_name, err)) + + return float(cputime_ns) / 10 ** 9 # nano secs to float secs + + @classmethod def _GetCgroupMemoryLimit(cls, instance_name): """Return the memory limit for an instance @@ -402,15 +415,14 @@ class LXCHypervisor(hv_base.BaseHypervisor): @return: (name, id, memory, vcpus, stat, times) """ - # TODO: read container info from the cgroup mountpoint - if not self._IsInstanceAlive(instance_name): return None cpu_list = self._GetCgroupCpuList(instance_name) memory = self._GetCgroupMemoryLimit(instance_name) / (1024 ** 2) + cputime = self._GetCgroupCpuUsage(instance_name) return (instance_name, 0, memory, len(cpu_list), - hv_base.HvInstanceState.RUNNING, 0) + hv_base.HvInstanceState.RUNNING, cputime) def GetAllInstancesInfo(self, hvparams=None): """Get properties of all instances. diff --git a/test/py/ganeti.hypervisor.hv_lxc_unittest.py b/test/py/ganeti.hypervisor.hv_lxc_unittest.py index df7309d..2559d58 100755 --- a/test/py/ganeti.hypervisor.hv_lxc_unittest.py +++ b/test/py/ganeti.hypervisor.hv_lxc_unittest.py @@ -103,12 +103,13 @@ class TestLXCHypervisorGetInstanceInfo(LXCHypervisorTestCase): super(TestLXCHypervisorGetInstanceInfo, self).setUp() self.hv._GetCgroupCpuList = mock.Mock(return_value=[1, 3]) self.hv._GetCgroupMemoryLimit = mock.Mock(return_value=128*(1024**2)) + self.hv._GetCgroupCpuUsage = mock.Mock(return_value=5.01) @patch_object(LXCHypervisor, "_IsInstanceAlive") def testRunningInstance(self, isalive_mock): isalive_mock.return_value = True self.assertEqual(self.hv.GetInstanceInfo("inst1"), - ("inst1", 0, 128, 2, hv_base.HvInstanceState.RUNNING, 0)) + ("inst1", 0, 128, 2, hv_base.HvInstanceState.RUNNING, 5.01)) @patch_object(LXCHypervisor, "_IsInstanceAlive") def testInactiveOrNonexistentInstance(self, isalive_mock): -- 2.0.4
