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/16 18:38:42 UTC

[2/2] mesos git commit: Added a test that verifies container attach after agent restart.

Added a test that verifies container attach after agent restart.

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


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

Branch: refs/heads/master
Commit: 8b09da9aa6f6ed31c4fd727e546eb10afc2b7a34
Parents: 28eaa8d
Author: Vinod Kone <vi...@gmail.com>
Authored: Mon Dec 12 16:42:19 2016 -0800
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Dec 16 13:38:19 2016 -0500

----------------------------------------------------------------------
 .../containerizer/io_switchboard_tests.cpp      | 108 +++++++++++++++++++
 1 file changed, 108 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/8b09da9a/src/tests/containerizer/io_switchboard_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/io_switchboard_tests.cpp b/src/tests/containerizer/io_switchboard_tests.cpp
index 074c32b..2718071 100644
--- a/src/tests/containerizer/io_switchboard_tests.cpp
+++ b/src/tests/containerizer/io_switchboard_tests.cpp
@@ -1033,6 +1033,114 @@ TEST_F(IOSwitchboardTest, RecoverThenKillSwitchboardContainerDestroyed)
   driver.stop();
   driver.join();
 }
+
+
+// This test verifies that a container can be attached after a slave restart.
+TEST_F(IOSwitchboardTest, ContainerAttachAfterSlaveRestart)
+{
+  Try<Owned<cluster::Master>> master = StartMaster();
+  ASSERT_SOME(master);
+
+  slave::Flags flags = CreateSlaveFlags();
+  flags.launcher = "posix";
+  flags.isolation = "posix/cpu";
+#ifdef __linux__
+  flags.agent_subsystems = None();
+#endif
+
+  Fetcher fetcher;
+
+  Owned<MasterDetector> detector = master.get()->createDetector();
+
+  Try<MesosContainerizer*> create = MesosContainerizer::create(
+      flags,
+      false,
+      &fetcher);
+
+  ASSERT_SOME(create);
+
+  Owned<MesosContainerizer> containerizer(create.get());
+
+  Try<Owned<cluster::Slave>> slave = StartSlave(
+      detector.get(),
+      containerizer.get(),
+      flags);
+
+  ASSERT_SOME(slave);
+
+  MockScheduler sched;
+
+  // Enable checkpointing for the framework.
+  FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO;
+  frameworkInfo.set_checkpoint(true);
+
+  MesosSchedulerDriver driver(
+      &sched, frameworkInfo, master.get()->pid, DEFAULT_CREDENTIAL);
+
+  EXPECT_CALL(sched, registered(_, _, _));
+
+  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> statusRunning;
+  EXPECT_CALL(sched, statusUpdate(_, _))
+    .WillOnce(FutureArg<1>(&statusRunning));
+
+  Future<Nothing> _ack =
+    FUTURE_DISPATCH(_, &slave::Slave::_statusUpdateAcknowledgement);
+
+  // Launch a task with tty to start the switchboard server.
+  TaskInfo task = createTask(offers.get()[0], "sleep 1000");
+  task.mutable_container()->set_type(ContainerInfo::MESOS);
+  task.mutable_container()->mutable_tty_info();
+
+  driver.launchTasks(offers.get()[0].id(), {task});
+
+  AWAIT_READY(statusRunning);
+
+  // Wait for the ACK to be checkpointed.
+  AWAIT_READY(_ack);
+
+  // Restart the slave with a new containerizer.
+  slave.get()->terminate();
+
+  Future<Nothing> _recover = FUTURE_DISPATCH(_, &slave::Slave::_recover);
+
+  create = MesosContainerizer::create(
+      flags,
+      false,
+      &fetcher);
+
+  ASSERT_SOME(create);
+
+  containerizer.reset(create.get());
+
+  slave = StartSlave(detector.get(), containerizer.get(), flags);
+  ASSERT_SOME(slave);
+
+  // Wait until containerizer is recovered.
+  AWAIT_READY(_recover);
+
+  Future<hashset<ContainerID>> containers = containerizer.get()->containers();
+  AWAIT_READY(containers);
+  ASSERT_EQ(1u, containers.get().size());
+
+  ContainerID containerId;
+  containerId.set_value(containers->begin()->value());
+
+  Future<http::Connection> connection = containerizer->attach(containerId);
+  AWAIT_READY(connection);
+
+  driver.stop();
+  driver.join();
+}
+
 #endif // __WINDOWS__
 
 } // namespace tests {