]> git.proxmox.com Git - mirror_lxc.git/commitdiff
introduce lxcapi_rename for renaming containers
authorS.Çağlar Onur <caglar@10ur.org>
Sat, 14 Dec 2013 05:41:25 +0000 (00:41 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Tue, 17 Dec 2013 21:21:36 +0000 (15:21 -0600)
lxcapi_rename implemented as a convenience function as lately
I find myself in a need to rename a container due to a
typo in its name. I could have started over but didn't want
to spend more time (to installing extra packages and changing
their configuration) on it.

c->clone() followed by c->destroy() did the trick for me and I
though it could be helpful to the other people, so here it is.

Signed-off-by: S.Çağlar Onur <caglar@10ur.org>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/lxccontainer.c
src/lxc/lxccontainer.h

index 6326724b6b7cf789c9a9dd47b74d6c8f484dd8ac..1af8d6282a1ab67ed64a05b6b0f86f9cb106c231 100644 (file)
@@ -2596,6 +2596,38 @@ out:
        return NULL;
 }
 
+static bool lxcapi_rename(struct lxc_container *c, const char *newname)
+{
+       struct bdev *bdev;
+       struct lxc_container *newc;
+       int flags = LXC_CLONE_KEEPMACADDR | LXC_CLONE_COPYHOOKS;
+
+       if (!c || !c->name || !c->config_path)
+               return false;
+
+       bdev = bdev_init(c->lxc_conf->rootfs.path, c->lxc_conf->rootfs.mount, NULL);
+       if (!bdev) {
+               ERROR("Failed to find original backing store type");
+               return false;
+       }
+
+       newc = lxcapi_clone(c, newname, c->config_path, flags, NULL, bdev->type, 0, NULL);
+       bdev_put(bdev);
+       if (!newc) {
+               lxc_container_put(newc);
+               return false;
+       }
+
+       if (newc && lxcapi_is_defined(newc))
+               lxc_container_put(newc);
+
+       if (!lxcapi_destroy(c)) {
+               ERROR("Could not destroy existing container %s", c->name);
+               return false;
+       }
+       return true;
+}
+
 static int lxcapi_attach(struct lxc_container *c, lxc_attach_exec_t exec_function, void *exec_payload, lxc_attach_options_t *options, pid_t *attached_process)
 {
        if (!c)
@@ -3139,6 +3171,7 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath
        c->wait = lxcapi_wait;
        c->set_config_item = lxcapi_set_config_item;
        c->destroy = lxcapi_destroy;
+       c->rename = lxcapi_rename;
        c->save_config = lxcapi_save_config;
        c->get_keys = lxcapi_get_keys;
        c->create = lxcapi_create;
index 3e1b492f6de1885f9e46561b1007a022c92eaaa0..b7c5313a8768e02739986c9001b8d3b1e550c739 100644 (file)
@@ -325,6 +325,16 @@ struct lxc_container {
        bool (*createl)(struct lxc_container *c, const char *t, const char *bdevtype,
                        struct bdev_specs *specs, int flags, ...);
 
+       /*!
+        * \brief Rename a container
+        *
+        * \param c Container.
+        * \param newname New name to be used for the container.
+        *
+        * \return \c true on success, else \c false.
+        */
+       bool (*rename)(struct lxc_container *c, const char *newname);
+
        /*!
         * \brief Request the container reboot by sending it \c SIGINT.
         *