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

Reply via email to