Added a V1 API call to list resource providers. The 'GET_RESOURCE_PROVIDERS' call will list all subscribed local resource providers of an agent.
Review: https://reviews.apache.org/r/64151/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/d142d38e Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/d142d38e Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/d142d38e Branch: refs/heads/master Commit: d142d38e3183c6b6ac56ab1c1c1629a6acde3ad5 Parents: 12695ec Author: Jan Schlicht <[email protected]> Authored: Fri Dec 8 11:26:23 2017 +0100 Committer: Benjamin Bannier <[email protected]> Committed: Fri Dec 8 11:26:23 2017 +0100 ---------------------------------------------------------------------- include/mesos/agent/agent.proto | 31 ++++++++-- include/mesos/v1/agent/agent.proto | 31 ++++++++-- src/slave/http.cpp | 34 +++++++++++ src/slave/http.hpp | 5 ++ src/slave/validation.cpp | 3 + src/tests/api_tests.cpp | 102 ++++++++++++++++++++++++++++++++ 6 files changed, 198 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/include/mesos/agent/agent.proto ---------------------------------------------------------------------- diff --git a/include/mesos/agent/agent.proto b/include/mesos/agent/agent.proto index 0f92f73..eb5f1b4 100644 --- a/include/mesos/agent/agent.proto +++ b/include/mesos/agent/agent.proto @@ -53,10 +53,21 @@ message Call { GET_STATE = 9; GET_CONTAINERS = 10; - GET_FRAMEWORKS = 11; // Retrieves the information about known frameworks. - GET_EXECUTORS = 12; // Retrieves the information about known executors. - GET_TASKS = 13; // Retrieves the information about known tasks. - GET_AGENT = 20; // Retrieves the agent information. + + // Retrieves the information about known frameworks. + GET_FRAMEWORKS = 11; + + // Retrieves the information about known executors. + GET_EXECUTORS = 12; + + // Retrieves the information about known tasks. + GET_TASKS = 13; + + // Retrieves the agent information. + GET_AGENT = 20; + + // Retrieves the information about known resource providers. + GET_RESOURCE_PROVIDERS = 26; // Calls for managing nested containers underneath an executor's container. // Some of these calls are deprecated in favor of the calls @@ -321,6 +332,7 @@ message Response { GET_EXECUTORS = 11; // See 'GetExecutors' below. GET_TASKS = 12; // See 'GetTasks' below. GET_AGENT = 14; // See 'GetAgent' below. + GET_RESOURCE_PROVIDERS = 16; // See 'GetResourceProviders' below. WAIT_NESTED_CONTAINER = 13 [deprecated = true]; WAIT_CONTAINER = 15; // See 'WaitContainer' below. @@ -437,6 +449,16 @@ message Response { optional SlaveInfo slave_info = 1; } + // Lists information about all resource providers known to the agent + // at the current time. + message GetResourceProviders { + message ResourceProvider { + required ResourceProviderInfo resource_provider_info = 1; + } + + repeated ResourceProvider resource_providers = 1; + } + // Returns termination information about the nested container. message WaitNestedContainer { // Wait status of the lead process in the container. Note that this @@ -496,6 +518,7 @@ message Response { optional GetExecutors get_executors = 12; optional GetTasks get_tasks = 13; optional GetAgent get_agent = 15; + optional GetResourceProviders get_resource_providers = 17; optional WaitNestedContainer wait_nested_container = 14; optional WaitContainer wait_container = 16; } http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/include/mesos/v1/agent/agent.proto ---------------------------------------------------------------------- diff --git a/include/mesos/v1/agent/agent.proto b/include/mesos/v1/agent/agent.proto index 012ffef..3aedfe8 100644 --- a/include/mesos/v1/agent/agent.proto +++ b/include/mesos/v1/agent/agent.proto @@ -53,10 +53,21 @@ message Call { GET_STATE = 9; GET_CONTAINERS = 10; - GET_FRAMEWORKS = 11; // Retrieves the information about known frameworks. - GET_EXECUTORS = 12; // Retrieves the information about known executors. - GET_TASKS = 13; // Retrieves the information about known tasks. - GET_AGENT = 20; // Retrieves the agent information. + + // Retrieves the information about known frameworks. + GET_FRAMEWORKS = 11; + + // Retrieves the information about known executors. + GET_EXECUTORS = 12; + + // Retrieves the information about known tasks. + GET_TASKS = 13; + + // Retrieves the agent information. + GET_AGENT = 20; + + // Retrieves the information about known resource providers. + GET_RESOURCE_PROVIDERS = 26; // Calls for managing nested containers underneath an executor's container. // Some of these calls are deprecated in favor of the calls @@ -321,6 +332,7 @@ message Response { GET_EXECUTORS = 11; // See 'GetExecutors' below. GET_TASKS = 12; // See 'GetTasks' below. GET_AGENT = 14; // See 'GetAgent' below. + GET_RESOURCE_PROVIDERS = 16; // See 'GetResourceProviders' below. WAIT_NESTED_CONTAINER = 13 [deprecated = true]; WAIT_CONTAINER = 15; // See 'WaitContainer' below. @@ -437,6 +449,16 @@ message Response { optional AgentInfo agent_info = 1; } + // Lists information about all resource providers known to the agent + // at the current time. + message GetResourceProviders { + message ResourceProvider { + required ResourceProviderInfo resource_provider_info = 1; + } + + repeated ResourceProvider resource_providers = 1; + } + // Returns termination information about the nested container. message WaitNestedContainer { // Wait status of the lead process in the container. Note that this @@ -496,6 +518,7 @@ message Response { optional GetExecutors get_executors = 12; optional GetTasks get_tasks = 13; optional GetAgent get_agent = 15; + optional GetResourceProviders get_resource_providers = 17; optional WaitNestedContainer wait_nested_container = 14; optional WaitContainer wait_container = 16; } http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/src/slave/http.cpp ---------------------------------------------------------------------- diff --git a/src/slave/http.cpp b/src/slave/http.cpp index fd0e809..49278a3 100644 --- a/src/slave/http.cpp +++ b/src/slave/http.cpp @@ -577,6 +577,9 @@ Future<Response> Http::_api( case mesos::agent::Call::GET_AGENT: return getAgent(call, mediaTypes.accept, principal); + case mesos::agent::Call::GET_RESOURCE_PROVIDERS: + return getResourceProviders(call, mediaTypes.accept, principal); + case mesos::agent::Call::LAUNCH_NESTED_CONTAINER: return launchNestedContainer(call, mediaTypes.accept, principal); @@ -1853,6 +1856,37 @@ Future<Response> Http::getAgent( } +Future<Response> Http::getResourceProviders( + const mesos::agent::Call& call, + ContentType acceptType, + const Option<Principal>& principal) const +{ + CHECK_EQ(mesos::agent::Call::GET_RESOURCE_PROVIDERS, call.type()); + + LOG(INFO) << "Processing GET_RESOURCE_PROVIDERS call"; + + // TODO(nfnt): Authorize this call (MESOS-8314). + + agent::Response response; + response.set_type(mesos::agent::Response::GET_RESOURCE_PROVIDERS); + + agent::Response::GetResourceProviders* resourceProviders = + response.mutable_get_resource_providers(); + + foreachvalue ( + const ResourceProviderInfo& resourceProviderInfo, + slave->resourceProviderInfos) { + agent::Response::GetResourceProviders::ResourceProvider* resourceProvider = + resourceProviders->add_resource_providers(); + + resourceProvider->mutable_resource_provider_info()->CopyFrom( + resourceProviderInfo); + } + + return OK(serialize(acceptType, evolve(response)), stringify(acceptType)); +} + + Future<Response> Http::getState( const mesos::agent::Call& call, ContentType acceptType, http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/src/slave/http.hpp ---------------------------------------------------------------------- diff --git a/src/slave/http.hpp b/src/slave/http.hpp index a51831c..5eecb2a 100644 --- a/src/slave/http.hpp +++ b/src/slave/http.hpp @@ -200,6 +200,11 @@ private: ContentType acceptType, const Option<process::http::authentication::Principal>& principal) const; + process::Future<process::http::Response> getResourceProviders( + const mesos::agent::Call& call, + ContentType acceptType, + const Option<process::http::authentication::Principal>& principal) const; + process::Future<process::http::Response> getState( const mesos::agent::Call& call, ContentType acceptType, http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/src/slave/validation.cpp ---------------------------------------------------------------------- diff --git a/src/slave/validation.cpp b/src/slave/validation.cpp index 32781fd..4a3a78a 100644 --- a/src/slave/validation.cpp +++ b/src/slave/validation.cpp @@ -156,6 +156,9 @@ Option<Error> validate( case mesos::agent::Call::GET_AGENT: return None(); + case mesos::agent::Call::GET_RESOURCE_PROVIDERS: + return None(); + case mesos::agent::Call::LAUNCH_NESTED_CONTAINER: { if (!call.has_launch_nested_container()) { return Error("Expecting 'launch_nested_container' to be present"); http://git-wip-us.apache.org/repos/asf/mesos/blob/d142d38e/src/tests/api_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp index 53c705e..c8855d0 100644 --- a/src/tests/api_tests.cpp +++ b/src/tests/api_tests.cpp @@ -6009,6 +6009,108 @@ TEST_P(AgentAPITest, DefaultAccept) } +TEST_P(AgentAPITest, GetResourceProviders) +{ + Clock::pause(); + + const ContentType contentType = GetParam(); + + Try<Owned<cluster::Master>> master = StartMaster(); + ASSERT_SOME(master); + + StandaloneMasterDetector detector(master.get()->pid); + + Future<UpdateSlaveMessage> updateSlaveMessage = + FUTURE_PROTOBUF(UpdateSlaveMessage(), _, _); + + slave::Flags slaveFlags = CreateSlaveFlags(); + slaveFlags.authenticate_http_readwrite = false; + + 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>> slave = StartSlave(&detector, slaveFlags); + ASSERT_SOME(slave); + + Clock::advance(slaveFlags.registration_backoff_factor); + Clock::settle(); + AWAIT_READY(updateSlaveMessage); + + v1::agent::Call v1Call; + v1Call.set_type(v1::agent::Call::GET_RESOURCE_PROVIDERS); + + Future<v1::agent::Response> v1Response = + post(slave.get()->pid, v1Call, contentType); + + AWAIT_READY(v1Response); + ASSERT_TRUE(v1Response->IsInitialized()); + ASSERT_EQ(v1::agent::Response::GET_RESOURCE_PROVIDERS, v1Response->type()); + + EXPECT_TRUE( + v1Response->get_resource_providers().resource_providers().empty()); + + 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, + slave.get()->pid.address.ip, + slave.get()->pid.address.port, + slave.get()->pid.id + "/api/v1/resource_provider"); + + Owned<EndpointDetector> endpointDetector(new ConstantEndpointDetector(url)); + + updateSlaveMessage = 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(updateSlaveMessage); + + v1Response = post(slave.get()->pid, v1Call, contentType); + + AWAIT_READY(v1Response); + ASSERT_TRUE(v1Response->IsInitialized()); + ASSERT_EQ(v1::agent::Response::GET_RESOURCE_PROVIDERS, v1Response->type()); + + EXPECT_EQ(1, v1Response->get_resource_providers().resource_providers_size()); + + const mesos::v1::ResourceProviderInfo& responseInfo = + v1Response->get_resource_providers() + .resource_providers(0) + .resource_provider_info(); + + EXPECT_EQ(info.type(), responseInfo.type()); + EXPECT_EQ(info.name(), responseInfo.name()); +} + + class AgentAPIStreamingTest : public MesosTest, public WithParamInterface<ContentType> {};
