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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
/*
* Copyright IBM Corporation. 2007
*
* Author: Balbir Singh <balbir@linux.vnet.ibm.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Basic acceptance test for libcgroup - Written one late night by Balbir Singh
*/
using namespace std;
#include <string>
#include <stdexcept>
#include <iostream>
#include <libcgroup.h>
#include <sys/types.h>
#include <pwd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <grp.h>
#include "../config.h"
#ifdef CGROUP_DBG
#define cgroup_dbg(p...) printf(p...)
#else
#define cgroup_dbg(p...) do {} while (0)
#endif
namespace cgtest {
class cg {
private:
public:
cg();
~cg()
{ }
struct cgroup *makenode(const string &name, const string &task_uid,
const string &task_gid, const string &control_uid,
const string &control_gid);
struct cgroup *makenodefromparent(const string &name);
};
cg::cg(void)
{
int ret;
ret = cgroup_init();
if (ret)
throw logic_error("Control Group Initialization failed..."
"Please check that cgroups are mounted and\n"
"at a single place");
}
struct cgroup *cg::makenode(const string &name, const string &task_uid,
const string &task_gid, const string &control_uid,
const string &control_gid)
{
uid_t tuid, cuid;
gid_t tgid, cgid;
char *cgroup_name;
struct cgroup *ccg;
struct cgroup_controller *cpu, *cpuacct;
struct passwd *passwd;
struct group *grp;
int ret;
passwd = getpwnam(task_uid.c_str());
if (!passwd)
return NULL;
tuid = passwd->pw_uid;
grp = getgrnam(task_gid.c_str());
if (!grp)
return NULL;
tgid = grp->gr_gid;
passwd = getpwnam(control_uid.c_str());
if (!passwd)
return NULL;
cuid = passwd->pw_uid;
grp = getgrnam(control_gid.c_str());
if (!grp)
return NULL;
cgid = grp->gr_gid;
cgroup_dbg("tuid %d, tgid %d, cuid %d, cgid %d\n", tuid, tgid, cuid, cgid);
cgroup_name = (char *) malloc(name.length());
strncpy(cgroup_name, name.c_str(), name.length() + 1);
ccg = cgroup_new_cgroup(cgroup_name);
cgroup_set_uid_gid(ccg, tuid, tgid, cuid, cgid);
cpu = cgroup_add_controller(ccg, "cpu");
cgroup_add_value_uint64(cpu, "cpu.shares", 2048);
cpuacct = cgroup_add_controller(ccg, "cpuacct");
cgroup_add_value_uint64(cpuacct, "cpuacct.usage", 0);
ret = cgroup_create_cgroup(ccg, 1);
if (ret) {
cout << "cg create group failed " << errno << endl;
ret = cgroup_delete_cgroup(ccg, 1);
if (ret)
cout << "cg delete group failed " << errno << endl;
}
return ccg;
}
struct cgroup *cg::makenodefromparent(const string &name)
{
char *cgroup_name;
struct cgroup *ccg;
int ret;
cgroup_name = (char *) malloc(name.length());
memset(cgroup_name, '\0', name.length());
strcpy(cgroup_name, name.c_str());
ccg = cgroup_new_cgroup(cgroup_name);
ret = cgroup_create_cgroup_from_parent(ccg, 1);
if (ret) {
cout << "cg create group failed " << errno << endl;
ret = cgroup_delete_cgroup(ccg, 1);
if (ret)
cout << "cg delete group failed " << errno << endl;
}
return ccg;
}
} // namespace
using namespace cgtest;
int main(int argc, char *argv[])
{
try {
cg *app = new cg();
struct cgroup *ccg, *ccg_child1, *ccg_child2;
ccg = app->makenode("database", "root", "root", "balbir",
"balbir");
ccg_child1 = app->makenodefromparent("mysql");
ccg_child2 = app->makenodefromparent("mysql/db1");
cgroup_free(&ccg);
cgroup_free(&ccg_child1);
cgroup_free(&ccg_child2);
delete app;
} catch (exception &e) {
cout << e.what() << endl;
exit(1);
}
return 0;
}
|