[lxc-devel] [PATCH] python3: Add snapshot_* to the binding
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Nov 29 15:22:18 UTC 2013
Quoting Stéphane Graber (stgraber at ubuntu.com):
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at 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 at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list