You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2016/12/12 00:35:11 UTC
[3/5] mesos git commit: Added a TTY test for
LAUNCH_NESTED_CONTAINER_SESSION.
Added a TTY test for LAUNCH_NESTED_CONTAINER_SESSION.
Test verifies that output and error are sent as stdout to client.
Review: https://reviews.apache.org/r/54508
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8804fd3e
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8804fd3e
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8804fd3e
Branch: refs/heads/master
Commit: 8804fd3edbbb8a9f34688ada44251be40f460a87
Parents: 8de25f9
Author: Vinod Kone <vi...@gmail.com>
Authored: Wed Dec 7 15:50:07 2016 -0800
Committer: Vinod Kone <vi...@gmail.com>
Committed: Sun Dec 11 16:20:05 2016 -0800
----------------------------------------------------------------------
src/tests/api_tests.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 115 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/8804fd3e/src/tests/api_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp
index 023c1f2..4f6f206 100644
--- a/src/tests/api_tests.cpp
+++ b/src/tests/api_tests.cpp
@@ -3861,6 +3861,121 @@ TEST_P(AgentAPITest, LaunchNestedContainerSession)
}
+// This test verifies that launching a nested container session with `TTYInfo`
+// results in stdout and stderr being streamed to the client as stdout.
+TEST_P(AgentAPITest, LaunchNestedContainerSessionWithTTY)
+{
+ ContentType contentType = GetParam();
+
+ Try<Owned<cluster::Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ slave::Flags flags = CreateSlaveFlags();
+ Fetcher fetcher;
+
+ Try<MesosContainerizer*> _containerizer =
+ MesosContainerizer::create(flags, false, &fetcher);
+
+ ASSERT_SOME(_containerizer);
+
+ Owned<slave::Containerizer> containerizer(_containerizer.get());
+
+ Owned<MasterDetector> detector = master.get()->createDetector();
+
+ Try<Owned<cluster::Slave>> slave =
+ StartSlave(detector.get(), containerizer.get(), flags);
+
+ ASSERT_SOME(slave);
+
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL);
+
+ EXPECT_CALL(sched, registered(&driver, _, _));
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(_, _))
+ .WillOnce(FutureArg<1>(&offers));
+
+ driver.start();
+
+ AWAIT_READY(offers);
+ EXPECT_NE(0u, offers.get().size());
+
+ Future<TaskStatus> status;
+ EXPECT_CALL(sched, statusUpdate(_, _))
+ .WillOnce(FutureArg<1>(&status));
+
+ TaskInfo task = createTask(offers.get()[0], "sleep 1000");
+
+ driver.launchTasks(offers.get()[0].id(), {task});
+
+ AWAIT_READY(status);
+ ASSERT_EQ(TASK_RUNNING, status->state());
+
+ // Launch a nested container session that runs a command
+ // that writes something to stdout and stderr and exits.
+
+ Future<hashset<ContainerID>> containerIds = containerizer->containers();
+ AWAIT_READY(containerIds);
+ ASSERT_EQ(1u, containerIds->size());
+
+ v1::ContainerID containerId;
+ containerId.set_value(UUID::random().toString());
+ containerId.mutable_parent()->set_value(containerIds->begin()->value());
+
+ string output = "output";
+ string error = "error";
+ string command = "printf " + output + " && printf " + error + " 1>&2";
+
+ v1::agent::Call call;
+ call.set_type(v1::agent::Call::LAUNCH_NESTED_CONTAINER_SESSION);
+
+ call.mutable_launch_nested_container_session()->mutable_container_id()
+ ->CopyFrom(containerId);
+
+ call.mutable_launch_nested_container_session()->mutable_command()->set_value(
+ command);
+
+ call.mutable_launch_nested_container_session()->mutable_container()->set_type(
+ mesos::v1::ContainerInfo::MESOS);
+
+ call.mutable_launch_nested_container_session()->mutable_container()
+ ->mutable_tty_info();
+
+ http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
+ headers["Accept"] = stringify(contentType);
+
+ Future<http::Response> response = http::streaming::post(
+ slave.get()->pid,
+ "api/v1",
+ headers,
+ serialize(contentType, call),
+ stringify(contentType));
+
+ AWAIT_EXPECT_RESPONSE_STATUS_EQ(http::OK().status, response);
+ ASSERT_EQ(stringify(contentType), response->headers.at("Content-Type"));
+ ASSERT_EQ(http::Response::PIPE, response->type);
+
+ ASSERT_SOME(response->reader);
+ Future<tuple<string, string>> received =
+ getProcessIOData(contentType, response->reader.get());
+
+ AWAIT_READY(received);
+
+ string stdoutReceived;
+ string stderrReceived;
+
+ tie(stdoutReceived, stderrReceived) = received.get();
+
+ EXPECT_EQ(output + error, stdoutReceived);
+ EXPECT_EQ("", stderrReceived);
+
+ driver.stop();
+ driver.join();
+}
+
+
// TODO(vinod): Update the test when mesos containerizer
// adds support for `attach`.
TEST_P(AgentAPITest, AttachContainerOutputFailure)