Added a test using Docker, a file URI, and the DefaultExecutor. This test verifies that URIs set on Docker tasks are fetched and made available to them when started by the DefaultExecutor.
Review: https://reviews.apache.org/r/62632/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/6eefc685 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/6eefc685 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/6eefc685 Branch: refs/heads/master Commit: 6eefc685ccf304d0fb8ed4ff9bc314197d77f078 Parents: f429f40 Author: Gaston Kleiman <gas...@mesosphere.io> Authored: Fri Sep 29 12:14:44 2017 -0700 Committer: Vinod Kone <vinodk...@gmail.com> Committed: Fri Sep 29 12:14:44 2017 -0700 ---------------------------------------------------------------------- src/tests/default_executor_tests.cpp | 111 ++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/6eefc685/src/tests/default_executor_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/default_executor_tests.cpp b/src/tests/default_executor_tests.cpp index de6f8d4..63952d9 100644 --- a/src/tests/default_executor_tests.cpp +++ b/src/tests/default_executor_tests.cpp @@ -1469,6 +1469,117 @@ TEST_P(DefaultExecutorTest, TaskWithFileURI) } +// This test verifies that URIs set on Docker tasks are fetched and made +// available to them when started by the DefaultExecutor. +TEST_P(DefaultExecutorTest, ROOT_INTERNET_CURL_DockerTaskWithFileURI) +{ + Try<Owned<cluster::Master>> master = StartMaster(); + ASSERT_SOME(master); + + slave::Flags flags = CreateSlaveFlags(); + flags.containerizers = GetParam(); + flags.isolation = "docker/runtime,filesystem/linux"; + flags.image_providers = "docker"; + + // Image pulling time may be long, depending on the location of + // the registry server. + flags.executor_registration_timeout = Minutes(10); + + 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>(); + + EXPECT_CALL(*scheduler, connected(_)) + .WillOnce(v1::scheduler::SendSubscribe(v1::DEFAULT_FRAMEWORK_INFO)); + + Future<v1::scheduler::Event::Subscribed> subscribed; + EXPECT_CALL(*scheduler, subscribed(_, _)) + .WillOnce(FutureArg<1>(&subscribed)); + + Future<v1::scheduler::Event::Offers> offers; + EXPECT_CALL(*scheduler, offers(_, _)) + .WillOnce(FutureArg<1>(&offers)) + .WillRepeatedly(Return()); // Ignore subsequent offers. + + EXPECT_CALL(*scheduler, heartbeat(_)) + .WillRepeatedly(Return()); // Ignore heartbeats. + + v1::scheduler::TestMesos mesos( + master.get()->pid, + ContentType::PROTOBUF, + scheduler); + + AWAIT_READY(subscribed); + v1::FrameworkID frameworkId(subscribed->framework_id()); + + AWAIT_READY(offers); + ASSERT_FALSE(offers->offers().empty()); + + const v1::Offer& offer = offers->offers(0); + const v1::AgentID& agentId = offer.agent_id(); + + v1::ExecutorInfo executorInfo = v1::createExecutorInfo( + v1::DEFAULT_EXECUTOR_ID, + None(), + "cpus:0.1;mem:32;disk:32", + v1::ExecutorInfo::DEFAULT, + frameworkId); + + // Create a task that will check if a file called 'testFile' + // contains the text 'pizza'. + + // Create the file that should be fetched for the task + string fromPath = path::join(os::getcwd(), "fromPath"); + ASSERT_SOME(os::mkdir(fromPath)); + string testFilePath = path::join(fromPath, "testFile"); + EXPECT_SOME(os::write(testFilePath, "pizza")); + + v1::TaskInfo taskInfo = v1::createTask( + agentId, + v1::Resources::parse("cpus:0.1;mem:32;disk:32").get(), + "test `cat testFile` = pizza"); + + taskInfo.mutable_command()->add_uris()->set_value("file://" + testFilePath); + + mesos::v1::Image image; + image.set_type(mesos::v1::Image::DOCKER); + image.mutable_docker()->set_name("alpine"); + + mesos::v1::ContainerInfo* container = taskInfo.mutable_container(); + container->set_type(mesos::v1::ContainerInfo::MESOS); + container->mutable_mesos()->mutable_image()->CopyFrom(image); + + Future<v1::scheduler::Event::Update> runningUpdate; + Future<v1::scheduler::Event::Update> finishedUpdate; + EXPECT_CALL(*scheduler, update(_, _)) + .WillOnce( + DoAll( + FutureArg<1>(&runningUpdate), + v1::scheduler::SendAcknowledge(frameworkId, agentId))) + .WillOnce( + DoAll( + FutureArg<1>(&finishedUpdate), + v1::scheduler::SendAcknowledge(frameworkId, agentId))); + + mesos.send( + v1::createCallAccept( + frameworkId, + offer, + {v1::LAUNCH_GROUP( + executorInfo, v1::createTaskGroupInfo({taskInfo}))})); + + AWAIT_READY(runningUpdate); + ASSERT_EQ(TASK_RUNNING, runningUpdate->status().state()); + ASSERT_EQ(taskInfo.task_id(), runningUpdate->status().task_id()); + + AWAIT_READY(finishedUpdate); + ASSERT_EQ(TASK_FINISHED, finishedUpdate->status().state()); + ASSERT_EQ(taskInfo.task_id(), finishedUpdate->status().task_id()); +} + + class PersistentVolumeDefaultExecutor : public MesosTest, public WithParamInterface<LauncherAndIsolationParam>