Added a new `RESIZE_VOLUME` agent capability. This will be used as a feature flag to gate the new volume resize feature. This feature will be turn on by default once released.
Review: https://reviews.apache.org/r/66733/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/9f2b4977 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/9f2b4977 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/9f2b4977 Branch: refs/heads/master Commit: 9f2b4977c1fd6b1d0ab5cc5674fe825a46ae7961 Parents: 7d88e06 Author: Zhitao Li <zhitaoli...@gmail.com> Authored: Thu May 3 17:04:21 2018 -0700 Committer: Chun-Hung Hsiao <chhs...@mesosphere.io> Committed: Thu May 3 17:04:21 2018 -0700 ---------------------------------------------------------------------- include/mesos/mesos.proto | 4 ++++ include/mesos/v1/mesos.proto | 4 ++++ src/common/protobuf_utils.cpp | 3 ++- src/common/protobuf_utils.hpp | 7 +++++++ src/slave/constants.cpp | 3 ++- src/slave/flags.cpp | 5 +++++ src/tests/master_tests.cpp | 15 +++++++++++---- src/tests/slave_tests.cpp | 16 +++++++++++----- 8 files changed, 46 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/include/mesos/mesos.proto ---------------------------------------------------------------------- diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto index 9930bea..463e6ad 100644 --- a/include/mesos/mesos.proto +++ b/include/mesos/mesos.proto @@ -993,6 +993,10 @@ message SlaveInfo { // // (2) The ability to provide operation feedback. RESOURCE_PROVIDER = 4; + + // This expresses the capability for the agent to handle persistent volume + // resize operations safely. This capability is turned on by default. + RESIZE_VOLUME = 5; } // Enum fields should be optional, see: MESOS-4997. http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/include/mesos/v1/mesos.proto ---------------------------------------------------------------------- diff --git a/include/mesos/v1/mesos.proto b/include/mesos/v1/mesos.proto index 4101243..8eaad9c 100644 --- a/include/mesos/v1/mesos.proto +++ b/include/mesos/v1/mesos.proto @@ -985,6 +985,10 @@ message AgentInfo { // // (2) The ability to provide operation feedback. RESOURCE_PROVIDER = 4; + + // This expresses the capability for the agent to handle persistent volume + // resize operations safely. This capability is turned on by default. + RESIZE_VOLUME = 5; } // Enum fields should be optional, see: MESOS-4997. http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/common/protobuf_utils.cpp ---------------------------------------------------------------------- diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp index 2e675c4..c5d873c 100644 --- a/src/common/protobuf_utils.cpp +++ b/src/common/protobuf_utils.cpp @@ -1061,7 +1061,8 @@ bool operator==(const Capabilities& left, const Capabilities& right) return left.multiRole == right.multiRole && left.hierarchicalRole == right.hierarchicalRole && left.reservationRefinement == right.reservationRefinement && - left.resourceProvider == right.resourceProvider; + left.resourceProvider == right.resourceProvider && + left.resizeVolume == right.resizeVolume; } http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/common/protobuf_utils.hpp ---------------------------------------------------------------------- diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp index ae060f3..1662125 100644 --- a/src/common/protobuf_utils.hpp +++ b/src/common/protobuf_utils.hpp @@ -281,6 +281,9 @@ struct Capabilities case SlaveInfo::Capability::RESOURCE_PROVIDER: resourceProvider = true; break; + case SlaveInfo::Capability::RESIZE_VOLUME: + resizeVolume = true; + break; // If adding another case here be sure to update the // equality operator. } @@ -292,6 +295,7 @@ struct Capabilities bool hierarchicalRole = false; bool reservationRefinement = false; bool resourceProvider = false; + bool resizeVolume = false; google::protobuf::RepeatedPtrField<SlaveInfo::Capability> toRepeatedPtrField() const @@ -309,6 +313,9 @@ struct Capabilities if (resourceProvider) { result.Add()->set_type(SlaveInfo::Capability::RESOURCE_PROVIDER); } + if (resizeVolume) { + result.Add()->set_type(SlaveInfo::Capability::RESIZE_VOLUME); + } return result; } http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/slave/constants.cpp ---------------------------------------------------------------------- diff --git a/src/slave/constants.cpp b/src/slave/constants.cpp index 51de71b..103384c 100644 --- a/src/slave/constants.cpp +++ b/src/slave/constants.cpp @@ -39,7 +39,8 @@ vector<SlaveInfo::Capability> AGENT_CAPABILITIES() SlaveInfo::Capability::HIERARCHICAL_ROLE, SlaveInfo::Capability::MULTI_ROLE, SlaveInfo::Capability::RESERVATION_REFINEMENT, - SlaveInfo::Capability::RESOURCE_PROVIDER}; + SlaveInfo::Capability::RESOURCE_PROVIDER, + SlaveInfo::Capability::RESIZE_VOLUME}; vector<SlaveInfo::Capability> result; foreach (SlaveInfo::Capability::Type type, types) { http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/slave/flags.cpp ---------------------------------------------------------------------- diff --git a/src/slave/flags.cpp b/src/slave/flags.cpp index 02e1a8b..a319b5e 100644 --- a/src/slave/flags.cpp +++ b/src/slave/flags.cpp @@ -740,6 +740,11 @@ mesos::internal::slave::Flags::Flags() "At least the following agent features need to be enabled: " "MULTI_ROLE, HIERARCHICAL_ROLE, RESERVATION_REFINEMENT"); } + + if (capabilities.resizeVolume && !capabilities.resourceProvider) { + return Error( + "RESIZE_VOLUME feature requires RESOURCE_PROVIDER feature"); + } } return None(); http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/tests/master_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp index d5ce52c..e159573 100644 --- a/src/tests/master_tests.cpp +++ b/src/tests/master_tests.cpp @@ -5045,11 +5045,18 @@ TEST_F(MasterTest, StateEndpointAgentCapabilities) ASSERT_EQ(1u, slaveInfo.values.count("capabilities")); JSON::Value slaveCapabilities = slaveInfo.values.at("capabilities"); - // Agents should have MULTI_ROLE, HIERARCHICAL_ROLE, RESERVATION_REFINEMENT, - // and RESOURCE_PROVIDER capabilities in current implementation. + // Agents should have the following capabilities in the current + // implementation. Try<JSON::Value> expectedCapabilities = JSON::parse( - "[\"MULTI_ROLE\",\"HIERARCHICAL_ROLE\",\"RESERVATION_REFINEMENT\"," - "\"RESOURCE_PROVIDER\"]"); + R"~( + [ + "MULTI_ROLE", + "HIERARCHICAL_ROLE", + "RESERVATION_REFINEMENT", + "RESOURCE_PROVIDER", + "RESIZE_VOLUME" + ] + )~"); ASSERT_SOME(expectedCapabilities); EXPECT_TRUE(slaveCapabilities.contains(expectedCapabilities.get())); http://git-wip-us.apache.org/repos/asf/mesos/blob/9f2b4977/src/tests/slave_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp index ae82438..9e39884 100644 --- a/src/tests/slave_tests.cpp +++ b/src/tests/slave_tests.cpp @@ -1699,12 +1699,18 @@ TEST_F(SlaveTest, StateEndpoint) EXPECT_FALSE(state.values["capabilities"].as<JSON::Array>().values.empty()); JSON::Value slaveCapabilities = state.values.at("capabilities"); - // Agents should always have MULTI_ROLE, HIERARCHICAL_ROLE, - // RESERVATION_REFINEMENT, and RESOURCE_PROVIDER capabilities - // in current implementation. + // Agents should have the following capabilities in the current + // implementation. Try<JSON::Value> expectedCapabilities = JSON::parse( - "[\"MULTI_ROLE\",\"HIERARCHICAL_ROLE\",\"RESERVATION_REFINEMENT\"," - "\"RESOURCE_PROVIDER\"]"); + R"~( + [ + "MULTI_ROLE", + "HIERARCHICAL_ROLE", + "RESERVATION_REFINEMENT", + "RESOURCE_PROVIDER", + "RESIZE_VOLUME" + ] + )~"); ASSERT_SOME(expectedCapabilities); EXPECT_TRUE(slaveCapabilities.contains(expectedCapabilities.get()));