You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ne...@apache.org on 2017/07/11 18:03:48 UTC
[7/8] mesos git commit: Changed allocator to offer remote resources
to region-aware frameworks.
Changed allocator to offer remote resources to region-aware frameworks.
Changed allocator to offer remote resources to region-aware frameworks.
Review: https://reviews.apache.org/r/59766/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/25111bb0
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/25111bb0
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/25111bb0
Branch: refs/heads/master
Commit: 25111bb03cd663a51e30b74feb2493203ea31d45
Parents: 5cf4934
Author: Neil Conway <ne...@gmail.com>
Authored: Tue Jul 11 10:43:43 2017 -0700
Committer: Neil Conway <ne...@gmail.com>
Committed: Tue Jul 11 10:43:43 2017 -0700
----------------------------------------------------------------------
include/mesos/allocator/allocator.hpp | 3 +-
src/master/allocator/mesos/allocator.hpp | 12 +-
src/master/allocator/mesos/hierarchical.cpp | 54 +++++++-
src/master/allocator/mesos/hierarchical.hpp | 13 +-
src/master/master.cpp | 3 +-
src/tests/allocator.hpp | 9 +-
src/tests/api_tests.cpp | 4 +-
src/tests/master_allocator_tests.cpp | 36 +++---
src/tests/master_quota_tests.cpp | 20 +--
src/tests/master_tests.cpp | 155 +++++++++++++++++++++++
src/tests/reservation_tests.cpp | 6 +-
src/tests/resource_offers_tests.cpp | 2 +-
src/tests/slave_recovery_tests.cpp | 2 +-
13 files changed, 272 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/include/mesos/allocator/allocator.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/allocator/allocator.hpp b/include/mesos/allocator/allocator.hpp
index 9d116c6..537658b 100644
--- a/include/mesos/allocator/allocator.hpp
+++ b/include/mesos/allocator/allocator.hpp
@@ -94,7 +94,8 @@ public:
inverseOfferCallback,
const Option<std::set<std::string>>&
fairnessExcludeResourceNames = None(),
- bool filterGpuResources = true) = 0;
+ bool filterGpuResources = true,
+ const Option<DomainInfo>& domain = None()) = 0;
/**
* Informs the allocator of the recovered state from the master.
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/master/allocator/mesos/allocator.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/allocator.hpp b/src/master/allocator/mesos/allocator.hpp
index 725ec7c..903edf6 100644
--- a/src/master/allocator/mesos/allocator.hpp
+++ b/src/master/allocator/mesos/allocator.hpp
@@ -58,7 +58,8 @@ public:
inverseOfferCallback,
const Option<std::set<std::string>>&
fairnessExcludeResourceNames = None(),
- bool filterGpuResources = true);
+ bool filterGpuResources = true,
+ const Option<DomainInfo>& domain = None());
void recover(
const int expectedAgentCount,
@@ -197,7 +198,8 @@ public:
inverseOfferCallback,
const Option<std::set<std::string>>&
fairnessExcludeResourceNames = None(),
- bool filterGpuResources = true) = 0;
+ bool filterGpuResources = true,
+ const Option<DomainInfo>& domain = None()) = 0;
virtual void recover(
const int expectedAgentCount,
@@ -345,7 +347,8 @@ inline void MesosAllocator<AllocatorProcess>::initialize(
const hashmap<SlaveID, UnavailableResources>&)>&
inverseOfferCallback,
const Option<std::set<std::string>>& fairnessExcludeResourceNames,
- bool filterGpuResources)
+ bool filterGpuResources,
+ const Option<DomainInfo>& domain)
{
process::dispatch(
process,
@@ -354,7 +357,8 @@ inline void MesosAllocator<AllocatorProcess>::initialize(
offerCallback,
inverseOfferCallback,
fairnessExcludeResourceNames,
- filterGpuResources);
+ filterGpuResources,
+ domain);
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/master/allocator/mesos/hierarchical.cpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/hierarchical.cpp b/src/master/allocator/mesos/hierarchical.cpp
index fad9330..f021c34 100644
--- a/src/master/allocator/mesos/hierarchical.cpp
+++ b/src/master/allocator/mesos/hierarchical.cpp
@@ -150,13 +150,15 @@ void HierarchicalAllocatorProcess::initialize(
const hashmap<SlaveID, UnavailableResources>&)>&
_inverseOfferCallback,
const Option<set<string>>& _fairnessExcludeResourceNames,
- bool _filterGpuResources)
+ bool _filterGpuResources,
+ const Option<DomainInfo>& _domain)
{
allocationInterval = _allocationInterval;
offerCallback = _offerCallback;
inverseOfferCallback = _inverseOfferCallback;
fairnessExcludeResourceNames = _fairnessExcludeResourceNames;
filterGpuResources = _filterGpuResources;
+ domain = _domain;
initialized = true;
paused = false;
@@ -560,6 +562,10 @@ void HierarchicalAllocatorProcess::addSlave(
slave.hostname = slaveInfo.hostname();
slave.capabilities = protobuf::slave::Capabilities(capabilities);
+ if (slaveInfo.has_domain()) {
+ slave.domain = slaveInfo.domain();
+ }
+
// NOTE: We currently implement maintenance in the allocator to be able to
// leverage state and features such as the FrameworkSorter and OfferFilter.
if (unavailability.isSome()) {
@@ -1599,6 +1605,12 @@ void HierarchicalAllocatorProcess::__allocate()
continue;
}
+ // If this framework is not region-aware, don't offer it
+ // resources on agents in remote regions.
+ if (!framework.capabilities.regionAware && isRemoteSlave(slave)) {
+ continue;
+ }
+
// Calculate the currently available resources on the slave, which
// is the difference in non-shared resources between total and
// allocated, plus all shared resources on the agent (if applicable).
@@ -1778,6 +1790,12 @@ void HierarchicalAllocatorProcess::__allocate()
continue;
}
+ // If this framework is not region-aware, don't offer it
+ // resources on agents in remote regions.
+ if (!framework.capabilities.regionAware && isRemoteSlave(slave)) {
+ continue;
+ }
+
// Calculate the currently available resources on the slave, which
// is the difference in non-shared resources between total and
// allocated, plus all shared resources on the agent (if applicable).
@@ -2365,6 +2383,40 @@ bool HierarchicalAllocatorProcess::updateSlaveTotal(
return true;
}
+
+bool HierarchicalAllocatorProcess::isRemoteSlave(const Slave& slave) const
+{
+ // If the slave does not have a configured domain, assume it is not remote.
+ if (slave.domain.isNone()) {
+ return false;
+ }
+
+ // The current version of the Mesos agent refuses to startup if a
+ // domain is specified without also including a fault domain. That
+ // might change in the future, if more types of domains are added.
+ // For forward compatibility, we treat agents with a configured
+ // domain but no fault domain as having no configured domain.
+ if (!slave.domain->has_fault_domain()) {
+ return false;
+ }
+
+ // If the slave has a configured domain (and it has been allowed to
+ // register with the master), the master must also have a configured
+ // domain.
+ CHECK(domain.isSome());
+
+ // The master will not startup if configured with a domain but no
+ // fault domain.
+ CHECK(domain->has_fault_domain());
+
+ const DomainInfo::FaultDomain::RegionInfo& masterRegion =
+ domain->fault_domain().region();
+ const DomainInfo::FaultDomain::RegionInfo& slaveRegion =
+ slave.domain->fault_domain().region();
+
+ return masterRegion != slaveRegion;
+}
+
} // namespace internal {
} // namespace allocator {
} // namespace master {
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/master/allocator/mesos/hierarchical.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/hierarchical.hpp b/src/master/allocator/mesos/hierarchical.hpp
index 81d1b96..c234605 100644
--- a/src/master/allocator/mesos/hierarchical.hpp
+++ b/src/master/allocator/mesos/hierarchical.hpp
@@ -103,7 +103,8 @@ public:
inverseOfferCallback,
const Option<std::set<std::string>>&
fairnessExcludeResourceNames = None(),
- bool filterGpuResources = true);
+ bool filterGpuResources = true,
+ const Option<DomainInfo>& domain = None());
void recover(
const int _expectedAgentCount,
@@ -376,6 +377,8 @@ protected:
protobuf::slave::Capabilities capabilities;
+ Option<DomainInfo> domain;
+
// Represents a scheduled unavailability due to maintenance for a specific
// slave, and the responses from frameworks as to whether they will be able
// to gracefully handle this unavailability.
@@ -448,6 +451,9 @@ protected:
// Filter GPU resources based on the `GPU_RESOURCES` framework capability.
bool filterGpuResources;
+ // The master's domain, if any.
+ Option<DomainInfo> domain;
+
// There are two stages of allocation. During the first stage resources
// are allocated only to frameworks in roles with quota set. During the
// second stage remaining resources that would not be required to satisfy
@@ -527,6 +533,11 @@ private:
// and the role and quota sorters (whose total resources match the agent's
// total resources). Returns true iff the stored agent total was changed.
bool updateSlaveTotal(const SlaveID& slaveId, const Resources& total);
+
+ // Helper that returns true if the given agent is located in a
+ // different region than the master. This can only be the case if
+ // the agent and the master are both configured with a fault domain.
+ bool isRemoteSlave(const Slave& slave) const;
};
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 68b1c71..eb660cc 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -768,7 +768,8 @@ void Master::initialize()
defer(self(), &Master::offer, lambda::_1, lambda::_2),
defer(self(), &Master::inverseOffer, lambda::_1, lambda::_2),
flags.fair_sharing_excluded_resource_names,
- flags.filter_gpu_resources);
+ flags.filter_gpu_resources,
+ flags.domain);
// Parse the whitelist. Passing Allocator::updateWhitelist()
// callback is safe because we shut down the whitelistWatcher in
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/allocator.hpp
----------------------------------------------------------------------
diff --git a/src/tests/allocator.hpp b/src/tests/allocator.hpp
index a990788..f1c0d14 100644
--- a/src/tests/allocator.hpp
+++ b/src/tests/allocator.hpp
@@ -229,9 +229,9 @@ public:
// to get the best of both worlds: the ability to use 'DoDefault'
// and no warnings when expectations are not explicit.
- ON_CALL(*this, initialize(_, _, _, _, _))
+ ON_CALL(*this, initialize(_, _, _, _, _, _))
.WillByDefault(InvokeInitialize(this));
- EXPECT_CALL(*this, initialize(_, _, _, _, _))
+ EXPECT_CALL(*this, initialize(_, _, _, _, _, _))
.WillRepeatedly(DoDefault());
ON_CALL(*this, recover(_, _))
@@ -357,7 +357,7 @@ public:
virtual ~TestAllocator() {}
- MOCK_METHOD5(initialize, void(
+ MOCK_METHOD6(initialize, void(
const Duration&,
const lambda::function<
void(const FrameworkID&,
@@ -366,7 +366,8 @@ public:
void(const FrameworkID&,
const hashmap<SlaveID, UnavailableResources>&)>&,
const Option<std::set<std::string>>&,
- bool));
+ bool,
+ const Option<DomainInfo>&));
MOCK_METHOD2(recover, void(
const int expectedAgentCount,
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/api_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp
index a460e56..f22ca28 100644
--- a/src/tests/api_tests.cpp
+++ b/src/tests/api_tests.cpp
@@ -967,7 +967,7 @@ TEST_P(MasterAPITest, ReserveResources)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Set a low allocation interval to speed up this test.
master::Flags flags = MesosTest::CreateMasterFlags();
@@ -1059,7 +1059,7 @@ TEST_P(MasterAPITest, UnreserveResources)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Set a low allocation interval to speed up this test.
master::Flags flags = MesosTest::CreateMasterFlags();
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/master_allocator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_allocator_tests.cpp b/src/tests/master_allocator_tests.cpp
index f83ca66..f8b315c 100644
--- a/src/tests/master_allocator_tests.cpp
+++ b/src/tests/master_allocator_tests.cpp
@@ -164,7 +164,7 @@ TYPED_TEST(MasterAllocatorTest, SingleFramework)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -212,7 +212,7 @@ TYPED_TEST(MasterAllocatorTest, ResourcesUnused)
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -321,7 +321,7 @@ TYPED_TEST(MasterAllocatorTest, OutOfOrderDispatch)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -450,7 +450,7 @@ TYPED_TEST(MasterAllocatorTest, SchedulerFailover)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -576,7 +576,7 @@ TYPED_TEST(MasterAllocatorTest, FrameworkExited)
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.allocation_interval = Milliseconds(50);
@@ -736,7 +736,7 @@ TYPED_TEST(MasterAllocatorTest, SlaveLost)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -860,7 +860,7 @@ TYPED_TEST(MasterAllocatorTest, SlaveAdded)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.allocation_interval = Milliseconds(50);
@@ -956,7 +956,7 @@ TYPED_TEST(MasterAllocatorTest, TaskFinished)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.allocation_interval = Milliseconds(50);
@@ -1060,7 +1060,7 @@ TYPED_TEST(MasterAllocatorTest, CpusOnlyOfferedAndTaskLaunched)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.allocation_interval = Milliseconds(50);
@@ -1141,7 +1141,7 @@ TYPED_TEST(MasterAllocatorTest, MemoryOnlyOfferedAndTaskLaunched)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.allocation_interval = Milliseconds(50);
@@ -1235,7 +1235,7 @@ TYPED_TEST(MasterAllocatorTest, Whitelist)
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Future<Nothing> updateWhitelist1;
EXPECT_CALL(allocator, updateWhitelist(Option<hashset<string>>(hosts)))
@@ -1274,7 +1274,7 @@ TYPED_TEST(MasterAllocatorTest, RoleTest)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
masterFlags.roles = Some("role2");
@@ -1367,7 +1367,7 @@ TYPED_TEST(MasterAllocatorTest, FrameworkReregistersFirst)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -1424,7 +1424,7 @@ TYPED_TEST(MasterAllocatorTest, FrameworkReregistersFirst)
{
TestAllocator<TypeParam> allocator2;
- EXPECT_CALL(allocator2, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator2, initialize(_, _, _, _, _, _));
Future<Nothing> addFramework;
EXPECT_CALL(allocator2, addFramework(_, _, _, _, _))
@@ -1491,7 +1491,7 @@ TYPED_TEST(MasterAllocatorTest, SlaveReregistersFirst)
{
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);
@@ -1547,7 +1547,7 @@ TYPED_TEST(MasterAllocatorTest, SlaveReregistersFirst)
{
TestAllocator<TypeParam> allocator2;
- EXPECT_CALL(allocator2, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator2, initialize(_, _, _, _, _, _));
Future<Nothing> addSlave;
EXPECT_CALL(allocator2, addSlave(_, _, _, _, _, _))
@@ -1614,7 +1614,7 @@ TYPED_TEST(MasterAllocatorTest, RebalancedForUpdatedWeights)
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Start Mesos master.
master::Flags masterFlags = this->CreateMasterFlags();
@@ -1808,7 +1808,7 @@ TYPED_TEST(MasterAllocatorTest, NestedRoles)
TestAllocator<TypeParam> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
master::Flags masterFlags = this->CreateMasterFlags();
Try<Owned<cluster::Master>> master =
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/master_quota_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_quota_tests.cpp b/src/tests/master_quota_tests.cpp
index bbdbfbe..9d52f76 100644
--- a/src/tests/master_quota_tests.cpp
+++ b/src/tests/master_quota_tests.cpp
@@ -408,7 +408,7 @@ TEST_F(MasterQuotaTest, SetExistingQuota)
TEST_F(MasterQuotaTest, RemoveSingleQuota)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -580,7 +580,7 @@ TEST_F(MasterQuotaTest, Status)
TEST_F(MasterQuotaTest, InsufficientResourcesSingleAgent)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -642,7 +642,7 @@ TEST_F(MasterQuotaTest, InsufficientResourcesSingleAgent)
TEST_F(MasterQuotaTest, InsufficientResourcesMultipleAgents)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -719,7 +719,7 @@ TEST_F(MasterQuotaTest, InsufficientResourcesMultipleAgents)
TEST_F(MasterQuotaTest, AvailableResourcesSingleAgent)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -769,7 +769,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesSingleAgent)
TEST_F(MasterQuotaTest, AvailableResourcesMultipleAgents)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -838,7 +838,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesMultipleAgents)
TEST_F(MasterQuotaTest, AvailableResourcesAfterRescinding)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
@@ -1074,7 +1074,7 @@ TEST_F(MasterQuotaTest, RecoverQuotaEmptyCluster)
}
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Restart the master; configured quota should be recovered from the registry.
master->reset();
@@ -1108,7 +1108,7 @@ TEST_F(MasterQuotaTest, RecoverQuotaEmptyCluster)
TEST_F(MasterQuotaTest, NoAuthenticationNoAuthorization)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Disable http_readwrite authentication and authorization.
// TODO(alexr): Setting master `--acls` flag to `ACLs()` or `None()` seems
@@ -1218,7 +1218,7 @@ TEST_F(MasterQuotaTest, UnauthenticatedQuotaRequest)
TEST_F(MasterQuotaTest, AuthorizeGetUpdateQuotaRequests)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
// Setup ACLs so that only the default principal can modify quotas
// for `ROLE1` and read status.
@@ -1782,7 +1782,7 @@ TEST_F(MasterQuotaTest, DISABLED_ChildRoleDeleteParentQuota)
TEST_F(MasterQuotaTest, DISABLED_ClusterCapacityWithNestedRoles)
{
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index effb96b..e070e87 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -7362,6 +7362,161 @@ TEST_F(MasterTest, MultiRoleSchedulerUnsubscribeFromRole)
}
+// This test checks that if the agent and master are configured with
+// domains that specify the same region (but different zones), the
+// agent is allowed to register and its resources are offered to
+// frameworks as usual.
+TEST_F(MasterTest, AgentDomainSameRegion)
+{
+ Clock::pause();
+
+ master::Flags masterFlags = CreateMasterFlags();
+ masterFlags.domain = createDomainInfo("region-abc", "zone-123");
+
+ Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
+ ASSERT_SOME(master);
+
+ slave::Flags slaveFlags = CreateSlaveFlags();
+ slaveFlags.domain = createDomainInfo("region-abc", "zone-456");
+
+ Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+ FUTURE_PROTOBUF(SlaveRegisteredMessage(), _, _);
+
+ Owned<MasterDetector> detector = master.get()->createDetector();
+ Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
+ ASSERT_SOME(slave);
+
+ Clock::advance(slaveFlags.registration_backoff_factor);
+ AWAIT_READY(slaveRegisteredMessage);
+
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL);
+
+ Future<MasterInfo> masterInfo;
+ EXPECT_CALL(sched, registered(&driver, _, _))
+ .WillOnce(FutureArg<2>(&masterInfo));
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .WillOnce(FutureArg<1>(&offers));
+
+ driver.start();
+
+ AWAIT_READY(masterInfo);
+ EXPECT_EQ(masterFlags.domain, masterInfo->domain());
+
+ AWAIT_READY(offers);
+ ASSERT_FALSE(offers->empty());
+
+ driver.stop();
+ driver.join();
+}
+
+
+// This test checks that if the agent and master are configured with
+// domains that specify different regions, the agent is allowed to
+// register but its resources are only offered to region-aware
+// frameworks. We also check that tasks can be launched in remote
+// regions.
+TEST_F(MasterTest, AgentDomainDifferentRegion)
+{
+ Clock::pause();
+
+ master::Flags masterFlags = CreateMasterFlags();
+ masterFlags.domain = createDomainInfo("region-abc", "zone-123");
+
+ Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
+ ASSERT_SOME(master);
+
+ slave::Flags slaveFlags = CreateSlaveFlags();
+ slaveFlags.domain = createDomainInfo("region-xyz", "zone-123");
+
+ Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+ FUTURE_PROTOBUF(SlaveRegisteredMessage(), _, _);
+
+ Owned<MasterDetector> detector = master.get()->createDetector();
+ Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
+ ASSERT_SOME(slave);
+
+ Clock::advance(slaveFlags.registration_backoff_factor);
+ AWAIT_READY(slaveRegisteredMessage);
+
+ // Launch a non-region-aware scheduler. It should NOT receive any
+ // resource offers for `slave`.
+ {
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL);
+
+ Future<Nothing> registered;
+ EXPECT_CALL(sched, registered(&driver, _, _))
+ .WillOnce(FutureSatisfy(®istered));
+
+ // We do not expect to get offered any resources.
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .Times(0);
+
+ driver.start();
+
+ AWAIT_READY(registered);
+
+ // Trigger a batch allocation, for good measure.
+ Clock::advance(masterFlags.allocation_interval);
+ Clock::settle();
+
+ driver.stop();
+ driver.join();
+ }
+
+ // Launch a region-aware scheduler. It should receive an offer for `slave`.
+ {
+ FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO;
+ frameworkInfo.add_capabilities()->set_type(
+ FrameworkInfo::Capability::REGION_AWARE);
+
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, frameworkInfo, master.get()->pid, DEFAULT_CREDENTIAL);
+
+ EXPECT_CALL(sched, registered(&driver, _, _));
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .WillOnce(FutureArg<1>(&offers));
+
+ driver.start();
+
+ AWAIT_READY(offers);
+ ASSERT_FALSE(offers->empty());
+
+ Offer offer = offers->front();
+
+ // Check that we can launch a task in a remote region.
+ TaskInfo task = createTask(offer, "sleep 60");
+
+ Future<TaskStatus> runningStatus;
+ EXPECT_CALL(sched, statusUpdate(&driver, _))
+ .WillOnce(FutureArg<1>(&runningStatus));
+
+ driver.launchTasks(offer.id(), {task});
+
+ AWAIT_READY(runningStatus);
+ EXPECT_EQ(TASK_RUNNING, runningStatus->state());
+ EXPECT_EQ(task.task_id(), runningStatus->task_id());
+
+ driver.stop();
+ driver.join();
+ }
+
+ // Resume the clock so that executor/task cleanup happens correctly.
+ //
+ // TODO(neilc): Replace this with more fine-grained clock advancement.
+ Clock::resume();
+}
+
+
// This test checks that if the master is configured with a domain but
// the agent is not, the agent is allowed to register and its
// resources are offered to frameworks as usual.
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/reservation_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/reservation_tests.cpp b/src/tests/reservation_tests.cpp
index 3b4884b..470f734 100644
--- a/src/tests/reservation_tests.cpp
+++ b/src/tests/reservation_tests.cpp
@@ -531,7 +531,7 @@ TEST_F(ReservationTest, DropReserveTooLarge)
masterFlags.allocation_interval = Milliseconds(5);
masterFlags.roles = frameworkInfo.role();
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
ASSERT_SOME(master);
@@ -2053,7 +2053,7 @@ TEST_F(ReservationTest, DropReserveWithDifferentRole)
masterFlags.allocation_interval = Milliseconds(5);
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
ASSERT_SOME(master);
@@ -2150,7 +2150,7 @@ TEST_F(ReservationTest, PreventUnreservingAlienResources)
masterFlags.allocation_interval = Milliseconds(5);
TestAllocator<> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
ASSERT_SOME(master);
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/resource_offers_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/resource_offers_tests.cpp b/src/tests/resource_offers_tests.cpp
index 427a652..e1fcab4 100644
--- a/src/tests/resource_offers_tests.cpp
+++ b/src/tests/resource_offers_tests.cpp
@@ -284,7 +284,7 @@ TEST_F(ResourceOffersTest, Request)
{
TestAllocator<master::allocator::HierarchicalDRFAllocator> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = StartMaster(&allocator);
ASSERT_SOME(master);
http://git-wip-us.apache.org/repos/asf/mesos/blob/25111bb0/src/tests/slave_recovery_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_recovery_tests.cpp b/src/tests/slave_recovery_tests.cpp
index f6eafcb..1cd248a 100644
--- a/src/tests/slave_recovery_tests.cpp
+++ b/src/tests/slave_recovery_tests.cpp
@@ -3383,7 +3383,7 @@ TYPED_TEST(SlaveRecoveryTest, ReconcileTasksMissingFromSlave)
{
TestAllocator<master::allocator::HierarchicalDRFAllocator> allocator;
- EXPECT_CALL(allocator, initialize(_, _, _, _, _));
+ EXPECT_CALL(allocator, initialize(_, _, _, _, _, _));
Try<Owned<cluster::Master>> master = this->StartMaster(&allocator);
ASSERT_SOME(master);