[lxc-devel] [PATCH] python3: Add list_containers to C API
Serge Hallyn
serge.hallyn at ubuntu.com
Wed Nov 27 00:23:52 UTC 2013
Quoting Stéphane Graber (stgraber at ubuntu.com):
> This adds a new list_containers function to the python3 binding and a
> matching override in __init__.py that adds the as_object parameter.
>
> This should be compatible to the previous pure python implementation
> with the advantage of also listing active non-defined containers (fixing
> github issue #68).
>
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
Looks good to my uneducated eye.
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> ---
> src/python-lxc/lxc.c | 71 ++++++++++++++++++++++++++++++++++++++++--
> src/python-lxc/lxc/__init__.py | 22 +++++++------
> 2 files changed, 80 insertions(+), 13 deletions(-)
>
> diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c
> index e42ed35..9e6f9d9 100644
> --- a/src/python-lxc/lxc.c
> +++ b/src/python-lxc/lxc.c
> @@ -170,6 +170,65 @@ LXC_get_version(PyObject *self, PyObject *args)
> return PyUnicode_FromString(lxc_get_version());
> }
>
> +static PyObject *
> +LXC_list_containers(PyObject *self, PyObject *args, PyObject *kwds)
> +{
> + char **names = NULL;
> + PyObject *list = NULL;
> + int list_count = 0;
> +
> + int list_active = 1;
> + int list_defined = 1;
> +
> + PyObject *py_list_active = NULL;
> + PyObject *py_list_defined = NULL;
> +
> + char* config_path = NULL;
> +
> + int i = 0;
> + PyObject *vargs = NULL;
> + static char *kwlist[] = {"active", "defined", "config_path", NULL};
> +
> + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOs", kwlist,
> + &py_list_active,
> + &py_list_defined,
> + &config_path, &vargs))
> + return NULL;
> +
> + /* We default to listing everything */
> + if (py_list_active && py_list_active != Py_True) {
> + list_active = 0;
> + }
> +
> + if (py_list_defined && py_list_defined != Py_True) {
> + list_defined = 0;
> + }
> +
> + /* Call the right API function based on filters */
> + if (list_active == 1 && list_defined == 1)
> + list_count = list_all_containers(config_path, &names, NULL);
> + else if (list_active == 1)
> + list_count = list_active_containers(config_path, &names, NULL);
> + else if (list_defined == 1)
> + list_count = list_defined_containers(config_path, &names, NULL);
> +
> + /* Handle failure */
> + if (list_count < 0) {
> + PyErr_SetString(PyExc_ValueError, "failure to list containers");
> + return NULL;
> + }
> +
> + /* Generate the tuple */
> + list = PyTuple_New(list_count);
> + for (i = 0; i < list_count; i++) {
> + PyTuple_SET_ITEM(list, i, PyUnicode_FromString(names[i]));
> + free(names[i]);
> + }
> + free(names);
> +
> + return list;
> +}
> +
> // Container properties
> static PyObject *
> Container_config_file_name(Container *self, void *closure)
> @@ -1219,15 +1278,21 @@ PyVarObject_HEAD_INIT(NULL, 0)
>
> static PyMethodDef LXC_methods[] = {
> {"attach_run_shell", (PyCFunction)LXC_attach_run_shell, METH_O,
> - "Starts up a shell when attaching, to use as the run parameter for attach or attach_wait"},
> + "Starts up a shell when attaching, to use as the run parameter for "
> + "attach or attach_wait"},
> {"attach_run_command", (PyCFunction)LXC_attach_run_command, METH_O,
> - "Runs a command when attaching, to use as the run parameter for attach or attach_wait"},
> + "Runs a command when attaching, to use as the run parameter for attach "
> + "or attach_wait"},
> {"arch_to_personality", (PyCFunction)LXC_arch_to_personality, METH_O,
> "Returns the process personality of the corresponding architecture"},
> - {"get_default_config_path", (PyCFunction)LXC_get_default_config_path, METH_NOARGS,
> + {"get_default_config_path", (PyCFunction)LXC_get_default_config_path,
> + METH_NOARGS,
> "Returns the current LXC config path"},
> {"get_version", (PyCFunction)LXC_get_version, METH_NOARGS,
> "Returns the current LXC library version"},
> + {"list_containers", (PyCFunction)LXC_list_containers,
> + METH_VARARGS|METH_KEYWORDS,
> + "Returns a list of container names or objects"},
> {NULL, NULL, 0, NULL}
> };
>
> diff --git a/src/python-lxc/lxc/__init__.py b/src/python-lxc/lxc/__init__.py
> index 8ae7852..e0d4b51 100644
> --- a/src/python-lxc/lxc/__init__.py
> +++ b/src/python-lxc/lxc/__init__.py
> @@ -417,21 +417,23 @@ class Container(_lxc.Container):
> return _lxc.Container.wait(self, state, timeout)
>
>
> -def list_containers(as_object=False, config_path=None):
> +def list_containers(active=True, defined=True,
> + as_object=False, config_path=None):
> """
> List the containers on the system.
> """
>
> - if not config_path:
> - config_path = default_config_path
> + if config_path:
> + entries = _lxc.list_containers(active=active, defined=defined,
> + config_path=config_path)
> + else:
> + entries = _lxc.list_containers(active=active, defined=defined)
> +
> + if as_object:
> + return tuple([Container(name, config_path) for name in entries])
> + else:
> + return entries
>
> - containers = []
> - for entry in glob.glob("%s/*/config" % config_path):
> - if as_object:
> - containers.append(Container(entry.split("/")[-2], config_path))
> - else:
> - containers.append(entry.split("/")[-2])
> - return containers
>
> def attach_run_command(cmd):
> """
> --
> 1.8.4.4
>
>
> ------------------------------------------------------------------------------
> Rapidly troubleshoot problems before they affect your business. Most IT
> organizations don't have a clear picture of how application performance
> affects their revenue. With AppDynamics, you get 100% visibility into your
> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
> http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list