You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jp...@apache.org on 2018/04/16 21:07:57 UTC

[1/2] mesos git commit: Adopted `createTask` helper API in Docker containerizer tests.

Repository: mesos
Updated Branches:
  refs/heads/master 95fc99fdf -> fd7889a34


Adopted `createTask` helper API in Docker containerizer tests.

The Docker containerizer tests were manually creating the `TaskInfo`
for the tasks they wanted to launch. We can remove some of that
boilerplate by adopting the `createTask` helper.

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


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

Branch: refs/heads/master
Commit: 5f74c05b866c2fdfd24ecc4e3b99bd5bcf0676df
Parents: 95fc99f
Author: James Peach <jp...@apache.org>
Authored: Mon Apr 16 13:42:00 2018 -0700
Committer: James Peach <jp...@apache.org>
Committed: Mon Apr 16 13:42:00 2018 -0700

----------------------------------------------------------------------
 .../docker_containerizer_tests.cpp              | 449 ++++++-------------
 src/tests/mesos.hpp                             |   2 +
 2 files changed, 144 insertions(+), 307 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5f74c05b/src/tests/containerizer/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_containerizer_tests.cpp b/src/tests/containerizer/docker_containerizer_tests.cpp
index 847258d..902a247 100644
--- a/src/tests/containerizer/docker_containerizer_tests.cpp
+++ b/src/tests/containerizer/docker_containerizer_tests.cpp
@@ -237,22 +237,17 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch_Executor)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
-  ExecutorInfo executorInfo;
   ExecutorID executorId;
   executorId.set_value("e1");
-  executorInfo.mutable_executor_id()->CopyFrom(executorId);
 
   CommandInfo command;
   command.set_value("/bin/test-executor");
-  executorInfo.mutable_command()->CopyFrom(command);
+
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command,
+      executorId);
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -262,9 +257,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch_Executor)
   dockerInfo.set_image("tnachen/test-executor");
 
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-  executorInfo.mutable_container()->CopyFrom(containerInfo);
 
-  task.mutable_executor()->CopyFrom(executorInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -363,22 +357,17 @@ TEST_F(DockerContainerizerTest, DISABLED_ROOT_DOCKER_Launch_Executor_Bridged)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
-  ExecutorInfo executorInfo;
   ExecutorID executorId;
   executorId.set_value("e1");
-  executorInfo.mutable_executor_id()->CopyFrom(executorId);
 
   CommandInfo command;
   command.set_value("/bin/test-executor");
-  executorInfo.mutable_command()->CopyFrom(command);
+
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command,
+      executorId);
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -389,9 +378,8 @@ TEST_F(DockerContainerizerTest, DISABLED_ROOT_DOCKER_Launch_Executor_Bridged)
   dockerInfo.set_network(ContainerInfo::DockerInfo::BRIDGE);
 
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-  executorInfo.mutable_container()->CopyFrom(containerInfo);
 
-  task.mutable_executor()->CopyFrom(executorInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -481,16 +469,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -500,7 +482,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -635,16 +616,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Kill)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -654,7 +629,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Kill)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -767,16 +741,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_TaskKillingCapability)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -786,7 +754,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_TaskKillingCapability)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -892,18 +859,15 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Usage)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
   // Run a CPU intensive command, so we can measure utime and stime later.
   command.set_value("dd if=/dev/zero of=/dev/null");
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -912,7 +876,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Usage)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -1042,16 +1005,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -1061,7 +1018,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -1631,8 +1587,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchWithPersistentVolumes)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  const Offer& offer = offers.get()[0];
-
   Resource volume = createPersistentVolume(
     Megabytes(64),
     "role1",
@@ -1642,17 +1596,15 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchWithPersistentVolumes)
     None(),
     frameworkInfo.principal());
 
-  TaskInfo task;
-  task.set_name("");
-  task.mutable_task_id()->set_value("1");
-  task.mutable_slave_id()->CopyFrom(offer.slave_id());
-  task.mutable_resources()->CopyFrom(
-      Resources::parse("cpus:1;mem:64").get() + volume);
-
   CommandInfo command;
   command.set_value("echo abc > " +
                     path::join(flags.sandbox_directory, "path1", "file"));
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      Resources::parse("cpus:1;mem:64").get() + volume,
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -1661,7 +1613,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchWithPersistentVolumes)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   // We use the filter explicitly here so that the resources will not
@@ -1687,7 +1638,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchWithPersistentVolumes)
     .WillRepeatedly(DoDefault());
 
   driver.acceptOffers(
-      {offer.id()},
+      {offers->front().id()},
       {CREATE(volume), LAUNCH({task})},
       filters);
 
@@ -1797,8 +1748,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverPersistentVolumes)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  const Offer& offer = offers.get()[0];
-
   Resource volume = createPersistentVolume(
     Megabytes(64),
     "role1",
@@ -1808,15 +1757,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverPersistentVolumes)
     None(),
     frameworkInfo.principal());
 
-  TaskInfo task;
-  task.set_name("");
-  task.mutable_task_id()->set_value("1");
-  task.mutable_slave_id()->CopyFrom(offer.slave_id());
-  task.mutable_resources()->CopyFrom(
-      Resources::parse("cpus:1;mem:64").get() + volume);
-
-  CommandInfo command;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      Resources::parse("cpus:1;mem:64").get() + volume,
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -1826,7 +1770,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverPersistentVolumes)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -1845,7 +1788,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverPersistentVolumes)
     .WillRepeatedly(DoDefault());
 
   driver.acceptOffers(
-      {offer.id()},
+      {offers->front().id()},
       {CREATE(volume), LAUNCH({task})},
       filters);
 
@@ -1965,8 +1908,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  const Offer& offer = offers.get()[0];
-
   Resource volume = createPersistentVolume(
     Megabytes(64),
     "role1",
@@ -1976,15 +1917,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
     None(),
     frameworkInfo.principal());
 
-  TaskInfo task;
-  task.set_name("");
-  task.mutable_task_id()->set_value("1");
-  task.mutable_slave_id()->CopyFrom(offer.slave_id());
-  task.mutable_resources()->CopyFrom(
-      Resources::parse("cpus:1;mem:64").get() + volume);
-
-  CommandInfo command;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      Resources::parse("cpus:1;mem:64").get() + volume,
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -1994,7 +1930,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2013,7 +1948,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
     .WillRepeatedly(DoDefault());
 
   driver.acceptOffers(
-      {offer.id()},
+      {offers->front().id()},
       {CREATE(volume), LAUNCH({task})},
       filters);
 
@@ -2035,7 +1970,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
   ASSERT_SOME(
       os::rmdir(getFrameworkPath(
           getMetaRootDir(flags.work_dir),
-          offer.slave_id(),
+          offers->front().slave_id(),
           frameworkId.get())));
 
   logger = ContainerLogger::create(flags.container_logger);
@@ -2133,14 +2068,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Logs)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
   string uuid = id::UUID::random().toString();
 
   // NOTE: We prefix `echo` with `unbuffer` so that we can immediately
@@ -2152,6 +2079,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Logs)
       "unbuffer echo out" + uuid + " ; "
       "unbuffer echo err" + uuid + " 1>&2");
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -2162,7 +2094,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Logs)
   dockerInfo.set_image("mesosphere/alpine-expect");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2277,14 +2208,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
   command.set_shell(false);
 
@@ -2292,6 +2215,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD)
   // will still be able to run the container because it has a default
   // entrypoint!
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -2300,7 +2228,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD)
   dockerInfo.set_image("mesosphere/inky");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2414,14 +2341,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Override)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
   string uuid = id::UUID::random().toString();
 
   CommandInfo command;
@@ -2431,6 +2350,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Override)
   // passed as an argument to the entrypoint, i.e., 'echo uuid'.
   command.set_value(uuid);
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -2439,7 +2363,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Override)
   dockerInfo.set_image("mesosphere/inky");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2556,14 +2479,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Args)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
   string uuid = id::UUID::random().toString();
 
   CommandInfo command;
@@ -2574,6 +2489,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Args)
   // entrypoint!
   command.add_arguments(uuid);
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -2582,7 +2502,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Args)
   dockerInfo.set_image("mesosphere/inky");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2700,16 +2619,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SlaveRecoveryTaskContainer)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -2719,7 +2632,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SlaveRecoveryTaskContainer)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -2875,22 +2787,17 @@ TEST_F(DockerContainerizerTest,
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
-  ExecutorInfo executorInfo;
   ExecutorID executorId;
   executorId.set_value("e1");
-  executorInfo.mutable_executor_id()->CopyFrom(executorId);
 
   CommandInfo command;
   command.set_value("test-executor");
-  executorInfo.mutable_command()->CopyFrom(command);
+
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command,
+      executorId);
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -2900,9 +2807,7 @@ TEST_F(DockerContainerizerTest,
   dockerInfo.set_image("mesosphere/test-executor");
 
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-  executorInfo.mutable_container()->CopyFrom(containerInfo);
-
-  task.mutable_executor()->CopyFrom(executorInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
   EXPECT_CALL(*dockerContainerizer, launch(_, _, _, _))
@@ -3046,14 +2951,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NC_PortMapping)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
   command.set_shell(false);
   command.set_value("nc");
@@ -3061,6 +2958,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NC_PortMapping)
   command.add_arguments("-p");
   command.add_arguments("1000");
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -3076,7 +2978,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NC_PortMapping)
   dockerInfo.add_port_mappings()->CopyFrom(portMapping);
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -3200,16 +3101,13 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchSandboxWithColon)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  const Offer& offer = offers.get()[0];
-
-  TaskInfo task;
-  task.set_name("");
-  task.mutable_task_id()->set_value("test:colon");
-  task.mutable_slave_id()->CopyFrom(offer.slave_id());
-  task.mutable_resources()->CopyFrom(offer.resources());
-
-  CommandInfo command;
-  command.set_value("sleep 1000");
+  // Create a sleep task whose name is "test:colon".
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000),
+      None(),
+      "test:colon");
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3219,7 +3117,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchSandboxWithColon)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -3321,16 +3218,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhileFetching)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3340,7 +3231,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhileFetching)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusFailed;
@@ -3441,16 +3331,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhilePulling)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3460,7 +3344,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhilePulling)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusFailed;
@@ -3584,16 +3467,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_ExecutorCleanupWhenLaunchFailed)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("ls");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      "ls");
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3602,7 +3479,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_ExecutorCleanupWhenLaunchFailed)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusGone;
@@ -3692,16 +3568,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_FetchFailure)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("ls");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      "ls");
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3710,7 +3580,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_FetchFailure)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusFailed;
@@ -3803,16 +3672,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerPullFailure)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("ls");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      "ls");
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3821,7 +3684,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerPullFailure)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusFailed;
@@ -3923,22 +3785,17 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerInspectDiscard)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
-  ExecutorInfo executorInfo;
   ExecutorID executorId;
   executorId.set_value("e1");
-  executorInfo.mutable_executor_id()->CopyFrom(executorId);
 
   CommandInfo command;
   command.set_value("/bin/test-executor");
-  executorInfo.mutable_command()->CopyFrom(command);
+
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command,
+      executorId);
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -3948,9 +3805,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerInspectDiscard)
   dockerInfo.set_image("tnachen/test-executor");
 
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-  executorInfo.mutable_container()->CopyFrom(containerInfo);
 
-  task.mutable_executor()->CopyFrom(executorInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -4211,17 +4067,14 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NoTransitionFromKillingToFinished)
   AWAIT_READY(offers);
   EXPECT_EQ(1u, offers->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;
   command.set_shell(false);
 
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
+
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
 
@@ -4233,7 +4086,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NoTransitionFromKillingToFinished)
   dockerInfo.set_image("nginx:alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -4342,16 +4194,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_CGROUPS_CFS_CgroupsEnableCFS)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -4361,7 +4207,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_CGROUPS_CFS_CgroupsEnableCFS)
   dockerInfo.set_image("alpine");
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;
@@ -4486,19 +4331,16 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Non_Root_Sandbox)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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());
-
   // Start the task as a user without supplying an explicit command
   // user. This should inherit the framework user for the task
   // ownership.
-  CommandInfo* command = task.mutable_command();
-  command->set_value("echo \"foo\" && sleep 1000");
+  CommandInfo command;
+  command.set_value("echo \"foo\" && sleep 1000");
+
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      command);
 
   ContainerInfo* containerInfo = task.mutable_container();
   containerInfo->set_type(ContainerInfo::DOCKER);
@@ -4644,16 +4486,10 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DefaultDNS)
   AWAIT_READY(offers);
   ASSERT_FALSE(offers->empty());
 
-  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;
-  command.set_value("sleep 1000");
+  TaskInfo task = createTask(
+      offers->front().slave_id(),
+      offers->front().resources(),
+      SLEEP_COMMAND(1000));
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -4664,7 +4500,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DefaultDNS)
   dockerInfo.set_network(ContainerInfo::DockerInfo::BRIDGE);
   containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
-  task.mutable_command()->CopyFrom(command);
   task.mutable_container()->CopyFrom(containerInfo);
 
   Future<ContainerID> containerId;

http://git-wip-us.apache.org/repos/asf/mesos/blob/5f74c05b/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index 6f4e0c5..7356523 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -785,6 +785,8 @@ inline void setAgentID(TaskInfo* task, const SlaveID& slaveId)
 {
   task->mutable_slave_id()->CopyFrom(slaveId);
 }
+
+
 inline void setAgentID(
     mesos::v1::TaskInfo* task,
     const mesos::v1::AgentID& agentId)


[2/2] mesos git commit: Added a `createDockerInfo` helper API in Docker containerizer tests.

Posted by jp...@apache.org.
Added a `createDockerInfo` helper API in Docker containerizer tests.

The Docker containerizer tests all create a Docker `ContainerInfo`.
We can reduce the amount of copy/paste boilerplate by adding a
simple helper function to create a `ContainerInfo` with a Docker
image.

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


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

Branch: refs/heads/master
Commit: fd7889a34caa6bc927863500d69bbaf190b9fea8
Parents: 5f74c05
Author: James Peach <jp...@apache.org>
Authored: Mon Apr 16 13:42:11 2018 -0700
Committer: James Peach <jp...@apache.org>
Committed: Mon Apr 16 13:42:11 2018 -0700

----------------------------------------------------------------------
 .../docker_containerizer_tests.cpp              | 330 ++++---------------
 1 file changed, 64 insertions(+), 266 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/fd7889a3/src/tests/containerizer/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_containerizer_tests.cpp b/src/tests/containerizer/docker_containerizer_tests.cpp
index 902a247..5e3dfdb 100644
--- a/src/tests/containerizer/docker_containerizer_tests.cpp
+++ b/src/tests/containerizer/docker_containerizer_tests.cpp
@@ -98,6 +98,18 @@ namespace internal {
 namespace tests {
 
 
+static
+ContainerInfo createDockerInfo(const string& imageName)
+{
+  ContainerInfo containerInfo;
+
+  containerInfo.set_type(ContainerInfo::DOCKER);
+  containerInfo.mutable_docker()->set_image(imageName);
+
+  return containerInfo;
+}
+
+
 class DockerContainerizerTest : public MesosTest
 {
 public:
@@ -249,16 +261,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch_Executor)
       command,
       executorId);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("tnachen/test-executor");
-
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(
+      createDockerInfo("tnachen/test-executor"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -369,15 +374,11 @@ TEST_F(DockerContainerizerTest, DISABLED_ROOT_DOCKER_Launch_Executor_Bridged)
       command,
       executorId);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("tnachen/test-executor");
-  dockerInfo.set_network(ContainerInfo::DockerInfo::BRIDGE);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
 
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  containerInfo.mutable_docker()->set_network(
+      ContainerInfo::DockerInfo::BRIDGE);
 
   task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
 
@@ -474,15 +475,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -621,15 +615,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Kill)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -746,15 +733,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_TaskKillingCapability)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -868,15 +848,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Usage)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -1010,15 +983,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -1155,13 +1121,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Recover)
 
   Resources resources = Resources::parse("cpus:1;mem:512").get();
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
 
   CommandInfo commandInfo;
   commandInfo.set_value("sleep 1000");
@@ -1291,14 +1252,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_KillOrphanContainers)
 
   Resources resources = Resources::parse("cpus:1;mem:512").get();
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
 
   CommandInfo commandInfo;
   commandInfo.set_value("sleep 1000");
@@ -1481,19 +1436,14 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SkipRecoverMalformedUUID)
   ASSERT_TRUE(docker->rm(container, true).await(Seconds(30)));
 
   Resources resources = Resources::parse("cpus:1;mem:512").get();
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
 
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
 
   CommandInfo commandInfo;
   commandInfo.set_value("sleep 1000");
 
   Try<Docker::RunOptions> runOptions = Docker::RunOptions::create(
-      containerInfo,
+      createDockerInfo("alpine"),
       commandInfo,
       container,
       flags.work_dir,
@@ -1605,15 +1555,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchWithPersistentVolumes)
       Resources::parse("cpus:1;mem:64").get() + volume,
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   // We use the filter explicitly here so that the resources will not
   // be filtered for 5 seconds (the default).
@@ -1762,15 +1705,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverPersistentVolumes)
       Resources::parse("cpus:1;mem:64").get() + volume,
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -1922,15 +1858,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_RecoverOrphanedPersistentVolumes)
       Resources::parse("cpus:1;mem:64").get() + volume,
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -2084,17 +2013,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Logs)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
   // NOTE: This is an image that is exactly
   // `docker run -t -i alpine /bin/sh -c "apk add --update expect"`.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("mesosphere/alpine-expect");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(
+      createDockerInfo("mesosphere/alpine-expect"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -2220,15 +2143,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("mesosphere/inky");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("mesosphere/inky"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -2355,15 +2271,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Override)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("mesosphere/inky");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("mesosphere/inky"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -2494,15 +2403,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Args)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("mesosphere/inky");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("mesosphere/inky"));
 
   Future<ContainerID> containerId;
   Future<ContainerConfig> containerConfig;
@@ -2624,15 +2526,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SlaveRecoveryTaskContainer)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(*dockerContainerizer, launch(_, _, _, _))
@@ -2799,15 +2694,9 @@ TEST_F(DockerContainerizerTest,
       command,
       executorId);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("mesosphere/test-executor");
-
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(
+      createDockerInfo("mesosphere/test-executor"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(*dockerContainerizer, launch(_, _, _, _))
@@ -2963,20 +2852,17 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NC_PortMapping)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  dockerInfo.set_network(ContainerInfo::DockerInfo::BRIDGE);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
+
+  containerInfo.mutable_docker()->set_network(
+      ContainerInfo::DockerInfo::BRIDGE);
 
   ContainerInfo::DockerInfo::PortMapping portMapping;
   portMapping.set_host_port(10000);
   portMapping.set_container_port(1000);
 
-  dockerInfo.add_port_mappings()->CopyFrom(portMapping);
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  containerInfo.mutable_docker()->add_port_mappings()->CopyFrom(portMapping);
 
   task.mutable_container()->CopyFrom(containerInfo);
 
@@ -3109,15 +2995,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchSandboxWithColon)
       None(),
       "test:colon");
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -3223,15 +3102,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhileFetching)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3336,15 +3208,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhilePulling)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3472,14 +3337,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_ExecutorCleanupWhenLaunchFailed)
       offers->front().resources(),
       "ls");
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<TaskStatus> statusGone;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3573,14 +3431,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_FetchFailure)
       offers->front().resources(),
       "ls");
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3677,14 +3528,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerPullFailure)
       offers->front().resources(),
       "ls");
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3797,16 +3641,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerInspectDiscard)
       command,
       executorId);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("tnachen/test-executor");
-
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_executor()->mutable_container()->CopyFrom(containerInfo);
+  task.mutable_executor()->mutable_container()->CopyFrom(
+      createDockerInfo("tnachen/test-executor"));
 
   Future<TaskStatus> statusFailed;
   EXPECT_CALL(sched, statusUpdate(&driver, _))
@@ -3933,9 +3770,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NoTransitionFromKillingToRunning)
   // The docker container runs in host network mode.
   //
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-  containerInfo.mutable_docker()->set_image("alpine");
+  ContainerInfo containerInfo = createDockerInfo("alpine");
+
   containerInfo.mutable_docker()->set_network(
       ContainerInfo::DockerInfo::HOST);
 
@@ -4075,18 +3911,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NoTransitionFromKillingToFinished)
       offers->front().resources(),
       command);
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // The "nginx:alpine" container returns an "EXIT_STATUS" of 0 on
   // receiving a SIGTERM.
   //
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("nginx:alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("nginx:alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(containerizer, launch(_, _, _, _))
@@ -4199,15 +4028,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_CGROUPS_CFS_CgroupsEnableCFS)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -4342,12 +4164,8 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Non_Root_Sandbox)
       offers->front().resources(),
       command);
 
-  ContainerInfo* containerInfo = task.mutable_container();
-  containerInfo->set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo* dockerInfo = containerInfo->mutable_docker();
-  dockerInfo->set_image("alpine");
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -4491,14 +4309,11 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DefaultDNS)
       offers->front().resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  dockerInfo.set_network(ContainerInfo::DockerInfo::BRIDGE);
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
+
+  containerInfo.mutable_docker()->set_network(
+      ContainerInfo::DockerInfo::BRIDGE);
 
   task.mutable_container()->CopyFrom(containerInfo);
 
@@ -4666,15 +4481,8 @@ TEST_F(DockerContainerizerIPv6Test, ROOT_DOCKER_LaunchIPv6HostNetwork)
       offer.resources(),
       SLEEP_COMMAND(10000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))
@@ -4858,14 +4666,11 @@ TEST_F(
       offer.resources(),
       SLEEP_COMMAND(10000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  dockerInfo.set_network(ContainerInfo::DockerInfo::USER);
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+  ContainerInfo containerInfo = createDockerInfo("alpine");
+
+  containerInfo.mutable_docker()->set_network(
+      ContainerInfo::DockerInfo::USER);
 
   // Setup the docker IPv6 network.
   NetworkInfo networkInfo;
@@ -5116,15 +4921,8 @@ TEST_F_TEMP_DISABLED_ON_WINDOWS(
       offer.resources(),
       SLEEP_COMMAND(1000));
 
-  ContainerInfo containerInfo;
-  containerInfo.set_type(ContainerInfo::DOCKER);
-
   // TODO(tnachen): Use local image to test if possible.
-  ContainerInfo::DockerInfo dockerInfo;
-  dockerInfo.set_image("alpine");
-  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
-
-  task.mutable_container()->CopyFrom(containerInfo);
+  task.mutable_container()->CopyFrom(createDockerInfo("alpine"));
 
   Future<ContainerID> containerId;
   EXPECT_CALL(dockerContainerizer, launch(_, _, _, _))