[lxc-devel] [PATCH v2] Update Lua API
Stéphane Graber
stgraber at ubuntu.com
Mon Feb 11 22:38:15 UTC 2013
On 02/11/2013 05:31 PM, Dwight Engen wrote:
> Add [gs]et_config_path from API to Lua binding. Add additional optional
> parameter to container_new(). Add tests for these new Lua API bindings.
> Commit 2a59a681 changed the meaning of lxc_path_get() in the binding,
> causing lua script breakage. Reinstate original behavior of
> lxc_path_get() and rename it to lxc_default_config_path_get() to make
> its intent clearer.
>
> Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
And on that note, I'll now freeze staging for alpha3.
I'll be running all the tests we have, do some more random testing, then
send the pull request to Daniel.
> ---
> src/lua-lxc/core.c | 38 ++++++++++++++++++++++++++++++++------
> src/lua-lxc/lxc.lua | 18 +++++++++++++++---
> src/lua-lxc/test/apitest.lua | 26 +++++++++++++++++++++++++-
> src/lxc/lxccontainer.c | 4 ++++
> src/lxc/lxccontainer.h | 1 +
> 5 files changed, 77 insertions(+), 10 deletions(-)
>
> diff --git a/src/lua-lxc/core.c b/src/lua-lxc/core.c
> index 9225158..c9eaef0 100644
> --- a/src/lua-lxc/core.c
> +++ b/src/lua-lxc/core.c
> @@ -43,9 +43,15 @@
>
> static int container_new(lua_State *L)
> {
> + struct lxc_container *c;
> const char *name = luaL_checkstring(L, 1);
> - struct lxc_container *c = lxc_container_new(name, NULL);
> + const char *configpath = NULL;
> + int argc = lua_gettop(L);
> +
> + if (argc > 1)
> + configpath = luaL_checkstring(L, 2);
>
> + c = lxc_container_new(name, configpath);
> if (c) {
> lua_boxpointer(L, c);
> luaL_getmetatable(L, CONTAINER_TYPENAME);
> @@ -238,6 +244,25 @@ static int container_save_config(lua_State *L)
> return 1;
> }
>
> +static int container_get_config_path(lua_State *L)
> +{
> + struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
> + const char *config_path;
> +
> + config_path = c->get_config_path(c);
> + lua_pushstring(L, config_path);
> + return 1;
> +}
> +
> +static int container_set_config_path(lua_State *L)
> +{
> + struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
> + const char *config_path = luaL_checkstring(L, 2);
> +
> + lua_pushboolean(L, !!c->set_config_path(c, config_path));
> + return 1;
> +}
> +
> static int container_clear_config_item(lua_State *L)
> {
> struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
> @@ -326,6 +351,8 @@ static luaL_Reg lxc_container_methods[] =
> {"config_file_name", container_config_file_name},
> {"load_config", container_load_config},
> {"save_config", container_save_config},
> + {"get_config_path", container_get_config_path},
> + {"set_config_path", container_set_config_path},
> {"get_config_item", container_get_config_item},
> {"set_config_item", container_set_config_item},
> {"clear_config_item", container_clear_config_item},
> @@ -338,18 +365,17 @@ static int lxc_version_get(lua_State *L) {
> return 1;
> }
>
> -static int lxc_path_get(lua_State *L) {
> - struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
> - const char *lxcpath;
> +static int lxc_default_config_path_get(lua_State *L) {
> + char *lxcpath = lxc_get_default_config_path();
>
> - lxcpath = c->get_config_path(c);
> lua_pushstring(L, lxcpath);
> + free(lxcpath);
> return 1;
> }
>
> static luaL_Reg lxc_lib_methods[] = {
> {"version_get", lxc_version_get},
> - {"path_get", lxc_path_get},
> + {"default_config_path_get", lxc_default_config_path_get},
> {"container_new", container_new},
> {NULL, NULL}
> };
> diff --git a/src/lua-lxc/lxc.lua b/src/lua-lxc/lxc.lua
> index c71de48..b6bc344 100755
> --- a/src/lua-lxc/lxc.lua
> +++ b/src/lua-lxc/lxc.lua
> @@ -107,13 +107,17 @@ container = {}
> container_mt = {}
> container_mt.__index = container
>
> -function container:new(lname)
> +function container:new(lname, config)
> local lcore
> local lnetcfg = {}
> local lstats = {}
>
> if lname then
> - lcore = core.container_new(lname)
> + if config then
> + lcore = core.container_new(lname, config)
> + else
> + lcore = core.container_new(lname)
> + end
> end
>
> return setmetatable({ctname = lname, core = lcore, netcfg = lnetcfg, stats = lstats}, container_mt)
> @@ -176,6 +180,14 @@ function container:destroy()
> return self.core:destroy()
> end
>
> +function container:get_config_path()
> + return self.core:get_config_path()
> +end
> +
> +function container:set_config_path(path)
> + return self.core:set_config_path(path)
> +end
> +
> function container:append_config_item(key, value)
> return self.core:set_config_item(key, value)
> end
> @@ -408,5 +420,5 @@ function containers_running(names_only)
> return containers
> end
>
> -lxc_path = core.path_get()
> +lxc_path = core.default_config_path_get()
> cgroup_path = cgroup_path_get()
> diff --git a/src/lua-lxc/test/apitest.lua b/src/lua-lxc/test/apitest.lua
> index 14d2a9d..1365f91 100755
> --- a/src/lua-lxc/test/apitest.lua
> +++ b/src/lua-lxc/test/apitest.lua
> @@ -22,9 +22,10 @@
> --
>
> local lxc = require("lxc")
> +local lfs = require("lfs")
> local getopt = require("alt_getopt")
>
> -local LXC_PATH = lxc.path_get()
> +local LXC_PATH = lxc.default_config_path_get()
>
> local container
> local cfg_containers = {}
> @@ -83,6 +84,28 @@ function test_container_new()
> assert(container:config_file_name() == string.format("%s/%s/config", LXC_PATH, optarg["n"]))
> end
>
> +function test_container_config_path()
> + local cfgcontainer
> + local cfgpath = "/tmp/" .. optarg["n"]
> + local cfgname = cfgpath .. "/config"
> +
> + log(0, "Test container config path...")
> +
> + -- create a config file in the new location from container's config
> + assert(lfs.mkdir(cfgpath))
> + assert(container:save_config(cfgname))
> + cfgcontainer = lxc.container:new(optarg["n"], "/tmp")
> + assert(cfgcontainer ~= nil)
> + log(0, "cfgname:%s cfgpath:%s", cfgcontainer:config_file_name(), cfgcontainer:get_config_path())
> + assert(cfgcontainer:config_file_name() == cfgname)
> + assert(cfgcontainer:get_config_path() == "/tmp")
> + assert(cfgcontainer:set_config_path(LXC_PATH))
> + assert(cfgcontainer:get_config_path() == LXC_PATH)
> +
> + assert(os.remove(cfgname))
> + assert(lfs.rmdir(cfgpath))
> +end
> +
> function test_container_create()
> if (optarg["c"]) then
> log(0, "%-20s %s", "Destroy existing container:", optarg["n"])
> @@ -280,6 +303,7 @@ test_container_new()
> test_container_create()
> test_container_stopped()
> test_container_in_cfglist(true)
> +test_container_config_path()
>
> test_config_items()
> test_config_keys()
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 733cbb6..caac11b 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -987,6 +987,10 @@ out:
> return ret;
> }
>
> +char *lxc_get_default_config_path(void)
> +{
> + return default_lxc_path();
> +}
>
> struct lxc_container *lxc_container_new(const char *name, const char *configpath)
> {
> diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> index de802a8..46c46c5 100644
> --- a/src/lxc/lxccontainer.h
> +++ b/src/lxc/lxccontainer.h
> @@ -86,6 +86,7 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath
> int lxc_container_get(struct lxc_container *c);
> int lxc_container_put(struct lxc_container *c);
> int lxc_get_wait_states(const char **states);
> +char *lxc_get_default_config_path(void);
>
> #if 0
> char ** lxc_get_valid_keys();
>
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20130211/6ed53002/attachment.pgp>
More information about the lxc-devel
mailing list