This patch adds 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       | 92 ++++++++++++++++++++++
 5 files changed, 99 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 e3a09fc..005378f 100755
--- a/test/py/ganeti.hypervisor.hv_lxc_unittest.py
+++ b/test/py/ganeti.hypervisor.hv_lxc_unittest.py
@@ -33,7 +33,22 @@ from ganeti.hypervisor import hv_lxc
 from ganeti.hypervisor.hv_lxc import LXCHypervisor
 
 import mock
+import os
+import shutil
+import tempfile
 import testutils
+from testutils import patch_object
+
+def setUpModule():
+  # Creating instance of LXCHypervisor will fail by permission issue of
+  # instance directories
+  global temp_dir
+  temp_dir = tempfile.mkdtemp()
+  LXCHypervisor._ROOT_DIR = utils.PathJoin(temp_dir, "root")
+  LXCHypervisor._LOG_DIR = utils.PathJoin(temp_dir, "log")
+
+def tearDownModule():
+  shutil.rmtree(temp_dir)
 
 
 def RunResultOk(stdout):
@@ -81,5 +96,82 @@ class TestLXCHypervisorGetInstanceInfo(unittest.TestCase):
     isalive_mock.return_value = False
     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

Reply via email to