Quoting S.Çağlar Onur (cag...@10ur.org): > What about something like following?
This looks good to me. Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c > index 480c4f5..eb99e5a 100644 > --- a/src/lxc/lxccontainer.c > +++ b/src/lxc/lxccontainer.c > @@ -508,7 +508,7 @@ static bool lxcapi_create(struct lxc_container *c, char > *t, char *const argv[]) > int len, nargs = 0; > char **newargv; > > - if (!c) > + if (!c || access(c->lxc_conf->rootfs.path, F_OK) == 0) > return false; > > len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1; > @@ -523,9 +523,6 @@ static bool lxcapi_create(struct lxc_container *c, char > *t, char *const argv[]) > goto out; > } > > - if (!create_container_dir(c)) > - goto out; > - > if (!c->save_config(c, NULL)) { > ERROR("failed to save starting configuration for %s\n", c->name); > goto out; > @@ -767,6 +764,9 @@ static bool lxcapi_save_config(struct lxc_container *c, > const char *alt_file) > return false; > } > > + if (!create_container_dir(c)) > + return false; > + > FILE *fout = fopen(alt_file, "w"); > if (!fout) > return false; > @@ -785,7 +785,7 @@ static bool lxcapi_destroy(struct lxc_container *c) > pid_t pid; > int ret, status; > > - if (!c) > + if (!c || access(c->lxc_conf->rootfs.path, F_OK) != 0) > return false; > > pid = fork(); > > > and this is how it behaves with it; > > caglar@qgq:~$ cat test.py > import lxc > c = lxc.Container("abcdef") > print (c.set_config_item("lxc.utsname", "abcdef")) > print (c.save_config()) > print (c.create("ubuntu")) > print (c.create("ubuntu")) > print (c.destroy()) > print (c.destroy()) > > caglar@qgq:~$ sudo python3 test.py > True > True > True > False > True > False > > > On Sun, Mar 31, 2013 at 7:26 PM, S.Çağlar Onur <cag...@10ur.org> wrote: > > > Hi Stéphane, > > > > Hmm, then I believe there is another bug somewhere cause here is what > > happens with your ordering; > > > > caglar@qgq:~/Project/lxc$ sudo python3 > > Python 3.2.3 (default, Oct 19 2012, 19:53:16) > > [GCC 4.7.2] on linux2 > > Type "help", "copyright", "credits" or "license" for more information. > > >>> import lxc > > __main__:1: Warning: The python-lxc API isn't yet stable and may change at > > any point in the future. > > >>> c = lxc.Container("abcdef") > > >>> c.set_config_item("lxc.utsname", "blah") > > True > > >>> c.set_config_item("lxc.utsname", "abcdef") > > True > > >>> c.save_config() > > False > > >>> c.config_file_name > > '/var/lib/lxc/abcdef/config' > > > > so it looks like save_config don't work if the container directory is not > > there and as long as I see only create calls create_container_dir to do > > that. > > > > Maybe correct way to handle that is to call create_container_dir from > > save_config as well but checking the rootfs directory's existence from > > create/destrory? > > > > Best, > > > > > > On Sun, Mar 31, 2013 at 5:22 PM, Stéphane Graber <stgra...@ubuntu.com> > > wrote: > > > > > > On 03/31/2013 04:22 PM, S.Çağlar Onur wrote: > > > > From: "S.Çağlar Onur" <cag...@10ur.org> > > > > > > > > Currently it behaves like following which might be confusing for the > > code that checks the return value of those calls to determine whether > > operation completed successfully or not. > > > > > > > >>> c = lxc.Container("r") > > > >>>> c.create("ubuntu") > > > > True > > > >>>> c.create("ubuntu") > > > > True > > > >>>> c.create("ubuntu") > > > > True > > > >>>> c.create("ubuntu") > > > > True > > > >>>> c.create("ubuntu") > > > >>>> c.destroy() > > > > True > > > >>>> c.destroy() > > > > lxc-destroy: 'r' does not exist > > > > False > > > >>>> c.destroy() > > > > lxc-destroy: 'r' does not exist > > > > False > > > > > > > > New behaviour > > > > > > > >>>> c = lxc.Container("r") > > > >>>> c.create('ubuntu') > > > > True > > > >>>> c.create('ubuntu') > > > > False > > > >>>> c.destroy() > > > > True > > > >>>> c.destroy() > > > > False > > > >>>> > > > > > > > > > Won't this break the following? > > > c = lxc.Container("abcdef") > > > c.set_config_item("lxc.utsname", "blah") > > > c.save_config() > > > c.create("ubuntu") > > > > > > I personally always considered ".create()" to mean "generate a new > > > rootfs" which doesn't at all mean "generate a new config file". > > > > > > ".destroy()" on the other hand destroys everything, including the config. > > > > > > > > > > > > > Signed-off-by: S.Çağlar Onur <cag...@10ur.org> > > > > --- > > > > src/lxc/lxccontainer.c | 4 ++-- > > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c > > > > index 480c4f5..7a11c85 100644 > > > > --- a/src/lxc/lxccontainer.c > > > > +++ b/src/lxc/lxccontainer.c > > > > @@ -508,7 +508,7 @@ static bool lxcapi_create(struct lxc_container *c, > > char *t, char *const argv[]) > > > > int len, nargs = 0; > > > > char **newargv; > > > > > > > > - if (!c) > > > > + if (!c || lxcapi_is_defined(c)) > > > > return false; > > > > > > > > len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1; > > > > @@ -785,7 +785,7 @@ static bool lxcapi_destroy(struct lxc_container *c) > > > > pid_t pid; > > > > int ret, status; > > > > > > > > - if (!c) > > > > + if (!c || !lxcapi_is_defined(c)) > > > > return false; > > > > > > > > pid = fork(); > > > > > > > > > > > > > -- > > > Stéphane Graber > > > Ubuntu developer > > > http://www.ubuntu.com > > > > > > > > > > > ------------------------------------------------------------------------------ > > > Own the Future-Intel(R) Level Up Game Demo Contest 2013 > > > Rise to greatness in Intel's independent game demo contest. Compete > > > for recognition, cash, and the chance to get your game on Steam. > > > $5K grand prize plus 10 genre and skill prizes. Submit your demo > > > by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2 > > > _______________________________________________ > > > Lxc-devel mailing list > > > Lxc-devel@lists.sourceforge.net > > > https://lists.sourceforge.net/lists/listinfo/lxc-devel > > > > > > > > > > > -- > > S.Çağlar Onur <cag...@10ur.org> > > > > > > -- > S.Çağlar Onur <cag...@10ur.org> > ------------------------------------------------------------------------------ > Own the Future-Intel(R) Level Up Game Demo Contest 2013 > Rise to greatness in Intel's independent game demo contest. Compete > for recognition, cash, and the chance to get your game on Steam. > $5K grand prize plus 10 genre and skill prizes. Submit your demo > by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2 > _______________________________________________ > Lxc-devel mailing list > Lxc-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/lxc-devel ------------------------------------------------------------------------------ Own the Future-Intel® Level Up Game Demo Contest 2013 Rise to greatness in Intel's independent game demo contest. Compete for recognition, cash, and the chance to get your game on Steam. $5K grand prize plus 10 genre and skill prizes. Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel