You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jo...@apache.org on 2019/07/16 20:43:25 UTC

[mesos] 08/09: Added drain and deactivation info to master API output.

This is an automated email from the ASF dual-hosted git repository.

josephwu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit a805d278f8874838364fa893e1bf8e1c6ca0a0b3
Author: Greg Mann <gr...@mesosphere.io>
AuthorDate: Tue Jul 16 12:20:56 2019 -0700

    Added drain and deactivation info to master API output.
    
    This adds the drain info and deactivation state of agents
    to the master's responses for the GET_STATE and GET_AGENTS
    calls, as well as the '/state' and '/state-summary'
    endpoints.
    
    Review: https://reviews.apache.org/r/71055/
---
 include/mesos/master/master.proto    |  3 +++
 include/mesos/v1/master/master.proto |  3 +++
 src/common/protobuf_utils.cpp        | 16 ++++++++++++++--
 src/common/protobuf_utils.hpp        |  6 +++++-
 src/master/http.cpp                  |  6 +++++-
 src/master/master.cpp                |  5 ++++-
 src/master/readonly_handler.cpp      | 35 +++++++++++++++++++++++++++++++----
 7 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/include/mesos/master/master.proto b/include/mesos/master/master.proto
index 399e27e..07bf4e7 100644
--- a/include/mesos/master/master.proto
+++ b/include/mesos/master/master.proto
@@ -446,6 +446,7 @@ message Response {
     message Agent {
       required SlaveInfo agent_info = 1;
       required bool active = 2;
+      optional bool deactivated = 12;
       required string version = 3;
 
       optional string pid = 4;
@@ -467,6 +468,8 @@ message Response {
       }
 
       repeated ResourceProvider resource_providers = 11;
+
+      optional DrainInfo drain_info = 13;
     }
 
     // Registered agents.
diff --git a/include/mesos/v1/master/master.proto b/include/mesos/v1/master/master.proto
index 62bcee5..9bcef2f 100644
--- a/include/mesos/v1/master/master.proto
+++ b/include/mesos/v1/master/master.proto
@@ -447,6 +447,7 @@ message Response {
     message Agent {
       required AgentInfo agent_info = 1;
       required bool active = 2;
+      optional bool deactivated = 12;
       required string version = 3;
 
       optional string pid = 4;
@@ -468,6 +469,8 @@ message Response {
       }
 
       repeated ResourceProvider resource_providers = 11;
+
+      optional DrainInfo drain_info = 13;
     }
 
     // Registered agents.
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index c91d543..fc67c38 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -1507,6 +1507,8 @@ mesos::master::Event createFrameworkRemoved(const FrameworkInfo& frameworkInfo)
 
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave,
+    const Option<DrainInfo>& drainInfo,
+    bool deactivated,
     const Option<Owned<ObjectApprovers>>& approvers)
 {
   mesos::master::Response::GetAgents::Agent agent;
@@ -1515,6 +1517,7 @@ mesos::master::Response::GetAgents::Agent createAgentResponse(
 
   agent.set_pid(string(slave.pid));
   agent.set_active(slave.active);
+  agent.set_deactivated(deactivated);
   agent.set_version(slave.version);
 
   agent.mutable_registered_time()->set_nanoseconds(
@@ -1567,18 +1570,27 @@ mesos::master::Response::GetAgents::Agent createAgentResponse(
         resourceProvider.totalResources);
   }
 
+  if (drainInfo.isSome()) {
+    agent.mutable_drain_info()->CopyFrom(drainInfo.get());
+  }
+
   return agent;
 }
 
 
 mesos::master::Event createAgentAdded(
-    const mesos::internal::master::Slave& slave)
+    const mesos::internal::master::Slave& slave,
+    const Option<DrainInfo>& drainInfo,
+    bool deactivated)
 {
   mesos::master::Event event;
   event.set_type(mesos::master::Event::AGENT_ADDED);
 
   event.mutable_agent_added()->mutable_agent()->CopyFrom(
-      createAgentResponse(slave));
+      createAgentResponse(
+          slave,
+          drainInfo,
+          deactivated));
 
   return event;
 }
diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 893022b..5d6a35d 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -576,12 +576,16 @@ mesos::master::Event createFrameworkRemoved(const FrameworkInfo& frameworkInfo);
 // Helper for creating an `Agent` response.
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave,
+    const Option<DrainInfo>& drainInfo,
+    bool deactivated,
     const Option<process::Owned<ObjectApprovers>>& approvers = None());
 
 
 // Helper for creating an `AGENT_ADDED` event from a `Slave`.
 mesos::master::Event createAgentAdded(
-    const mesos::internal::master::Slave& slave);
+    const mesos::internal::master::Slave& slave,
+    const Option<DrainInfo>& drainInfo,
+    bool deactivated);
 
 
 // Helper for creating an `AGENT_REMOVED` event from a `SlaveID`.
diff --git a/src/master/http.cpp b/src/master/http.cpp
index ee0f2d5..765d505 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -2087,7 +2087,11 @@ mesos::master::Response::GetAgents Master::Http::_getAgents(
   foreachvalue (const Slave* slave, master->slaves.registered) {
     mesos::master::Response::GetAgents::Agent* agent = getAgents.add_agents();
     *agent =
-        protobuf::master::event::createAgentResponse(*slave, approvers);
+        protobuf::master::event::createAgentResponse(
+            *slave,
+            master->slaves.draining.get(slave->id),
+            master->slaves.deactivated.contains(slave->id),
+            approvers);
   }
 
   foreachvalue (const SlaveInfo& slaveInfo, master->slaves.recovered) {
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 61d0e7b..f1ca637 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -11574,7 +11574,10 @@ void Master::addSlave(
       slave->usedResources);
 
   if (!subscribers.subscribed.empty()) {
-    subscribers.send(protobuf::master::event::createAgentAdded(*slave));
+    subscribers.send(protobuf::master::event::createAgentAdded(
+        *slave,
+        slaves.draining.get(slave->id),
+        slaves.deactivated.contains(slave->id)));
   }
 }
 
diff --git a/src/master/readonly_handler.cpp b/src/master/readonly_handler.cpp
index ab8a4ce..60dac9a 100644
--- a/src/master/readonly_handler.cpp
+++ b/src/master/readonly_handler.cpp
@@ -96,11 +96,15 @@ struct SlaveWriter
 {
   SlaveWriter(
       const Slave& slave,
+      const Option<DrainInfo>& drainInfo,
+      bool deactivated,
       const process::Owned<ObjectApprovers>& approvers);
 
   void operator()(JSON::ObjectWriter* writer) const;
 
   const Slave& slave_;
+  const Option<DrainInfo> drainInfo_;
+  const bool deactivated_;
   const process::Owned<ObjectApprovers>& approvers_;
 };
 
@@ -285,8 +289,13 @@ void FullFrameworkWriter::operator()(JSON::ObjectWriter* writer) const
 
 SlaveWriter::SlaveWriter(
     const Slave& slave,
+    const Option<DrainInfo>& drainInfo,
+    bool deactivated,
     const Owned<ObjectApprovers>& approvers)
-  : slave_(slave), approvers_(approvers)
+  : slave_(slave),
+    drainInfo_(drainInfo),
+    deactivated_(deactivated),
+    approvers_(approvers)
 {}
 
 
@@ -321,8 +330,13 @@ void SlaveWriter::operator()(JSON::ObjectWriter* writer) const
   writer->field("unreserved_resources", totalResources.unreserved());
 
   writer->field("active", slave_.active);
+  writer->field("deactivated", deactivated_);
   writer->field("version", slave_.version);
   writer->field("capabilities", slave_.capabilities.toRepeatedPtrField());
+
+  if (drainInfo_.isSome()) {
+    writer->field("drain_info", JSON::Protobuf(drainInfo_.get()));
+  }
 }
 
 
@@ -365,7 +379,11 @@ void SlavesWriter::operator()(JSON::ObjectWriter* writer) const
 void SlavesWriter::writeSlave(
   const Slave* slave, JSON::ObjectWriter* writer) const
 {
-  SlaveWriter(*slave, approvers_)(writer);
+  SlaveWriter(
+      *slave,
+      slaves_.draining.get(slave->id),
+      slaves_.deactivated.contains(slave->id),
+      approvers_)(writer);
 
   // Add the complete protobuf->JSON for all used, reserved,
   // and offered resources. The other endpoints summarize
@@ -867,7 +885,11 @@ process::http::Response Master::ReadOnlyHandler::state(
         "slaves",
         [master, &approvers](JSON::ArrayWriter* writer) {
           foreachvalue (Slave* slave, master->slaves.registered) {
-            writer->element(SlaveWriter(*slave, approvers));
+            writer->element(SlaveWriter(
+                *slave,
+                master->slaves.draining.get(slave->id),
+                master->slaves.deactivated.contains(slave->id),
+                approvers));
           }
         });
 
@@ -966,10 +988,15 @@ process::http::Response Master::ReadOnlyHandler::stateSummary(
           foreachvalue (Slave* slave, master->slaves.registered) {
             writer->element(
                 [&slave,
+                 &master,
                  &slaveFrameworkMapping,
                  &taskStateSummaries,
                  &approvers](JSON::ObjectWriter* writer) {
-                  SlaveWriter slaveWriter(*slave, approvers);
+                  SlaveWriter slaveWriter(
+                      *slave,
+                      master->slaves.draining.get(slave->id),
+                      master->slaves.deactivated.contains(slave->id),
+                      approvers);
                   slaveWriter(writer);
 
                   // Add the 'TaskState' summary for this slave.