[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