Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- src/python-lxc/lxc.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+)
diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index 050f6ae..f850a3d 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -1119,6 +1119,106 @@ Container_shutdown(Container *self, PyObject *args, PyObject *kwds) } static PyObject * +Container_snapshot(Container *self, PyObject *args, PyObject *kwds) +{ + char *comment_path = NULL; + static char *kwlist[] = {"comment_path", NULL}; + int retval = 0; + int ret = 0; + char newname[20]; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, + &comment_path)) + return NULL; + + retval = self->container->snapshot(self->container, comment_path); + + if (retval < 0) { + Py_RETURN_FALSE; + } + + ret = snprintf(newname, 20, "snap%d", retval); + if (ret < 0 || ret >= 20) + return NULL; + + + return PyUnicode_FromString(newname); +} + +static PyObject * +Container_snapshot_destroy(Container *self, PyObject *args, PyObject *kwds) +{ + char *name = NULL; + static char *kwlist[] = {"name", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, + &name)) + return NULL; + + if (self->container->snapshot_destroy(self->container, name)) { + Py_RETURN_TRUE; + } + + Py_RETURN_FALSE; +} + +static PyObject * +Container_snapshot_list(Container *self, PyObject *args, PyObject *kwds) +{ + struct lxc_snapshot *snap; + int snap_count = 0; + PyObject *list = NULL; + int i = 0; + + snap_count = self->container->snapshot_list(self->container, &snap); + + if (snap_count < 0) { + PyErr_SetString(PyExc_KeyError, "Unable to list snapshots"); + return NULL; + } + + list = PyTuple_New(snap_count); + for (i = 0; i < snap_count; i++) { + PyObject *list_entry = NULL; + + list_entry = PyTuple_New(4); + PyTuple_SET_ITEM(list_entry, 0, + PyUnicode_FromString(snap[i].name)); + PyTuple_SET_ITEM(list_entry, 1, + PyUnicode_FromString(snap[i].comment_pathname)); + PyTuple_SET_ITEM(list_entry, 2, + PyUnicode_FromString(snap[i].timestamp)); + PyTuple_SET_ITEM(list_entry, 3, + PyUnicode_FromString(snap[i].lxcpath)); + + snap[i].free(&snap[i]); + + PyTuple_SET_ITEM(list, i, list_entry); + } + + return list; +} + + +static PyObject * +Container_snapshot_restore(Container *self, PyObject *args, PyObject *kwds) +{ + char *name = NULL; + char *newname = NULL; + static char *kwlist[] = {"name", "newname", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, + &name, &newname)) + return NULL; + + if (self->container->snapshot_restore(self->container, name, newname)) { + Py_RETURN_TRUE; + } + + Py_RETURN_FALSE; +} + +static PyObject * Container_start(Container *self, PyObject *args, PyObject *kwds) { char** init_args = {NULL}; @@ -1390,6 +1490,33 @@ static PyMethodDef Container_methods[] = { "unless timeout is set to a positive value, in which case " "the container will be killed when the timeout is reached." }, + {"snapshot", (PyCFunction)Container_snapshot, + METH_VARARGS|METH_KEYWORDS, + "snapshot(comment_path = None) -> string\n" + "\n" + "Snapshot the container and return the snapshot name " + "(or False on error)." + }, + {"snapshot_destroy", (PyCFunction)Container_snapshot_destroy, + METH_VARARGS|METH_KEYWORDS, + "snapshot_destroy(name) -> boolean\n" + "\n" + "Destroy a snapshot." + }, + {"snapshot_list", (PyCFunction)Container_snapshot_list, + METH_NOARGS, + "snapshot_list() -> tuple of snapshot tuples\n" + "\n" + "List all snapshots for a container." + }, + {"snapshot_restore", (PyCFunction)Container_snapshot_restore, + METH_VARARGS|METH_KEYWORDS, + "snapshot_restore(name, newname = None) -> boolean\n" + "\n" + "Restore a container snapshot. If newname is provided a new " + "container will be created from the snapshot, otherwise an in-place " + "restore will be attempted." + }, {"start", (PyCFunction)Container_start, METH_VARARGS|METH_KEYWORDS, "start(useinit = False, cmd = (,)) -> boolean\n" -- 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