This is an automated email from the ASF dual-hosted git repository. gilbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 773b3f7af75af45ad7db2c36a366eec56512b42f Author: Qian Zhang <[email protected]> AuthorDate: Thu Aug 15 14:04:21 2019 -0700 Added a test `SlaveTest.DefaultExecutorResources`. Review: https://reviews.apache.org/r/71287/ --- src/tests/slave_tests.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp index 1a92602..02b65a9 100644 --- a/src/tests/slave_tests.cpp +++ b/src/tests/slave_tests.cpp @@ -9332,6 +9332,121 @@ TEST_F_TEMP_DISABLED_ON_WINDOWS(SlaveTest, DefaultExecutorCommandInfo) } +// This test verifies that the agent correctly populates the resources +// for default executor. This is a regression test for MESOS-9925. +TEST_F(SlaveTest, DefaultExecutorResources) +{ + Try<Owned<cluster::Master>> master = StartMaster(); + ASSERT_SOME(master); + + auto scheduler = std::make_shared<v1::MockHTTPScheduler>(); + auto executor = std::make_shared<v1::MockHTTPExecutor>(); + + Resources resources = + Resources::parse("cpus:0.1;mem:32;disk:32").get(); + + FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO; + + ExecutorInfo executorInfo; + executorInfo.set_type(ExecutorInfo::DEFAULT); + + executorInfo.mutable_executor_id()->CopyFrom(DEFAULT_EXECUTOR_ID); + executorInfo.mutable_resources()->CopyFrom(resources); + + const ExecutorID& executorId = executorInfo.executor_id(); + TestContainerizer containerizer(executorId, executor); + + Owned<MasterDetector> detector = master.get()->createDetector(); + Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), &containerizer); + ASSERT_SOME(slave); + + Future<Nothing> connected; + EXPECT_CALL(*scheduler, connected(_)) + .WillOnce(FutureSatisfy(&connected)); + + v1::scheduler::TestMesos mesos( + master.get()->pid, + ContentType::PROTOBUF, + scheduler); + + AWAIT_READY(connected); + + 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()); + + EXPECT_CALL(*scheduler, heartbeat(_)) + .WillRepeatedly(Return()); // Ignore heartbeats. + + { + Call call; + call.set_type(Call::SUBSCRIBE); + Call::Subscribe* subscribe = call.mutable_subscribe(); + subscribe->mutable_framework_info()->CopyFrom(evolve(frameworkInfo)); + + mesos.send(call); + } + + AWAIT_READY(subscribed); + + v1::FrameworkID frameworkId(subscribed->framework_id()); + + // Update `executorInfo` with the subscribed `frameworkId`. + executorInfo.mutable_framework_id()->CopyFrom(devolve(frameworkId)); + + AWAIT_READY(offers); + ASSERT_FALSE(offers->offers().empty()); + + Future<ContainerConfig> containerConfig; + EXPECT_CALL(containerizer, launch(_, _, _, _)) + .WillOnce(DoAll(FutureArg<1>(&containerConfig), + Return(Future<Containerizer::LaunchResult>()))); + + const v1::Offer& offer = offers->offers(0); + const SlaveID slaveId = devolve(offer.agent_id()); + + v1::TaskInfo taskInfo = + evolve(createTask(slaveId, resources, "")); + + v1::TaskGroupInfo taskGroup; + taskGroup.add_tasks()->CopyFrom(taskInfo); + + { + Call call; + call.mutable_framework_id()->CopyFrom(frameworkId); + call.set_type(Call::ACCEPT); + + Call::Accept* accept = call.mutable_accept(); + accept->add_offer_ids()->CopyFrom(offer.id()); + + v1::Offer::Operation* operation = accept->add_operations(); + operation->set_type(v1::Offer::Operation::LAUNCH_GROUP); + + v1::Offer::Operation::LaunchGroup* launchGroup = + operation->mutable_launch_group(); + + launchGroup->mutable_executor()->CopyFrom(evolve(executorInfo)); + launchGroup->mutable_task_group()->CopyFrom(taskGroup); + + mesos.send(call); + } + + AWAIT_READY(containerConfig); + + Resources containerResources = Resources(containerConfig->resources()); + containerResources.unallocate(); + + // The resources used to launch executor container should include + // both executorInfo's resources and all task's resources. + EXPECT_EQ(containerResources, resources + resources); +} + + // This test ensures that we do not send a queued task group to // the executor if any of its tasks are killed before the executor // subscribes with the agent.
