You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ya...@apache.org on 2015/06/12 02:45:42 UTC

mesos git commit: Changed Resourcs JSON model() to combine nonrevocable resources and ignore revocable resources.

Repository: mesos
Updated Branches:
  refs/heads/master d2985542a -> c67d1dd3a


Changed Resourcs JSON model() to combine nonrevocable resources and ignore revocable resources.

Review: https://reviews.apache.org/r/35367


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/c67d1dd3
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/c67d1dd3
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/c67d1dd3

Branch: refs/heads/master
Commit: c67d1dd3a1e81e4d80e8d7bdbf0b85bfcd991e33
Parents: d298554
Author: Jiang Yan Xu <ya...@jxu.me>
Authored: Thu Jun 11 12:52:43 2015 -0700
Committer: Jiang Yan Xu <ya...@jxu.me>
Committed: Thu Jun 11 17:43:29 2015 -0700

----------------------------------------------------------------------
 include/mesos/resources.hpp     |  6 ++++++
 src/common/http.cpp             | 28 +++++++++++++++++++++-------
 src/common/resources.cpp        | 12 ++++++++++++
 src/tests/common/http_tests.cpp | 36 ++++++++++++++++++++++++++++++++++++
 src/tests/resources_tests.cpp   | 14 ++++++++++++++
 5 files changed, 89 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/c67d1dd3/include/mesos/resources.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/resources.hpp b/include/mesos/resources.hpp
index 7da6e6e..0ccc337 100644
--- a/include/mesos/resources.hpp
+++ b/include/mesos/resources.hpp
@@ -19,6 +19,7 @@
 #ifndef __RESOURCES_HPP__
 #define __RESOURCES_HPP__
 
+#include <map>
 #include <iostream>
 #include <set>
 #include <string>
@@ -250,6 +251,11 @@ public:
   // Get the set of unique resource names.
   std::set<std::string> names() const;
 
+  // Get the types of resources associated with each resource name.
+  // NOTE: Resources of the same name must have the same type, as
+  // enforced by Resources::parse().
+  std::map<std::string, Value_Type> types() const;
+
   // Helpers to get known resource types.
   // TODO(vinod): Fix this when we make these types as first class
   // protobufs.

http://git-wip-us.apache.org/repos/asf/mesos/blob/c67d1dd3/src/common/http.cpp
----------------------------------------------------------------------
diff --git a/src/common/http.cpp b/src/common/http.cpp
index 2ac7fba..c9a441f 100644
--- a/src/common/http.cpp
+++ b/src/common/http.cpp
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+#include <map>
+#include <set>
+#include <string>
 #include <utility>
 #include <vector>
 
@@ -30,6 +33,9 @@
 
 #include "messages/messages.hpp"
 
+using std::map;
+using std::set;
+using std::string;
 using std::vector;
 
 namespace mesos {
@@ -45,21 +51,29 @@ JSON::Object model(const Resources& resources)
   object.values["mem"] = 0;
   object.values["disk"] = 0;
 
-  foreach (const Resource& resource, resources)
-  {
-    switch(resource.type())
+  // To maintain backwards compatibility we exclude revocable
+  // resources in the reporting.
+  Resources nonRevocable = resources - resources.revocable();
+
+  map<string, Value_Type> types = nonRevocable.types();
+
+  foreachpair (const string& name, const Value_Type& type, types) {
+    switch(type)
     {
       case Value::SCALAR:
-        object.values[resource.name()] = resource.scalar().value();
+        object.values[name] =
+          nonRevocable.get<Value::Scalar>(name).get().value();
         break;
       case Value::RANGES:
-        object.values[resource.name()] = stringify(resource.ranges());
+        object.values[name] =
+          stringify(nonRevocable.get<Value::Ranges>(name).get());
         break;
       case Value::SET:
-        object.values[resource.name()] = stringify(resource.set());
+        object.values[name] =
+          stringify(nonRevocable.get<Value::Set>(name).get());
         break;
       default:
-        LOG(FATAL) << "Unexpected Value type: " << resource.type();
+        LOG(FATAL) << "Unexpected Value type: " << type;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/c67d1dd3/src/common/resources.cpp
----------------------------------------------------------------------
diff --git a/src/common/resources.cpp b/src/common/resources.cpp
index 0596919..3b79243 100644
--- a/src/common/resources.cpp
+++ b/src/common/resources.cpp
@@ -33,6 +33,7 @@
 #include <stout/lambda.hpp>
 #include <stout/strings.hpp>
 
+using std::map;
 using std::ostream;
 using std::set;
 using std::string;
@@ -959,6 +960,17 @@ set<string> Resources::names() const
 }
 
 
+map<string, Value_Type> Resources::types() const
+{
+  map<string, Value_Type> result;
+  foreach(const Resource& resource, resources) {
+    result[resource.name()] = resource.type();
+  }
+
+  return result;
+}
+
+
 Option<double> Resources::cpus() const
 {
   Option<Value::Scalar> value = get<Value::Scalar>("cpus");

http://git-wip-us.apache.org/repos/asf/mesos/blob/c67d1dd3/src/tests/common/http_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/common/http_tests.cpp b/src/tests/common/http_tests.cpp
index f087b23..97a0eba 100644
--- a/src/tests/common/http_tests.cpp
+++ b/src/tests/common/http_tests.cpp
@@ -21,6 +21,7 @@
 #include <vector>
 
 #include <mesos/mesos.hpp>
+#include <mesos/resources.hpp>
 
 #include <stout/gtest.hpp>
 #include <stout/json.hpp>
@@ -112,3 +113,38 @@ TEST(HTTP, ModelTask)
   // Ensure both are modeled the same.
   EXPECT_EQ(object, object_);
 }
+
+
+// This test verifies that Resources model combines all resources of different
+// roles and filters out revocable resources.
+TEST(HTTP, ModelResources)
+{
+  // Resources of mixed types, roles, duplicate names; standard (
+  // e.g., 'cpus') and custom (i.e., 'bar').
+  Resources nonRevocable = Resources::parse(
+      "cpus:1;cpus(foo):1;mem:512;disk:1024;ports(foo):[1-10];bar:1").get();
+
+  Resource revocableCpus = Resources::parse("cpus", "1.1", "*").get();
+  revocableCpus.mutable_revocable();
+  Resource revocableMem = Resources::parse("mem", "513", "*").get();
+  revocableMem.mutable_revocable();
+  Resource revocableDisk = Resources::parse("disk", "1025", "*").get();
+  revocableDisk.mutable_revocable();
+
+  Resources total =
+    nonRevocable + revocableCpus + revocableMem + revocableDisk;
+
+  JSON::Value object = model(total);
+
+  Try<JSON::Value> expected = JSON::parse(
+      "{"
+      "  \"bar\":1,"
+      "  \"cpus\":2,"
+      "  \"disk\":1024,"
+      "  \"mem\":512,"
+      "  \"ports\":\"[1-10]\""
+      "}");
+
+  ASSERT_SOME(expected);
+  EXPECT_EQ(expected.get(), object);
+}

http://git-wip-us.apache.org/repos/asf/mesos/blob/c67d1dd3/src/tests/resources_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/resources_tests.cpp b/src/tests/resources_tests.cpp
index ad12648..9f96b14 100644
--- a/src/tests/resources_tests.cpp
+++ b/src/tests/resources_tests.cpp
@@ -31,6 +31,7 @@
 
 using namespace mesos::internal::master;
 
+using std::map;
 using std::ostringstream;
 using std::pair;
 using std::set;
@@ -919,6 +920,19 @@ TEST(ResourcesTest, Names)
 }
 
 
+TEST(ResourcesTest, Types)
+{
+  Resources resources =
+    Resources::parse("cpus(role1):2;cpus:4;ports:[1-10];ports:[11-20]").get();
+
+  map<string, Value_Type> types{
+    {"cpus", Value::SCALAR},
+    {"ports", Value::RANGES}
+  };
+  ASSERT_EQ(types, resources.types());
+}
+
+
 // Helper for creating a reserved resource.
 static Resource createReservedResource(
     const string& name,