You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2016/03/03 23:47:47 UTC

mesos git commit: Renamed event_call_framework.cpp to test_http_framework.cpp.

Repository: mesos
Updated Branches:
  refs/heads/master e88815b52 -> 7276019d6


Renamed event_call_framework.cpp to test_http_framework.cpp.

This change rename event_call_framework to test_http_framework
in order to correctly reflect that it's an example for HTTP based
framework. (MESOS-4583)

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


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

Branch: refs/heads/master
Commit: 7276019d601045e1e78fe74777f6990b88392d35
Parents: e88815b
Author: Yong Tang <yo...@outlook.com>
Authored: Thu Mar 3 14:47:11 2016 -0800
Committer: Vinod Kone <vi...@gmail.com>
Committed: Thu Mar 3 14:47:11 2016 -0800

----------------------------------------------------------------------
 src/Makefile.am                        |  12 +-
 src/examples/event_call_framework.cpp  | 443 ----------------------------
 src/examples/test_http_framework.cpp   | 443 ++++++++++++++++++++++++++++
 src/tests/event_call_framework_test.sh |  43 ---
 src/tests/examples_tests.cpp           |   4 +-
 src/tests/test_http_framework_test.sh  |  43 +++
 6 files changed, 494 insertions(+), 494 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index b30cc25..5b54fe0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1595,10 +1595,10 @@ clean-python:
 PHONY_TARGETS += clean-python
 
 # Test (make check) binaries.
-check_PROGRAMS += event-call-framework
-event_call_framework_SOURCES = examples/event_call_framework.cpp
-event_call_framework_CPPFLAGS = $(MESOS_CPPFLAGS)
-event_call_framework_LDADD = libmesos.la $(LDADD)
+check_PROGRAMS += test-http-framework
+test_http_framework_SOURCES = examples/test_http_framework.cpp
+test_http_framework_CPPFLAGS = $(MESOS_CPPFLAGS)
+test_http_framework_LDADD = libmesos.la $(LDADD)
 
 check_PROGRAMS += test-framework
 test_framework_SOURCES = examples/test_framework.cpp
@@ -1972,7 +1972,7 @@ EXTRA_DIST +=							\
 
 dist_check_SCRIPTS +=						\
   tests/balloon_framework_test.sh				\
-  tests/event_call_framework_test.sh				\
+  tests/test_http_framework_test.sh				\
   tests/java_exception_test.sh					\
   tests/java_framework_test.sh					\
   tests/java_log_test.sh					\
@@ -1988,7 +1988,7 @@ if INSTALL_TESTS
 testlibexec_PROGRAMS = $(check_PROGRAMS)
 dist_testlibexec_SCRIPTS =			\
   tests/balloon_framework_test.sh		\
-  tests/event_call_framework_test.sh		\
+  tests/test_http_framework_test.sh		\
   tests/java_exception_test.sh			\
   tests/java_framework_test.sh			\
   tests/java_log_test.sh			\

http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/examples/event_call_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/event_call_framework.cpp b/src/examples/event_call_framework.cpp
deleted file mode 100644
index 9bac802..0000000
--- a/src/examples/event_call_framework.cpp
+++ /dev/null
@@ -1,443 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <iostream>
-#include <string>
-#include <queue>
-
-#include <boost/lexical_cast.hpp>
-
-#include <mesos/v1/mesos.hpp>
-#include <mesos/v1/resources.hpp>
-#include <mesos/v1/scheduler.hpp>
-
-#include <process/delay.hpp>
-#include <process/owned.hpp>
-#include <process/process.hpp>
-#include <process/protobuf.hpp>
-
-#include <stout/check.hpp>
-#include <stout/duration.hpp>
-#include <stout/exit.hpp>
-#include <stout/flags.hpp>
-#include <stout/foreach.hpp>
-#include <stout/lambda.hpp>
-#include <stout/none.hpp>
-#include <stout/numify.hpp>
-#include <stout/option.hpp>
-#include <stout/os.hpp>
-#include <stout/option.hpp>
-#include <stout/path.hpp>
-#include <stout/stringify.hpp>
-
-#include "common/status_utils.hpp"
-
-#include "logging/flags.hpp"
-#include "logging/logging.hpp"
-
-using namespace mesos::v1;
-
-using std::cerr;
-using std::cout;
-using std::endl;
-using std::queue;
-using std::string;
-using std::vector;
-
-using boost::lexical_cast;
-
-using mesos::v1::scheduler::Call;
-using mesos::v1::scheduler::Event;
-
-const int32_t CPUS_PER_TASK = 1;
-const int32_t MEM_PER_TASK = 128;
-
-class EventCallScheduler : public process::Process<EventCallScheduler>
-{
-public:
-  EventCallScheduler(const FrameworkInfo& _framework,
-                     const ExecutorInfo& _executor,
-                     const string& _master)
-    : framework(_framework),
-      executor(_executor),
-      master(_master),
-      state(INITIALIZING),
-      tasksLaunched(0),
-      tasksFinished(0),
-      totalTasks(5) {}
-
-  EventCallScheduler(const FrameworkInfo& _framework,
-                     const ExecutorInfo& _executor,
-                     const string& _master,
-                     const Credential& credential)
-    : framework(_framework),
-      executor(_executor),
-      master(_master),
-      state(INITIALIZING),
-      tasksLaunched(0),
-      tasksFinished(0),
-      totalTasks(5) {}
-
-  ~EventCallScheduler() {}
-
-  void connected()
-  {
-    doReliableRegistration();
-  }
-
-  void disconnected()
-  {
-    state = DISCONNECTED;
-  }
-
-  void received(queue<Event> events)
-  {
-    while (!events.empty()) {
-      Event event = events.front();
-      events.pop();
-
-      switch (event.type()) {
-        case Event::SUBSCRIBED: {
-          cout << endl << "Received a SUBSCRIBED event" << endl;
-
-          framework.mutable_id()->CopyFrom(event.subscribed().framework_id());
-          state = SUBSCRIBED;
-
-          cout << "Subscribed with ID '" << framework.id() << endl;
-          break;
-        }
-
-        case Event::OFFERS: {
-          cout << endl << "Received an OFFERS event" << endl;
-          resourceOffers(google::protobuf::convert(event.offers().offers()));
-          break;
-        }
-
-        case Event::RESCIND: {
-          cout << endl << "Received a RESCIND event" << endl;
-          break;
-        }
-
-        case Event::UPDATE: {
-          cout << endl << "Received an UPDATE event" << endl;
-
-          // TODO(zuyu): Do batch processing of UPDATE events.
-          statusUpdate(event.update().status());
-          break;
-        }
-
-        case Event::MESSAGE: {
-          cout << endl << "Received a MESSAGE event" << endl;
-          break;
-        }
-
-        case Event::FAILURE: {
-          cout << endl << "Received a FAILURE event" << endl;
-
-          if (event.failure().has_executor_id()) {
-            // Executor failed.
-            cout << "Executor '"
-                 << event.failure().executor_id().value() << "' terminated";
-
-            if (event.failure().has_agent_id()) {
-              cout << " on Agent '"
-                   << event.failure().agent_id().value() << "'";
-            }
-
-            if (event.failure().has_status()) {
-              cout << ", and " << WSTRINGIFY(event.failure().status());
-            }
-
-            cout << endl;
-          } else if (event.failure().has_agent_id()) {
-            // Agent failed.
-            cout << "Agent '" << event.failure().agent_id().value()
-                 << "' terminated" << endl;
-          }
-          break;
-        }
-
-        case Event::ERROR: {
-          cout << endl << "Received an ERROR event: "
-               << event.error().message() << endl;
-          process::terminate(self());
-          break;
-        }
-
-        case Event::HEARTBEAT: {
-          cout << endl << "Received a HEARTBEAT event" << endl;
-          break;
-        }
-
-        default: {
-          EXIT(1) << "Received an UNKNOWN event";
-        }
-      }
-    }
-  }
-
-protected:
-virtual void initialize()
-{
-  // We initialize the library here to ensure that callbacks are only invoked
-  // after the process has spawned.
-  mesos.reset(new scheduler::Mesos(
-      master,
-      mesos::ContentType::PROTOBUF,
-      process::defer(self(), &Self::connected),
-      process::defer(self(), &Self::disconnected),
-      process::defer(self(), &Self::received, lambda::_1)));
-}
-
-private:
-  void resourceOffers(const vector<Offer>& offers)
-  {
-    foreach (const Offer& offer, offers) {
-      cout << "Received offer " << offer.id() << " with "
-           << Resources(offer.resources())
-           << endl;
-
-      static const Resources TASK_RESOURCES = Resources::parse(
-          "cpus:" + stringify(CPUS_PER_TASK) +
-          ";mem:" + stringify(MEM_PER_TASK)).get();
-
-      Resources remaining = offer.resources();
-
-      // Launch tasks.
-      vector<TaskInfo> tasks;
-      while (tasksLaunched < totalTasks &&
-             remaining.flatten().contains(TASK_RESOURCES)) {
-        int taskId = tasksLaunched++;
-
-        cout << "Launching task " << taskId << " using offer "
-             << offer.id() << endl;
-
-        TaskInfo task;
-        task.set_name("Task " + lexical_cast<string>(taskId));
-        task.mutable_task_id()->set_value(
-            lexical_cast<string>(taskId));
-        task.mutable_agent_id()->MergeFrom(offer.agent_id());
-        task.mutable_executor()->MergeFrom(executor);
-
-        Option<Resources> resources =
-          remaining.find(TASK_RESOURCES.flatten(framework.role()));
-
-        CHECK_SOME(resources);
-
-        task.mutable_resources()->CopyFrom(resources.get());
-
-        remaining -= resources.get();
-
-        tasks.push_back(task);
-      }
-
-      Call call;
-      CHECK(framework.has_id());
-      call.mutable_framework_id()->CopyFrom(framework.id());
-      call.set_type(Call::ACCEPT);
-
-      Call::Accept* accept = call.mutable_accept();
-      accept->add_offer_ids()->CopyFrom(offer.id());
-
-      Offer::Operation* operation = accept->add_operations();
-      operation->set_type(Offer::Operation::LAUNCH);
-      foreach (const TaskInfo& taskInfo, tasks) {
-        operation->mutable_launch()->add_task_infos()->CopyFrom(taskInfo);
-      }
-
-      mesos->send(call);
-    }
-  }
-
-  void statusUpdate(const TaskStatus& status)
-  {
-    cout << "Task " << status.task_id() << " is in state " << status.state();
-
-    if (status.has_message()) {
-      cout << " with message '" << status.message() << "'";
-    }
-    cout << endl;
-
-    if (status.has_uuid()) {
-      Call call;
-      CHECK(framework.has_id());
-      call.mutable_framework_id()->CopyFrom(framework.id());
-      call.set_type(Call::ACKNOWLEDGE);
-
-      Call::Acknowledge* ack = call.mutable_acknowledge();
-      ack->mutable_agent_id()->CopyFrom(status.agent_id());
-      ack->mutable_task_id ()->CopyFrom(status.task_id ());
-      ack->set_uuid(status.uuid());
-
-      mesos->send(call);
-    }
-
-    if (status.state() == TASK_FINISHED) {
-      ++tasksFinished;
-    }
-
-    if (status.state() == TASK_LOST ||
-        status.state() == TASK_KILLED ||
-        status.state() == TASK_FAILED) {
-      EXIT(1) << "Exiting because task " << status.task_id()
-              << " is in unexpected state " << status.state()
-              << " with reason " << status.reason()
-              << " from source " << status.source()
-              << " with message '" << status.message() << "'";
-    }
-
-    if (tasksFinished == totalTasks) {
-      process::terminate(self());
-    }
-  }
-
-  void doReliableRegistration()
-  {
-    if (state == SUBSCRIBED) {
-      return;
-    }
-
-    Call call;
-    if (framework.has_id()) {
-      call.mutable_framework_id()->CopyFrom(framework.id());
-    }
-    call.set_type(Call::SUBSCRIBE);
-
-    Call::Subscribe* subscribe = call.mutable_subscribe();
-    subscribe->mutable_framework_info()->CopyFrom(framework);
-
-    mesos->send(call);
-
-    process::delay(Seconds(1),
-                   self(),
-                   &Self::doReliableRegistration);
-  }
-
-  void finalize()
-  {
-    Call call;
-    CHECK(framework.has_id());
-    call.mutable_framework_id()->CopyFrom(framework.id());
-    call.set_type(Call::TEARDOWN);
-
-    mesos->send(call);
-  }
-
-  FrameworkInfo framework;
-  const ExecutorInfo executor;
-  const string master;
-  process::Owned<scheduler::Mesos> mesos;
-
-  enum State
-  {
-    INITIALIZING = 0,
-    SUBSCRIBED = 1,
-    DISCONNECTED = 2
-  } state;
-
-  int tasksLaunched;
-  int tasksFinished;
-  const int totalTasks;
-};
-
-
-void usage(const char* argv0, const flags::FlagsBase& flags)
-{
-  cerr << "Usage: " << Path(argv0).basename() << " [...]" << endl
-       << endl
-       << "Supported options:" << endl
-       << flags.usage();
-}
-
-
-int main(int argc, char** argv)
-{
-  // Find this executable's directory to locate executor.
-  string uri;
-  Option<string> value = os::getenv("MESOS_BUILD_DIR");
-  if (value.isSome()) {
-    uri = path::join(value.get(), "src", "test-executor");
-  } else {
-    uri = path::join(
-        os::realpath(Path(argv[0]).dirname()).get(),
-        "src",
-        "test-executor");
-  }
-
-  mesos::internal::logging::Flags flags;
-
-  string role;
-  flags.add(&role,
-            "role",
-            "Role to use when registering",
-            "*");
-
-  Option<string> master;
-  flags.add(&master,
-            "master",
-            "ip:port of master to connect");
-
-  Try<Nothing> load = flags.load(None(), argc, argv);
-
-  if (load.isError()) {
-    cerr << load.error() << endl;
-    usage(argv[0], flags);
-    EXIT(1);
-  } else if (master.isNone()) {
-    cerr << "Missing --master" << endl;
-    usage(argv[0], flags);
-    EXIT(1);
-  }
-
-  process::initialize();
-  mesos::internal::logging::initialize(argv[0], flags, true); // Catch signals.
-
-  FrameworkInfo framework;
-  framework.set_name("Event Call Scheduler using libprocess (C++)");
-  framework.set_role(role);
-
-  const Result<string> user = os::user();
-
-  CHECK_SOME(user);
-  framework.set_user(user.get());
-
-  value = os::getenv("MESOS_CHECKPOINT");
-  if (value.isSome()) {
-    framework.set_checkpoint(
-        numify<bool>(value.get()).get());
-  }
-
-  ExecutorInfo executor;
-  executor.mutable_executor_id()->set_value("default");
-  executor.mutable_command()->set_value(uri);
-  executor.set_name("Test Executor (C++)");
-  executor.set_source("cpp_test");
-
-  value = os::getenv("DEFAULT_PRINCIPAL");
-  if (value.isNone()) {
-    EXIT(1) << "Expecting authentication principal in the environment";
-  }
-
-  framework.set_principal(value.get());
-
-  process::Owned<EventCallScheduler> scheduler(
-      new EventCallScheduler(framework, executor, master.get()));
-
-  process::spawn(scheduler.get());
-  process::wait(scheduler.get());
-
-  return EXIT_SUCCESS;
-}

http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/examples/test_http_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/test_http_framework.cpp b/src/examples/test_http_framework.cpp
new file mode 100644
index 0000000..0f8f0b7
--- /dev/null
+++ b/src/examples/test_http_framework.cpp
@@ -0,0 +1,443 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <iostream>
+#include <string>
+#include <queue>
+
+#include <boost/lexical_cast.hpp>
+
+#include <mesos/v1/mesos.hpp>
+#include <mesos/v1/resources.hpp>
+#include <mesos/v1/scheduler.hpp>
+
+#include <process/delay.hpp>
+#include <process/owned.hpp>
+#include <process/process.hpp>
+#include <process/protobuf.hpp>
+
+#include <stout/check.hpp>
+#include <stout/duration.hpp>
+#include <stout/exit.hpp>
+#include <stout/flags.hpp>
+#include <stout/foreach.hpp>
+#include <stout/lambda.hpp>
+#include <stout/none.hpp>
+#include <stout/numify.hpp>
+#include <stout/option.hpp>
+#include <stout/os.hpp>
+#include <stout/option.hpp>
+#include <stout/path.hpp>
+#include <stout/stringify.hpp>
+
+#include "common/status_utils.hpp"
+
+#include "logging/flags.hpp"
+#include "logging/logging.hpp"
+
+using namespace mesos::v1;
+
+using std::cerr;
+using std::cout;
+using std::endl;
+using std::queue;
+using std::string;
+using std::vector;
+
+using boost::lexical_cast;
+
+using mesos::v1::scheduler::Call;
+using mesos::v1::scheduler::Event;
+
+const int32_t CPUS_PER_TASK = 1;
+const int32_t MEM_PER_TASK = 128;
+
+class HTTPScheduler : public process::Process<HTTPScheduler>
+{
+public:
+  HTTPScheduler(const FrameworkInfo& _framework,
+                     const ExecutorInfo& _executor,
+                     const string& _master)
+    : framework(_framework),
+      executor(_executor),
+      master(_master),
+      state(INITIALIZING),
+      tasksLaunched(0),
+      tasksFinished(0),
+      totalTasks(5) {}
+
+  HTTPScheduler(const FrameworkInfo& _framework,
+                     const ExecutorInfo& _executor,
+                     const string& _master,
+                     const Credential& credential)
+    : framework(_framework),
+      executor(_executor),
+      master(_master),
+      state(INITIALIZING),
+      tasksLaunched(0),
+      tasksFinished(0),
+      totalTasks(5) {}
+
+  ~HTTPScheduler() {}
+
+  void connected()
+  {
+    doReliableRegistration();
+  }
+
+  void disconnected()
+  {
+    state = DISCONNECTED;
+  }
+
+  void received(queue<Event> events)
+  {
+    while (!events.empty()) {
+      Event event = events.front();
+      events.pop();
+
+      switch (event.type()) {
+        case Event::SUBSCRIBED: {
+          cout << endl << "Received a SUBSCRIBED event" << endl;
+
+          framework.mutable_id()->CopyFrom(event.subscribed().framework_id());
+          state = SUBSCRIBED;
+
+          cout << "Subscribed with ID '" << framework.id() << endl;
+          break;
+        }
+
+        case Event::OFFERS: {
+          cout << endl << "Received an OFFERS event" << endl;
+          resourceOffers(google::protobuf::convert(event.offers().offers()));
+          break;
+        }
+
+        case Event::RESCIND: {
+          cout << endl << "Received a RESCIND event" << endl;
+          break;
+        }
+
+        case Event::UPDATE: {
+          cout << endl << "Received an UPDATE event" << endl;
+
+          // TODO(zuyu): Do batch processing of UPDATE events.
+          statusUpdate(event.update().status());
+          break;
+        }
+
+        case Event::MESSAGE: {
+          cout << endl << "Received a MESSAGE event" << endl;
+          break;
+        }
+
+        case Event::FAILURE: {
+          cout << endl << "Received a FAILURE event" << endl;
+
+          if (event.failure().has_executor_id()) {
+            // Executor failed.
+            cout << "Executor '"
+                 << event.failure().executor_id().value() << "' terminated";
+
+            if (event.failure().has_agent_id()) {
+              cout << " on Agent '"
+                   << event.failure().agent_id().value() << "'";
+            }
+
+            if (event.failure().has_status()) {
+              cout << ", and " << WSTRINGIFY(event.failure().status());
+            }
+
+            cout << endl;
+          } else if (event.failure().has_agent_id()) {
+            // Agent failed.
+            cout << "Agent '" << event.failure().agent_id().value()
+                 << "' terminated" << endl;
+          }
+          break;
+        }
+
+        case Event::ERROR: {
+          cout << endl << "Received an ERROR event: "
+               << event.error().message() << endl;
+          process::terminate(self());
+          break;
+        }
+
+        case Event::HEARTBEAT: {
+          cout << endl << "Received a HEARTBEAT event" << endl;
+          break;
+        }
+
+        default: {
+          EXIT(1) << "Received an UNKNOWN event";
+        }
+      }
+    }
+  }
+
+protected:
+virtual void initialize()
+{
+  // We initialize the library here to ensure that callbacks are only invoked
+  // after the process has spawned.
+  mesos.reset(new scheduler::Mesos(
+      master,
+      mesos::ContentType::PROTOBUF,
+      process::defer(self(), &Self::connected),
+      process::defer(self(), &Self::disconnected),
+      process::defer(self(), &Self::received, lambda::_1)));
+}
+
+private:
+  void resourceOffers(const vector<Offer>& offers)
+  {
+    foreach (const Offer& offer, offers) {
+      cout << "Received offer " << offer.id() << " with "
+           << Resources(offer.resources())
+           << endl;
+
+      static const Resources TASK_RESOURCES = Resources::parse(
+          "cpus:" + stringify(CPUS_PER_TASK) +
+          ";mem:" + stringify(MEM_PER_TASK)).get();
+
+      Resources remaining = offer.resources();
+
+      // Launch tasks.
+      vector<TaskInfo> tasks;
+      while (tasksLaunched < totalTasks &&
+             remaining.flatten().contains(TASK_RESOURCES)) {
+        int taskId = tasksLaunched++;
+
+        cout << "Launching task " << taskId << " using offer "
+             << offer.id() << endl;
+
+        TaskInfo task;
+        task.set_name("Task " + lexical_cast<string>(taskId));
+        task.mutable_task_id()->set_value(
+            lexical_cast<string>(taskId));
+        task.mutable_agent_id()->MergeFrom(offer.agent_id());
+        task.mutable_executor()->MergeFrom(executor);
+
+        Option<Resources> resources =
+          remaining.find(TASK_RESOURCES.flatten(framework.role()));
+
+        CHECK_SOME(resources);
+
+        task.mutable_resources()->CopyFrom(resources.get());
+
+        remaining -= resources.get();
+
+        tasks.push_back(task);
+      }
+
+      Call call;
+      CHECK(framework.has_id());
+      call.mutable_framework_id()->CopyFrom(framework.id());
+      call.set_type(Call::ACCEPT);
+
+      Call::Accept* accept = call.mutable_accept();
+      accept->add_offer_ids()->CopyFrom(offer.id());
+
+      Offer::Operation* operation = accept->add_operations();
+      operation->set_type(Offer::Operation::LAUNCH);
+      foreach (const TaskInfo& taskInfo, tasks) {
+        operation->mutable_launch()->add_task_infos()->CopyFrom(taskInfo);
+      }
+
+      mesos->send(call);
+    }
+  }
+
+  void statusUpdate(const TaskStatus& status)
+  {
+    cout << "Task " << status.task_id() << " is in state " << status.state();
+
+    if (status.has_message()) {
+      cout << " with message '" << status.message() << "'";
+    }
+    cout << endl;
+
+    if (status.has_uuid()) {
+      Call call;
+      CHECK(framework.has_id());
+      call.mutable_framework_id()->CopyFrom(framework.id());
+      call.set_type(Call::ACKNOWLEDGE);
+
+      Call::Acknowledge* ack = call.mutable_acknowledge();
+      ack->mutable_agent_id()->CopyFrom(status.agent_id());
+      ack->mutable_task_id ()->CopyFrom(status.task_id ());
+      ack->set_uuid(status.uuid());
+
+      mesos->send(call);
+    }
+
+    if (status.state() == TASK_FINISHED) {
+      ++tasksFinished;
+    }
+
+    if (status.state() == TASK_LOST ||
+        status.state() == TASK_KILLED ||
+        status.state() == TASK_FAILED) {
+      EXIT(1) << "Exiting because task " << status.task_id()
+              << " is in unexpected state " << status.state()
+              << " with reason " << status.reason()
+              << " from source " << status.source()
+              << " with message '" << status.message() << "'";
+    }
+
+    if (tasksFinished == totalTasks) {
+      process::terminate(self());
+    }
+  }
+
+  void doReliableRegistration()
+  {
+    if (state == SUBSCRIBED) {
+      return;
+    }
+
+    Call call;
+    if (framework.has_id()) {
+      call.mutable_framework_id()->CopyFrom(framework.id());
+    }
+    call.set_type(Call::SUBSCRIBE);
+
+    Call::Subscribe* subscribe = call.mutable_subscribe();
+    subscribe->mutable_framework_info()->CopyFrom(framework);
+
+    mesos->send(call);
+
+    process::delay(Seconds(1),
+                   self(),
+                   &Self::doReliableRegistration);
+  }
+
+  void finalize()
+  {
+    Call call;
+    CHECK(framework.has_id());
+    call.mutable_framework_id()->CopyFrom(framework.id());
+    call.set_type(Call::TEARDOWN);
+
+    mesos->send(call);
+  }
+
+  FrameworkInfo framework;
+  const ExecutorInfo executor;
+  const string master;
+  process::Owned<scheduler::Mesos> mesos;
+
+  enum State
+  {
+    INITIALIZING = 0,
+    SUBSCRIBED = 1,
+    DISCONNECTED = 2
+  } state;
+
+  int tasksLaunched;
+  int tasksFinished;
+  const int totalTasks;
+};
+
+
+void usage(const char* argv0, const flags::FlagsBase& flags)
+{
+  cerr << "Usage: " << Path(argv0).basename() << " [...]" << endl
+       << endl
+       << "Supported options:" << endl
+       << flags.usage();
+}
+
+
+int main(int argc, char** argv)
+{
+  // Find this executable's directory to locate executor.
+  string uri;
+  Option<string> value = os::getenv("MESOS_BUILD_DIR");
+  if (value.isSome()) {
+    uri = path::join(value.get(), "src", "test-executor");
+  } else {
+    uri = path::join(
+        os::realpath(Path(argv[0]).dirname()).get(),
+        "src",
+        "test-executor");
+  }
+
+  mesos::internal::logging::Flags flags;
+
+  string role;
+  flags.add(&role,
+            "role",
+            "Role to use when registering",
+            "*");
+
+  Option<string> master;
+  flags.add(&master,
+            "master",
+            "ip:port of master to connect");
+
+  Try<Nothing> load = flags.load(None(), argc, argv);
+
+  if (load.isError()) {
+    cerr << load.error() << endl;
+    usage(argv[0], flags);
+    EXIT(1);
+  } else if (master.isNone()) {
+    cerr << "Missing --master" << endl;
+    usage(argv[0], flags);
+    EXIT(1);
+  }
+
+  process::initialize();
+  mesos::internal::logging::initialize(argv[0], flags, true); // Catch signals.
+
+  FrameworkInfo framework;
+  framework.set_name("Event Call Scheduler using libprocess (C++)");
+  framework.set_role(role);
+
+  const Result<string> user = os::user();
+
+  CHECK_SOME(user);
+  framework.set_user(user.get());
+
+  value = os::getenv("MESOS_CHECKPOINT");
+  if (value.isSome()) {
+    framework.set_checkpoint(
+        numify<bool>(value.get()).get());
+  }
+
+  ExecutorInfo executor;
+  executor.mutable_executor_id()->set_value("default");
+  executor.mutable_command()->set_value(uri);
+  executor.set_name("Test Executor (C++)");
+  executor.set_source("cpp_test");
+
+  value = os::getenv("DEFAULT_PRINCIPAL");
+  if (value.isNone()) {
+    EXIT(1) << "Expecting authentication principal in the environment";
+  }
+
+  framework.set_principal(value.get());
+
+  process::Owned<HTTPScheduler> scheduler(
+      new HTTPScheduler(framework, executor, master.get()));
+
+  process::spawn(scheduler.get());
+  process::wait(scheduler.get());
+
+  return EXIT_SUCCESS;
+}

http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/tests/event_call_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/event_call_framework_test.sh b/src/tests/event_call_framework_test.sh
deleted file mode 100755
index cddb520..0000000
--- a/src/tests/event_call_framework_test.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-
-# Expecting MESOS_SOURCE_DIR and MESOS_BUILD_DIR to be in environment.
-
-env | grep MESOS_SOURCE_DIR >/dev/null
-
-test $? != 0 && \
-  echo "Failed to find MESOS_SOURCE_DIR in environment" && \
-  exit 1
-
-env | grep MESOS_BUILD_DIR >/dev/null
-
-test $? != 0 && \
-  echo "Failed to find MESOS_BUILD_DIR in environment" && \
-  exit 1
-
-source ${MESOS_SOURCE_DIR}/support/colors.sh
-source ${MESOS_SOURCE_DIR}/support/atexit.sh
-source ${MESOS_HELPER_DIR}/colors.sh
-source ${MESOS_HELPER_DIR}/atexit.sh
-
-MESOS_WORK_DIR=`mktemp -d -t mesos-XXXXXX`
-
-atexit "rm -rf ${MESOS_WORK_DIR}"
-export MESOS_WORK_DIR=${MESOS_WORK_DIR}
-
-# Set local Mesos runner to use 3 slaves
-export MESOS_NUM_SLAVES=3
-
-# Set resources for the slave.
-export MESOS_RESOURCES="cpus:2;mem:10240"
-
-# Set isolation for the slave.
-export MESOS_ISOLATION="filesystem/posix,posix/cpu,posix/mem"
-
-# Set launcher for the slave.
-export MESOS_LAUNCHER="posix"
-
-# Disable authentication as the scheduler library does not support it.
-export MESOS_AUTHENTICATE=false
-
-# Check that the C++ low level scheduler executes without crashing (returns 0).
-exec ${MESOS_HELPER_DIR}/event-call-framework --master=local

http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/tests/examples_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/examples_tests.cpp b/src/tests/examples_tests.cpp
index 9b8b30f..6ddac17 100644
--- a/src/tests/examples_tests.cpp
+++ b/src/tests/examples_tests.cpp
@@ -24,8 +24,8 @@ TEST_SCRIPT(ExamplesTest, TestFramework, "test_framework_test.sh")
 TEST_SCRIPT(ExamplesTest, NoExecutorFramework, "no_executor_framework_test.sh")
 
 
-TEST_SCRIPT(ExamplesTest, EventCallFramework,
-            "event_call_framework_test.sh")
+TEST_SCRIPT(ExamplesTest, TestHTTPFramework,
+            "test_http_framework_test.sh")
 
 
 TEST_SCRIPT(ExamplesTest, PersistentVolumeFramework,

http://git-wip-us.apache.org/repos/asf/mesos/blob/7276019d/src/tests/test_http_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/test_http_framework_test.sh b/src/tests/test_http_framework_test.sh
new file mode 100755
index 0000000..3a2b24c
--- /dev/null
+++ b/src/tests/test_http_framework_test.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# Expecting MESOS_SOURCE_DIR and MESOS_BUILD_DIR to be in environment.
+
+env | grep MESOS_SOURCE_DIR >/dev/null
+
+test $? != 0 && \
+  echo "Failed to find MESOS_SOURCE_DIR in environment" && \
+  exit 1
+
+env | grep MESOS_BUILD_DIR >/dev/null
+
+test $? != 0 && \
+  echo "Failed to find MESOS_BUILD_DIR in environment" && \
+  exit 1
+
+source ${MESOS_SOURCE_DIR}/support/colors.sh
+source ${MESOS_SOURCE_DIR}/support/atexit.sh
+source ${MESOS_HELPER_DIR}/colors.sh
+source ${MESOS_HELPER_DIR}/atexit.sh
+
+MESOS_WORK_DIR=`mktemp -d -t mesos-XXXXXX`
+
+atexit "rm -rf ${MESOS_WORK_DIR}"
+export MESOS_WORK_DIR=${MESOS_WORK_DIR}
+
+# Set local Mesos runner to use 3 slaves
+export MESOS_NUM_SLAVES=3
+
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
+# Set isolation for the slave.
+export MESOS_ISOLATION="filesystem/posix,posix/cpu,posix/mem"
+
+# Set launcher for the slave.
+export MESOS_LAUNCHER="posix"
+
+# Disable authentication as the scheduler library does not support it.
+export MESOS_AUTHENTICATE=false
+
+# Check that the C++ HTTP scheduler executes without crashing (returns 0).
+exec ${MESOS_HELPER_DIR}/test-http-framework --master=local