1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1-only
#
# Create a systemd scope with an existing PID
#
# Copyright (c) 2022 Oracle and/or its affiliates.
# Author: Tom Hromatka <tom.hromatka@oracle.com>
#
from cgroup import Cgroup as CgroupCli
from cgroup import CgroupVersion
from libcgroup import Cgroup
from systemd import Systemd
from process import Process
from run import RunError
import ftests
import consts
import sys
import os
SLICE = 'libcgtests.slice'
SCOPE = '050delegated.scope'
pid = None
# Which controller isn't all that important, but it is important that we
# have a cgroup v2 controller
CONTROLLER = 'cpu'
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 CgroupVersion.get_version(CONTROLLER) != CgroupVersion.CGROUP_V2:
result = consts.TEST_SKIPPED
cause = 'This test requires cgroup v2'
return result, cause
def setup(config):
pass
def test(config):
global pid
result = consts.TEST_PASSED
cause = None
pid = int(config.process.create_process(config))
Cgroup.create_scope(SCOPE, slice_name=SLICE, pid=pid)
if not Systemd.is_delegated(config, SCOPE):
result = consts.TEST_FAILED
cause = 'Cgroup is not delegated'
return result, cause
def teardown(config, result):
global pid
Process.kill(config, pid)
if result != consts.TEST_PASSED:
# Something went wrong. Let's force the removal of the cgroups just to be safe.
# Note that this should remove the cgroup, but it won't remove it from systemd's
# internal caches, so the system may not return to its 'pristine' prior-to-this-test
# state
try:
CgroupCli.delete(config, None, os.path.join(SLICE, SCOPE))
except RunError:
pass
else:
# There is no need to remove the scope. systemd should automatically remove it
# once there are no processes inside of it
pass
return consts.TEST_PASSED, None
def main(config):
[result, cause] = prereqs(config)
if result != consts.TEST_PASSED:
return [result, cause]
try:
result = consts.TEST_FAILED
setup(config)
[result, cause] = test(config)
finally:
teardown(config, result)
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:
|