Updates the binding for the two new functions. This also fixes some problems with the argument checking of get_config_item that'd otherwise lead to a segfault.
The python binding for set_cgroup_item and get_cgroup_item are pretty raw as lxc has little control over the cgroup entries. That means that we don't try to interpret lists as we do for the config entries. Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/python-lxc/examples/api_test.py.in | 7 +++++ src/python-lxc/lxc.c | 55 +++++++++++++++++++++++++++++++++- src/python-lxc/lxc/__init__.py.in | 12 ++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/python-lxc/examples/api_test.py.in b/src/python-lxc/examples/api_test.py.in index 0b17bd6..7711291 100644 --- a/src/python-lxc/examples/api_test.py.in +++ b/src/python-lxc/examples/api_test.py.in @@ -97,6 +97,13 @@ container.attach("NETWORK|UTSNAME", "/sbin/ifconfig", "eth0") # A few basic checks of the current state assert(len(ips) > 0) +## Testing cgroups a bit +print("Testing cgroup API") +max_mem = container.get_cgroup_item("memory.max_usage_in_bytes") +current_limit = container.get_cgroup_item("memory.limit_in_bytes") +assert(container.set_cgroup_item("memory.limit_in_bytes", max_mem)) +assert(container.get_cgroup_item("memory.limit_in_bytes") != current_limit) + ## Freezing the container print("Freezing the container") container.freeze() diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index b489079..83e2659 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -204,13 +204,38 @@ Container_freeze(Container *self, PyObject *args, PyObject *kwds) } static PyObject * +Container_get_cgroup_item(Container *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"key", NULL}; + char* key = NULL; + int len = 0; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, + &key)) + Py_RETURN_FALSE; + + len = self->container->get_cgroup_item(self->container, key, NULL, 0); + + if (len <= 0) { + Py_RETURN_FALSE; + } + + char* value = (char*) malloc(sizeof(char)*len + 1); + if (self->container->get_cgroup_item(self->container, key, value, len + 1) != len) { + Py_RETURN_FALSE; + } + + return PyUnicode_FromString(value); +} + +static PyObject * Container_get_config_item(Container *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"key", NULL}; char* key = NULL; int len = 0; - if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, + if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, &key)) Py_RETURN_FALSE; @@ -288,6 +313,24 @@ Container_save_config(Container *self, PyObject *args, PyObject *kwds) } static PyObject * +Container_set_cgroup_item(Container *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"key", "value", NULL}; + char *key = NULL; + char *value = NULL; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "ss|", kwlist, + &key, &value)) + Py_RETURN_FALSE; + + if (self->container->set_cgroup_item(self->container, key, value)) { + Py_RETURN_TRUE; + } + + Py_RETURN_FALSE; +} + +static PyObject * Container_set_config_item(Container *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"key", "value", NULL}; @@ -441,6 +484,11 @@ static PyMethodDef Container_methods[] = { "\n" "Freezes the container and returns its return code." }, + {"get_cgroup_item", (PyCFunction)Container_get_cgroup_item, METH_VARARGS | METH_KEYWORDS, + "get_cgroup_item(key) -> string\n" + "\n" + "Get the current value of a cgroup entry." + }, {"get_config_item", (PyCFunction)Container_get_config_item, METH_VARARGS | METH_KEYWORDS, "get_config_item(key) -> string\n" "\n" @@ -463,6 +511,11 @@ static PyMethodDef Container_methods[] = { "Save the container configuration to its default " "location or to an alternative location if provided." }, + {"set_cgroup_item", (PyCFunction)Container_set_cgroup_item, METH_VARARGS | METH_KEYWORDS, + "set_cgroup_item(key, value) -> boolean\n" + "\n" + "Set a cgroup entry to the provided value." + }, {"set_config_item", (PyCFunction)Container_set_config_item, METH_VARARGS | METH_KEYWORDS, "set_config_item(key, value) -> boolean\n" "\n" diff --git a/src/python-lxc/lxc/__init__.py.in b/src/python-lxc/lxc/__init__.py.in index 9ef3459..91a59ed 100644 --- a/src/python-lxc/lxc/__init__.py.in +++ b/src/python-lxc/lxc/__init__.py.in @@ -318,6 +318,18 @@ class Container(_lxc.Container): return False return True + def get_cgroup_item(self, key): + """ + Returns the value for a given cgroup entry. + A list is returned when multiple values are set. + """ + value = _lxc.Container.get_cgroup_item(self, key) + + if value is False: + return False + else: + return value.rstrip("\n") + def get_config_item(self, key): """ Returns the value for a given config key. -- 1.8.0 ------------------------------------------------------------------------------ LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial Remotely access PCs and mobile devices and provide instant support Improve your efficiency, and focus on delivering more value-add services Discover what IT Professionals Know. Rescue delivers http://p.sf.net/sfu/logmein_12329d2d _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel