Unit test for file/symlink/directory overwriting in provisioners. The test is based on the following image: https://hub.docker.com/r/chhsiao/overwrite/
Review: https://reviews.apache.org/r/58443/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/6a3b4248 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/6a3b4248 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/6a3b4248 Branch: refs/heads/master Commit: 6a3b4248924a7473d64b7da789897193c6927c7f Parents: 3c8deed Author: Chun-Hung Hsiao <[email protected]> Authored: Tue Apr 18 14:19:09 2017 +0800 Committer: Jie Yu <[email protected]> Committed: Tue Apr 18 14:19:09 2017 +0800 ---------------------------------------------------------------------- .../containerizer/provisioner_docker_tests.cpp | 117 +++++++++++++++++++ 1 file changed, 117 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/6a3b4248/src/tests/containerizer/provisioner_docker_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer/provisioner_docker_tests.cpp b/src/tests/containerizer/provisioner_docker_tests.cpp index d1224d8..2620de7 100644 --- a/src/tests/containerizer/provisioner_docker_tests.cpp +++ b/src/tests/containerizer/provisioner_docker_tests.cpp @@ -731,6 +731,123 @@ TEST_P(ProvisionerDockerWhiteoutTest, ROOT_INTERNET_CURL_Whiteout) } +class ProvisionerDockerOverwriteTest + : public MesosTest, + public WithParamInterface<string> +{ +public: + // Returns the supported backends. + static vector<string> parameters() + { + vector<string> backends = {COPY_BACKEND}; + + Try<bool> aufsSupported = fs::supported("aufs"); + if (aufsSupported.isSome() && aufsSupported.get()) { + backends.push_back(AUFS_BACKEND); + } + + Try<bool> overlayfsSupported = fs::supported("overlayfs"); + if (overlayfsSupported.isSome() && overlayfsSupported.get()) { + backends.push_back(OVERLAY_BACKEND); + } + + return backends; + } +}; + + +INSTANTIATE_TEST_CASE_P( + BackendFlag, + ProvisionerDockerOverwriteTest, + ::testing::ValuesIn(ProvisionerDockerOverwriteTest::parameters())); + + +// This test verifies that the provisioner correctly overwrites a +// directory in underlying layers with a with a regular file or symbolic +// link of the same name in an upper layer, and vice versa. +TEST_P(ProvisionerDockerOverwriteTest, ROOT_INTERNET_CURL_Overwrite) +{ + Try<Owned<cluster::Master>> master = StartMaster(); + ASSERT_SOME(master); + + slave::Flags flags = CreateSlaveFlags(); + flags.isolation = "docker/runtime,filesystem/linux"; + flags.image_providers = "docker"; + flags.image_provisioner_backend = GetParam(); + + Owned<MasterDetector> detector = master.get()->createDetector(); + Try<Owned<cluster::Slave>> slave = StartSlave(detector.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(&driver, _)) + .WillOnce(FutureArg<1>(&offers)) + .WillRepeatedly(Return()); // Ignore subsequent offers. + + driver.start(); + + AWAIT_READY(offers); + ASSERT_EQ(1u, offers->size()); + + const Offer& offer = offers.get()[0]; + + // We are using the docker image 'chhsiao/overwrite' to verify that: + // 1. The '/merged' directory is merged. + // 2. All '/replaced*' files/directories are correctly overwritten. + // 3. The '/bar' symlink and '/baz' file are correctly overwritten. + // See more details in the following link: + // https://hub.docker.com/r/chhsiao/overwrite/ + CommandInfo command = createCommandInfo( + "test -f /replaced1 &&" + "test -L /replaced2 &&" + "test -f /replaced2/m1 &&" + "test -f /replaced2/m2 &&" + "! test -e /replaced2/r2 &&" + "test -d /replaced3 &&" + "test -d /replaced4 &&" + "! test -e /replaced4/m1 &&" + "test -f /foo &&" + "! test -L /bar &&" + "test -L /baz"); + + TaskInfo task = createTask( + offer.slave_id(), + Resources::parse("cpus:1;mem:128").get(), + command); + + Image image = createDockerImage("chhsiao/overwrite"); + + ContainerInfo* container = task.mutable_container(); + container->set_type(ContainerInfo::MESOS); + container->mutable_mesos()->mutable_image()->CopyFrom(image); + + Future<TaskStatus> statusRunning; + Future<TaskStatus> statusFinished; + EXPECT_CALL(sched, statusUpdate(&driver, _)) + .WillOnce(FutureArg<1>(&statusRunning)) + .WillOnce(FutureArg<1>(&statusFinished)); + + driver.launchTasks(offer.id(), {task}); + + AWAIT_READY_FOR(statusRunning, Seconds(60)); + EXPECT_EQ(task.task_id(), statusRunning->task_id()); + EXPECT_EQ(TASK_RUNNING, statusRunning->state()); + + AWAIT_READY(statusFinished); + EXPECT_EQ(task.task_id(), statusFinished->task_id()); + EXPECT_EQ(TASK_FINISHED, statusFinished->state()); + + driver.stop(); + driver.join(); +} + + // This test verifies that Docker image can be pulled from the // repository by digest. TEST_F(ProvisionerDockerPullerTest, ROOT_INTERNET_CURL_ImageDigest)
