Quoting S.Çağlar Onur (cag...@10ur.org):
> 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 <cag...@10ur.org>

Looks ok, but should you be specifying LXC_CLONE_COPYHOOKS |
LXC_CLONE_KEEPMACADDR  as clone flags?

> ---
>  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 6326724..1af8d62 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 3e1b492..b7c5313 100644
> --- a/src/lxc/lxccontainer.h
> +++ b/src/lxc/lxccontainer.h
> @@ -326,6 +326,16 @@ struct lxc_container {
>                       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.
>        *
>        * \param c Container.
> -- 
> 1.8.3.2
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel@lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to