This patch adds a few unit tests for cgroup management functions of hv_lxc.
Signed-off-by: Yuto KAWAMURA(kawamuray) <[email protected]> --- .../cpuset/some_group/lxc/instance1/cpuset.cpus | 1 + .../devices/some_group/lxc/instance1/devices.list | 1 + .../memory/lxc/instance1/memory.limit_in_bytes | 1 + test/data/proc_cgroup.txt | 4 ++ test/py/ganeti.hypervisor.hv_lxc_unittest.py | 80 ++++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 test/data/cgroup_root/cpuset/some_group/lxc/instance1/cpuset.cpus create mode 100644 test/data/cgroup_root/devices/some_group/lxc/instance1/devices.list create mode 100644 test/data/cgroup_root/memory/lxc/instance1/memory.limit_in_bytes create mode 100644 test/data/proc_cgroup.txt diff --git a/test/data/cgroup_root/cpuset/some_group/lxc/instance1/cpuset.cpus b/test/data/cgroup_root/cpuset/some_group/lxc/instance1/cpuset.cpus new file mode 100644 index 0000000..8b0fab8 --- /dev/null +++ b/test/data/cgroup_root/cpuset/some_group/lxc/instance1/cpuset.cpus @@ -0,0 +1 @@ +0-1 diff --git a/test/data/cgroup_root/devices/some_group/lxc/instance1/devices.list b/test/data/cgroup_root/devices/some_group/lxc/instance1/devices.list new file mode 100644 index 0000000..8f3ec6b --- /dev/null +++ b/test/data/cgroup_root/devices/some_group/lxc/instance1/devices.list @@ -0,0 +1 @@ +a *:* rwm diff --git a/test/data/cgroup_root/memory/lxc/instance1/memory.limit_in_bytes b/test/data/cgroup_root/memory/lxc/instance1/memory.limit_in_bytes new file mode 100644 index 0000000..a949a93 --- /dev/null +++ b/test/data/cgroup_root/memory/lxc/instance1/memory.limit_in_bytes @@ -0,0 +1 @@ +128 diff --git a/test/data/proc_cgroup.txt b/test/data/proc_cgroup.txt new file mode 100644 index 0000000..13fafd0 --- /dev/null +++ b/test/data/proc_cgroup.txt @@ -0,0 +1,4 @@ +3:devices:/some_group + +2:memory:/ +1:cpuset:/some_group diff --git a/test/py/ganeti.hypervisor.hv_lxc_unittest.py b/test/py/ganeti.hypervisor.hv_lxc_unittest.py index e41354d..d8fb28a 100755 --- a/test/py/ganeti.hypervisor.hv_lxc_unittest.py +++ b/test/py/ganeti.hypervisor.hv_lxc_unittest.py @@ -33,6 +33,7 @@ from ganeti.hypervisor import hv_lxc from ganeti.hypervisor.hv_lxc import LXCHypervisor import mock +import os import shutil import tempfile import testutils @@ -101,5 +102,84 @@ class TestLXCHypervisorGetInstanceInfo(unittest.TestCase): self.assertIsNone(self.hv.GetInstanceInfo("inst1")) +class TestCgroupMount(unittest.TestCase): + @patch_object(utils, "GetMounts") + @patch_object(LXCHypervisor, "_MountCgroupSubsystem") + def testGetOrPrepareCgroupSubsysMountPoint(self, mntcgsub_mock, getmnt_mock): + getmnt_mock.return_value = [ + ("/dev/foo", "/foo", "foo", "cpuset"), + ("cpuset", "/sys/fs/cgroup/cpuset", "cgroup", "rw,relatime,cpuset"), + ("devices", "/sys/fs/cgroup/devices", "cgroup", "rw,devices,relatime"), + ("cpumem", "/sys/fs/cgroup/cpumem", "cgroup", "cpu,memory,rw,relatime"), + ] + mntcgsub_mock.return_value = "/foo" + hv = LXCHypervisor() + self.assertEqual(hv._GetOrPrepareCgroupSubsysMountPoint("cpuset"), + "/sys/fs/cgroup/cpuset") + self.assertEqual(hv._GetOrPrepareCgroupSubsysMountPoint("devices"), + "/sys/fs/cgroup/devices") + self.assertEqual(hv._GetOrPrepareCgroupSubsysMountPoint("cpu"), + "/sys/fs/cgroup/cpumem") + self.assertEqual(hv._GetOrPrepareCgroupSubsysMountPoint("memory"), + "/sys/fs/cgroup/cpumem") + self.assertEqual(hv._GetOrPrepareCgroupSubsysMountPoint("freezer"), + "/foo") + mntcgsub_mock.assert_called_with("freezer") + + +class TestCgroupReadData(unittest.TestCase): + cgroot = os.path.abspath(testutils.TestDataFilename("cgroup_root")) + + def setUp(self): + self.hv = LXCHypervisor() + + @patch_object(LXCHypervisor, "_CGROUP_ROOT_DIR", cgroot) + def testGetCgroupMountPoint(self): + self.assertEqual(self.hv._GetCgroupMountPoint(), self.cgroot) + + @patch_object(LXCHypervisor, "_PROC_CGROUP_FILE", + testutils.TestDataFilename("proc_cgroup.txt")) + def testGetCurrentCgroupSubsysGroups(self): + expected_groups = { + "memory": "", # root + "cpuset": "some_group", + "devices": "some_group", + } + self.assertEqual(self.hv._GetCurrentCgroupSubsysGroups(), expected_groups) + + @patch_object(LXCHypervisor, "_GetOrPrepareCgroupSubsysMountPoint") + @patch_object(LXCHypervisor, "_GetCurrentCgroupSubsysGroups") + def testGetCgroupInstanceSubsysDir(self, getcgg_mock, getmp_mock): + getmp_mock.return_value = "/cg" + getcgg_mock.return_value = {"cpuset": "grp"} + self.assertEqual(self.hv._GetCgroupInstanceSubsysDir("instance1", "memory"), + "/cg/lxc/instance1") + self.assertEqual(self.hv._GetCgroupInstanceSubsysDir("instance1", "cpuset"), + "/cg/grp/lxc/instance1") + + @patch_object(LXCHypervisor, "_GetCgroupInstanceSubsysDir") + def testGetCgroupInstanceValue(self, getdir_mock): + getdir_mock.return_value = utils.PathJoin(self.cgroot, "memory", "lxc", + "instance1") + self.assertEqual(self.hv._GetCgroupInstanceValue("instance1", "memory", + "memory.limit_in_bytes"), + "128") + getdir_mock.return_value = utils.PathJoin(self.cgroot, "cpuset", + "some_group", "lxc", "instance1") + self.assertEqual(self.hv._GetCgroupInstanceValue("instance1", "cpuset", + "cpuset.cpus"), + "0-1") + + @patch_object(LXCHypervisor, "_GetCgroupInstanceValue") + def testGetCgroupCpuList(self, getval_mock): + getval_mock.return_value = "0-1" + self.assertEqual(self.hv._GetCgroupCpuList("instance1"), [0, 1]) + + @patch_object(LXCHypervisor, "_GetCgroupInstanceValue") + def testGetCgroupMemoryLimit(self, getval_mock): + getval_mock.return_value = "128" + self.assertEqual(self.hv._GetCgroupMemoryLimit("instance1"), 128) + + if __name__ == "__main__": testutils.GanetiTestProgram() -- 1.8.5.5
