Repository: mesos Updated Branches: refs/heads/master c869b0647 -> cc102c440
Added unit-test for checking `NetCls` classid in `state.json`. Added a test-case to check that the agent is able to retrieve the `ContainerStatus` successfully from the containerizer (and therefore the isolators), and expose it in its `state.json`. Review: https://reviews.apache.org/r/43323/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/cc102c44 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/cc102c44 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/cc102c44 Branch: refs/heads/master Commit: cc102c44093466e44df68018b8fa3195751399fb Parents: d6a68ad Author: Avinash sridharan <[email protected]> Authored: Wed Feb 10 08:51:53 2016 -0800 Committer: Jie Yu <[email protected]> Committed: Wed Feb 10 09:06:46 2016 -0800 ---------------------------------------------------------------------- src/tests/containerizer/isolator_tests.cpp | 87 +++++++++++++++++++++++++ 1 file changed, 87 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/cc102c44/src/tests/containerizer/isolator_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer/isolator_tests.cpp b/src/tests/containerizer/isolator_tests.cpp index 52a4957..653b037 100644 --- a/src/tests/containerizer/isolator_tests.cpp +++ b/src/tests/containerizer/isolator_tests.cpp @@ -100,6 +100,9 @@ using mesos::slave::ContainerConfig; using mesos::slave::ContainerLaunchInfo; using mesos::slave::Isolator; +using process::http::OK; +using process::http::Response; + using std::ostringstream; using std::set; using std::string; @@ -1026,6 +1029,90 @@ TEST_F(NetClsIsolatorTest, ROOT_CGROUPS_NetClsIsolate) delete containerizer.get(); } + + +// This test verifies that are able to retrieve the `net_cls` handle +// from `state.json`. +TEST_F(NetClsIsolatorTest, ROOT_CGROUPS_ContainerStatus) +{ + Try<PID<Master>> master = StartMaster(); + ASSERT_SOME(master); + + slave::Flags flags = CreateSlaveFlags(); + flags.isolation = "cgroups/net_cls"; + flags.cgroups_net_cls_primary_handle = stringify(0x0012); + + Fetcher fetcher; + + Try<MesosContainerizer*> containerizer = + MesosContainerizer::create(flags, true, &fetcher); + + ASSERT_SOME(containerizer); + + Try<PID<Slave>> slave = StartSlave(containerizer.get(), flags); + ASSERT_SOME(slave); + + MockScheduler sched; + + MesosSchedulerDriver driver( + &sched, DEFAULT_FRAMEWORK_INFO, master.get(), DEFAULT_CREDENTIAL); + + Future<Nothing> schedRegistered; + EXPECT_CALL(sched, registered(_, _, _)) + .WillOnce(FutureSatisfy(&schedRegistered)); + + Future<vector<Offer>> offers; + EXPECT_CALL(sched, resourceOffers(_, _)) + .WillOnce(FutureArg<1>(&offers)) + .WillRepeatedly(Return()); // Ignore subsequent offers. + + driver.start(); + + AWAIT_READY(schedRegistered); + + AWAIT_READY(offers); + EXPECT_EQ(1u, offers.get().size()); + + // Create a task to be launched in the mesos-container. + TaskInfo task = createTask(offers.get()[0], "sleep 1000"); + + Future<TaskStatus> status; + EXPECT_CALL(sched, statusUpdate(_, _)) + .WillOnce(FutureArg<1>(&status)); + + driver.launchTasks(offers.get()[0].id(), {task}); + + AWAIT_READY(status); + ASSERT_EQ(TASK_RUNNING, status.get().state()); + + // Task is ready. Verify `ContainerStatus` is present in slave state.json. + Future<Response> response = http::get(slave.get(), "state.json"); + + AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response); + AWAIT_EXPECT_RESPONSE_HEADER_EQ(APPLICATION_JSON, "Content-Type", response); + + Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.get().body); + ASSERT_SOME(parse); + + Result<JSON::Object> netCls = parse->find<JSON::Object>( + "frameworks[0].executors[0].tasks[0].statuses[0]." + "container_status.cgroup_info.net_cls"); + ASSERT_SOME(netCls); + + uint32_t classid = + netCls->values["classid"].as<JSON::Number>().as<uint32_t>(); + + // Check the primary and the secondary handle. + EXPECT_EQ(0x0012u, classid >> 16); + EXPECT_NE(0u, classid & 0xffff); + + driver.stop(); + driver.join(); + + Shutdown(); + + delete containerizer.get(); +} #endif
