You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by an...@apache.org on 2017/07/27 21:41:03 UTC

[1/4] mesos git commit: Added 'FRAMEWORK_ADDED' event for master streaming api.

Repository: mesos
Updated Branches:
  refs/heads/master e6ec4e836 -> a5ad763d1


Added 'FRAMEWORK_ADDED' event for master streaming api.

Added event 'FRAMEWORK_ADDED' for master's v1 streaming operator API.
It will be generated when the framework registers for the first time.

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

Author:    Zhitao Li <zh...@gmail.com>
Date:      Thu Jul 27 14:30:30 2017 -0700


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

Branch: refs/heads/master
Commit: 5073717e79dce38de51214cf437f58da1b8a1085
Parents: e6ec4e8
Author: Zhitao Li <zh...@gmail.com>
Authored: Thu Jul 27 14:30:30 2017 -0700
Committer: Anand Mazumdar <an...@apache.org>
Committed: Thu Jul 27 14:38:03 2017 -0700

----------------------------------------------------------------------
 include/mesos/master/master.proto    |  8 ++++++++
 include/mesos/v1/master/master.proto |  9 +++++++++
 src/common/protobuf_utils.cpp        | 31 +++++++++++++++++++++++++++++++
 src/common/protobuf_utils.hpp        |  6 ++++++
 src/master/master.cpp                | 10 ++++++++++
 5 files changed, 64 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5073717e/include/mesos/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/master/master.proto b/include/mesos/master/master.proto
index 7a722a6..8051519 100644
--- a/include/mesos/master/master.proto
+++ b/include/mesos/master/master.proto
@@ -480,6 +480,7 @@ message Event {
     TASK_UPDATED = 3; // See `TaskUpdated` below.
     AGENT_ADDED = 4; // See `AgentAdded` below.
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
+    FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -510,6 +511,12 @@ message Event {
     required TaskState state = 3;
   }
 
+  // Forwarded by the master when a framework becomes known to it.
+  // This can happen when a new framework registers with the master.
+  message FrameworkAdded {
+    required Response.GetFrameworks.Framework framework = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -535,4 +542,5 @@ message Event {
   optional TaskUpdated task_updated = 4;
   optional AgentAdded agent_added = 5;
   optional AgentRemoved agent_removed = 6;
+  optional FrameworkAdded framework_added = 7;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/5073717e/include/mesos/v1/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/master/master.proto b/include/mesos/v1/master/master.proto
index cf88ea6..22800fe 100644
--- a/include/mesos/v1/master/master.proto
+++ b/include/mesos/v1/master/master.proto
@@ -480,6 +480,7 @@ message Event {
     TASK_UPDATED = 3; // See `TaskUpdated` below.
     AGENT_ADDED = 4; // See `AgentAdded` below.
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
+    FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -510,6 +511,13 @@ message Event {
     required TaskState state = 3;
   }
 
+
+  // Forwarded by the master when a framework becomes known to it.
+  // This can happen when a new framework registers with the master.
+  message FrameworkAdded {
+    required Response.GetFrameworks.Framework framework = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -535,4 +543,5 @@ message Event {
   optional TaskUpdated task_updated = 4;
   optional AgentAdded agent_added = 5;
   optional AgentRemoved agent_removed = 6;
+  optional FrameworkAdded framework_added = 7;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/5073717e/src/common/protobuf_utils.cpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index 4e5ab02..5e0bddc 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -808,6 +808,37 @@ mesos::master::Event createTaskAdded(const Task& task)
 }
 
 
+mesos::master::Event createFrameworkAdded(
+    const mesos::internal::master::Framework& _framework)
+{
+  CHECK(_framework.active());
+  CHECK(_framework.connected());
+  CHECK(!_framework.recovered());
+
+  mesos::master::Event event;
+  event.set_type(mesos::master::Event::FRAMEWORK_ADDED);
+
+  mesos::master::Response::GetFrameworks::Framework* framework =
+    event.mutable_framework_added()->mutable_framework();
+
+  framework->mutable_framework_info()->CopyFrom(_framework.info);
+  framework->set_active(_framework.active());
+  framework->set_connected(_framework.connected());
+  framework->set_recovered(_framework.recovered());
+
+  framework->mutable_registered_time()->set_nanoseconds(
+      _framework.registeredTime.duration().ns());
+
+  framework->mutable_reregistered_time()->set_nanoseconds(
+      _framework.reregisteredTime.duration().ns());
+
+  framework->mutable_unregistered_time()->set_nanoseconds(
+      _framework.unregisteredTime.duration().ns());
+
+  return event;
+}
+
+
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave)
 {

http://git-wip-us.apache.org/repos/asf/mesos/blob/5073717e/src/common/protobuf_utils.hpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 2156f6d..8f04978 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -52,6 +52,7 @@ namespace internal {
 
 namespace master {
 // Forward declaration (in lieu of an include).
+struct Framework;
 struct Slave;
 } // namespace master {
 
@@ -303,6 +304,11 @@ mesos::master::Event createTaskUpdated(
 mesos::master::Event createTaskAdded(const Task& task);
 
 
+// Helper for creating a 'FRAMEWORK_ADDED' event from a `Framework`.
+mesos::master::Event createFrameworkAdded(
+    const mesos::internal::master::Framework& framework);
+
+
 // Helper for creating an `Agent` response.
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave);

http://git-wip-us.apache.org/repos/asf/mesos/blob/5073717e/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index e12c997..c972841 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2701,6 +2701,11 @@ void Master::_subscribe(
     // Start the heartbeat after sending SUBSCRIBED event.
     framework->heartbeat();
 
+    if (!subscribers.subscribed.empty()) {
+      subscribers.send(
+          protobuf::master::event::createFrameworkAdded(*framework));
+    }
+
     return;
   }
 
@@ -2996,6 +3001,11 @@ void Master::_subscribe(
     message.mutable_master_info()->MergeFrom(info_);
     framework->send(message);
 
+    if (!subscribers.subscribed.empty()) {
+      subscribers.send(
+          protobuf::master::event::createFrameworkAdded(*framework));
+    }
+
     return;
   }
 


[2/4] mesos git commit: Added 'FRAMEWORK_UPDATED' event for master streaming api.

Posted by an...@apache.org.
Added 'FRAMEWORK_UPDATED' event for master streaming api.

Added event 'FRAMEWORK_UPDATED' for master's v1 streaming operator API.
It will be generated when the framework re-registers with the master.

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


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

Branch: refs/heads/master
Commit: 77486d777973bc4e7e4a2098c66e128a56702a94
Parents: 5073717
Author: Quinn Leng <qu...@gmail.com>
Authored: Thu Jul 27 14:31:23 2017 -0700
Committer: Anand Mazumdar <an...@apache.org>
Committed: Thu Jul 27 14:38:25 2017 -0700

----------------------------------------------------------------------
 include/mesos/master/master.proto    |  8 ++++++++
 include/mesos/v1/master/master.proto |  8 ++++++++
 src/common/protobuf_utils.cpp        | 27 +++++++++++++++++++++++++++
 src/common/protobuf_utils.hpp        |  5 +++++
 src/master/master.cpp                | 20 ++++++++++++++++++++
 5 files changed, 68 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/77486d77/include/mesos/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/master/master.proto b/include/mesos/master/master.proto
index 8051519..c387504 100644
--- a/include/mesos/master/master.proto
+++ b/include/mesos/master/master.proto
@@ -481,6 +481,7 @@ message Event {
     AGENT_ADDED = 4; // See `AgentAdded` below.
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
     FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
+    FRAMEWORK_UPDATED = 7; // See `FrameworkUpdated` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -517,6 +518,12 @@ message Event {
     required Response.GetFrameworks.Framework framework = 1;
   }
 
+  // Forwarded by the master when a framework re-registers with the master
+  // upon a disconnection (network error) or upon a master failover.
+  message FrameworkUpdated {
+    required Response.GetFrameworks.Framework framework = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -543,4 +550,5 @@ message Event {
   optional AgentAdded agent_added = 5;
   optional AgentRemoved agent_removed = 6;
   optional FrameworkAdded framework_added = 7;
+  optional FrameworkUpdated framework_updated = 8;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/77486d77/include/mesos/v1/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/master/master.proto b/include/mesos/v1/master/master.proto
index 22800fe..b79143a 100644
--- a/include/mesos/v1/master/master.proto
+++ b/include/mesos/v1/master/master.proto
@@ -481,6 +481,7 @@ message Event {
     AGENT_ADDED = 4; // See `AgentAdded` below.
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
     FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
+    FRAMEWORK_UPDATED = 7; // See `FrameworkUpdated` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -518,6 +519,12 @@ message Event {
     required Response.GetFrameworks.Framework framework = 1;
   }
 
+  // Forwarded by the master when a framework re-registers with the master
+  // upon a disconnection (network error) or upon a master failover.
+  message FrameworkUpdated {
+    required Response.GetFrameworks.Framework framework = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -544,4 +551,5 @@ message Event {
   optional AgentAdded agent_added = 5;
   optional AgentRemoved agent_removed = 6;
   optional FrameworkAdded framework_added = 7;
+  optional FrameworkUpdated framework_updated = 8;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/77486d77/src/common/protobuf_utils.cpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index 5e0bddc..1ab168a 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -839,6 +839,33 @@ mesos::master::Event createFrameworkAdded(
 }
 
 
+mesos::master::Event createFrameworkUpdated(
+    const mesos::internal::master::Framework& _framework)
+{
+  mesos::master::Event event;
+  event.set_type(mesos::master::Event::FRAMEWORK_UPDATED);
+
+  mesos::master::Response::GetFrameworks::Framework* framework =
+    event.mutable_framework_updated()->mutable_framework();
+
+  framework->mutable_framework_info()->CopyFrom(_framework.info);
+  framework->set_active(_framework.active());
+  framework->set_connected(_framework.connected());
+  framework->set_recovered(_framework.recovered());
+
+  framework->mutable_registered_time()->set_nanoseconds(
+      _framework.registeredTime.duration().ns());
+
+  framework->mutable_reregistered_time()->set_nanoseconds(
+      _framework.reregisteredTime.duration().ns());
+
+  framework->mutable_unregistered_time()->set_nanoseconds(
+      _framework.unregisteredTime.duration().ns());
+
+  return event;
+}
+
+
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave)
 {

http://git-wip-us.apache.org/repos/asf/mesos/blob/77486d77/src/common/protobuf_utils.hpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 8f04978..2060e52 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -309,6 +309,11 @@ mesos::master::Event createFrameworkAdded(
     const mesos::internal::master::Framework& framework);
 
 
+// Helper for creating a 'FRAMEWORK_UPDATED' event from a `Framework`.
+mesos::master::Event createFrameworkUpdated(
+    const mesos::internal::master::Framework& framework);
+
+
 // Helper for creating an `Agent` response.
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave);

http://git-wip-us.apache.org/repos/asf/mesos/blob/77486d77/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index c972841..a80cc5e 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2752,6 +2752,11 @@ void Master::_subscribe(
     }
   }
 
+  if (!subscribers.subscribed.empty()) {
+    subscribers.send(
+        protobuf::master::event::createFrameworkUpdated(*framework));
+  }
+
   // Broadcast the new framework pid to all the slaves. We have to
   // broadcast because an executor might be running on a slave but
   // it currently isn't running any tasks.
@@ -3077,6 +3082,11 @@ void Master::_subscribe(
       // if necesssary.
       LOG(INFO) << "Framework " << *framework << " failed over";
       failoverFramework(framework, from);
+
+      if (!subscribers.subscribed.empty()) {
+        subscribers.send(
+            protobuf::master::event::createFrameworkUpdated(*framework));
+      }
     } else {
       LOG(INFO) << "Allowing framework " << *framework
                 << " to subscribe with an already used id";
@@ -3124,6 +3134,11 @@ void Master::_subscribe(
       message.mutable_framework_id()->MergeFrom(frameworkInfo.id());
       message.mutable_master_info()->MergeFrom(info_);
       framework->send(message);
+
+      if (!subscribers.subscribed.empty()) {
+        subscribers.send(
+            protobuf::master::event::createFrameworkUpdated(*framework));
+      }
       return;
     }
   } else {
@@ -3140,6 +3155,11 @@ void Master::_subscribe(
       send(from, message);
       return;
     }
+
+    if (!subscribers.subscribed.empty()) {
+      subscribers.send(
+          protobuf::master::event::createFrameworkUpdated(*framework));
+    }
   }
 
   // Broadcast the new framework pid to all the slaves. We have to


[4/4] mesos git commit: Added test cases for framework streaming events.

Posted by an...@apache.org.
Added test cases for framework streaming events.

Added test cases for 'FRAMEWORK_ADDED', 'FRAMEWORK_UPDATED' and
'FRAMEWORK_REMOVED' events in v1 operator API.

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


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

Branch: refs/heads/master
Commit: a5ad763d1c3a2a35b897255fe75e19b65ccea269
Parents: bb0e4f2
Author: Quinn Leng <qu...@gmail.com>
Authored: Thu Jul 27 14:32:01 2017 -0700
Committer: Anand Mazumdar <an...@apache.org>
Committed: Thu Jul 27 14:38:44 2017 -0700

----------------------------------------------------------------------
 src/tests/api_tests.cpp | 185 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 185 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/a5ad763d/src/tests/api_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp
index f22ca28..1d5b080 100644
--- a/src/tests/api_tests.cpp
+++ b/src/tests/api_tests.cpp
@@ -1922,6 +1922,191 @@ TEST_P(MasterAPITest, Subscribe)
 }
 
 
+// This test tries to verify that a client subscribed to the 'api/v1' endpoint
+// can receive `FRAMEWORK_ADDED`, `FRAMEWORK_UPDATED` and 'FRAMEWORK_REMOVED'
+// events.
+TEST_P(MasterAPITest, FrameworksEvent)
+{
+  ContentType contentType = GetParam();
+
+  Try<Owned<cluster::Master>> master = this->StartMaster();
+  ASSERT_SOME(master);
+
+  v1::master::Call v1Call;
+  v1Call.set_type(v1::master::Call::SUBSCRIBE);
+
+  http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
+
+  headers["Accept"] = stringify(contentType);
+
+  Future<http::Response> response = http::streaming::post(
+      master.get()->pid,
+      "api/v1",
+      headers,
+      serialize(contentType, v1Call),
+      stringify(contentType));
+
+  AWAIT_EXPECT_RESPONSE_STATUS_EQ(http::OK().status, response);
+  AWAIT_EXPECT_RESPONSE_HEADER_EQ("chunked", "Transfer-Encoding", response);
+  ASSERT_EQ(http::Response::PIPE, response->type);
+  ASSERT_SOME(response->reader);
+
+  http::Pipe::Reader reader = response->reader.get();
+
+  auto deserializer =
+    lambda::bind(deserialize<v1::master::Event>, contentType, lambda::_1);
+
+  Reader<v1::master::Event> decoder(
+      Decoder<v1::master::Event>(deserializer), reader);
+
+  Future<Result<v1::master::Event>> event = decoder.read();
+  AWAIT_READY(event);
+
+  EXPECT_EQ(v1::master::Event::SUBSCRIBED, event->get().type());
+  const v1::master::Response::GetState& getState =
+      event->get().subscribed().get_state();
+
+  EXPECT_EQ(0u, getState.get_frameworks().frameworks_size());
+  EXPECT_EQ(0u, getState.get_agents().agents_size());
+  EXPECT_EQ(0u, getState.get_tasks().tasks_size());
+  EXPECT_EQ(0u, getState.get_executors().executors_size());
+
+  event = decoder.read();
+  EXPECT_TRUE(event.isPending());
+
+  // Start a scheduler. The subscriber will receive a 'FRAMEWORK_ADDED' event
+  // when the scheduler subscribes with the master.
+  auto scheduler = std::make_shared<v1::MockHTTPScheduler>();
+  auto detector = std::make_shared<StandaloneMasterDetector>(master.get()->pid);
+
+  Future<Nothing> connected;
+  EXPECT_CALL(*scheduler, connected(_))
+    .WillOnce(FutureSatisfy(&connected));
+
+  v1::scheduler::TestMesos mesos(
+      master.get()->pid,
+      contentType,
+      scheduler,
+      detector);
+
+  AWAIT_READY(connected);
+
+  Future<v1::scheduler::Event::Subscribed> subscribed;
+  EXPECT_CALL(*scheduler, subscribed(_, _))
+    .WillOnce(FutureArg<1>(&subscribed));
+
+  EXPECT_CALL(*scheduler, heartbeat(_))
+    .WillRepeatedly(Return()); // Ignore heartbeats.
+
+  v1::FrameworkInfo frameworkInfo = v1::DEFAULT_FRAMEWORK_INFO;
+
+  // Set the timeout to a large value to avoid the framework being removed
+  // when it reconnects.
+  frameworkInfo.set_failover_timeout(Weeks(2).secs());
+
+  {
+    v1::scheduler::Call call;
+    call.set_type(v1::scheduler::Call::SUBSCRIBE);
+
+    v1::scheduler::Call::Subscribe* subscribe = call.mutable_subscribe();
+    subscribe->mutable_framework_info()->CopyFrom(frameworkInfo);
+
+    mesos.send(call);
+  }
+
+  AWAIT_READY(subscribed);
+
+  v1::FrameworkID frameworkId = subscribed->framework_id();
+  frameworkInfo.mutable_id()->CopyFrom(frameworkId);
+
+  AWAIT_READY(event);
+
+  {
+    EXPECT_EQ(v1::master::Event::FRAMEWORK_ADDED, event.get().get().type());
+
+    const v1::master::Response::GetFrameworks::Framework& framework =
+      event.get().get().framework_added().framework();
+
+    EXPECT_EQ(frameworkInfo, framework.framework_info());
+    EXPECT_TRUE(framework.active());
+    EXPECT_TRUE(framework.connected());
+  }
+
+  EXPECT_CALL(*scheduler, subscribed(_, _))
+    .WillOnce(FutureArg<1>(&subscribed));
+
+  Future<Nothing> disconnected;
+  EXPECT_CALL(*scheduler, disconnected(_))
+    .WillOnce(FutureSatisfy(&disconnected));
+
+  EXPECT_CALL(*scheduler, connected(_))
+    .WillOnce(FutureSatisfy(&connected))
+    .WillRepeatedly(Return()); // Ignore future invocations.
+
+  // Force a reconnection with the master. This should result in a
+  // 'FRAMEWORK_UPDATED' event when the scheduler re-registers with the master.
+  mesos.reconnect();
+
+  AWAIT_READY(disconnected);
+
+  // The scheduler should be able to immediately reconnect with the master.
+  AWAIT_READY(connected);
+
+  {
+    v1::scheduler::Call call;
+    call.set_type(v1::scheduler::Call::SUBSCRIBE);
+    call.mutable_framework_id()->CopyFrom(frameworkId);
+
+    v1::scheduler::Call::Subscribe* subscribe = call.mutable_subscribe();
+    subscribe->mutable_framework_info()->CopyFrom(frameworkInfo);
+
+    mesos.send(call);
+  }
+
+  event = decoder.read();
+  AWAIT_READY(event);
+
+  {
+    EXPECT_EQ(v1::master::Event::FRAMEWORK_UPDATED, event.get().get().type());
+
+    const v1::master::Response::GetFrameworks::Framework& framework =
+      event.get().get().framework_updated().framework();
+
+    EXPECT_EQ(frameworkInfo, framework.framework_info());
+  }
+
+  EXPECT_CALL(*scheduler, disconnected(_))
+    .WillOnce(FutureSatisfy(&disconnected));
+
+  // Send a teardown request to the master to teardown the framework.
+  // The subscriber will receive a 'FRAMEWORK_REMOVED' event from the master.
+  {
+    Future<http::Response> response = process::http::post(
+        master.get()->pid,
+        "teardown",
+        createBasicAuthHeaders(DEFAULT_CREDENTIAL),
+        "frameworkId=" + frameworkId.value());
+
+    AWAIT_READY(response);
+    AWAIT_EXPECT_RESPONSE_STATUS_EQ(http::OK().status, response);
+  }
+
+  AWAIT_READY(disconnected);
+
+  event = decoder.read();
+  AWAIT_READY(event);
+
+  {
+    EXPECT_EQ(v1::master::Event::FRAMEWORK_REMOVED, event.get().get().type());
+
+    const v1::FrameworkID& frameworkId_ =
+      event.get().get().framework_removed().framework_info().id();
+
+    EXPECT_EQ(frameworkId, frameworkId_);
+  }
+}
+
+
 // This test verifies if we can retrieve the current quota status through
 // `GET_QUOTA` call, after we set quota resources through `SET_QUOTA` call.
 TEST_P(MasterAPITest, GetQuota)


[3/4] mesos git commit: Added 'FRAMEWORK_REMOVED' event for master streaming api.

Posted by an...@apache.org.
Added 'FRAMEWORK_REMOVED' event for master streaming api.

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


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

Branch: refs/heads/master
Commit: bb0e4f2c3ac4a24d995acc14440838b11932b95a
Parents: 77486d7
Author: Zhitao Li <zh...@gmail.com>
Authored: Thu Jul 27 14:31:32 2017 -0700
Committer: Anand Mazumdar <an...@apache.org>
Committed: Thu Jul 27 14:38:35 2017 -0700

----------------------------------------------------------------------
 include/mesos/master/master.proto    |  9 +++++++++
 include/mesos/v1/master/master.proto |  9 +++++++++
 src/common/protobuf_utils.cpp        | 12 ++++++++++++
 src/common/protobuf_utils.hpp        |  4 ++++
 src/master/master.cpp                |  5 +++++
 5 files changed, 39 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/bb0e4f2c/include/mesos/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/master/master.proto b/include/mesos/master/master.proto
index c387504..0e4c30e 100644
--- a/include/mesos/master/master.proto
+++ b/include/mesos/master/master.proto
@@ -482,6 +482,7 @@ message Event {
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
     FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
     FRAMEWORK_UPDATED = 7; // See `FrameworkUpdated` below.
+    FRAMEWORK_REMOVED = 8; // See `FrameworkRemoved` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -524,6 +525,13 @@ message Event {
     required Response.GetFrameworks.Framework framework = 1;
   }
 
+  // Forwarded by the master when a framework is removed. This can happen when
+  // a framework is explicitly teardown by the operator or if it fails to
+  // re-register with the master within the failover timeout.
+  message FrameworkRemoved {
+    required FrameworkInfo framework_info = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -551,4 +559,5 @@ message Event {
   optional AgentRemoved agent_removed = 6;
   optional FrameworkAdded framework_added = 7;
   optional FrameworkUpdated framework_updated = 8;
+  optional FrameworkRemoved framework_removed = 9;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/bb0e4f2c/include/mesos/v1/master/master.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/master/master.proto b/include/mesos/v1/master/master.proto
index b79143a..c04fd16 100644
--- a/include/mesos/v1/master/master.proto
+++ b/include/mesos/v1/master/master.proto
@@ -482,6 +482,7 @@ message Event {
     AGENT_REMOVED = 5; // See `AgentRemoved` below.
     FRAMEWORK_ADDED = 6; // See `FrameworkAdded` below.
     FRAMEWORK_UPDATED = 7; // See `FrameworkUpdated` below.
+    FRAMEWORK_REMOVED = 8; // See `FrameworkRemoved` below.
 
     // TODO(vinod): Fill in more events.
   }
@@ -525,6 +526,13 @@ message Event {
     required Response.GetFrameworks.Framework framework = 1;
   }
 
+  // Forwarded by the master when a framework is removed. This can happen when
+  // a framework is explicitly teardown by the operator or if it fails to
+  // re-register with the master within the failover timeout.
+  message FrameworkRemoved {
+    required FrameworkInfo framework_info = 1;
+  }
+
   // Forwarded by the master when an agent becomes known to it.
   // This can happen when an agent registered for the first
   // time, or reregistered after a master failover.
@@ -552,4 +560,5 @@ message Event {
   optional AgentRemoved agent_removed = 6;
   optional FrameworkAdded framework_added = 7;
   optional FrameworkUpdated framework_updated = 8;
+  optional FrameworkRemoved framework_removed = 9;
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/bb0e4f2c/src/common/protobuf_utils.cpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index 1ab168a..49d3a22 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -866,6 +866,18 @@ mesos::master::Event createFrameworkUpdated(
 }
 
 
+mesos::master::Event createFrameworkRemoved(const FrameworkInfo& frameworkInfo)
+{
+  mesos::master::Event event;
+  event.set_type(mesos::master::Event::FRAMEWORK_REMOVED);
+
+  event.mutable_framework_removed()->mutable_framework_info()->CopyFrom(
+      frameworkInfo);
+
+  return event;
+}
+
+
 mesos::master::Response::GetAgents::Agent createAgentResponse(
     const mesos::internal::master::Slave& slave)
 {

http://git-wip-us.apache.org/repos/asf/mesos/blob/bb0e4f2c/src/common/protobuf_utils.hpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 2060e52..80d2edd 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -314,6 +314,10 @@ mesos::master::Event createFrameworkUpdated(
     const mesos::internal::master::Framework& framework);
 
 
+// Helper for creating a 'FRAMEWORK_REMOVED' event from a `FrameworkInfo`.
+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);

http://git-wip-us.apache.org/repos/asf/mesos/blob/bb0e4f2c/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index a80cc5e..dbf5dac 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -8499,6 +8499,11 @@ void Master::removeFramework(Framework* framework)
 
   // The framework pointer is now owned by `frameworks.completed`.
   frameworks.completed.set(framework->id(), Owned<Framework>(framework));
+
+  if (!subscribers.subscribed.empty()) {
+    subscribers.send(
+        protobuf::master::event::createFrameworkRemoved(framework->info));
+  }
 }