Added test to verify container status for nested containers.

This patch is used to verify that container status is properly set in
task status update for nested containers.

Review: https://reviews.apache.org/r/53466


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/bfd44863
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/bfd44863
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/bfd44863

Branch: refs/heads/master
Commit: bfd44863c5a9b03576543eddec145104452468df
Parents: f041787
Author: Jie Yu <yujie....@gmail.com>
Authored: Mon Nov 7 16:42:58 2016 -0800
Committer: Jie Yu <yujie....@gmail.com>
Committed: Mon Nov 7 17:05:38 2016 -0800

----------------------------------------------------------------------
 src/tests/default_executor_tests.cpp | 121 ++++++++++++++++++++++++++++++
 src/tests/mesos.hpp                  |   1 +
 2 files changed, 122 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/bfd44863/src/tests/default_executor_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/default_executor_tests.cpp 
b/src/tests/default_executor_tests.cpp
index bb954fc..5bddcc3 100644
--- a/src/tests/default_executor_tests.cpp
+++ b/src/tests/default_executor_tests.cpp
@@ -36,6 +36,7 @@
 using mesos::master::detector::MasterDetector;
 
 using mesos::v1::scheduler::Call;
+using mesos::v1::scheduler::Event;
 using mesos::v1::scheduler::Mesos;
 
 using process::Future;
@@ -48,6 +49,9 @@ using std::pair;
 using std::set;
 using std::string;
 
+using testing::_;
+using testing::DoAll;
+using testing::Return;
 using testing::WithParamInterface;
 
 namespace mesos {
@@ -693,6 +697,123 @@ TEST_P(DefaultExecutorTest, TaskUsesExecutor)
   EXPECT_TRUE(update->status().has_timestamp());
 }
 
+
+// This test verifies that the container status for a task in a task
+// group is set properly. In other words, it is the status of the
+// container that corresponds to the task.
+TEST_P(DefaultExecutorTest, ROOT_ContainerStatusForTask)
+{
+  Try<Owned<cluster::Master>> master = StartMaster();
+  ASSERT_SOME(master);
+
+  // Disable AuthN on the agent.
+  slave::Flags flags = CreateSlaveFlags();
+  flags.authenticate_http_readwrite = false;
+  flags.containerizers = GetParam();
+
+  Owned<MasterDetector> detector = master.get()->createDetector();
+
+  Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), flags);
+  ASSERT_SOME(slave);
+
+  auto scheduler = std::make_shared<v1::MockHTTPScheduler>();
+
+  Future<Nothing> connected;
+  EXPECT_CALL(*scheduler, connected(_))
+    .WillOnce(DoAll(
+        v1::scheduler::SendSubscribe(v1::DEFAULT_FRAMEWORK_INFO),
+        FutureSatisfy(&connected)));
+
+  Future<Event::Subscribed> subscribed;
+  EXPECT_CALL(*scheduler, subscribed(_, _))
+    .WillOnce(FutureArg<1>(&subscribed));
+
+  Future<Event::Offers> offers;
+  EXPECT_CALL(*scheduler, offers(_, _))
+    .WillOnce(FutureArg<1>(&offers))
+    .WillRepeatedly(Return());
+
+  EXPECT_CALL(*scheduler, heartbeat(_))
+    .WillRepeatedly(Return()); // Ignore heartbeats.
+
+  v1::scheduler::TestMesos mesos(
+      master.get()->pid,
+      ContentType::PROTOBUF,
+      scheduler);
+
+  AWAIT_READY(connected);
+
+  AWAIT_READY(subscribed);
+
+  AWAIT_READY(offers);
+  EXPECT_NE(0, offers->offers().size());
+
+  const v1::Offer& offer = offers->offers(0);
+
+  v1::FrameworkID frameworkId(subscribed->framework_id());
+
+  v1::ExecutorInfo executorInfo = v1::createExecutorInfo(
+      "test_default_executor",
+      None(),
+      "cpus:0.1;mem:32;disk:32",
+      v1::ExecutorInfo::DEFAULT);
+
+  // Update `executorInfo` with the subscribed `frameworkId`.
+  executorInfo.mutable_framework_id()->CopyFrom(frameworkId);
+
+  v1::TaskInfo task1 = v1::createTask(
+      offer.agent_id(),
+      v1::Resources::parse("cpus:0.1;mem:32;disk:32").get(),
+      v1::createCommandInfo("sleep 1000"));
+
+  v1::TaskInfo task2 = v1::createTask(
+      offer.agent_id(),
+      v1::Resources::parse("cpus:0.1;mem:32;disk:32").get(),
+      v1::createCommandInfo("sleep 1000"));
+
+  Future<Event::Update> updateRunning1;
+  Future<Event::Update> updateRunning2;
+  EXPECT_CALL(*scheduler, update(_, _))
+    .WillOnce(DoAll(
+        FutureArg<1>(&updateRunning1),
+        v1::scheduler::SendAcknowledge(
+            frameworkId,
+            offer.agent_id())))
+    .WillOnce(DoAll(
+        FutureArg<1>(&updateRunning2),
+        v1::scheduler::SendAcknowledge(
+            frameworkId,
+            offer.agent_id())));
+
+  mesos.send(v1::createCallAccept(
+      frameworkId,
+      offer,
+      v1::LAUNCH_GROUP(
+          executorInfo,
+          v1::createTaskGroupInfo({task1, task2}))));
+
+  AWAIT_READY(updateRunning1);
+  AWAIT_READY(updateRunning2);
+
+  ASSERT_EQ(TASK_RUNNING, updateRunning1->status().state());
+  ASSERT_EQ(TASK_RUNNING, updateRunning2->status().state());
+
+  ASSERT_TRUE(updateRunning1->status().has_container_status());
+  ASSERT_TRUE(updateRunning2->status().has_container_status());
+
+  v1::ContainerStatus status1 = updateRunning1->status().container_status();
+  v1::ContainerStatus status2 = updateRunning2->status().container_status();
+
+  ASSERT_TRUE(status1.has_container_id());
+  ASSERT_TRUE(status2.has_container_id());
+
+  EXPECT_TRUE(status1.container_id().has_parent());
+  EXPECT_TRUE(status2.container_id().has_parent());
+  EXPECT_NE(status1.container_id(), status2.container_id());
+  EXPECT_EQ(status1.container_id().parent(),
+            status2.container_id().parent());
+}
+
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {

http://git-wip-us.apache.org/repos/asf/mesos/blob/bfd44863/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index 0d21175..f94882f 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -362,6 +362,7 @@ using mesos::v1::TASK_UNKNOWN;
 
 using mesos::v1::AgentID;
 using mesos::v1::ContainerID;
+using mesos::v1::ContainerStatus;
 using mesos::v1::ExecutorID;
 using mesos::v1::ExecutorInfo;
 using mesos::v1::Filters;

Reply via email to