You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2013/12/13 01:59:14 UTC

git commit: Added extra_modules option to Scheduler.

Updated Branches:
  refs/heads/skarumuri/extra_modules [created] 201ceb469


Added extra_modules option to Scheduler.


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/201ceb46
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/201ceb46
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/201ceb46

Branch: refs/heads/skarumuri/extra_modules
Commit: 201ceb469f7acb053c8266827acaa6bb2b332469
Parents: cf7ee5a
Author: Suman Karumuri <sk...@twitter.com>
Authored: Mon Dec 9 09:33:32 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Mon Dec 9 09:33:32 2013 -0800

----------------------------------------------------------------------
 .../twitter/aurora/scheduler/app/Modules.java   | 54 +++++++++++++++++
 .../aurora/scheduler/app/SchedulerMain.java     | 61 ++++++--------------
 2 files changed, 72 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/201ceb46/src/main/java/com/twitter/aurora/scheduler/app/Modules.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/app/Modules.java b/src/main/java/com/twitter/aurora/scheduler/app/Modules.java
new file mode 100644
index 0000000..18253b0
--- /dev/null
+++ b/src/main/java/com/twitter/aurora/scheduler/app/Modules.java
@@ -0,0 +1,54 @@
+package com.twitter.aurora.scheduler.app;
+
+import com.google.inject.Module;
+import com.google.inject.PrivateModule;
+
+/**
+ * A utility class for managing guice modules.
+ */
+final class Modules {
+
+  private Modules() {
+    // Utility class
+  }
+
+  private static Module instantiateModule(final Class<? extends Module> moduleClass) {
+    try {
+      return moduleClass.newInstance();
+    } catch (InstantiationException e) {
+      throw new IllegalArgumentException(
+          String.format(
+              "Failed to instantiate module %s. Are you sure it has a no-arg constructor?",
+              moduleClass.getName()),
+          e);
+    } catch (IllegalAccessException e) {
+      throw new IllegalArgumentException(
+          String.format(
+              "Failed to instantiate module %s. Are you sure it's public?",
+              moduleClass.getName()),
+          e);
+    }
+  }
+
+  // Defensively wrap each module provided on the command-line in a PrivateModule that only
+  // exposes requested classes to ensure that we don't depend on surprise extra bindings across
+  // different implementations.
+  static Module wrapInPrivateModule(
+      Class<? extends Module> moduleClass,
+      final Iterable<Class<?>> exposedClasses) {
+
+    final Module module = instantiateModule(moduleClass);
+    return new PrivateModule() {
+      @Override protected void configure() {
+        install(module);
+        for (Class<?> klass : exposedClasses) {
+          expose(klass);
+        }
+      }
+    };
+  }
+
+  static Module getModule(Class<? extends Module> moduleClass) {
+    return instantiateModule(moduleClass);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/201ceb46/src/main/java/com/twitter/aurora/scheduler/app/SchedulerMain.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/app/SchedulerMain.java b/src/main/java/com/twitter/aurora/scheduler/app/SchedulerMain.java
index 73b86a9..778472b 100644
--- a/src/main/java/com/twitter/aurora/scheduler/app/SchedulerMain.java
+++ b/src/main/java/com/twitter/aurora/scheduler/app/SchedulerMain.java
@@ -20,6 +20,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.net.InetSocketAddress;
+import java.util.List;
 import java.util.logging.Logger;
 
 import javax.annotation.Nonnegative;
@@ -28,9 +29,9 @@ import javax.inject.Singleton;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
 import com.google.inject.AbstractModule;
 import com.google.inject.Module;
-import com.google.inject.PrivateModule;
 
 import com.twitter.aurora.auth.CapabilityValidator;
 import com.twitter.aurora.auth.SessionValidator;
@@ -136,6 +137,12 @@ public class SchedulerMain extends AbstractApplication {
       .add(JobFilter.class)
       .build();
 
+  // TODO(Suman Karumuri): Pass in AUTH, QUOTA and CRON modules as extra modules
+  @CmdLine(name = "extra_modules",
+      help = "A list of modules that provide additional functionality.")
+  private static final Arg<List<Class<? extends Module>>> EXTRA_MODULES =
+      Arg.create((List<Class<? extends Module>>) ImmutableList.<Class<? extends Module>>of());
+
   @Inject private SingletonService schedulerService;
   @Inject private LocalServiceRegistry serviceRegistry;
   @Inject private SchedulerLifecycle schedulerLifecycle;
@@ -149,49 +156,17 @@ public class SchedulerMain extends AbstractApplication {
     );
   }
 
-  // TODO(ksweeney): Consider factoring this out into a ModuleParser library.
-  private static Module instantiateFlaggedModule(Arg<? extends Class<? extends Module>> moduleArg) {
-    Class<? extends Module> moduleClass = moduleArg.get();
-    try {
-      return moduleClass.newInstance();
-    } catch (InstantiationException e) {
-      throw new IllegalArgumentException(
-          String.format(
-              "Failed to instantiate module %s. Are you sure it has a no-arg constructor?",
-              moduleClass.getName()),
-          e);
-    } catch (IllegalAccessException e) {
-      throw new IllegalArgumentException(
-          String.format(
-              "Failed to instantiate module %s. Are you sure it's public?",
-              moduleClass.getName()),
-          e);
-    }
-  }
-
-  // Defensively wrap each module provided on the command-line in a PrivateModule that only
-  // exposes requested classes to ensure that we don't depend on surprise extra bindings across
-  // different implementations.
-  private static Module getFlaggedModule(
-      Arg<? extends Class<? extends Module>> moduleArg,
-      final Iterable<Class<?>> exposedClasses) {
+  private static Iterable<? extends Module> getExtraModules() {
+    Builder<Module> modules = ImmutableList.builder();
+    modules.add(Modules.wrapInPrivateModule(AUTH_MODULE.get(), AUTH_MODULE_CLASSES))
+        .add(Modules.wrapInPrivateModule(CRON_MODULE.get(), CRON_MODULE_CLASSES)).
+        add(Modules.wrapInPrivateModule(QUOTA_MODULE.get(), QUOTA_MODULE_CLASSES));
 
-    final Module module = instantiateFlaggedModule(moduleArg);
-    return new PrivateModule() {
-      @Override protected void configure() {
-        install(module);
-        for (Class<?> klass : exposedClasses) {
-          expose(klass);
-        }
-      }
-    };
-  }
+    for (Class<? extends Module> moduleClass : EXTRA_MODULES.get()) {
+      modules.add(Modules.getModule(moduleClass));
+    }
 
-  private static Iterable<? extends Module> getFlaggedModules() {
-    return ImmutableList.of(
-        getFlaggedModule(AUTH_MODULE, AUTH_MODULE_CLASSES),
-        getFlaggedModule(CRON_MODULE, CRON_MODULE_CLASSES),
-        getFlaggedModule(QUOTA_MODULE, QUOTA_MODULE_CLASSES));
+    return modules.build();
   }
 
   static Iterable<? extends Module> getModules(
@@ -200,9 +175,9 @@ public class SchedulerMain extends AbstractApplication {
       ClientConfig zkClientConfig) {
 
     return ImmutableList.<Module>builder()
-        .addAll(getFlaggedModules())
         .addAll(getSystemModules())
         .add(new AppModule(clusterName, serverSetPath, zkClientConfig))
+        .addAll(getExtraModules())
         .add(new LogStorageModule())
         .add(new MemStorageModule(Bindings.annotatedKeyFactory(LogStorage.WriteBehind.class)))
         .add(new ThriftModule())