Restored `WaitAfterDestroy` test for a nested container. This test was removed in fd4b9af147, but it's important to check that after termination of a nested container, its termination status is available. This property is used in default executor.
Review: https://reviews.apache.org/r/65505/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/a1ce9ad6 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/a1ce9ad6 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/a1ce9ad6 Branch: refs/heads/master Commit: a1ce9ad6227d7871d8409fcfee519a63dc812a0c Parents: b549c9c Author: Andrei Budnik <[email protected]> Authored: Fri May 25 09:08:37 2018 +0800 Committer: Qian Zhang <[email protected]> Committed: Fri May 25 09:08:37 2018 +0800 ---------------------------------------------------------------------- .../nested_mesos_containerizer_tests.cpp | 87 ++++++++++++++++++++ 1 file changed, 87 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/a1ce9ad6/src/tests/containerizer/nested_mesos_containerizer_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp index 8664f59..3481726 100644 --- a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp +++ b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp @@ -2579,6 +2579,93 @@ TEST_F(NestedMesosContainerizerTest, ASSERT_FALSE(containers->contains(containerId)); } + +// This test verifies that termination status of a nested container is +// available until its parent is terminated. +TEST_F(NestedMesosContainerizerTest, ROOT_CGROUPS_WaitAfterDestroy) +{ + slave::Flags flags = CreateSlaveFlags(); + flags.launcher = "linux"; + flags.isolation = "cgroups/cpu,filesystem/linux,namespaces/pid"; + + Fetcher fetcher(flags); + + Try<MesosContainerizer*> create = MesosContainerizer::create( + flags, + true, + &fetcher); + + ASSERT_SOME(create); + + Owned<MesosContainerizer> containerizer(create.get()); + + SlaveID slaveId = SlaveID(); + + // Launch a top-level container. + ContainerID containerId; + containerId.set_value(id::UUID::random().toString()); + + Try<string> directory = environment->mkdtemp(); + ASSERT_SOME(directory); + + Future<Containerizer::LaunchResult> launch = containerizer->launch( + containerId, + createContainerConfig( + None(), + createExecutorInfo("executor", "sleep 1000", "cpus:1"), + directory.get()), + map<string, string>(), + None()); + + AWAIT_ASSERT_EQ(Containerizer::LaunchResult::SUCCESS, launch); + + // Launch a nested container. + ContainerID nestedContainerId; + nestedContainerId.mutable_parent()->CopyFrom(containerId); + nestedContainerId.set_value(id::UUID::random().toString()); + + launch = containerizer->launch( + nestedContainerId, + createContainerConfig(createCommandInfo("exit 42")), + map<string, string>(), + None()); + + AWAIT_ASSERT_EQ(Containerizer::LaunchResult::SUCCESS, launch); + + // Wait once for a nested container completion, then wait again + // to make sure that its termination status is still available. + Future<Option<ContainerTermination>> nestedWait = + containerizer->wait(nestedContainerId); + + AWAIT_READY(nestedWait); + ASSERT_SOME(nestedWait.get()); + ASSERT_TRUE(nestedWait.get()->has_status()); + EXPECT_WEXITSTATUS_EQ(42, nestedWait.get()->status()); + + nestedWait = containerizer->wait(nestedContainerId); + + AWAIT_READY(nestedWait); + ASSERT_SOME(nestedWait.get()); + ASSERT_TRUE(nestedWait.get()->has_status()); + EXPECT_WEXITSTATUS_EQ(42, nestedWait.get()->status()); + + // Destroy the top-level container. + Future<Option<ContainerTermination>> termination = + containerizer->destroy(containerId); + + AWAIT_READY(termination); + ASSERT_SOME(termination.get()); + ASSERT_TRUE(termination.get()->has_status()); + EXPECT_WTERMSIG_EQ(SIGKILL, termination.get()->status()); + + // Wait on nested container again. + nestedWait = containerizer->wait(nestedContainerId); + + AWAIT_READY(nestedWait); + ASSERT_NONE(nestedWait.get()); +} + + // This test verifies that agent environment variables are not leaked // to the nested container, and the environment variables specified in // the command for the nested container will be honored.
