From 06e5650eaba7182a09bf73b0fa68100f6b43575f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=2E=C3=87a=C4=9Flar=20Onur?= Date: Sat, 14 Dec 2013 00:41:25 -0500 Subject: [PATCH] introduce lxcapi_rename for renaming containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Serge Hallyn --- src/lxc/lxccontainer.c | 33 +++++++++++++++++++++++++++++++++ src/lxc/lxccontainer.h | 10 ++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 6326724b6..1af8d6282 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -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; diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h index 3e1b492f6..b7c5313a8 100644 --- a/src/lxc/lxccontainer.h +++ b/src/lxc/lxccontainer.h @@ -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. *