This is an automated email from the ASF dual-hosted git repository. abudnik pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit e452533a29baecd8ae748852dda2d4385d2270a6 Author: Andrei Budnik <abud...@apache.org> AuthorDate: Fri Feb 28 16:15:47 2020 +0100 Added a test `LaunchNestedShareCgroups`. Review: https://reviews.apache.org/r/72190 --- .../nested_mesos_containerizer_tests.cpp | 89 +++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp index 13c6d28..8aaf80a 100644 --- a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp +++ b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp @@ -53,7 +53,7 @@ using mesos::internal::slave::Containerizer; using mesos::internal::slave::Fetcher; using mesos::internal::slave::MesosContainerizer; - +using mesos::internal::slave::containerizer::paths::getCgroupPath; using mesos::internal::slave::containerizer::paths::getContainerConfig; using mesos::internal::slave::containerizer::paths::getRuntimePath; using mesos::internal::slave::containerizer::paths::getSandboxPath; @@ -274,6 +274,93 @@ TEST_P(NestedMesosContainerizerTest, ROOT_CGROUPS_LaunchNested) } +// This test verifies that a separate cgroup is created for a nested +// container only if it does not share cgroups with its parent container. +TEST_P(NestedMesosContainerizerTest, ROOT_CGROUPS_LaunchNestedShareCgroups) +{ + const bool shareCgroups = GetParam(); + + slave::Flags flags = CreateSlaveFlags(); + flags.launcher = "linux"; + flags.isolation = "cgroups/cpu,filesystem/linux,namespaces/pid"; + + Fetcher fetcher(flags); + + Try<MesosContainerizer*> create = MesosContainerizer::create( + flags, + false, + &fetcher); + + ASSERT_SOME(create); + + Owned<MesosContainerizer> containerizer(create.get()); + + SlaveState state; + state.id = SlaveID(); + + AWAIT_READY(containerizer->recover(state)); + + 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); + + // Now launch nested container. + ContainerID nestedContainerId; + nestedContainerId.mutable_parent()->CopyFrom(containerId); + nestedContainerId.set_value(id::UUID::random().toString()); + + launch = containerizer->launch( + nestedContainerId, + createNestedContainerConfig("cpus:0.1", createCommandInfo("sleep 1000")), + map<string, string>(), + None()); + + AWAIT_ASSERT_EQ(Containerizer::LaunchResult::SUCCESS, launch); + + // Check that a separate cgroup is created for a nested container only + // if `share_cgroups` field is set to false. + Result<string> cpuHierarchy = cgroups::hierarchy("cpu"); + ASSERT_SOME(cpuHierarchy); + + const string cgroup = getCgroupPath(flags.cgroups_root, nestedContainerId); + + ASSERT_NE(shareCgroups, cgroups::exists(cpuHierarchy.get(), cgroup)); + + Future<Option<ContainerTermination>> nestedTermination = + containerizer->destroy(nestedContainerId); + + AWAIT_READY(nestedTermination); + ASSERT_SOME(nestedTermination.get()); + ASSERT_TRUE(nestedTermination.get()->has_status()); + EXPECT_WTERMSIG_EQ(SIGKILL, nestedTermination.get()->status()); + + 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()); + + // Check that the cgroups isolator cleaned up a nested cgroup + // for the nested container. + ASSERT_FALSE(cgroups::exists(cpuHierarchy.get(), cgroup)); +} + + // This test verifies that a debug container inherits the // environment of its parent even after agent failover. TEST_F(NestedMesosContainerizerTest,