2 * Copyright (C) 2013-2014 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see
16 * <http://www.gnu.org/licenses/>.
18 * Author: Daniel P. Berrange <berrange@redhat.com>
23 #include "testutils.h"
29 # define __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
30 # include "vircgrouppriv.h"
31 # include "virstring.h"
32 # include "virerror.h"
35 # include "testutilslxc.h"
36 # include "nodeinfo.h"
38 # define VIR_FROM_THIS VIR_FROM_NONE
40 VIR_LOG_INIT("tests.cgrouptest");
42 static int validateCgroup(virCgroupPtr cgroup,
43 const char *expectPath,
44 const char **expectMountPoint,
45 const char **expectLinkPoint,
46 const char **expectPlacement)
50 if (STRNEQ(cgroup->path, expectPath)) {
51 fprintf(stderr, "Wrong path '%s', expected '%s'\n",
52 cgroup->path, expectPath);
56 for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
57 if (STRNEQ_NULLABLE(expectMountPoint[i],
58 cgroup->controllers[i].mountPoint)) {
59 fprintf(stderr, "Wrong mount '%s', expected '%s' for '%s'\n",
60 cgroup->controllers[i].mountPoint,
62 virCgroupControllerTypeToString(i));
65 if (STRNEQ_NULLABLE(expectLinkPoint[i],
66 cgroup->controllers[i].linkPoint)) {
67 fprintf(stderr, "Wrong link '%s', expected '%s' for '%s'\n",
68 cgroup->controllers[i].linkPoint,
70 virCgroupControllerTypeToString(i));
73 if (STRNEQ_NULLABLE(expectPlacement[i],
74 cgroup->controllers[i].placement)) {
75 fprintf(stderr, "Wrong placement '%s', expected '%s' for '%s'\n",
76 cgroup->controllers[i].placement,
78 virCgroupControllerTypeToString(i));
86 const char *mountsSmall[VIR_CGROUP_CONTROLLER_LAST] = {
87 [VIR_CGROUP_CONTROLLER_CPU] = "/not/really/sys/fs/cgroup/cpu,cpuacct",
88 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/not/really/sys/fs/cgroup/cpu,cpuacct",
89 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
90 [VIR_CGROUP_CONTROLLER_MEMORY] = "/not/really/sys/fs/cgroup/memory",
91 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
92 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
93 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
94 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
96 const char *mountsFull[VIR_CGROUP_CONTROLLER_LAST] = {
97 [VIR_CGROUP_CONTROLLER_CPU] = "/not/really/sys/fs/cgroup/cpu,cpuacct",
98 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/not/really/sys/fs/cgroup/cpu,cpuacct",
99 [VIR_CGROUP_CONTROLLER_CPUSET] = "/not/really/sys/fs/cgroup/cpuset",
100 [VIR_CGROUP_CONTROLLER_MEMORY] = "/not/really/sys/fs/cgroup/memory",
101 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
102 [VIR_CGROUP_CONTROLLER_FREEZER] = "/not/really/sys/fs/cgroup/freezer",
103 [VIR_CGROUP_CONTROLLER_BLKIO] = "/not/really/sys/fs/cgroup/blkio",
104 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/not/really/sys/fs/cgroup/systemd",
106 const char *mountsAllInOne[VIR_CGROUP_CONTROLLER_LAST] = {
107 [VIR_CGROUP_CONTROLLER_CPU] = "/not/really/sys/fs/cgroup",
108 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/not/really/sys/fs/cgroup",
109 [VIR_CGROUP_CONTROLLER_CPUSET] = "/not/really/sys/fs/cgroup",
110 [VIR_CGROUP_CONTROLLER_MEMORY] = "/not/really/sys/fs/cgroup",
111 [VIR_CGROUP_CONTROLLER_DEVICES] = "/not/really/sys/fs/cgroup",
112 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
113 [VIR_CGROUP_CONTROLLER_BLKIO] = "/not/really/sys/fs/cgroup",
114 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
116 const char *mountsLogind[VIR_CGROUP_CONTROLLER_LAST] = {
117 [VIR_CGROUP_CONTROLLER_CPU] = NULL,
118 [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
119 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
120 [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
121 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
122 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
123 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
124 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/not/really/sys/fs/cgroup/systemd",
127 const char *links[VIR_CGROUP_CONTROLLER_LAST] = {
128 [VIR_CGROUP_CONTROLLER_CPU] = "/not/really/sys/fs/cgroup/cpu",
129 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/not/really/sys/fs/cgroup/cpuacct",
130 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
131 [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
132 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
133 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
134 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
135 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
138 const char *linksAllInOne[VIR_CGROUP_CONTROLLER_LAST] = {
139 [VIR_CGROUP_CONTROLLER_CPU] = NULL,
140 [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
141 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
142 [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
143 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
144 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
145 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
146 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
149 const char *linksLogind[VIR_CGROUP_CONTROLLER_LAST] = {
150 [VIR_CGROUP_CONTROLLER_CPU] = NULL,
151 [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
152 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
153 [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
154 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
155 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
156 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
157 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
161 static int testCgroupNewForSelf(const void *args ATTRIBUTE_UNUSED)
163 virCgroupPtr cgroup = NULL;
165 const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
166 [VIR_CGROUP_CONTROLLER_CPU] = "/system",
167 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/system",
168 [VIR_CGROUP_CONTROLLER_CPUSET] = "/",
169 [VIR_CGROUP_CONTROLLER_MEMORY] = "/",
170 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
171 [VIR_CGROUP_CONTROLLER_FREEZER] = "/",
172 [VIR_CGROUP_CONTROLLER_BLKIO] = "/",
173 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
176 if (virCgroupNewSelf(&cgroup) < 0) {
177 fprintf(stderr, "Cannot create cgroup for self\n");
181 ret = validateCgroup(cgroup, "", mountsFull, links, placement);
184 virCgroupFree(&cgroup);
189 # define ENSURE_ERRNO(en) \
191 if (!virLastErrorIsSystemErrno(en)) { \
192 virErrorPtr err = virGetLastError(); \
193 fprintf(stderr, "Did not get " #en " error code: %d:%d\n", \
194 err ? err->code : 0, err ? err->int1 : 0); \
198 /* Asking for impossible combination since CPU is co-mounted */
201 static int testCgroupNewForPartition(const void *args ATTRIBUTE_UNUSED)
203 virCgroupPtr cgroup = NULL;
206 const char *placementSmall[VIR_CGROUP_CONTROLLER_LAST] = {
207 [VIR_CGROUP_CONTROLLER_CPU] = "/virtualmachines.partition",
208 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/virtualmachines.partition",
209 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
210 [VIR_CGROUP_CONTROLLER_MEMORY] = "/virtualmachines.partition",
211 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
212 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
213 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
214 [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
216 const char *placementFull[VIR_CGROUP_CONTROLLER_LAST] = {
217 [VIR_CGROUP_CONTROLLER_CPU] = "/virtualmachines.partition",
218 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/virtualmachines.partition",
219 [VIR_CGROUP_CONTROLLER_CPUSET] = "/virtualmachines.partition",
220 [VIR_CGROUP_CONTROLLER_MEMORY] = "/virtualmachines.partition",
221 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
222 [VIR_CGROUP_CONTROLLER_FREEZER] = "/virtualmachines.partition",
223 [VIR_CGROUP_CONTROLLER_BLKIO] = "/virtualmachines.partition",
224 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
227 if ((rv = virCgroupNewPartition("/virtualmachines", false, -1, &cgroup)) != -1) {
228 fprintf(stderr, "Unexpected found /virtualmachines cgroup: %d\n", -rv);
231 ENSURE_ERRNO(ENOENT);
233 /* Asking for impossible combination since CPU is co-mounted */
234 if ((rv = virCgroupNewPartition("/virtualmachines", true,
235 (1 << VIR_CGROUP_CONTROLLER_CPU),
237 fprintf(stderr, "Should not have created /virtualmachines cgroup: %d\n", -rv);
240 ENSURE_ERRNO(EINVAL);
242 /* Asking for impossible combination since devices is not mounted */
243 if ((rv = virCgroupNewPartition("/virtualmachines", true,
244 (1 << VIR_CGROUP_CONTROLLER_DEVICES),
246 fprintf(stderr, "Should not have created /virtualmachines cgroup: %d\n", -rv);
251 /* Asking for small combination since devices is not mounted */
252 if ((rv = virCgroupNewPartition("/virtualmachines", true,
253 (1 << VIR_CGROUP_CONTROLLER_CPU) |
254 (1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
255 (1 << VIR_CGROUP_CONTROLLER_MEMORY),
257 fprintf(stderr, "Cannot create /virtualmachines cgroup: %d\n", -rv);
260 ret = validateCgroup(cgroup, "/virtualmachines.partition", mountsSmall, links, placementSmall);
261 virCgroupFree(&cgroup);
263 if ((rv = virCgroupNewPartition("/virtualmachines", true, -1, &cgroup)) != 0) {
264 fprintf(stderr, "Cannot create /virtualmachines cgroup: %d\n", -rv);
267 ret = validateCgroup(cgroup, "/virtualmachines.partition", mountsFull, links, placementFull);
270 virCgroupFree(&cgroup);
275 static int testCgroupNewForPartitionNested(const void *args ATTRIBUTE_UNUSED)
277 virCgroupPtr cgroup = NULL;
280 const char *placementFull[VIR_CGROUP_CONTROLLER_LAST] = {
281 [VIR_CGROUP_CONTROLLER_CPU] = "/deployment.partition/production.partition",
282 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/deployment.partition/production.partition",
283 [VIR_CGROUP_CONTROLLER_CPUSET] = "/deployment.partition/production.partition",
284 [VIR_CGROUP_CONTROLLER_MEMORY] = "/deployment.partition/production.partition",
285 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
286 [VIR_CGROUP_CONTROLLER_FREEZER] = "/deployment.partition/production.partition",
287 [VIR_CGROUP_CONTROLLER_BLKIO] = "/deployment.partition/production.partition",
288 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
291 if ((rv = virCgroupNewPartition("/deployment/production", false, -1, &cgroup)) != -1) {
292 fprintf(stderr, "Unexpected found /deployment/production cgroup: %d\n", -rv);
295 ENSURE_ERRNO(ENOENT);
297 /* Should not work, since we require /deployment to be pre-created */
298 if ((rv = virCgroupNewPartition("/deployment/production", true, -1, &cgroup)) != -1) {
299 fprintf(stderr, "Unexpected created /deployment/production cgroup: %d\n", -rv);
302 ENSURE_ERRNO(ENOENT);
304 if ((rv = virCgroupNewPartition("/deployment", true, -1, &cgroup)) != 0) {
305 fprintf(stderr, "Failed to create /deployment cgroup: %d\n", -rv);
309 /* Should now work */
310 if ((rv = virCgroupNewPartition("/deployment/production", true, -1, &cgroup)) != 0) {
311 fprintf(stderr, "Failed to create /deployment/production cgroup: %d\n", -rv);
315 ret = validateCgroup(cgroup, "/deployment.partition/production.partition",
316 mountsFull, links, placementFull);
319 virCgroupFree(&cgroup);
324 static int testCgroupNewForPartitionNestedDeep(const void *args ATTRIBUTE_UNUSED)
326 virCgroupPtr cgroup = NULL;
329 const char *placementFull[VIR_CGROUP_CONTROLLER_LAST] = {
330 [VIR_CGROUP_CONTROLLER_CPU] = "/user/berrange.user/production.partition",
331 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/user/berrange.user/production.partition",
332 [VIR_CGROUP_CONTROLLER_CPUSET] = "/user/berrange.user/production.partition",
333 [VIR_CGROUP_CONTROLLER_MEMORY] = "/user/berrange.user/production.partition",
334 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
335 [VIR_CGROUP_CONTROLLER_FREEZER] = "/user/berrange.user/production.partition",
336 [VIR_CGROUP_CONTROLLER_BLKIO] = "/user/berrange.user/production.partition",
337 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
340 if ((rv = virCgroupNewPartition("/user/berrange.user/production", false, -1, &cgroup)) != -1) {
341 fprintf(stderr, "Unexpected found /user/berrange.user/production cgroup: %d\n", -rv);
344 ENSURE_ERRNO(ENOENT);
346 /* Should not work, since we require /user/berrange.user to be pre-created */
347 if ((rv = virCgroupNewPartition("/user/berrange.user/production", true, -1, &cgroup)) != -1) {
348 fprintf(stderr, "Unexpected created /user/berrange.user/production cgroup: %d\n", -rv);
351 ENSURE_ERRNO(ENOENT);
353 if ((rv = virCgroupNewPartition("/user", true, -1, &cgroup)) != 0) {
354 fprintf(stderr, "Failed to create /user/berrange.user cgroup: %d\n", -rv);
358 if ((rv = virCgroupNewPartition("/user/berrange.user", true, -1, &cgroup)) != 0) {
359 fprintf(stderr, "Failed to create /user/berrange.user cgroup: %d\n", -rv);
363 /* Should now work */
364 if ((rv = virCgroupNewPartition("/user/berrange.user/production", true, -1, &cgroup)) != 0) {
365 fprintf(stderr, "Failed to create /user/berrange.user/production cgroup: %d\n", -rv);
369 ret = validateCgroup(cgroup, "/user/berrange.user/production.partition",
370 mountsFull, links, placementFull);
373 virCgroupFree(&cgroup);
379 static int testCgroupNewForPartitionDomain(const void *args ATTRIBUTE_UNUSED)
381 virCgroupPtr partitioncgroup = NULL;
382 virCgroupPtr domaincgroup = NULL;
385 const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
386 [VIR_CGROUP_CONTROLLER_CPU] = "/production.partition/foo.libvirt-lxc",
387 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/production.partition/foo.libvirt-lxc",
388 [VIR_CGROUP_CONTROLLER_CPUSET] = "/production.partition/foo.libvirt-lxc",
389 [VIR_CGROUP_CONTROLLER_MEMORY] = "/production.partition/foo.libvirt-lxc",
390 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
391 [VIR_CGROUP_CONTROLLER_FREEZER] = "/production.partition/foo.libvirt-lxc",
392 [VIR_CGROUP_CONTROLLER_BLKIO] = "/production.partition/foo.libvirt-lxc",
393 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
396 if ((rv = virCgroupNewPartition("/production", true, -1, &partitioncgroup)) != 0) {
397 fprintf(stderr, "Failed to create /production cgroup: %d\n", -rv);
401 if ((rv = virCgroupNewDomainPartition(partitioncgroup, "lxc", "foo", true, &domaincgroup)) != 0) {
402 fprintf(stderr, "Cannot create LXC cgroup: %d\n", -rv);
406 ret = validateCgroup(domaincgroup, "/production.partition/foo.libvirt-lxc", mountsFull, links, placement);
409 virCgroupFree(&partitioncgroup);
410 virCgroupFree(&domaincgroup);
414 static int testCgroupNewForPartitionDomainEscaped(const void *args ATTRIBUTE_UNUSED)
416 virCgroupPtr partitioncgroup1 = NULL;
417 virCgroupPtr partitioncgroup2 = NULL;
418 virCgroupPtr partitioncgroup3 = NULL;
419 virCgroupPtr domaincgroup = NULL;
422 const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
423 [VIR_CGROUP_CONTROLLER_CPU] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
424 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
425 [VIR_CGROUP_CONTROLLER_CPUSET] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
426 [VIR_CGROUP_CONTROLLER_MEMORY] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
427 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
428 [VIR_CGROUP_CONTROLLER_FREEZER] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
429 [VIR_CGROUP_CONTROLLER_BLKIO] = "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc",
430 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/user/berrange/123",
433 if ((rv = virCgroupNewPartition("/cgroup.evil", true, -1, &partitioncgroup1)) != 0) {
434 fprintf(stderr, "Failed to create /cgroup.evil cgroup: %d\n", -rv);
438 if ((rv = virCgroupNewPartition("/cgroup.evil/net_cls.evil", true, -1, &partitioncgroup2)) != 0) {
439 fprintf(stderr, "Failed to create /cgroup.evil/cpu.evil cgroup: %d\n", -rv);
443 if ((rv = virCgroupNewPartition("/cgroup.evil/net_cls.evil/_evil.evil", true, -1, &partitioncgroup3)) != 0) {
444 fprintf(stderr, "Failed to create /cgroup.evil cgroup: %d\n", -rv);
448 if ((rv = virCgroupNewDomainPartition(partitioncgroup3, "lxc", "cpu.foo", true, &domaincgroup)) != 0) {
449 fprintf(stderr, "Cannot create LXC cgroup: %d\n", -rv);
453 /* NB we're not expecting 'net_cls.evil' to be escaped,
454 * since our fake /proc/cgroups pretends this controller
455 * isn't compiled into the kernel
457 ret = validateCgroup(domaincgroup, "/_cgroup.evil/net_cls.evil/__evil.evil/_cpu.foo.libvirt-lxc", mountsFull, links, placement);
460 virCgroupFree(&partitioncgroup3);
461 virCgroupFree(&partitioncgroup2);
462 virCgroupFree(&partitioncgroup1);
463 virCgroupFree(&domaincgroup);
467 static int testCgroupNewForSelfAllInOne(const void *args ATTRIBUTE_UNUSED)
469 virCgroupPtr cgroup = NULL;
471 const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
472 [VIR_CGROUP_CONTROLLER_CPU] = "/",
473 [VIR_CGROUP_CONTROLLER_CPUACCT] = "/",
474 [VIR_CGROUP_CONTROLLER_CPUSET] = "/",
475 [VIR_CGROUP_CONTROLLER_MEMORY] = "/",
476 [VIR_CGROUP_CONTROLLER_DEVICES] = "/",
477 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
478 [VIR_CGROUP_CONTROLLER_BLKIO] = "/",
481 if (virCgroupNewSelf(&cgroup) < 0) {
482 fprintf(stderr, "Cannot create cgroup for self\n");
486 ret = validateCgroup(cgroup, "", mountsAllInOne, linksAllInOne, placement);
489 virCgroupFree(&cgroup);
494 static int testCgroupNewForSelfLogind(const void *args ATTRIBUTE_UNUSED)
496 virCgroupPtr cgroup = NULL;
498 const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
499 [VIR_CGROUP_CONTROLLER_CPU] = NULL,
500 [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
501 [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
502 [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
503 [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
504 [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
505 [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
506 [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/",
509 if (virCgroupNewSelf(&cgroup) < 0) {
510 fprintf(stderr, "Cannot create cgroup for self\n");
514 ret = validateCgroup(cgroup, "", mountsLogind, linksLogind, placement);
517 virCgroupFree(&cgroup);
522 static int testCgroupAvailable(const void *args)
524 bool got = virCgroupAvailable();
525 bool want = args == (void*)0x1;
528 fprintf(stderr, "Expected cgroup %savailable, but state was wrong\n",
536 static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED)
538 virCgroupPtr cgroup = NULL;
541 virTypedParameter params[2];
543 // TODO: mock nodeGetCPUCount() as well & check 2nd cpu, too
544 unsigned long long expected[] = {
548 if ((rv = virCgroupNewPartition("/virtualmachines", true,
549 (1 << VIR_CGROUP_CONTROLLER_CPU) |
550 (1 << VIR_CGROUP_CONTROLLER_CPUACCT),
552 fprintf(stderr, "Could not create /virtualmachines cgroup: %d\n", -rv);
556 if (nodeGetCPUCount() < 1) {
557 fprintf(stderr, "Unexpected: nodeGetCPUCount() yields: %d\n", nodeGetCPUCount());
561 if ((rv = virCgroupGetPercpuStats(cgroup,
564 fprintf(stderr, "Failed call to virCgroupGetPercpuStats for /virtualmachines cgroup: %d\n", -rv);
568 for (i = 0; i < ARRAY_CARDINALITY(expected); i++) {
569 if (!STREQ(params[i].field, VIR_DOMAIN_CPU_STATS_CPUTIME)) {
571 "Wrong parameter name value from virCgroupGetPercpuStats (is: %s)\n",
576 if (params[i].type != VIR_TYPED_PARAM_ULLONG) {
578 "Wrong parameter value type from virCgroupGetPercpuStats (is: %d)\n",
583 if (params[i].value.ul != expected[i]) {
585 "Wrong value from virCgroupGetMemoryUsage (expected %llu)\n",
594 virCgroupFree(&cgroup);
598 static int testCgroupGetMemoryUsage(const void *args ATTRIBUTE_UNUSED)
600 virCgroupPtr cgroup = NULL;
604 if ((rv = virCgroupNewPartition("/virtualmachines", true,
605 (1 << VIR_CGROUP_CONTROLLER_MEMORY),
607 fprintf(stderr, "Could not create /virtualmachines cgroup: %d\n", -rv);
611 if ((rv = virCgroupGetMemoryUsage(cgroup, &kb)) < 0) {
612 fprintf(stderr, "Could not retrieve GetMemoryUsage for /virtualmachines cgroup: %d\n", -rv);
616 if (kb != 1421212UL) {
618 "Wrong value from virCgroupGetMemoryUsage (expected %ld)\n",
626 virCgroupFree(&cgroup);
630 static int testCgroupGetBlkioIoServiced(const void *args ATTRIBUTE_UNUSED)
632 virCgroupPtr cgroup = NULL;
636 const long long expected_values[] = {
642 const char* names[] = {
648 long long values[ARRAY_CARDINALITY(expected_values)];
650 if ((rv = virCgroupNewPartition("/virtualmachines", true,
651 (1 << VIR_CGROUP_CONTROLLER_BLKIO),
653 fprintf(stderr, "Could not create /virtualmachines cgroup: %d\n", -rv);
657 if ((rv = virCgroupGetBlkioIoServiced(cgroup,
659 &values[2], &values[3])) < 0) {
660 fprintf(stderr, "Could not retrieve BlkioIoServiced for /virtualmachines cgroup: %d\n", -rv);
664 for (i = 0; i < ARRAY_CARDINALITY(expected_values); i++) {
665 if (expected_values[i] != values[i]) {
667 "Wrong value for %s from virCgroupBlkioIoServiced (expected %lld)\n",
668 names[i], expected_values[i]);
676 virCgroupFree(&cgroup);
680 static int testCgroupGetBlkioIoDeviceServiced(const void *args ATTRIBUTE_UNUSED)
682 virCgroupPtr cgroup = NULL;
685 const long long expected_values0[] = {
691 const long long expected_values1[] = {
697 const char* names[] = {
703 long long values[ARRAY_CARDINALITY(expected_values0)];
705 if ((rv = virCgroupNewPartition("/virtualmachines", true,
706 (1 << VIR_CGROUP_CONTROLLER_BLKIO),
708 fprintf(stderr, "Could not create /virtualmachines cgroup: %d\n", -rv);
712 if ((rv = virCgroupGetBlkioIoDeviceServiced(cgroup,
715 &values[2], &values[3])) < 0) {
716 fprintf(stderr, "Could not retrieve BlkioIoDeviceServiced for /virtualmachines cgroup: %d\n", -rv);
720 for (i = 0; i < ARRAY_CARDINALITY(expected_values0); i++) {
721 if (expected_values0[i] != values[i]) {
723 "Wrong value for %s from virCgroupGetBlkioIoDeviceServiced (expected %lld)\n",
724 names[i], expected_values0[i]);
729 if ((rv = virCgroupGetBlkioIoDeviceServiced(cgroup,
732 &values[2], &values[3])) < 0) {
733 fprintf(stderr, "Could not retrieve BlkioIoDeviceServiced for /virtualmachines cgroup: %d\n", -rv);
737 for (i = 0; i < ARRAY_CARDINALITY(expected_values1); i++) {
738 if (expected_values1[i] != values[i]) {
740 "Wrong value for %s from virCgroupGetBlkioIoDeviceServiced (expected %lld)\n",
741 names[i], expected_values1[i]);
749 virCgroupFree(&cgroup);
753 # define FAKESYSFSDIRTEMPLATE abs_builddir "/fakesysfsdir-XXXXXX"
761 if (VIR_STRDUP_QUIET(fakesysfsdir, FAKESYSFSDIRTEMPLATE) < 0) {
762 fprintf(stderr, "Out of memory\n");
766 if (!mkdtemp(fakesysfsdir)) {
767 fprintf(stderr, "Cannot create fakesysfsdir");
771 setenv("LIBVIRT_FAKE_SYSFS_DIR", fakesysfsdir, 1);
773 if (virtTestRun("New cgroup for self", testCgroupNewForSelf, NULL) < 0)
776 if (virtTestRun("New cgroup for partition", testCgroupNewForPartition, NULL) < 0)
779 if (virtTestRun("New cgroup for partition nested", testCgroupNewForPartitionNested, NULL) < 0)
782 if (virtTestRun("New cgroup for partition nested deeply", testCgroupNewForPartitionNestedDeep, NULL) < 0)
785 if (virtTestRun("New cgroup for domain partition", testCgroupNewForPartitionDomain, NULL) < 0)
788 if (virtTestRun("New cgroup for domain partition escaped", testCgroupNewForPartitionDomainEscaped, NULL) < 0)
791 if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0)
794 if (virtTestRun("virCgroupGetBlkioIoServiced works", testCgroupGetBlkioIoServiced, NULL) < 0)
797 if (virtTestRun("virCgroupGetBlkioIoDeviceServiced works", testCgroupGetBlkioIoDeviceServiced, NULL) < 0)
800 if (virtTestRun("virCgroupGetMemoryUsage works", testCgroupGetMemoryUsage, NULL) < 0)
803 if (virtTestRun("virCgroupGetPercpuStats works", testCgroupGetPercpuStats, NULL) < 0)
806 setenv("VIR_CGROUP_MOCK_MODE", "allinone", 1);
807 if (virtTestRun("New cgroup for self (allinone)", testCgroupNewForSelfAllInOne, NULL) < 0)
809 if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0)
811 unsetenv("VIR_CGROUP_MOCK_MODE");
813 setenv("VIR_CGROUP_MOCK_MODE", "logind", 1);
814 if (virtTestRun("New cgroup for self (logind)", testCgroupNewForSelfLogind, NULL) < 0)
816 if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x0) < 0)
818 unsetenv("VIR_CGROUP_MOCK_MODE");
820 if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
821 virFileDeleteTree(fakesysfsdir);
823 VIR_FREE(fakesysfsdir);
825 return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
828 VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/vircgroupmock.so")