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());
 }