diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index c9a2dd2759..9a0a09ea3b 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -20,6 +20,7 @@ lxc_test_snapshot_SOURCES = snapshot.c lxc_test_concurrent_SOURCES = concurrent.c lxc_test_may_control_SOURCES = may_control.c lxc_test_reboot_SOURCES = reboot.c +lxc_test_api_reboot_SOURCES = api_reboot.c lxc_test_list_SOURCES = list.c lxc_test_attach_SOURCES = attach.c lxc_test_device_add_remove_SOURCES = device_add_remove.c @@ -57,7 +58,8 @@ bin_PROGRAMS = lxc-test-containertests lxc-test-locktests lxc-test-startone \ lxc-test-snapshot lxc-test-concurrent lxc-test-may-control \ lxc-test-reboot lxc-test-list lxc-test-attach lxc-test-device-add-remove \ lxc-test-apparmor lxc-test-utils lxc-test-parse-config-file \ - lxc-test-config-jump-table lxc-test-shortlived lxc-test-livepatch + lxc-test-config-jump-table lxc-test-shortlived lxc-test-livepatch \ + lxc-test-api-reboot bin_SCRIPTS = lxc-test-automount \ lxc-test-autostart \ diff --git a/src/tests/api_reboot.c b/src/tests/api_reboot.c new file mode 100644 index 0000000000..d609a33392 --- /dev/null +++ b/src/tests/api_reboot.c @@ -0,0 +1,125 @@ +/* liblxcapi + * + * Copyright © 2017 Christian Brauner . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lxc/lxccontainer.h" +#include "lxctest.h" + +int main(int argc, char *argv[]) +{ + int i; + struct lxc_container *c; + int ret = EXIT_FAILURE; + + /* Test that the reboot() API function properly waits for containers to + * restart. + */ + c = lxc_container_new("reboot", NULL); + if (!c) { + lxc_error("%s", "Failed to create container \"reboot\""); + exit(ret); + } + + if (c->is_defined(c)) { + lxc_error("%s\n", "Container \"reboot\" is defined"); + goto on_error_put; + } + + if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) { + lxc_error("%s\n", "Failed to create busybox container \"reboot\""); + goto on_error_put; + } + + if (!c->is_defined(c)) { + lxc_error("%s\n", "Container \"reboot\" is not defined"); + goto on_error_put; + } + + c->clear_config(c); + + if (!c->load_config(c, NULL)) { + lxc_error("%s\n", "Failed to load config for container \"reboot\""); + goto on_error_stop; + } + + if (!c->want_daemonize(c, true)) { + lxc_error("%s\n", "Failed to mark container \"reboot\" daemonized"); + goto on_error_stop; + } + + if (!c->startl(c, 0, NULL)) { + lxc_error("%s\n", "Failed to start container \"reboot\" daemonized"); + goto on_error_stop; + } + + /* reboot 10 times */ + for (i = 0; i < 10; i++) { + /* Give the init system some time to setup it's signal handlers + * otherwise we will hang indefinitely. + */ + sleep(5); + + if (!c->reboot2(c, -1)) { + lxc_error("%s\n", "Failed to reboot container \"reboot\""); + goto on_error_stop; + } + + if (!c->is_running(c)) { + lxc_error("%s\n", "Failed to reboot container \"reboot\""); + goto on_error_stop; + } + lxc_debug("%s\n", "Container \"reboot\" rebooted successfully"); + } + + /* Give the init system some time to setup it's signal handlers + * otherwise we will hang indefinitely. + */ + sleep(5); + + /* Test non-blocking reboot2() */ + if (!c->reboot2(c, 0)) { + lxc_error("%s\n", "Failed to request non-blocking reboot of container \"reboot\""); + goto on_error_stop; + } + lxc_debug("%s\n", "Non-blocking reboot of container \"reboot\" succeeded"); + + ret = EXIT_SUCCESS; + +on_error_stop: + if (c->is_running(c) && !c->stop(c)) + lxc_error("%s\n", "Failed to stop container \"reboot\""); + + if (!c->destroy(c)) + lxc_error("%s\n", "Failed to destroy container \"reboot\""); + +on_error_put: + lxc_container_put(c); + if (ret == EXIT_SUCCESS) + lxc_debug("%s\n", "All reboot tests passed"); + exit(ret); +} diff --git a/src/tests/livepatch.c b/src/tests/livepatch.c index 7189cb36c7..fb86757d97 100644 --- a/src/tests/livepatch.c +++ b/src/tests/livepatch.c @@ -203,14 +203,11 @@ int main(int argc, char *argv[]) } free(value); - if (!c->reboot(c)) { + if (!c->reboot2(c, -1)) { lxc_error("%s", "Failed to create container \"livepatch\""); goto on_error_stop; } - /* Busybox shouldn't take long to reboot. Sleep for 5s. */ - sleep(5); - if (!c->is_running(c)) { lxc_error("%s\n", "Failed to reboot container \"livepatch\""); goto on_error_destroy;