Commit 593e8478 by Stéphane Graber

Re-organize API for global lxc.conf config

Instead of having one function for each possible key in lxc.conf which doesn't really scale and requires an API update for every new key, switch to a generic lxc_get_global_config_item() function which takes a key name as argument. Signed-off-by: 's avatarStéphane Graber <stgraber@ubuntu.com> Acked-by: 's avatarSerge E. Hallyn <serge.hallyn@ubuntu.com>
parent 9e8be781
...@@ -412,7 +412,7 @@ static int lxc_version_get(lua_State *L) { ...@@ -412,7 +412,7 @@ static int lxc_version_get(lua_State *L) {
} }
static int lxc_default_config_path_get(lua_State *L) { static int lxc_default_config_path_get(lua_State *L) {
const char *lxcpath = lxc_get_default_config_path(); const char *lxcpath = lxc_get_global_config_item("lxc.lxcpath");
lua_pushstring(L, lxcpath); lua_pushstring(L, lxcpath);
return 1; return 1;
......
...@@ -222,7 +222,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args, ...@@ -222,7 +222,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args,
/* If no lxcpaths were given, use default */ /* If no lxcpaths were given, use default */
if (!args->lxcpath_cnt) { if (!args->lxcpath_cnt) {
ret = lxc_arguments_lxcpath_add(args, default_lxc_path()); ret = lxc_arguments_lxcpath_add(args, lxc_global_config_value("lxc.lxcpath"));
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
......
...@@ -565,7 +565,7 @@ static int zfs_clone(const char *opath, const char *npath, const char *oname, ...@@ -565,7 +565,7 @@ static int zfs_clone(const char *opath, const char *npath, const char *oname,
return -1; return -1;
*p = '\0'; *p = '\0';
} else } else
zfsroot = default_zfs_root(); zfsroot = lxc_global_config_value("lxc.zfsroot");
ret = snprintf(option, MAXPATHLEN, "-omountpoint=%s/%s/rootfs", ret = snprintf(option, MAXPATHLEN, "-omountpoint=%s/%s/rootfs",
lxcpath, nname); lxcpath, nname);
...@@ -695,7 +695,7 @@ static int zfs_create(struct bdev *bdev, const char *dest, const char *n, ...@@ -695,7 +695,7 @@ static int zfs_create(struct bdev *bdev, const char *dest, const char *n,
pid_t pid; pid_t pid;
if (!specs || !specs->zfs.zfsroot) if (!specs || !specs->zfs.zfsroot)
zfsroot = default_zfs_root(); zfsroot = lxc_global_config_value("lxc.zfsroot");
else else
zfsroot = specs->zfs.zfsroot; zfsroot = specs->zfs.zfsroot;
...@@ -982,7 +982,7 @@ static int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldna ...@@ -982,7 +982,7 @@ static int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldna
orig->type); orig->type);
return -1; return -1;
} }
vg = default_lvm_vg(); vg = lxc_global_config_value("lxc.lvm_vg");
len = strlen("/dev/") + strlen(vg) + strlen(cname) + 2; len = strlen("/dev/") + strlen(vg) + strlen(cname) + 2;
if ((new->src = malloc(len)) == NULL) if ((new->src = malloc(len)) == NULL)
return -1; return -1;
...@@ -1032,7 +1032,7 @@ static int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldna ...@@ -1032,7 +1032,7 @@ static int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldna
return -1; return -1;
} }
} else { } else {
if (do_lvm_create(new->src, size, default_lvm_thin_pool()) < 0) { if (do_lvm_create(new->src, size, lxc_global_config_value("lxc.lvm_thin_pool")) < 0) {
ERROR("Error creating new lvm blockdev"); ERROR("Error creating new lvm blockdev");
return -1; return -1;
} }
...@@ -1071,11 +1071,11 @@ static int lvm_create(struct bdev *bdev, const char *dest, const char *n, ...@@ -1071,11 +1071,11 @@ static int lvm_create(struct bdev *bdev, const char *dest, const char *n,
vg = specs->lvm.vg; vg = specs->lvm.vg;
if (!vg) if (!vg)
vg = default_lvm_vg(); vg = lxc_global_config_value("lxc.lvm_vg");
thinpool = specs->lvm.thinpool; thinpool = specs->lvm.thinpool;
if (!thinpool) if (!thinpool)
thinpool = default_lvm_thin_pool(); thinpool = lxc_global_config_value("lxc.lvm_thin_pool");
/* /dev/$vg/$lv */ /* /dev/$vg/$lv */
if (specs->lvm.lv) if (specs->lvm.lv)
......
...@@ -89,7 +89,7 @@ struct cgroup_meta_data *lxc_cgroup_load_meta() ...@@ -89,7 +89,7 @@ struct cgroup_meta_data *lxc_cgroup_load_meta()
int saved_errno; int saved_errno;
errno = 0; errno = 0;
cgroup_use = default_cgroup_use(); cgroup_use = lxc_global_config_value("lxc.cgroup.use");
if (!cgroup_use && errno != 0) if (!cgroup_use && errno != 0)
return NULL; return NULL;
if (cgroup_use) { if (cgroup_use) {
......
...@@ -80,7 +80,7 @@ static int fill_sock_name(char *path, int len, const char *name, ...@@ -80,7 +80,7 @@ static int fill_sock_name(char *path, int len, const char *name,
int ret; int ret;
if (!inpath) { if (!inpath) {
lxcpath = default_lxc_path(); lxcpath = lxc_global_config_value("lxc.lxcpath");
if (!lxcpath) { if (!lxcpath) {
ERROR("Out of memory getting lxcpath"); ERROR("Out of memory getting lxcpath");
return -1; return -1;
......
...@@ -1921,7 +1921,7 @@ static int mount_entry_on_absolute_rootfs(const struct mntent *mntent, ...@@ -1921,7 +1921,7 @@ static int mount_entry_on_absolute_rootfs(const struct mntent *mntent,
return -1; return -1;
} }
lxcpath = default_lxc_path(); lxcpath = lxc_global_config_value("lxc.lxcpath");
if (!lxcpath) { if (!lxcpath) {
ERROR("Out of memory"); ERROR("Out of memory");
return -1; return -1;
......
...@@ -324,7 +324,7 @@ extern int lxc_log_init(const char *name, const char *file, ...@@ -324,7 +324,7 @@ extern int lxc_log_init(const char *name, const char *file,
lxcpath = LOGPATH; lxcpath = LOGPATH;
/* try LOGPATH if lxcpath is the default */ /* try LOGPATH if lxcpath is the default */
if (strcmp(lxcpath, default_lxc_path()) == 0) if (strcmp(lxcpath, lxc_global_config_value("lxc.lxcpath")) == 0)
ret = _lxc_log_set_file(name, NULL, 0); ret = _lxc_log_set_file(name, NULL, 0);
/* try in lxcpath */ /* try in lxcpath */
......
...@@ -27,15 +27,15 @@ ...@@ -27,15 +27,15 @@
struct lxc_config_items { struct lxc_config_items {
char *name; char *name;
const char *(*fn)(void);
}; };
static struct lxc_config_items items[] = static struct lxc_config_items items[] =
{ {
{ .name = "lxc.lxcpath", .fn = &lxc_get_default_config_path, }, { .name = "lxc.default_config", },
{ .name = "lxc.lvm_vg", .fn = &lxc_get_default_lvm_vg, }, { .name = "lxc.lxcpath", },
{ .name = "lxc.lvm_thin_pool", .fn = &lxc_get_default_lvm_thin_pool, }, { .name = "lxc.lvm_vg", },
{ .name = "lxc.zfsroot", .fn = &lxc_get_default_zfs_root, }, { .name = "lxc.lvm_thin_pool", },
{ .name = "lxc.zfsroot", },
{ .name = NULL, }, { .name = NULL, },
}; };
...@@ -65,7 +65,7 @@ int main(int argc, char *argv[]) ...@@ -65,7 +65,7 @@ int main(int argc, char *argv[])
list_config_items(); list_config_items();
for (i = &items[0]; i->name; i++) { for (i = &items[0]; i->name; i++) {
if (strcmp(argv[1], i->name) == 0) { if (strcmp(argv[1], i->name) == 0) {
printf("%s\n", i->fn()); printf("%s\n", lxc_get_global_config_item(i->name));
exit(0); exit(0);
} }
} }
......
...@@ -2035,24 +2035,9 @@ static int lxcapi_get_cgroup_item(struct lxc_container *c, const char *subsys, c ...@@ -2035,24 +2035,9 @@ static int lxcapi_get_cgroup_item(struct lxc_container *c, const char *subsys, c
return ret; return ret;
} }
const char *lxc_get_default_config_path(void) const char *lxc_get_global_config_item(const char *key)
{ {
return default_lxc_path(); return lxc_global_config_value(key);
}
const char *lxc_get_default_lvm_vg(void)
{
return default_lvm_vg();
}
const char *lxc_get_default_lvm_thin_pool(void)
{
return default_lvm_thin_pool();
}
const char *lxc_get_default_zfs_root(void)
{
return default_zfs_root();
} }
const char *lxc_get_version(void) const char *lxc_get_version(void)
...@@ -3035,7 +3020,7 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath ...@@ -3035,7 +3020,7 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath
if (configpath) if (configpath)
c->config_path = strdup(configpath); c->config_path = strdup(configpath);
else else
c->config_path = strdup(default_lxc_path()); c->config_path = strdup(lxc_global_config_value("lxc.lxcpath"));
if (!c->config_path) { if (!c->config_path) {
fprintf(stderr, "Out of memory"); fprintf(stderr, "Out of memory");
...@@ -3157,7 +3142,7 @@ int list_defined_containers(const char *lxcpath, char ***names, struct lxc_conta ...@@ -3157,7 +3142,7 @@ int list_defined_containers(const char *lxcpath, char ***names, struct lxc_conta
struct lxc_container *c; struct lxc_container *c;
if (!lxcpath) if (!lxcpath)
lxcpath = default_lxc_path(); lxcpath = lxc_global_config_value("lxc.lxcpath");
dir = opendir(lxcpath); dir = opendir(lxcpath);
if (!dir) { if (!dir) {
...@@ -3247,7 +3232,7 @@ int list_active_containers(const char *lxcpath, char ***nret, ...@@ -3247,7 +3232,7 @@ int list_active_containers(const char *lxcpath, char ***nret,
struct lxc_container *c; struct lxc_container *c;
if (!lxcpath) if (!lxcpath)
lxcpath = default_lxc_path(); lxcpath = lxc_global_config_value("lxc.lxcpath");
lxcpath_len = strlen(lxcpath); lxcpath_len = strlen(lxcpath);
if (cret) if (cret)
......
...@@ -786,45 +786,14 @@ int lxc_container_put(struct lxc_container *c); ...@@ -786,45 +786,14 @@ int lxc_container_put(struct lxc_container *c);
*/ */
int lxc_get_wait_states(const char **states); int lxc_get_wait_states(const char **states);
/*! /*
* \brief Determine path to default configuration file. * \brief Get the value for a global config key
*
* \return Static string representing full path to default configuration
* file.
*
* \note Returned string must not be freed.
*/
const char *lxc_get_default_config_path(void);
/*!
* \brief Determine default LVM volume group.
*
* \return Static string representing default volume group,
* or \c NULL on error.
*
* \note Returned string must not be freed.
*/
const char *lxc_get_default_lvm_vg(void);
/*!
* \brief Determine default LVM thin pool.
*
* \return Static string representing default lvm thin pool,
* or \c NULL on error.
*
* \note Returned string must not be freed.
*/
const char *lxc_get_default_lvm_thin_pool(void);
/*!
* \brief Determine default ZFS root.
* *
* \return Static string representing default ZFS root, * \param key The name of the config key
* or \c NULL on error.
* *
* \note Returned string must not be freed. * \return String representing the current value for the key.
*/ */
const char *lxc_get_default_zfs_root(void); const char *lxc_get_global_config_item(const char *key);
/*! /*!
* \brief Determine version of LXC. * \brief Determine version of LXC.
......
...@@ -767,7 +767,7 @@ static int lxc_spawn(struct lxc_handler *handler) ...@@ -767,7 +767,7 @@ static int lxc_spawn(struct lxc_handler *handler)
* default value is available * default value is available
*/ */
if (getuid() == 0) if (getuid() == 0)
cgroup_pattern = default_cgroup_pattern(); cgroup_pattern = lxc_global_config_value("lxc.cgroup.pattern");
if (!cgroup_pattern) if (!cgroup_pattern)
cgroup_pattern = "%n"; cgroup_pattern = "%n";
......
...@@ -238,7 +238,7 @@ static char *copy_global_config_value(char *p) ...@@ -238,7 +238,7 @@ static char *copy_global_config_value(char *p)
#define DEFAULT_THIN_POOL "lxc" #define DEFAULT_THIN_POOL "lxc"
#define DEFAULT_ZFSROOT "lxc" #define DEFAULT_ZFSROOT "lxc"
static const char *lxc_global_config_value(const char *option_name) const char *lxc_global_config_value(const char *option_name)
{ {
static const char * const options[][2] = { static const char * const options[][2] = {
{ "lxc.lvm_vg", DEFAULT_VG }, { "lxc.lvm_vg", DEFAULT_VG },
...@@ -371,36 +371,6 @@ out: ...@@ -371,36 +371,6 @@ out:
return values[i]; return values[i];
} }
const char *default_lvm_vg(void)
{
return lxc_global_config_value("lxc.lvm_vg");
}
const char *default_lvm_thin_pool(void)
{
return lxc_global_config_value("lxc.lvm_thin_pool");
}
const char *default_zfs_root(void)
{
return lxc_global_config_value("lxc.zfsroot");
}
const char *default_lxc_path(void)
{
return lxc_global_config_value("lxc.lxcpath");
}
const char *default_cgroup_use(void)
{
return lxc_global_config_value("lxc.cgroup.use");
}
const char *default_cgroup_pattern(void)
{
return lxc_global_config_value("lxc.cgroup.pattern");
}
const char *get_rundir() const char *get_rundir()
{ {
const char *rundir; const char *rundir;
......
...@@ -41,16 +41,8 @@ extern int mkdir_p(const char *dir, mode_t mode); ...@@ -41,16 +41,8 @@ extern int mkdir_p(const char *dir, mode_t mode);
extern void remove_trailing_slashes(char *p); extern void remove_trailing_slashes(char *p);
extern const char *get_rundir(void); extern const char *get_rundir(void);
/* extern const char *lxc_global_config_value(const char *option_name);
* Return a buffer containing the default container path.
* Caller must NOT free this buffer, since it may be static.
*/
extern const char *default_lxc_path(void);
extern const char *default_zfs_root(void);
extern const char *default_lvm_vg(void);
extern const char *default_lvm_thin_pool(void);
extern const char *default_cgroup_use(void);
extern const char *default_cgroup_pattern(void);
/* Define getline() if missing from the C library */ /* Define getline() if missing from the C library */
#ifndef HAVE_GETLINE #ifndef HAVE_GETLINE
#ifdef HAVE_FGETLN #ifdef HAVE_FGETLN
......
...@@ -325,9 +325,16 @@ LXC_attach_run_shell(PyObject *self, PyObject *arg) ...@@ -325,9 +325,16 @@ LXC_attach_run_shell(PyObject *self, PyObject *arg)
} }
static PyObject * static PyObject *
LXC_get_default_config_path(PyObject *self, PyObject *args) LXC_get_global_config_item(PyObject *self, PyObject *args, PyObject *kwds)
{ {
return PyUnicode_FromString(lxc_get_default_config_path()); static char *kwlist[] = {"key", NULL};
char* key = NULL;
if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist,
&key))
return NULL;
return PyUnicode_FromString(lxc_get_global_config_item(key));
} }
static PyObject * static PyObject *
...@@ -1670,8 +1677,8 @@ static PyMethodDef LXC_methods[] = { ...@@ -1670,8 +1677,8 @@ static PyMethodDef LXC_methods[] = {
{"attach_run_shell", (PyCFunction)LXC_attach_run_shell, METH_O, {"attach_run_shell", (PyCFunction)LXC_attach_run_shell, METH_O,
"Starts up a shell when attaching, to use as the run parameter for " "Starts up a shell when attaching, to use as the run parameter for "
"attach or attach_wait"}, "attach or attach_wait"},
{"get_default_config_path", (PyCFunction)LXC_get_default_config_path, {"get_global_config_item", (PyCFunction)LXC_get_global_config_item,
METH_NOARGS, METH_VARARGS|METH_KEYWORDS,
"Returns the current LXC config path"}, "Returns the current LXC config path"},
{"get_version", (PyCFunction)LXC_get_version, METH_NOARGS, {"get_version", (PyCFunction)LXC_get_version, METH_NOARGS,
"Returns the current LXC library version"}, "Returns the current LXC library version"},
......
...@@ -32,7 +32,7 @@ import warnings ...@@ -32,7 +32,7 @@ import warnings
warnings.warn("The python-lxc API isn't yet stable " warnings.warn("The python-lxc API isn't yet stable "
"and may change at any point in the future.", Warning, 2) "and may change at any point in the future.", Warning, 2)
default_config_path = _lxc.get_default_config_path() default_config_path = _lxc.get_global_config_item("lxc.lxcpath")
version = _lxc.get_version() version = _lxc.get_version()
......
...@@ -38,7 +38,7 @@ static void try_to_remove(void) ...@@ -38,7 +38,7 @@ static void try_to_remove(void)
c->destroy(c); c->destroy(c);
lxc_container_put(c); lxc_container_put(c);
} }
snprintf(snappath, 1024, "%ssnaps/%s", lxc_get_default_config_path(), MYNAME); snprintf(snappath, 1024, "%ssnaps/%s", lxc_get_global_config_item("lxc.lxcpath"), MYNAME);
c = lxc_container_new("snap0", snappath); c = lxc_container_new("snap0", snappath);
if (c) { if (c) {
if (c->is_defined(c)) if (c->is_defined(c))
...@@ -92,7 +92,7 @@ int main(int argc, char *argv[]) ...@@ -92,7 +92,7 @@ int main(int argc, char *argv[])
struct stat sb; struct stat sb;
int ret; int ret;
char path[1024]; char path[1024];
snprintf(path, 1024, "%ssnaps/%s/snap0/rootfs", lxc_get_default_config_path(), MYNAME); snprintf(path, 1024, "%ssnaps/%s/snap0/rootfs", lxc_get_global_config_item("lxc.lxcpath"), MYNAME);
ret = stat(path, &sb); ret = stat(path, &sb);
if (ret != 0) { if (ret != 0) {
fprintf(stderr, "%s: %d: snapshot was not actually created\n", __FILE__, __LINE__); fprintf(stderr, "%s: %d: snapshot was not actually created\n", __FILE__, __LINE__);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment