You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2017/12/13 01:11:46 UTC
mesos git commit: Exposed resource provider information in master
'GET_AGENTS' response.
Repository: mesos
Updated Branches:
refs/heads/master d0d5f5c46 -> 2df68b4b2
Exposed resource provider information in master 'GET_AGENTS' response.
This patch extends the master's 'GET_AGENTS' response to include local
resource provider information. For now only the 'ResourceProviderInfo'
are shown.
Review: https://reviews.apache.org/r/64543/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2df68b4b
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2df68b4b
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2df68b4b
Branch: refs/heads/master
Commit: 2df68b4b22c8dcea90ec2ce60ba9c763d1b3b20a
Parents: d0d5f5c
Author: Benjamin Bannier <be...@mesosphere.io>
Authored: Tue Dec 12 17:02:04 2017 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Dec 12 17:02:04 2017 -0800
----------------------------------------------------------------------
include/mesos/master/master.proto | 6 ++
include/mesos/v1/master/master.proto | 6 ++
src/master/http.cpp | 10 ++++
src/tests/api_tests.cpp | 91 ++++++++++++++++++++++++++++---
4 files changed, 104 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/2df68b4b/include/mesos/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/master/master.proto b/include/mesos/master/master.proto
index 87083be..f4506fe 100644
--- a/include/mesos/master/master.proto
+++ b/include/mesos/master/master.proto
@@ -339,6 +339,12 @@ message Response {
repeated Resource offered_resources = 9;
repeated SlaveInfo.Capability capabilities = 10;
+
+ message ResourceProvider {
+ required ResourceProviderInfo resource_provider_info = 1;
+ }
+
+ repeated ResourceProvider resource_providers = 11;
}
// Registered agents.
http://git-wip-us.apache.org/repos/asf/mesos/blob/2df68b4b/include/mesos/v1/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/master/master.proto b/include/mesos/v1/master/master.proto
index ea04b8f..5cb64df 100644
--- a/include/mesos/v1/master/master.proto
+++ b/include/mesos/v1/master/master.proto
@@ -337,6 +337,12 @@ message Response {
repeated Resource offered_resources = 9;
repeated AgentInfo.Capability capabilities = 10;
+
+ message ResourceProvider {
+ required ResourceProviderInfo resource_provider_info = 1;
+ }
+
+ repeated ResourceProvider resource_providers = 11;
}
// Registered agents.
http://git-wip-us.apache.org/repos/asf/mesos/blob/2df68b4b/src/master/http.cpp
----------------------------------------------------------------------
diff --git a/src/master/http.cpp b/src/master/http.cpp
index bb040ce..21de4bc 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -2608,6 +2608,16 @@ mesos::master::Response::GetAgents Master::Http::_getAgents(
mesos::master::Response::GetAgents::Agent* agent = getAgents.add_agents();
agent->CopyFrom(
protobuf::master::event::createAgentResponse(*slave, rolesAcceptor));
+
+ foreachvalue (
+ const ResourceProviderInfo& resourceProviderInfo,
+ slave->resourceProviders) {
+ mesos::master::Response::GetAgents::Agent::ResourceProvider*
+ resourceProvider = agent->add_resource_providers();
+
+ resourceProvider->mutable_resource_provider_info()->CopyFrom(
+ resourceProviderInfo);
+ }
}
foreachvalue (const SlaveInfo& slaveInfo, master->slaves.recovered) {
http://git-wip-us.apache.org/repos/asf/mesos/blob/2df68b4b/src/tests/api_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp
index 3372849..dd9305c 100644
--- a/src/tests/api_tests.cpp
+++ b/src/tests/api_tests.cpp
@@ -20,6 +20,7 @@
#include <mesos/http.hpp>
#include <mesos/v1/resources.hpp>
+#include <mesos/v1/resource_provider.hpp>
#include <mesos/v1/master/master.hpp>
@@ -160,6 +161,8 @@ INSTANTIATE_TEST_CASE_P(
TEST_P(MasterAPITest, GetAgents)
{
+ Clock::pause();
+
master::Flags masterFlags = CreateMasterFlags();
masterFlags.domain = createDomainInfo("region-abc", "zone-123");
@@ -169,17 +172,33 @@ TEST_P(MasterAPITest, GetAgents)
Owned<MasterDetector> detector = master.get()->createDetector();
// Start one agent.
- Future<SlaveRegisteredMessage> agentRegisteredMessage =
- FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+ Future<UpdateSlaveMessage> updateAgentMessage =
+ FUTURE_PROTOBUF(UpdateSlaveMessage(), _, _);
slave::Flags slaveFlags = CreateSlaveFlags();
+ slaveFlags.authenticate_http_readwrite = false;
slaveFlags.hostname = "host";
slaveFlags.domain = createDomainInfo("region-xyz", "zone-456");
+ constexpr SlaveInfo::Capability::Type capabilities[] = {
+ SlaveInfo::Capability::MULTI_ROLE,
+ SlaveInfo::Capability::HIERARCHICAL_ROLE,
+ SlaveInfo::Capability::RESERVATION_REFINEMENT,
+ SlaveInfo::Capability::RESOURCE_PROVIDER};
+
+ slaveFlags.agent_features = SlaveCapabilities();
+ foreach (SlaveInfo::Capability::Type type, capabilities) {
+ SlaveInfo::Capability* capability =
+ slaveFlags.agent_features->add_capabilities();
+ capability->set_type(type);
+ }
+
Try<Owned<cluster::Slave>> agent = StartSlave(detector.get(), slaveFlags);
ASSERT_SOME(agent);
- AWAIT_READY(agentRegisteredMessage);
+ Clock::advance(slaveFlags.registration_backoff_factor);
+ Clock::settle();
+ AWAIT_READY(updateAgentMessage);
v1::master::Call v1Call;
v1Call.set_type(v1::master::Call::GET_AGENTS);
@@ -197,12 +216,66 @@ TEST_P(MasterAPITest, GetAgents)
const v1::master::Response::GetAgents::Agent& v1Agent =
v1Response->get_agents().agents(0);
- ASSERT_EQ("host", v1Agent.agent_info().hostname());
- ASSERT_EQ(evolve(slaveFlags.domain.get()), v1Agent.agent_info().domain());
- ASSERT_EQ(agent.get()->pid, v1Agent.pid());
- ASSERT_TRUE(v1Agent.active());
- ASSERT_EQ(MESOS_VERSION, v1Agent.version());
- ASSERT_EQ(4, v1Agent.total_resources_size());
+ EXPECT_EQ("host", v1Agent.agent_info().hostname());
+ EXPECT_EQ(evolve(slaveFlags.domain.get()), v1Agent.agent_info().domain());
+ EXPECT_EQ(agent.get()->pid, v1Agent.pid());
+ EXPECT_TRUE(v1Agent.active());
+ EXPECT_EQ(MESOS_VERSION, v1Agent.version());
+ EXPECT_EQ(4, v1Agent.total_resources_size());
+ EXPECT_TRUE(v1Agent.resource_providers().empty());
+
+ // Start a resource provider.
+ mesos::v1::ResourceProviderInfo info;
+ info.set_type("org.apache.mesos.rp.test");
+ info.set_name("test");
+
+ v1::MockResourceProvider resourceProvider(
+ info,
+ v1::createDiskResource(
+ "200", "*", None(), None(), v1::createDiskSourceRaw()));
+
+ // Start and register a resource provider.
+ string scheme = "http";
+
+#ifdef USE_SSL_SOCKET
+ if (process::network::openssl::flags().enabled) {
+ scheme = "https";
+ }
+#endif
+
+ http::URL url(
+ scheme,
+ agent.get()->pid.address.ip,
+ agent.get()->pid.address.port,
+ agent.get()->pid.id + "/api/v1/resource_provider");
+
+ Owned<EndpointDetector> endpointDetector(new ConstantEndpointDetector(url));
+
+ updateAgentMessage = FUTURE_PROTOBUF(UpdateSlaveMessage(), _, _);
+
+ resourceProvider.start(endpointDetector, contentType, v1::DEFAULT_CREDENTIAL);
+
+ // Wait until the agent's resources have been updated to include the
+ // resource provider resources.
+ AWAIT_READY(updateAgentMessage);
+
+ v1Response = post(master.get()->pid, v1Call, contentType);
+
+ AWAIT_READY(v1Response);
+ AWAIT_READY(v1Response);
+ ASSERT_TRUE(v1Response->IsInitialized());
+ ASSERT_EQ(v1::master::Response::GET_AGENTS, v1Response->type());
+ ASSERT_EQ(v1Response->get_agents().agents_size(), 1);
+ ASSERT_FALSE(v1Response->get_agents().agents(0).resource_providers().empty());
+
+ const mesos::v1::ResourceProviderInfo& responseInfo =
+ v1Response->get_agents()
+ .agents(0)
+ .resource_providers(0)
+ .resource_provider_info();
+
+ EXPECT_EQ(info.type(), responseInfo.type());
+ EXPECT_EQ(info.name(), responseInfo.name());
}