Quoting Stéphane Graber (stgra...@ubuntu.com): > Signed-off-by: Stéphane Graber <stgra...@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.hal...@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@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/lxc-devel ------------------------------------------------------------------------------ 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@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel