[lxc-devel] [PATCH] python3: Add clone() to the binding

Serge Hallyn serge.hallyn at ubuntu.com
Thu Nov 28 03:09:45 UTC 2013


Quoting Stéphane Graber (stgraber at ubuntu.com):
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>

Thanks.  I've only tested basic clone so far, but it looks good and
if I run into any problems with the bdevtype etc we can fix those later.

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/python-lxc/lxc.c           | 68 ++++++++++++++++++++++++++++++++++++++++++
>  src/python-lxc/lxc/__init__.py | 35 +++++++++++-----------
>  2 files changed, 85 insertions(+), 18 deletions(-)
> 
> diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c
> index 8c86323..e9a3455 100644
> --- a/src/python-lxc/lxc.c
> +++ b/src/python-lxc/lxc.c
> @@ -600,6 +600,61 @@ Container_clear_config_item(Container *self, PyObject *args, PyObject *kwds)
>  }
>  
>  static PyObject *
> +Container_clone(Container *self, PyObject *args, PyObject *kwds)
> +{
> +    char *newname = NULL;
> +    char *config_path = NULL;
> +    int flags = 0;
> +    char *bdevtype = NULL;
> +    char *bdevdata = NULL;
> +    unsigned long newsize = 0;
> +    char **hookargs = NULL;
> +
> +    PyObject *py_hookargs = NULL;
> +    struct lxc_container *new_container = NULL;
> +    int i = 0;
> +
> +    static char *kwlist[] = {"newname", "config_path", "flags", "bdevtype",
> +                             "bdevdata", "newsize", "hookargs", NULL};
> +    if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|sisskO", kwlist,
> +                                      &newname, &config_path, &flags,
> +                                      &bdevtype, &bdevdata, &newsize,
> +                                      &py_hookargs))
> +        return NULL;
> +
> +    if (py_hookargs) {
> +        if (PyTuple_Check(py_hookargs)) {
> +            hookargs = convert_tuple_to_char_pointer_array(py_hookargs);
> +            if (!hookargs) {
> +                return NULL;
> +            }
> +        }
> +        else {
> +            PyErr_SetString(PyExc_ValueError, "hookargs needs to be a tuple");
> +            return NULL;
> +        }
> +    }
> +
> +    new_container = self->container->clone(self->container, newname,
> +                                           config_path, flags, bdevtype,
> +                                           bdevdata, newsize, hookargs);
> +
> +    if (hookargs) {
> +        for (i = 0; i < PyTuple_GET_SIZE(py_hookargs); i++)
> +            free(hookargs[i]);
> +        free(hookargs);
> +    }
> +
> +    if (new_container == NULL) {
> +        Py_RETURN_FALSE;
> +    }
> +
> +    lxc_container_put(new_container);
> +
> +    Py_RETURN_TRUE;
> +}
> +
> +static PyObject *
>  Container_console(Container *self, PyObject *args, PyObject *kwds)
>  {
>      static char *kwlist[] = {"ttynum", "stdinfd", "stdoutfd", "stderrfd",
> @@ -1220,6 +1275,13 @@ static PyMethodDef Container_methods[] = {
>       "\n"
>       "Attach to container's console."
>      },
> +    {"clone", (PyCFunction)Container_clone,
> +     METH_VARARGS|METH_KEYWORDS,
> +     "clone(newname, config_path, flags, bdevtype, bdevdata, newsize, "
> +     "hookargs) -> boolean\n"
> +     "\n"
> +     "Create a new container based on the current one."
> +    },
>      {"create", (PyCFunction)Container_create,
>       METH_VARARGS|METH_KEYWORDS,
>       "create(template, args = (,)) -> boolean\n"
> @@ -1468,6 +1530,12 @@ PyInit__lxc(void)
>      PYLXC_EXPORT_CONST(LXC_ATTACH_REMOUNT_PROC_SYS);
>      PYLXC_EXPORT_CONST(LXC_ATTACH_SET_PERSONALITY);
>  
> +    /* clone: clone flags */
> +    PYLXC_EXPORT_CONST(LXC_CLONE_COPYHOOKS);
> +    PYLXC_EXPORT_CONST(LXC_CLONE_KEEPMACADDR);
> +    PYLXC_EXPORT_CONST(LXC_CLONE_KEEPNAME);
> +    PYLXC_EXPORT_CONST(LXC_CLONE_SNAPSHOT);
> +
>      #undef PYLXC_EXPORT_CONST
>  
>      return m;
> diff --git a/src/python-lxc/lxc/__init__.py b/src/python-lxc/lxc/__init__.py
> index e0d4b51..b900c75 100644
> --- a/src/python-lxc/lxc/__init__.py
> +++ b/src/python-lxc/lxc/__init__.py
> @@ -22,7 +22,6 @@
>  #
>  
>  import _lxc
> -import glob
>  import os
>  import subprocess
>  import stat
> @@ -247,29 +246,29 @@ class Container(_lxc.Container):
>  
>          return _lxc.Container.create(self, template, tuple(template_args))
>  
> -    def clone(self, container):
> +    def clone(self, newname, config_path=None, flags=0, bdevtype=None,
> +              bdevdata=None, newsize=0, hookargs=()):
>          """
> -            Clone an existing container into a new one.
> +            Clone the current container.
>          """
>  
> -        if self.defined:
> -            return False
> -
> -        if isinstance(container, Container):
> -            source = container
> +        args = {}
> +        args['newname'] = newname
> +        args['flags'] = 0
> +        args['newsize'] = 0
> +        args['hookargs'] = hookargs
> +        if config_path:
> +            args['config_path'] = config_path
> +        if bdevtype:
> +            args['bdevtype'] = bdevtype
> +        if bdevdata:
> +            args['bdevdata'] = bdevdata
> +
> +        if _lxc.Container.clone(self, **args):
> +            return Container(newname, config_path=config_path)
>          else:
> -            source = Container(container)
> -
> -        if not source.defined:
>              return False
>  
> -        if subprocess.call(["lxc-clone", "-o", source.name, "-n", self.name],
> -                           universal_newlines=True) != 0:
> -            return False
> -
> -        self.load_config()
> -        return True
> -
>      def console(self, ttynum=-1, stdinfd=0, stdoutfd=1, stderrfd=2, escape=1):
>          """
>              Attach to console of running container.
> -- 
> 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