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 <[email protected]> Authored: Tue Dec 12 17:02:04 2017 -0800 Committer: Jie Yu <[email protected]> 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()); }
