cgpath.c revision ae5c8b8ed5feb9a47c5007c986ce01ea39b5075f
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* liblxcapi
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen *
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen * Copyright � 2012 Serge Hallyn <serge.hallyn@ubuntu.com>.
739125f23e3312045e620014812fe2249a309cc4Timo Sirainen * Copyright � 2012 Canonical Ltd.
130fadd21e01ea380170b3bda859f6a27ff8e1a8Timo Sirainen *
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen * This program is free software; you can redistribute it and/or modify
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen * it under the terms of the GNU General Public License version 2, as
98c2cac72e2032f223050a4edd229993c1d5c1f0Aki Tuomi * published by the Free Software Foundation.
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen *
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen * This program is distributed in the hope that it will be useful,
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen * but WITHOUT ANY WARRANTY; without even the implied warranty of
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen * GNU General Public License for more details.
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen *
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen * You should have received a copy of the GNU General Public License along
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen * with this program; if not, write to the Free Software Foundation, Inc.,
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen */
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen#include "../lxc/lxccontainer.h"
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen
cb999a76f51081a4c5d7f7ac411de3fe6cff6c15Timo Sirainen#include <unistd.h>
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen#include <signal.h>
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen#include <stdio.h>
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen#include <sys/types.h>
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen#include <sys/wait.h>
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen#include <stdlib.h>
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen#include <errno.h>
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen#include "../lxc/cgroup.h"
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen#include "../lxc/lxc.h"
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen#define MYNAME "lxctest1"
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen#define MYNAME2 "lxctest2"
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen#define TSTERR(x) do { \
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen fprintf(stderr, "%d: %s\n", __LINE__, x); \
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen} while (0)
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainenint main()
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen{
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen struct lxc_container *c = NULL, *c2 = NULL;
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen char *path;
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen int len;
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen int ret, retv = -1;
af4cf954021adac7e021262bf6ae3cc3cec3ba54Timo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen /* won't require privilege necessarily once users are classified by
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen * pam_cgroup */
20905b89a05e27f0d1c6606a6b49b33dc23a1323Timo Sirainen if (geteuid() != 0) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("requires privilege");
3b4bd183cc469f70eb91d82a7f01f60ffc24ca5bTimo Sirainen exit(0);
3b4bd183cc469f70eb91d82a7f01f60ffc24ca5bTimo Sirainen }
c09d07e85ae22aa620945648a4430ca2a5a676f4Timo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen printf("Basic cgroup path tests...\n");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen path = lxc_cgroup_path_create(NULL, MYNAME);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen len = strlen(path);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (!path || !len) {
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen TSTERR("zero result from lxc_cgroup_path_create");
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (!strstr(path, "lxc/" MYNAME)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("lxc_cgroup_path_create NULL lxctest1");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen free(path);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen path = lxc_cgroup_path_create("ab", MYNAME);
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen len = strlen(path);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (!path || !len) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("zero result from lxc_cgroup_path_create");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (!strstr(path, "ab/" MYNAME)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("lxc_cgroup_path_create ab lxctest1");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen free(path);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen printf("... passed\n");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen printf("Container creation tests...\n");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen if ((c = lxc_container_new(MYNAME, NULL)) == NULL) {
8b5d186ec2f8b56ded72a7f45a70b7542caad9d0Timo Sirainen TSTERR("instantiating first container");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (c->is_defined(c)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c->stop(c);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c->destroy(c);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c = lxc_container_new(MYNAME, NULL);
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen }
9f7ba3807f77209a65e0faa56cac8545b06cd116Aki Tuomi c->set_config_item(c, "lxc.network.type", "empty");
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen if (!c->createl(c, "ubuntu", NULL)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("creating first container");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen exit(1);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c->load_config(c, NULL);
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen c->want_daemonize(c);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (!c->startl(c, 0, NULL)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("starting first container");
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen goto out;
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen printf("first container passed. Now two containers...\n");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen char *nsgroup;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen#define ALTBASE "/var/lib/lxctest2"
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen ret = mkdir(ALTBASE, 0755);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen ret = lxc_cgroup_path_get(&nsgroup, "freezer", MYNAME, c->get_config_path(c));
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen if (ret < 0 || !strstr(nsgroup, "lxc/" MYNAME)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("getting first cgroup path from lxc_command");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen goto out;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen /* start second container */
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen if ((c2 = lxc_container_new(MYNAME2, ALTBASE)) == NULL) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("instantiating first container");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen goto out;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (c2->is_defined(c2)) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c2->stop(c2);
c281d6630970d51a0e017366be9d86a061303d4bAki Tuomi c2->destroy(c2);
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen c2 = lxc_container_new(MYNAME2, ALTBASE);
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen }
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen c2->set_config_item(c2, "lxc.network.type", "empty");
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen if (!c2->createl(c2, "ubuntu", NULL)) {
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen TSTERR("creating first container");
23bdbb7b1831785c6ba6df190f6369da882d2b9dTimo Sirainen goto out;
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen }
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen
c281d6630970d51a0e017366be9d86a061303d4bAki Tuomi c2->load_config(c2, NULL);
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen c2->want_daemonize(c2);
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen if (!c2->startl(c2, 0, NULL)) {
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen TSTERR("starting first container");
b4d850a0ffd519c1c745557568daf7d48e18c820Timo Sirainen goto out;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
23bdbb7b1831785c6ba6df190f6369da882d2b9dTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen ret = lxc_cgroup_path_get(&nsgroup, "freezer", MYNAME2, c2->get_config_path(c2));
095481fee84040436ce2dccca472c9bb1df4d5bbTimo Sirainen if (ret < 0 || !strstr(nsgroup, "lxc/" MYNAME2)) {
71b60849a773dd68bdc015cb6a8ea1664d16b359Timo Sirainen TSTERR("getting second cgroup path from lxc_command");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen goto out;
71b60849a773dd68bdc015cb6a8ea1664d16b359Timo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen const char *dirpath;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen if (lxc_get_cgpath(&dirpath, NULL, c2->name, c2->config_path) < 0) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("getting second container's cgpath");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen return -1;
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen }
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen if (lxc_cgroup_nrtasks(dirpath) < 1) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen TSTERR("getting nrtasks");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen goto out;
1c4f8e4c4e5f3a5f05692a2d5c57f96a5b612f3dTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen printf("...passed\n");
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen
3faa1040e5a3f9f35ffad29110216094ab2f5880Timo Sirainen retv = 0;
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainenout:
3b4bd183cc469f70eb91d82a7f01f60ffc24ca5bTimo Sirainen if (c2) {
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen c2->stop(c2);
23bdbb7b1831785c6ba6df190f6369da882d2b9dTimo Sirainen c2->destroy(c2);
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen }
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen if (c) {
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen c->stop(c);
ba1c847d0af4afe4787ed470d0c818e948e184e2Timo Sirainen c->destroy(c);
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen }
e98de01b5644c88b6053e2921eb5e9a506fe263fTimo Sirainen return retv;
c4d66e8ccbb8440622f1a70791ed2a8f99659af1Juha Koho}
c4d66e8ccbb8440622f1a70791ed2a8f99659af1Juha Koho