Whitespace nitpicks that should be fixed, otherwise LGTM On Thu, Jul 24, 2014 at 2:31 AM, Yuto KAWAMURA(kawamuray) < [email protected]> wrote:
> This patch adds few unit tests for cgroup management functions of > ... a few ... > 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 > + > \n > +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") > + > \n > +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")) > > \n > +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"), > s/relatime/realtime/ - it does not matter though > + ("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") > + > \n > +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"} > s/:/: / + 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 > >
