From f1eb9902c6fb5fbe2421f3f97e63b879ae4b0d43 Mon Sep 17 00:00:00 2001 From: Tom Hromatka Date: Tue, 4 Apr 2023 22:32:12 +0000 Subject: [PATCH] ftests: Add a test to create a systemd scope via cgcreate Add a test to create a systemd scope via the cgcreate command line tool. ----------------------------------------------------------------- Test Results: Run Date: Apr 05 01:35:43 Passed: 1 test(s) Skipped: 0 test(s) Failed: 0 test(s) ----------------------------------------------------------------- Timing Results: Test Time (sec) ------------------------------------------------ setup 0.00 078-sudo-cgcreate_systemd_scope.py 5.03 teardown 0.00 ------------------------------------------------ Total Run Time 5.03 Signed-off-by: Tom Hromatka Reviewed-by: Kamalesh Babulal (cherry picked from commit ebeaf858d791fab3f64352ad462cc7ed4b603dcd) --- .../ftests/078-sudo-cgcreate_systemd_scope.py | 108 ++++++++++++++++++ tests/ftests/Makefile.am | 1 + 2 files changed, 109 insertions(+) create mode 100755 tests/ftests/078-sudo-cgcreate_systemd_scope.py diff --git a/tests/ftests/078-sudo-cgcreate_systemd_scope.py b/tests/ftests/078-sudo-cgcreate_systemd_scope.py new file mode 100755 index 00000000..48897d56 --- /dev/null +++ b/tests/ftests/078-sudo-cgcreate_systemd_scope.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-only +# +# Test to create a systemd scope using cgcreate +# +# Copyright (c) 2023 Oracle and/or its affiliates. +# Author: Tom Hromatka +# + +from cgroup import Cgroup +from process import Process +from libcgroup import Mode +from run import RunError +from log import Log +import consts +import ftests +import sys +import os + +CONTROLLERS = ['cpu', 'pids'] +SLICE = 'libcgroup.slice' +CGNAME = os.path.join(SLICE, '078cgcreate.scope') +IN_SCOPE_CHILD_CGNAME = os.path.join(CGNAME, 'in_scope_childcg') +OUT_OF_SCOPE_CHILD_CGNAME = '078outofscopechild' + + +def prereqs(config): + result = consts.TEST_PASSED + cause = None + + if config.args.container: + result = consts.TEST_SKIPPED + cause = 'This test cannot be run within a container' + return result, cause + + if Cgroup.get_cgroup_mode(config) != Mode.CGROUP_MODE_UNIFIED: + result = consts.TEST_SKIPPED + cause = 'This test requires the unified cgroup hierarchy' + + return result, cause + + +def setup(config): + pass + + +def test(config): + result = consts.TEST_PASSED + cause = None + + Cgroup.create_and_validate(config, CONTROLLERS, CGNAME, create_scope=True) + + # get the placeholder PID that libcgroup placed in the scope + try: + pid = int(Cgroup.get(config, None, CGNAME, setting='cgroup.procs', + print_headers=False, values_only=True, ignore_systemd=True)) + # use the pid variable so that lint is happy + Log.log_debug('Cgroup {} has pid {}'.format(CGNAME, pid)) + except RunError: + result = consts.TEST_FAILED + cause = 'Failed to read pid in {}\'s cgroup.procs'.format(CGNAME) + return result, cause + + # Since the scope was created without being made the default, we must specify + # the entire path to operate on a child cgroup below the scope. + Cgroup.create_and_validate(config, None, IN_SCOPE_CHILD_CGNAME) + Cgroup.create_and_validate(config, None, OUT_OF_SCOPE_CHILD_CGNAME) + + return result, cause + + +def teardown(config): + Cgroup.delete(config, None, IN_SCOPE_CHILD_CGNAME) + Cgroup.delete(config, None, OUT_OF_SCOPE_CHILD_CGNAME) + + pid = int(Cgroup.get(config, None, CGNAME, setting='cgroup.procs', + print_headers=False, values_only=True, ignore_systemd=True)) + Process.kill(config, pid) + + # systemd will automatically remove the cgroup once there are no more pids in + # the cgroup, so we don't need to delete CGNAME. But let's try to remove the + # slice + try: + Cgroup.delete(config, CONTROLLERS, SLICE) + except RunError: + pass + + +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 78e14ec2..a5132ff3 100644 --- a/tests/ftests/Makefile.am +++ b/tests/ftests/Makefile.am @@ -98,6 +98,7 @@ EXTRA_DIST_PYTHON_TESTS = \ 075-pybindings-cgroup_compare_cgroup.py \ 076-cgconfig-auto_convert.py \ 077-pybindings-cgroup_get_procs.py \ + 078-sudo-cgcreate_systemd_scope.py \ 998-cgdelete-non-existing-shared-mnt-cgroup-v1.py # Intentionally omit the stress test from the extra dist # 999-stress-cgroup_init.py -- 2.47.2