You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ti...@apache.org on 2018/01/31 02:45:25 UTC

[3/5] mesos git commit: Updated example frameworks to make use of added flags.

Updated example frameworks to make use of added flags.

The example frameworks now consistently rely on a set of common flags
for parameterizing. This unifies parameter names, descriptions and
validation for those examples.

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


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

Branch: refs/heads/master
Commit: 2d2806ae5e037c5f2809f9e2cdd49c2c5cf36d71
Parents: ef6447b
Author: Till Toenshoff <to...@me.com>
Authored: Wed Jan 31 03:40:52 2018 +0100
Committer: Till Toenshoff <to...@me.com>
Committed: Wed Jan 31 03:40:52 2018 +0100

----------------------------------------------------------------------
 src/examples/balloon_framework.cpp             |  54 ++++------
 src/examples/disk_full_framework.cpp           |  50 ++++------
 src/examples/docker_no_executor_framework.cpp  |  78 ++++++++-------
 src/examples/dynamic_reservation_framework.cpp |  45 +++------
 src/examples/load_generator_framework.cpp      | 103 +++++---------------
 src/examples/long_lived_framework.cpp          |  58 +++--------
 src/examples/no_executor_framework.cpp         |  78 +++++----------
 src/examples/persistent_volume_framework.cpp   |  36 ++-----
 src/examples/test_framework.cpp                |  56 +++--------
 9 files changed, 176 insertions(+), 382 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/balloon_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/balloon_framework.cpp b/src/examples/balloon_framework.cpp
index b466e76..1938510 100644
--- a/src/examples/balloon_framework.cpp
+++ b/src/examples/balloon_framework.cpp
@@ -45,6 +45,8 @@
 
 #include "common/parse.hpp"
 
+#include "examples/flags.hpp"
+
 #include "logging/logging.hpp"
 
 using namespace mesos;
@@ -66,11 +68,10 @@ const double CPUS_PER_EXECUTOR = 0.1;
 const int32_t MEM_PER_EXECUTOR = 64;
 
 constexpr char EXECUTOR_BINARY[] = "balloon-executor";
-constexpr char FRAMEWORK_PRINCIPAL[] = "balloon-framework-cpp";
 constexpr char FRAMEWORK_METRICS_PREFIX[] = "balloon_framework";
 
 
-class Flags : public virtual flags::FlagsBase
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
@@ -80,10 +81,6 @@ public:
         "Name to be used by the framework.",
         "Balloon Framework");
 
-    add(&Flags::master,
-        "master",
-        "Master to connect to.");
-
     add(&Flags::task_memory_usage_limit,
         "task_memory_usage_limit",
         None(),
@@ -143,11 +140,6 @@ public:
         "The command that should be used to start the executor.\n"
         "This will override the value set by `--build_dir`.");
 
-    add(&Flags::checkpoint,
-        "checkpoint",
-        "Whether this framework should be checkpointed.\n",
-        false);
-
     add(&Flags::long_running,
         "long_running",
         "Whether this framework should launch tasks repeatedly\n"
@@ -156,7 +148,6 @@ public:
   }
 
   string name;
-  string master;
   Bytes task_memory_usage_limit;
   Bytes task_memory;
 
@@ -169,7 +160,6 @@ public:
   Option<JSON::Array> executor_uris;
   Option<string> executor_command;
 
-  bool checkpoint;
   bool long_running;
 };
 
@@ -569,9 +559,10 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(os::user().get());
+  framework.set_principal(flags.principal);
   framework.set_name(flags.name);
   framework.set_checkpoint(flags.checkpoint);
-  framework.add_roles("*");
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.add_capabilities()->set_type(
@@ -581,36 +572,25 @@ int main(int argc, char** argv)
 
   MesosSchedulerDriver* driver;
 
-  // TODO(josephw): Refactor these into a common set of flags.
-  Option<string> value = os::getenv("MESOS_AUTHENTICATE_FRAMEWORKS");
-  if (value.isSome()) {
+  if (flags.authenticate) {
     LOG(INFO) << "Enabling authentication for the framework";
 
-    value = os::getenv("DEFAULT_PRINCIPAL");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication principal in the environment";
-    }
-
     Credential credential;
-    credential.set_principal(value.get());
-
-    framework.set_principal(value.get());
-
-    value = os::getenv("DEFAULT_SECRET");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication secret in the environment";
+    credential.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
     }
 
-    credential.set_secret(value.get());
-
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master, credential);
+        &scheduler,
+        framework,
+        flags.master,
+        credential);
   } else {
-    framework.set_principal(FRAMEWORK_PRINCIPAL);
-
-    driver = new MesosSchedulerDriver(&scheduler, framework, flags.master);
+    driver = new MesosSchedulerDriver(
+        &scheduler,
+        framework,
+        flags.master);
   }
 
   int status = driver->run() == DRIVER_STOPPED ? 0 : 1;

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/disk_full_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/disk_full_framework.cpp b/src/examples/disk_full_framework.cpp
index fbe1ab0..2ad5ede 100644
--- a/src/examples/disk_full_framework.cpp
+++ b/src/examples/disk_full_framework.cpp
@@ -38,6 +38,8 @@
 #include <stout/os.hpp>
 #include <stout/try.hpp>
 
+#include "examples/flags.hpp"
+
 #include "logging/logging.hpp"
 
 using namespace mesos;
@@ -54,11 +56,10 @@ const double CPUS_PER_TASK = 0.1;
 const int MEMORY_PER_TASK = 16;
 const Bytes DISK_PER_TASK = Megabytes(5);
 
-constexpr char FRAMEWORK_PRINCIPAL[] = "disk-full-framework-cpp";
 constexpr char FRAMEWORK_METRICS_PREFIX[] = "disk_full_framework";
 
 
-class Flags : public virtual flags::FlagsBase
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
@@ -68,10 +69,6 @@ public:
         "Name to be used by the framework.",
         "Disk Full Framework");
 
-    add(&Flags::master,
-        "master",
-        "Master to connect to.");
-
     add(&Flags::run_once,
         "run_once",
         "Whether this framework should exit after running a single task.\n"
@@ -105,7 +102,6 @@ public:
   }
 
   string name;
-  string master;
   bool run_once;
   Duration pre_sleep_duration;
   Duration post_sleep_duration;
@@ -466,9 +462,10 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(flags.name);
-  framework.set_checkpoint(true);
-  framework.add_roles("*");
+  framework.set_checkpoint(flags.checkpoint);
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.add_capabilities()->set_type(
@@ -478,36 +475,25 @@ int main(int argc, char** argv)
 
   MesosSchedulerDriver* driver;
 
-  // TODO(hartem): Refactor these into a common set of flags.
-  Option<string> value = os::getenv("MESOS_AUTHENTICATE_FRAMEWORKS");
-  if (value.isSome()) {
+  if (flags.authenticate) {
     LOG(INFO) << "Enabling authentication for the framework";
 
-    value = os::getenv("DEFAULT_PRINCIPAL");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication principal in the environment";
-    }
-
     Credential credential;
-    credential.set_principal(value.get());
-
-    framework.set_principal(value.get());
-
-    value = os::getenv("DEFAULT_SECRET");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication secret in the environment";
+    credential.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
     }
 
-    credential.set_secret(value.get());
-
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master, credential);
+        &scheduler,
+        framework,
+        flags.master,
+        credential);
   } else {
-    framework.set_principal(FRAMEWORK_PRINCIPAL);
-
-    driver = new MesosSchedulerDriver(&scheduler, framework, flags.master);
+    driver = new MesosSchedulerDriver(
+        &scheduler,
+        framework,
+        flags.master);
   }
 
   int status = driver->run() == DRIVER_STOPPED ? 0 : 1;

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/docker_no_executor_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/docker_no_executor_framework.cpp b/src/examples/docker_no_executor_framework.cpp
index d1bdce9..85a2e9c 100644
--- a/src/examples/docker_no_executor_framework.cpp
+++ b/src/examples/docker_no_executor_framework.cpp
@@ -25,14 +25,14 @@
 #include <stout/option.hpp>
 #include <stout/os.hpp>
 
+#include "examples/flags.hpp"
+
+#include "logging/logging.hpp"
+
 using namespace mesos;
 
 using boost::lexical_cast;
 
-using std::cout;
-using std::cerr;
-using std::endl;
-using std::flush;
 using std::string;
 using std::vector;
 
@@ -40,7 +40,6 @@ const int32_t CPUS_PER_TASK = 1;
 const int32_t MEM_PER_TASK = 32;
 
 constexpr char FRAMEWORK_NAME[] = "Docker No Executor Framework (C++)";
-constexpr char FRAMEWORK_PRINCIPAL[] = "no-executor-framework-cpp";
 
 
 class DockerNoExecutorScheduler : public Scheduler
@@ -55,7 +54,7 @@ public:
                           const FrameworkID&,
                           const MasterInfo&)
   {
-    cout << "Registered!" << endl;
+    LOG(INFO) << "Registered!";
   }
 
   virtual void reregistered(SchedulerDriver*, const MasterInfo& masterInfo) {}
@@ -65,7 +64,8 @@ public:
   virtual void resourceOffers(SchedulerDriver* driver,
                               const vector<Offer>& offers)
   {
-    cout << "." << flush;
+    LOG(INFO) << ".";
+
     for (size_t i = 0; i < offers.size(); i++) {
       const Offer& offer = offers[i];
 
@@ -93,8 +93,7 @@ public:
              mem >= MEM_PER_TASK) {
         int taskId = tasksLaunched++;
 
-        cout << "Starting task " << taskId << " on "
-             << offer.hostname() << endl;
+        LOG(INFO) << "Starting task " << taskId << " on " << offer.hostname();
 
         TaskInfo task;
         task.set_name("Task " + lexical_cast<string>(taskId));
@@ -141,7 +140,7 @@ public:
   {
     int taskId = lexical_cast<int>(status.task_id().value());
 
-    cout << "Task " << taskId << " is in state " << status.state() << endl;
+    LOG(INFO) << "Task " << taskId << " is in state " << status.state();
 
     if (status.state() == TASK_FINISHED) {
       tasksFinished++;
@@ -173,51 +172,58 @@ private:
 };
 
 
+class Flags : public virtual mesos::internal::examples::Flags {};
+
+
 int main(int argc, char** argv)
 {
-  if (argc != 2) {
-    cerr << "Usage: " << argv[0] << " <master>" << endl;
-    return -1;
+  Flags flags;
+  Try<flags::Warnings> load = flags.load("MESOS_EXAMPLE_", argc, argv);
+
+  if (flags.help) {
+    std::cout << flags.usage() << std::endl;
+    return EXIT_SUCCESS;
   }
 
-  DockerNoExecutorScheduler scheduler;
+  if (load.isError()) {
+    std::cerr << flags.usage(load.error()) << std::endl;
+    return EXIT_FAILURE;
+  }
+
+  internal::logging::initialize(argv[0], false);
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
-  framework.set_checkpoint(true);
+  framework.set_checkpoint(flags.checkpoint);
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::RESERVATION_REFINEMENT);
 
+  DockerNoExecutorScheduler scheduler;
+
   MesosSchedulerDriver* driver;
-  if (os::getenv("MESOS_EXAMPLE_AUTHENTICATE").isSome()) {
-    cout << "Enabling authentication for the framework" << endl;
 
-    Option<string> value = os::getenv("MESOS_EXAMPLE_PRINCIPAL");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication principal in the environment";
-    }
+  if (flags.authenticate) {
+    LOG(INFO) << "Enabling authentication for the framework";
 
     Credential credential;
-    credential.set_principal(value.get());
-
-    framework.set_principal(value.get());
-
-    value = os::getenv("MESOS_EXAMPLE_SECRET");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication secret in the environment";
+    credential.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
     }
 
-    credential.set_secret(value.get());
-
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, argv[1], credential);
+        &scheduler,
+        framework,
+        argv[1],
+        credential);
   } else {
-    framework.set_principal(FRAMEWORK_PRINCIPAL);
-
-    driver = new MesosSchedulerDriver(&scheduler, framework, argv[1]);
+    driver = new MesosSchedulerDriver(
+        &scheduler,
+        framework,
+        argv[1]);
   }
 
   int status = driver->run() == DRIVER_STOPPED ? 0 : 1;

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/dynamic_reservation_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/dynamic_reservation_framework.cpp b/src/examples/dynamic_reservation_framework.cpp
index 781863a..15f3ec5 100644
--- a/src/examples/dynamic_reservation_framework.cpp
+++ b/src/examples/dynamic_reservation_framework.cpp
@@ -34,6 +34,8 @@
 
 #include "logging/logging.hpp"
 
+#include "examples/flags.hpp"
+
 using namespace mesos;
 
 using std::cerr;
@@ -327,26 +329,16 @@ private:
 };
 
 
-class Flags : public virtual flags::FlagsBase
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
   {
-    add(&Flags::master,
-        "master",
-        "The master to connect to. May be one of:\n"
-        "  master@addr:port (The PID of the master)\n"
-        "  zk://host1:port1,host2:port2,.../path\n"
-        "  zk://username:password@host1:port1,host2:port2,.../path\n"
-        "  file://path/to/file (where file contains one of the above)");
-
+    // Using non unified role flag as this framework needs a non "*"
+    // default role.
     add(&Flags::role,
         "role",
-        "Role to use when registering");
-
-    add(&Flags::principal,
-        "principal",
-        "The principal used to identify this framework",
+        "Role to use when registering.",
         "test");
 
     add(&Flags::command,
@@ -355,12 +347,11 @@ public:
         "echo hello");
   }
 
-  Option<string> master;
-  Option<string> role;
-  string principal;
+  string role;
   string command;
 };
 
+
 int main(int argc, char** argv)
 {
   Flags flags;
@@ -376,13 +367,7 @@ int main(int argc, char** argv)
     return EXIT_FAILURE;
   }
 
-  if (flags.master.isNone()) {
-    cerr << flags.usage("Missing --master") << endl;
-    return EXIT_FAILURE;
-  } else if (flags.role.isNone()) {
-    cerr << flags.usage("Missing --role") << endl;
-    return EXIT_FAILURE;
-  } else if (flags.role.get() == "*") {
+  if (flags.role == "*") {
     cerr << flags.usage(
                 "Role is incorrect; the default '*' role cannot be used")
          << endl;
@@ -398,34 +383,34 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(""); // Mesos'll fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
-  framework.add_roles(flags.role.get());
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
-  framework.set_principal(flags.principal);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::RESERVATION_REFINEMENT);
 
   DynamicReservationScheduler scheduler(
       flags.command,
-      flags.role.get(),
+      flags.role,
       flags.principal);
 
-  if (flags.master.get() == "local") {
+  if (flags.master == "local") {
     // Configure master.
     os::setenv("MESOS_AUTHENTICATE_FRAMEWORKS", "false");
 
     ACLs acls;
     ACL::RegisterFramework* acl = acls.add_register_frameworks();
     acl->mutable_principals()->set_type(ACL::Entity::ANY);
-    acl->mutable_roles()->add_values(flags.role.get());
+    acl->mutable_roles()->add_values(flags.role);
     os::setenv("MESOS_ACLS", stringify(JSON::protobuf(acls)));
   }
 
   MesosSchedulerDriver* driver = new MesosSchedulerDriver(
       &scheduler,
       framework,
-      flags.master.get());
+      flags.master);
 
   int status = driver->run() == DRIVER_STOPPED ? 0 : 1;
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/load_generator_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/load_generator_framework.cpp b/src/examples/load_generator_framework.cpp
index 29ddddf..665dd57 100644
--- a/src/examples/load_generator_framework.cpp
+++ b/src/examples/load_generator_framework.cpp
@@ -29,15 +29,13 @@
 #include <stout/stopwatch.hpp>
 #include <stout/strings.hpp>
 
-#include "logging/flags.hpp"
+#include "examples/flags.hpp"
+
 #include "logging/logging.hpp"
 
 using namespace mesos;
 using namespace process;
 
-using std::cerr;
-using std::cout;
-using std::endl;
 using std::string;
 using std::vector;
 
@@ -226,36 +224,11 @@ private:
 };
 
 
-class Flags : public virtual mesos::internal::logging::Flags
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
   {
-    add(&Flags::master,
-        "master",
-        "Required. The master to connect to. May be one of:\n"
-        "  master@addr:port (The PID of the master)\n"
-        "  zk://host1:port1,host2:port2,.../path\n"
-        "  zk://username:password@host1:port1,host2:port2,.../path\n"
-        "  file://path/to/file (where file contains one of the above)");
-
-    add(&Flags::authenticate,
-        "authenticate",
-        "Set to 'true' to enable framework authentication",
-        false);
-
-    add(&Flags::principal,
-        "principal",
-        "The principal used to identify this framework",
-        "load-generator-framework");
-
-    add(&Flags::secret,
-        "secret",
-        "The secret used to authenticate this framework.\n"
-        "If the value starts with '/' or 'file://' it will be parsed as the\n"
-        "path to a file containing the secret. Otherwise the string value is\n"
-        "treated as the secret");
-
     add(&Flags::qps,
         "qps",
         "Required. Generate load at this specified rate (queries per second).\n"
@@ -273,11 +246,7 @@ public:
         "forever as long as it is connected to the master");
   }
 
-  Option<string> master;
-  string principal;
-  Option<string> secret;
-  bool authenticate;
-  Option<double> qps;
+  double qps;
   Option<Duration> duration;
 };
 
@@ -288,76 +257,58 @@ int main(int argc, char** argv)
   Try<flags::Warnings> load = flags.load("MESOS_EXAMPLE_", argc, argv);
 
   if (load.isError()) {
-    cerr << flags.usage(load.error()) << endl;
+    std::cerr << flags.usage(load.error()) << std::endl;
     return EXIT_FAILURE;
   }
 
   if (flags.help) {
-    cout << flags.usage() << endl;
+    std::cout << flags.usage() << std::endl;
     return EXIT_SUCCESS;
   }
 
-  if (flags.master.isNone()) {
-    cerr << flags.usage("Missing required option --master") << endl;
-    return EXIT_FAILURE;
-  }
-
-  if (flags.qps.isNone()) {
-    cerr << flags.usage("Missing required option --qps") << endl;
-    return EXIT_FAILURE;
-  }
-
-  if (flags.qps.get() <= 0) {
-    cerr << flags.usage("--qps needs to be greater than zero") << endl;
-    return EXIT_FAILURE;
-  }
-
-  // We want the logger to catch failure signals.
-  mesos::internal::logging::initialize(argv[0], true, flags);
+  mesos::internal::logging::initialize(argv[0], false);
 
   // Log any flag warnings (after logging is initialized).
   foreach (const flags::Warning& warning, load->warnings) {
     LOG(WARNING) << warning.message;
   }
 
-  LoadGeneratorScheduler scheduler(flags.qps.get(), flags.duration);
+  if (flags.qps <= 0.0) {
+    EXIT(EXIT_FAILURE) << "Flag '--qps' needs to be greater than zero";
+  }
+
+  LoadGeneratorScheduler scheduler(flags.qps, flags.duration);
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
+  framework.set_checkpoint(flags.checkpoint);
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::RESERVATION_REFINEMENT);
-
-  const Option<string> checkpoint = os::getenv("MESOS_CHECKPOINT");
-  if (checkpoint.isSome()) {
-    framework.set_checkpoint(
-        numify<bool>(checkpoint.get()).get());
-  }
+  framework.set_checkpoint(flags.checkpoint);
 
   MesosSchedulerDriver* driver;
   if (flags.authenticate) {
-    cout << "Enabling authentication for the framework" << endl;
-
-    if (flags.secret.isNone()) {
-      cerr << "Expecting --secret when --authenticate is set" << endl;
-      return EXIT_FAILURE;
-    }
-
-    string secret = flags.secret.get();
+    LOG(INFO) << "Enabling authentication for the framework";
 
     Credential credential;
     credential.set_principal(flags.principal);
-    credential.set_secret(strings::trim(secret));
-
-    framework.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
+    }
 
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master.get(), credential);
+        &scheduler,
+        framework,
+        flags.master,
+        credential);
   } else {
-    framework.set_principal(flags.principal);
-
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master.get());
+        &scheduler,
+        framework,
+        flags.master);
   }
 
   int status = driver->run() == DRIVER_STOPPED ? EXIT_SUCCESS : EXIT_FAILURE;

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/long_lived_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/long_lived_framework.cpp b/src/examples/long_lived_framework.cpp
index a142199..1dc8dd4 100644
--- a/src/examples/long_lived_framework.cpp
+++ b/src/examples/long_lived_framework.cpp
@@ -49,6 +49,8 @@
 
 #include "common/parse.hpp"
 
+#include "examples/flags.hpp"
+
 #include "logging/logging.hpp"
 
 using std::queue;
@@ -496,22 +498,11 @@ private:
 };
 
 
-class Flags : public virtual flags::FlagsBase
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
   {
-    add(&Flags::master,
-        "master",
-        "Master to connect to.",
-        [](const Option<string>& value) -> Option<Error> {
-          if (value.isNone()) {
-            return Error("Missing --master");
-          }
-
-          return None();
-        });
-
     add(&Flags::build_dir,
         "build_dir",
         "The build directory of Mesos. If set, the framework will assume\n"
@@ -548,23 +539,8 @@ public:
         "executor_command",
         "The command that should be used to start the executor.\n"
         "This will override the value set by `--build_dir`.");
-
-    add(&Flags::checkpoint,
-        "checkpoint",
-        "Whether this framework should be checkpointed.",
-        false);
-
-    add(&Flags::principal,
-        "principal",
-        "The principal to use for framework authentication.");
-
-    add(&Flags::secret,
-        "secret",
-        "The secret to use for framework authentication.");
   }
 
-  Option<string> master;
-
   // Flags for specifying the executor binary and other URIs.
   //
   // TODO(armand): Remove the `--executor_uri` flag after the
@@ -573,10 +549,6 @@ public:
   Option<string> executor_uri;
   Option<JSON::Array> executor_uris;
   Option<string> executor_command;
-
-  bool checkpoint;
-  Option<string> principal;
-  Option<string> secret;
 };
 
 
@@ -662,9 +634,10 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(os::user().get());
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
   framework.set_checkpoint(flags.checkpoint);
-  framework.add_roles("*");
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.add_capabilities()->set_type(
@@ -672,23 +645,20 @@ int main(int argc, char** argv)
 
   Option<Credential> credential = None();
 
-  if (flags.principal.isSome()) {
-    framework.set_principal(flags.principal.get());
-
+  if (flags.authenticate) {
+    Credential credential_;
+    credential_.set_principal(flags.principal);
     if (flags.secret.isSome()) {
-      Credential credential_;
-      credential_.set_principal(flags.principal.get());
       credential_.set_secret(flags.secret.get());
-      credential = credential_;
     }
+    credential = credential_;
   }
 
-  Owned<LongLivedScheduler> scheduler(
-      new LongLivedScheduler(
-        flags.master.get(),
-        framework,
-        executor,
-        credential));
+  Owned<LongLivedScheduler> scheduler(new LongLivedScheduler(
+      flags.master,
+      framework,
+      executor,
+      credential));
 
   process::spawn(scheduler.get());
   process::wait(scheduler.get());

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/no_executor_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/no_executor_framework.cpp b/src/examples/no_executor_framework.cpp
index 061b8b8..02aaf07 100644
--- a/src/examples/no_executor_framework.cpp
+++ b/src/examples/no_executor_framework.cpp
@@ -32,7 +32,8 @@
 #include "common/protobuf_utils.hpp"
 #include "common/status_utils.hpp"
 
-#include "logging/flags.hpp"
+#include "examples/flags.hpp"
+
 #include "logging/logging.hpp"
 
 using namespace mesos;
@@ -227,34 +228,11 @@ private:
 };
 
 
-class Flags : public virtual logging::Flags
+class Flags : public virtual mesos::internal::examples::Flags
 {
 public:
   Flags()
   {
-    add(&Flags::master,
-        "master",
-        "The master to connect to. May be one of:\n"
-        "  master@addr:port (The PID of the master)\n"
-        "  zk://host1:port1,host2:port2,.../path\n"
-        "  zk://username:password@host1:port1,host2:port2,.../path\n"
-        "  file://path/to/file (where file contains one of the above)");
-
-    add(&Flags::checkpoint,
-        "checkpoint",
-        "Whether to enable checkpointing (true by default).",
-        true);
-
-    add(&Flags::principal,
-        "principal",
-        "To enable authentication, both --principal and --secret\n"
-        "must be supplied.");
-
-    add(&Flags::secret,
-        "secret",
-        "To enable authentication, both --principal and --secret\n"
-        "must be supplied.");
-
     add(&Flags::command,
         "command",
         "The command to run for each task.",
@@ -278,10 +256,6 @@ public:
         "If unset, as many tasks as possible will be launched.");
   }
 
-  Option<string> master;
-  bool checkpoint;
-  Option<string> principal;
-  Option<string> secret;
   string command;
   string task_resources;
   Option<string> task_revocable_resources;
@@ -304,19 +278,6 @@ int main(int argc, char** argv)
     return EXIT_FAILURE;
   }
 
-  if (flags.master.isNone()) {
-    cerr << flags.usage("Missing required option --master") << endl;
-    return EXIT_FAILURE;
-  }
-
-  if (flags.principal.isSome() != flags.secret.isSome()) {
-    cerr << flags.usage(
-                "Both --principal and --secret are required"
-                " to enable authentication")
-         << endl;
-    return EXIT_FAILURE;
-  }
-
   logging::initialize(argv[0], true, flags); // Catch signals.
 
   // Log any flag warnings.
@@ -326,9 +287,10 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
   framework.set_checkpoint(flags.checkpoint);
-  framework.add_roles("*");
+  framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.add_capabilities()->set_type(
@@ -339,15 +301,10 @@ int main(int argc, char** argv)
         FrameworkInfo::Capability::REVOCABLE_RESOURCES);
   }
 
-  if (flags.principal.isSome()) {
-    framework.set_principal(flags.principal.get());
-  }
-
   Try<Resources> resources = Resources::parse(flags.task_resources);
 
   if (resources.isError()) {
-    EXIT(EXIT_FAILURE) << flags.usage(
-        "Invalid --task_resources: " + resources.error());
+    EXIT(EXIT_FAILURE) << "Invalid '--task_resources': " << resources.error();
   }
 
   Resources taskResources = resources.get();
@@ -357,8 +314,8 @@ int main(int argc, char** argv)
       Resources::parse(flags.task_revocable_resources.get());
 
     if (revocableResources.isError()) {
-      EXIT(EXIT_FAILURE) << flags.usage(
-          "Invalid --task_revocable_resources: " + revocableResources.error());
+      EXIT(EXIT_FAILURE) << "Invalid '--task_revocable_resources': "
+                         << revocableResources.error();
     }
 
     foreach (Resource revocable, revocableResources.get()) {
@@ -377,16 +334,25 @@ int main(int argc, char** argv)
 
   MesosSchedulerDriver* driver;
 
-  if (flags.principal.isSome() && flags.secret.isSome()) {
+  if (flags.authenticate) {
+    LOG(INFO) << "Enabling authentication for the framework";
+
     Credential credential;
-    credential.set_principal(flags.principal.get());
-    credential.set_secret(flags.secret.get());
+    credential.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
+    }
 
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master.get(), credential);
+        &scheduler,
+        framework,
+        flags.master,
+        credential);
   } else {
     driver = new MesosSchedulerDriver(
-        &scheduler, framework, flags.master.get());
+        &scheduler,
+        framework,
+        flags.master);
   }
 
   int status = driver->run() == DRIVER_STOPPED ? 0 : 1;

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/persistent_volume_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/persistent_volume_framework.cpp b/src/examples/persistent_volume_framework.cpp
index b4dee96..0339af9 100644
--- a/src/examples/persistent_volume_framework.cpp
+++ b/src/examples/persistent_volume_framework.cpp
@@ -42,6 +42,8 @@
 #include "logging/flags.hpp"
 #include "logging/logging.hpp"
 
+#include "examples/flags.hpp"
+
 using namespace mesos;
 using namespace mesos::internal;
 
@@ -490,29 +492,19 @@ private:
 };
 
 
-class Flags : public virtual logging::Flags
+class Flags : public virtual mesos::internal::examples::Flags,
+              public virtual logging::Flags
 {
 public:
   Flags()
   {
-    add(&Flags::master,
-        "master",
-        "The master to connect to. May be one of:\n"
-        "  master@addr:port (The PID of the master)\n"
-        "  zk://host1:port1,host2:port2,.../path\n"
-        "  zk://username:password@host1:port1,host2:port2,.../path\n"
-        "  file://path/to/file (where file contains one of the above)");
-
+    // Using non unified role flag as this framework needs a non "*"
+    // default role.
     add(&Flags::role,
         "role",
         "Role to use when registering",
         "test");
 
-    add(&Flags::principal,
-        "principal",
-        "The principal used to identify this framework",
-        "test");
-
     add(&Flags::num_shards,
         "num_shards",
         "The number of shards the framework will run using regular volume.",
@@ -529,9 +521,7 @@ public:
         2);
   }
 
-  Option<string> master;
   string role;
-  string principal;
   size_t num_shards;
   size_t num_shared_shards;
   size_t tasks_per_shard;
@@ -553,11 +543,6 @@ int main(int argc, char** argv)
     return EXIT_FAILURE;
   }
 
-  if (flags.master.isNone()) {
-    cerr << flags.usage("Missing required option --master") << endl;
-    return EXIT_FAILURE;
-  }
-
   logging::initialize(argv[0], true, flags); // Catch signals.
 
   // Log any flag warnings (after logging is initialized).
@@ -567,27 +552,26 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
   framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.set_checkpoint(true);
-  framework.set_principal(flags.principal);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::SHARED_RESOURCES);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::RESERVATION_REFINEMENT);
 
-  if (flags.master.get() == "local") {
+  if (flags.master == "local") {
     // Configure master.
     os::setenv("MESOS_ROLES", flags.role);
-    os::setenv("MESOS_AUTHENTICATE_FRAMEWORKS", "false");
+    os::setenv("MESOS_AUTHENTICATE_FRAMEWORKS", stringify(flags.authenticate));
 
     ACLs acls;
     ACL::RegisterFramework* acl = acls.add_register_frameworks();
     acl->mutable_principals()->set_type(ACL::Entity::ANY);
     acl->mutable_roles()->add_values(flags.role);
-
     os::setenv("MESOS_ACLS", stringify(JSON::protobuf(acls)));
 
     // Configure agent.
@@ -603,7 +587,7 @@ int main(int argc, char** argv)
   MesosSchedulerDriver* driver = new MesosSchedulerDriver(
       &scheduler,
       framework,
-      flags.master.get());
+      flags.master);
 
   int status = driver->run() == DRIVER_STOPPED ? EXIT_SUCCESS : EXIT_FAILURE;
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d2806ae/src/examples/test_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/test_framework.cpp b/src/examples/test_framework.cpp
index 2f48bf2..c8e4bb4 100644
--- a/src/examples/test_framework.cpp
+++ b/src/examples/test_framework.cpp
@@ -37,6 +37,8 @@
 #include "logging/flags.hpp"
 #include "logging/logging.hpp"
 
+#include "examples/flags.hpp"
+
 using namespace mesos;
 
 using boost::lexical_cast;
@@ -56,8 +58,6 @@ const int32_t MEM_PER_TASK = 128;
 constexpr char EXECUTOR_BINARY[] = "test-executor";
 constexpr char EXECUTOR_NAME[] = "Test Executor (C++)";
 constexpr char FRAMEWORK_NAME[] = "Test Framework (C++)";
-constexpr char FRAMEWORK_PRINCIPAL[] = "test-framework-cpp";
-
 
 class TestScheduler : public Scheduler
 {
@@ -211,18 +211,7 @@ void usage(const char* argv0, const flags::FlagsBase& flags)
 }
 
 
-class Flags : public virtual mesos::internal::logging::Flags
-{
-public:
-  Flags()
-  {
-    add(&Flags::role, "role", "Role to use when registering", "*");
-    add(&Flags::master, "master", "ip:port of master to connect");
-  }
-
-  string role;
-  Option<string> master;
-};
+class Flags : public virtual mesos::internal::examples::Flags {};
 
 
 int main(int argc, char** argv)
@@ -251,11 +240,6 @@ int main(int argc, char** argv)
     return EXIT_FAILURE;
   }
 
-  if (flags.master.isNone()) {
-    cerr << flags.usage("Missing --master") << endl;
-    return EXIT_FAILURE;
-  }
-
   internal::logging::initialize(argv[0], true, flags); // Catch signals.
 
   // Log any flag warnings (after logging is initialized).
@@ -270,17 +254,14 @@ int main(int argc, char** argv)
 
   FrameworkInfo framework;
   framework.set_user(""); // Have Mesos fill in the current user.
+  framework.set_principal(flags.principal);
   framework.set_name(FRAMEWORK_NAME);
   framework.add_roles(flags.role);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::MULTI_ROLE);
   framework.add_capabilities()->set_type(
       FrameworkInfo::Capability::RESERVATION_REFINEMENT);
-
-  value = os::getenv("MESOS_CHECKPOINT");
-  if (value.isSome()) {
-    framework.set_checkpoint(numify<bool>(value.get()).get());
-  }
+  framework.set_checkpoint(flags.checkpoint);
 
   bool implicitAcknowledgements = true;
   if (os::getenv("MESOS_EXPLICIT_ACKNOWLEDGEMENTS").isSome()) {
@@ -292,41 +273,26 @@ int main(int argc, char** argv)
   MesosSchedulerDriver* driver;
   TestScheduler scheduler(implicitAcknowledgements, executor, flags.role);
 
-  if (os::getenv("MESOS_AUTHENTICATE_FRAMEWORKS").isSome()) {
+  if (flags.authenticate) {
     cout << "Enabling authentication for the framework" << endl;
 
-    value = os::getenv("DEFAULT_PRINCIPAL");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication principal in the environment";
-    }
-
     Credential credential;
-    credential.set_principal(value.get());
-
-    framework.set_principal(value.get());
-
-    value = os::getenv("DEFAULT_SECRET");
-    if (value.isNone()) {
-      EXIT(EXIT_FAILURE)
-        << "Expecting authentication secret in the environment";
+    credential.set_principal(flags.principal);
+    if (flags.secret.isSome()) {
+      credential.set_secret(flags.secret.get());
     }
 
-    credential.set_secret(value.get());
-
     driver = new MesosSchedulerDriver(
         &scheduler,
         framework,
-        flags.master.get(),
+        flags.master,
         implicitAcknowledgements,
         credential);
   } else {
-    framework.set_principal(FRAMEWORK_PRINCIPAL);
-
     driver = new MesosSchedulerDriver(
         &scheduler,
         framework,
-        flags.master.get(),
+        flags.master,
         implicitAcknowledgements);
   }