]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
ftests: Add a domain invalid test
authorTom Hromatka <tom.hromatka@oracle.com>
Mon, 17 Apr 2023 14:58:15 +0000 (14:58 +0000)
committerTom Hromatka <tom.hromatka@oracle.com>
Thu, 20 Apr 2023 20:17:30 +0000 (14:17 -0600)
-----------------------------------------------------------------
Test Results:
Run Date:                          Apr 13 19:23:11
Passed:                                  1 test(s)
Skipped:                                 0 test(s)
Failed:                                  0 test(s)
-----------------------------------------------------------------
Timing Results:
Test                             Time (sec)
-------------------------------------------
setup                                  0.00
080-kernel-domain_invalid.py           4.22
teardown                               0.00
-------------------------------------------
Total Run Time                         4.22

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
(cherry picked from commit bca30abc50391b674a7caf779c3cd374c8f5a2b5)

tests/ftests/080-kernel-domain_invalid.py [new file with mode: 0755]
tests/ftests/Makefile.am

diff --git a/tests/ftests/080-kernel-domain_invalid.py b/tests/ftests/080-kernel-domain_invalid.py
new file mode 100755 (executable)
index 0000000..79fdf74
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-only
+#
+# Test to exercise that libcgroup properly handles cgroups that are marked as "domain invalid"
+#
+# Copyright (c) 2023 Oracle and/or its affiliates
+# Author: Tom Hromatka <tom.hromatka@oracle.com>
+#
+
+from cgroup import Cgroup as Cgroup, Mode
+from process import Process
+from run import RunError
+import consts
+import ftests
+import sys
+import os
+
+CONTROLLER = 'cpu'
+PARENTCG = '080domaininvalid'
+CHILDCG = os.path.join(PARENTCG, 'childcg')
+GRANDCHILDCG = os.path.join(CHILDCG, 'grandchildcg')
+
+
+def prereqs(config):
+    result = consts.TEST_PASSED
+    cause = None
+
+    if Cgroup.get_cgroup_mode(config) != Mode.CGROUP_MODE_UNIFIED:
+        result = consts.TEST_SKIPPED
+        cause = 'This test requires the unified cgroup v2 hierarchy'
+
+    return result, cause
+
+
+def setup(config):
+    Cgroup.create(config, CONTROLLER, PARENTCG)
+    Cgroup.create(config, CONTROLLER, CHILDCG)
+
+    config.process.create_process_in_cgroup(config, CONTROLLER, PARENTCG, ignore_systemd=True)
+
+
+def test(config):
+    #
+    # test 1 - ensure that we can create and delete a cgroup (with no controllers) under a
+    # parent whose type is 'domain invalid'
+    #
+    Cgroup.create_and_validate(config, None, GRANDCHILDCG)
+    Cgroup.delete(config, None, GRANDCHILDCG)
+
+    #
+    # test 2 - attempt to add a process to the child cgroup.  the kernel should not allow this,
+    # and libcgroup needs to handle this
+    #
+    pid = config.process.create_process(config)
+    try:
+        Cgroup.classify(config, CONTROLLER, CHILDCG, pid)
+    except RunError as re:
+        if 'Operation not supported' not in re.stderr:
+            raise re
+    finally:
+        Process.kill(config, pid)
+
+    #
+    # test 3 - attempt to enable a controller that enforces the no-processes-in-non-leaf-nodes
+    # rule.  the kernel should not allow this
+    #
+    try:
+        Cgroup.subtree_control(config, CHILDCG, 'memory')
+    except RunError as re:
+        if 'No such file or directory' not in re.stderr:
+            raise re
+
+    return consts.TEST_PASSED, None
+
+
+def teardown(config):
+    pids = Cgroup.get_pids_in_cgroup(config, PARENTCG, CONTROLLER)
+    Process.kill(config, pids)
+
+    Cgroup.delete(config, CONTROLLER, CHILDCG)
+    Cgroup.delete(config, CONTROLLER, PARENTCG)
+
+
+def main(config):
+    [result, cause] = prereqs(config)
+    if result != consts.TEST_PASSED:
+        return [result, cause]
+
+    setup(config)
+    [result, cause] = test(config)
+    teardown(config)
+
+    return [result, cause]
+
+
+if __name__ == '__main__':
+    config = ftests.parse_args()
+    # this test was invoked directly.  run only it
+    config.args.num = int(os.path.basename(__file__).split('-')[0])
+    sys.exit(ftests.main(config))
+
+# vim: set et ts=4 sw=4:
index 744a5bab2cd86ceeb39a846a05274cb8aa314d01..c810eb64d313124a5a9341954823ffaa26e3b2df 100644 (file)
@@ -100,6 +100,7 @@ EXTRA_DIST_PYTHON_TESTS = \
                          077-pybindings-cgroup_get_procs.py \
                          078-sudo-cgcreate_systemd_scope.py \
                          079-sudo-cgcreate_default_systemd_scope.py \
+                         080-kernel-domain_invalid.py \
                          998-cgdelete-non-existing-shared-mnt-cgroup-v1.py
 # Intentionally omit the stress test from the extra dist
 # 999-stress-cgroup_init.py