You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2014/08/05 00:09:31 UTC

[10/43] git commit: Add environment test for Docker.

Add environment test for Docker.


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

Branch: refs/heads/master
Commit: 4406fb546b3f154bcf2beca49508b29656a3c3a5
Parents: 1ecab99
Author: Timothy Chen <tn...@gmail.com>
Authored: Tue Jun 24 11:28:34 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Mon Aug 4 15:08:15 2014 -0700

----------------------------------------------------------------------
 src/Makefile.am                          |   1 +
 src/docker/docker.cpp                    |  14 +++
 src/docker/docker.hpp                    |   4 +
 src/slave/containerizer/docker.cpp       |  10 +--
 src/tests/docker_containerizer_tests.cpp | 121 ++++++++++++++++++++++++++
 src/tests/environment.cpp                |  10 ++-
 6 files changed, 152 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index 7507d72..aad5440 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1045,6 +1045,7 @@ mesos_tests_SOURCES =				\
   tests/containerizer.cpp			\
   tests/containerizer_tests.cpp			\
   tests/credentials_tests.cpp			\
+  tests/docker_containerizer_tests.cpp          \
   tests/environment.cpp				\
   tests/examples_tests.cpp			\
   tests/exception_tests.cpp			\

http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 976a660..53c0805 100644
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -21,6 +21,20 @@ using std::string;
 using std::vector;
 
 
+Try<Nothing> Docker::validateDocker(const Docker &docker)
+{
+  Future<list<Docker::Container> > containers = docker.ps();
+
+  if (!containers.await(Seconds(3))) {
+    return Error("Failed to use Docker: Timed out");
+  } else if (containers.isFailed()) {
+    return Error("Failed to use Docker: " + containers.failure());
+  }
+
+  return Nothing();
+}
+
+
 string Docker::Container::id() const
 {
   map<string, JSON::Value>::const_iterator entry =

http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 3bed71d..a43fa58 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -26,12 +26,16 @@
 #include <process/subprocess.hpp>
 
 #include <stout/json.hpp>
+#include <stout/nothing.hpp>
 #include <stout/option.hpp>
 
 // Abstraction for working with Docker (modeled on CLI).
 class Docker
 {
 public:
+  // Validate Docker support
+  static Try<Nothing> validateDocker(const Docker& docker);
+
   class Container
   {
   public:

http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index 3d62390..f9cfa9f 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -154,13 +154,9 @@ Try<DockerContainerizer*> DockerContainerizer::create(
     bool local,
     const Docker& docker)
 {
-  // Try out the Docker command so that
-  Future<list<Docker::Container> > containers = docker.ps();
-
-  if (!containers.await(Seconds(3))) {
-    return Error("Failed to use Docker: Timed out");
-  } else if (containers.isFailed()) {
-    return Error("Failed to use Docker: " + containers.failure());
+  Try<Nothing> validation = Docker::validateDocker(docker);
+  if (validation.isError()) {
+    return Error(validation.error());
   }
 
   return new DockerContainerizer(flags, local, docker);

http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/tests/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/docker_containerizer_tests.cpp b/src/tests/docker_containerizer_tests.cpp
new file mode 100644
index 0000000..8cbde0b
--- /dev/null
+++ b/src/tests/docker_containerizer_tests.cpp
@@ -0,0 +1,121 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <process/future.hpp>
+
+#include "tests/mesos.hpp"
+
+#include "slave/slave.hpp"
+#include "slave/containerizer/docker.hpp"
+
+using namespace mesos;
+using namespace mesos::internal;
+using namespace mesos::internal::tests;
+
+using mesos::internal::master::Master;
+
+using mesos::internal::slave::Slave;
+
+using process::Future;
+using process::PID;
+
+using std::vector;
+using std::list;
+
+using testing::_;
+using testing::Eq;
+using testing::Return;
+
+class DockerContainerizerTest : public MesosTest {};
+
+TEST_F(DockerContainerizerTest, DOCKER_Launch) {
+  Try<PID<Master> > master = StartMaster();
+  ASSERT_SOME(master);
+
+  slave::Flags flags = CreateSlaveFlags();
+  flags.isolation.clear();
+  flags.containerizers = "docker";
+
+  Try<PID<Slave> > slave = StartSlave(flags);
+  ASSERT_SOME(slave);
+
+  MockScheduler sched;
+  MesosSchedulerDriver driver(
+    &sched, DEFAULT_FRAMEWORK_INFO, master.get(), DEFAULT_CREDENTIAL);
+
+  Future<FrameworkID> frameworkId;
+  EXPECT_CALL(sched, registered(&driver, _, _))
+    .WillOnce(FutureArg<1>(&frameworkId));
+
+  Future<vector<Offer> > offers;
+  EXPECT_CALL(sched, resourceOffers(&driver, _))
+    .WillOnce(FutureArg<1>(&offers))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+  driver.start();
+
+  AWAIT_READY(offers);
+  EXPECT_NE(0u, offers.get().size());
+
+  const Offer& offer = offers.get()[0];
+
+  TaskInfo task;
+  task.set_name("");
+  task.mutable_task_id()->set_value("1");
+  task.mutable_slave_id()->CopyFrom(offer.slave_id());
+  task.mutable_resources()->CopyFrom(offer.resources());
+
+  CommandInfo command;
+
+  CommandInfo::ContainerInfo* containerInfo =
+    task.mutable_command()->mutable_container();
+
+  containerInfo->set_image("docker://busybox");
+
+  command.set_value("sleep 30");
+
+  task.mutable_command()->CopyFrom(command);
+
+  Future<TaskStatus> statusRunning;
+
+  vector<TaskInfo> tasks;
+  tasks.push_back(task);
+
+  EXPECT_CALL(sched, statusUpdate(&driver, _))
+    .WillOnce(FutureArg<1>(&statusRunning));
+
+  driver.launchTasks(offers.get()[0].id(), tasks);
+
+  AWAIT_READY(statusRunning);
+  ASSERT_EQ(TASK_RUNNING, statusRunning.get().state());
+
+  Docker docker("docker");
+  Future<list<Docker::Container> > containers = docker.ps();
+
+  AWAIT_READY(containers);
+
+  ASSERT_TRUE(containers.get().size() > 0);
+
+  driver.stop();
+  driver.join();
+
+  Shutdown();
+}

http://git-wip-us.apache.org/repos/asf/mesos/blob/4406fb54/src/tests/environment.cpp
----------------------------------------------------------------------
diff --git a/src/tests/environment.cpp b/src/tests/environment.cpp
index 551698f..5c14cca 100644
--- a/src/tests/environment.cpp
+++ b/src/tests/environment.cpp
@@ -25,6 +25,8 @@
 #include <list>
 #include <string>
 
+#include "docker/docker.hpp"
+
 #include <process/gmock.hpp>
 #include <process/gtest.hpp>
 
@@ -70,6 +72,7 @@ Environment* environment;
 //   'CGROUPS_' : Disable test if cgroups support isn't present.
 //   'NOHIERARCHY_' : Disable test if there is already a cgroups
 //       hierarchy mounted.
+//   'DOCKER_': Disable test if Docker is not supported.
 //
 // These flags can be composed in any order, but must come after
 // 'DISABLED_'. In addition, we disable tests that attempt to use the
@@ -127,6 +130,12 @@ static bool enable(const ::testing::TestInfo& test)
     }
 #endif
 
+    if (strings::contains(name, "DOCKER_")) {
+      Docker docker("docker");
+      Try<Nothing> validate = Docker::validateDocker(docker);
+      return !validate.isError();
+    }
+
     // Filter out benchmark tests when we run 'make check'.
     if (strings::contains(name, "BENCHMARK_") && !flags.benchmark) {
       return false;
@@ -332,4 +341,3 @@ Try<string> Environment::mkdtemp()
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {
-