From: Tom Hromatka Date: Mon, 17 Apr 2023 14:58:15 +0000 (+0000) Subject: ftests: Add a domain invalid test X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2370a9b52782d205aede1b7c496c2098c84957dc;p=thirdparty%2Flibcgroup.git ftests: Add a domain invalid test ----------------------------------------------------------------- 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 Reviewed-by: Kamalesh Babulal (cherry picked from commit bca30abc50391b674a7caf779c3cd374c8f5a2b5) --- diff --git a/tests/ftests/080-kernel-domain_invalid.py b/tests/ftests/080-kernel-domain_invalid.py new file mode 100755 index 00000000..79fdf74c --- /dev/null +++ b/tests/ftests/080-kernel-domain_invalid.py @@ -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 +# + +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: diff --git a/tests/ftests/Makefile.am b/tests/ftests/Makefile.am index 744a5bab..c810eb64 100644 --- a/tests/ftests/Makefile.am +++ b/tests/ftests/Makefile.am @@ -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