Repository: aurora Updated Branches: refs/heads/master e658a8a0b -> 44e472642
Refactor SchedulerMain to absorb AppLauncher. Reviewed at https://reviews.apache.org/r/38331/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/44e47264 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/44e47264 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/44e47264 Branch: refs/heads/master Commit: 44e47264261fc01def325eccd34bfa0d5079e479 Parents: e658a8a Author: Bill Farner <[email protected]> Authored: Mon Sep 14 18:31:05 2015 -0700 Committer: Bill Farner <[email protected]> Committed: Mon Sep 14 18:31:05 2015 -0700 ---------------------------------------------------------------------- .../aurora/common/application/AppLauncher.java | 101 --------- .../aurora/common/application/Application.java | 29 --- .../aurora/common/application/Lifecycle.java | 6 +- .../application/modules/AppLauncherModule.java | 48 ---- config/checkstyle/checkstyle.xml | 6 +- config/checkstyle/suppressions.xml | 24 ++ config/legacy_untested_classes.txt | 1 + .../apache/aurora/scheduler/app/AppModule.java | 84 ------- .../apache/aurora/scheduler/app/Modules.java | 98 -------- .../aurora/scheduler/app/MoreModules.java | 98 ++++++++ .../aurora/scheduler/app/SchedulerMain.java | 226 +++++++++++-------- .../scheduler/app/ServiceDiscoveryModule.java | 91 ++++++++ .../http/api/security/HttpSecurityModule.java | 4 +- .../http/api/security/ModuleParser.java | 4 +- .../scheduler/thrift/auth/ThriftAuthModule.java | 4 +- .../scheduler/SchedulerLifecycleTest.java | 8 +- .../aurora/scheduler/app/ModulesTest.java | 39 ---- .../aurora/scheduler/app/MoreModulesTest.java | 39 ++++ .../aurora/scheduler/app/SchedulerIT.java | 24 +- .../scheduler/app/local/LocalSchedulerMain.java | 64 +++--- .../aurora/scheduler/http/QuitCallbackTest.java | 6 +- .../scheduler/log/mesos/MesosLogTest.java | 2 +- .../scheduler/mesos/MesosSchedulerImplTest.java | 5 +- .../aurora/scheduler/sla/SlaModuleTest.java | 2 - 24 files changed, 445 insertions(+), 568 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/commons/src/main/java/org/apache/aurora/common/application/AppLauncher.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/application/AppLauncher.java b/commons/src/main/java/org/apache/aurora/common/application/AppLauncher.java deleted file mode 100644 index 6496870..0000000 --- a/commons/src/main/java/org/apache/aurora/common/application/AppLauncher.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Licensed 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. - */ -package org.apache.aurora.common.application; - -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.google.common.base.Preconditions; -import com.google.inject.Guice; -import com.google.inject.Injector; - -import org.apache.aurora.common.args.Arg; -import org.apache.aurora.common.args.ArgFilters; -import org.apache.aurora.common.args.ArgScanner; -import org.apache.aurora.common.args.ArgScanner.ArgScanException; -import org.apache.aurora.common.args.CmdLine; - -/** - * An application launcher that sets up a framework for pluggable binding modules. This class - * should be called directly as the main class, with a command line argument {@code -app_class} - * which is the canonical class name of the application to execute. - * - * If your application uses command line arguments all {@link Arg} fields annotated with - * {@link CmdLine} will be discovered and command line arguments will be validated against this set, - * parsed and applied. - */ -public final class AppLauncher { - - private static final Logger LOG = Logger.getLogger(AppLauncher.class.getName()); - - private AppLauncher() { - // This should not be invoked directly. - } - - private void run(Application application) { - Lifecycle lifecycle = null; - try { - Injector injector = Guice.createInjector(application.getModules()); - lifecycle = injector.getInstance(Lifecycle.class); - injector.injectMembers(application); - try { - application.run(); - } finally { - LOG.info("Application run() exited."); - } - } finally { - if (lifecycle != null) { - lifecycle.shutdown(); - } - } - } - - /** - * Used to launch an application with a restricted set of {@literal @CmdLine} {@link Arg}s - * considered for parsing. This is useful if the classpath includes annotated fields you do not - * wish arguments to be parsed for. - * - * @param appClass The application class to instantiate and launch. - * @param args The command line arguments to parse. - * @see ArgFilters - */ - public static void launch(Class<? extends Application> appClass, String... args) { - Preconditions.checkNotNull(appClass); - Preconditions.checkNotNull(args); - - try { - if (!new ArgScanner().parse(Arrays.asList(args))) { - System.exit(0); - } - } catch (ArgScanException e) { - exit("Failed to scan arguments", e); - } catch (IllegalArgumentException e) { - exit("Failed to apply arguments", e); - } - - try { - new AppLauncher().run(appClass.newInstance()); - } catch (InstantiationException e) { - throw new IllegalStateException(e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); - } - } - - private static void exit(String message, Exception error) { - LOG.log(Level.SEVERE, message + "\n" + error, error); - System.exit(1); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/commons/src/main/java/org/apache/aurora/common/application/Application.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/application/Application.java b/commons/src/main/java/org/apache/aurora/common/application/Application.java deleted file mode 100644 index ebe01e8..0000000 --- a/commons/src/main/java/org/apache/aurora/common/application/Application.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Licensed 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. - */ -package org.apache.aurora.common.application; - -import com.google.inject.Module; - -/** - * An application that supports a limited lifecycle and optional binding of guice modules. - */ -public interface Application extends Runnable { - - /** - * Returns binding modules for the application. - * - * @return Application binding modules. - */ - Iterable<? extends Module> getModules(); -} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/commons/src/main/java/org/apache/aurora/common/application/Lifecycle.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/application/Lifecycle.java b/commons/src/main/java/org/apache/aurora/common/application/Lifecycle.java index 5d22a2a..a71a51d 100644 --- a/commons/src/main/java/org/apache/aurora/common/application/Lifecycle.java +++ b/commons/src/main/java/org/apache/aurora/common/application/Lifecycle.java @@ -13,7 +13,6 @@ */ package org.apache.aurora.common.application; -import java.lang.Thread.UncaughtExceptionHandler; import java.util.logging.Logger; import com.google.inject.Inject; @@ -38,11 +37,8 @@ public class Lifecycle { private final Command shutdownRegistry; @Inject - public Lifecycle(@ShutdownStage Command shutdownRegistry, - UncaughtExceptionHandler exceptionHandler) { - + public Lifecycle(@ShutdownStage Command shutdownRegistry) { this.shutdownRegistry = shutdownRegistry; - Thread.setDefaultUncaughtExceptionHandler(exceptionHandler); } /** http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/commons/src/main/java/org/apache/aurora/common/application/modules/AppLauncherModule.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/aurora/common/application/modules/AppLauncherModule.java b/commons/src/main/java/org/apache/aurora/common/application/modules/AppLauncherModule.java deleted file mode 100644 index 1c08f7e..0000000 --- a/commons/src/main/java/org/apache/aurora/common/application/modules/AppLauncherModule.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Licensed 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. - */ -package org.apache.aurora.common.application.modules; - -import java.lang.Thread.UncaughtExceptionHandler; -import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.google.inject.AbstractModule; - -import org.apache.aurora.common.application.AppLauncher; -import org.apache.aurora.common.stats.Stats; - -/** - * Binding module for the bare minimum requirements for the - * {@link AppLauncher}. - * - * @author William Farner - */ -public class AppLauncherModule extends AbstractModule { - - private static final Logger LOG = Logger.getLogger(AppLauncherModule.class.getName()); - private static final AtomicLong UNCAUGHT_EXCEPTIONS = Stats.exportLong("uncaught_exceptions"); - - @Override - protected void configure() { - bind(UncaughtExceptionHandler.class).to(LoggingExceptionHandler.class); - } - - public static class LoggingExceptionHandler implements UncaughtExceptionHandler { - @Override public void uncaughtException(Thread t, Throwable e) { - UNCAUGHT_EXCEPTIONS.incrementAndGet(); - LOG.log(Level.SEVERE, "Uncaught exception from " + t + ":" + e, e); - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/config/checkstyle/checkstyle.xml ---------------------------------------------------------------------- diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 9c291f5..2074beb 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -266,7 +266,7 @@ limitations under the License. <module name="ArrayTypeStyle"/> <module name="OuterTypeFilename"/> - <!-- Regexp checks --> + <!-- Discourage use of System.exit() --> <module name="RegexpSinglelineJava"> <property name="format" value="System.exit"/> <property name="ignoreComments" value="true"/> @@ -274,4 +274,8 @@ limitations under the License. value="Don't System.exit(), throw a RuntimeException()" /> </module> </module> + + <module name="SuppressionFilter"> + <property name="file" value="config/checkstyle/suppressions.xml"/> + </module> </module> http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/config/checkstyle/suppressions.xml ---------------------------------------------------------------------- diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000..50a53e0 --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<!-- +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this work except in compliance with the License. +You may obtain a copy of the License in the LICENSE file, or 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. +--> + +<!DOCTYPE suppressions PUBLIC + "-//Puppy Crawl//DTD Suppressions 1.1//EN" + "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd"> + +<suppressions> + <!-- Allow use of System.exit() in main. --> + <suppress files="org/apache/aurora/scheduler/app/SchedulerMain.java" + checks="RegexpSinglelineJava"/> +</suppressions> http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/config/legacy_untested_classes.txt ---------------------------------------------------------------------- diff --git a/config/legacy_untested_classes.txt b/config/legacy_untested_classes.txt index 07fd5f1..7b891b2 100644 --- a/config/legacy_untested_classes.txt +++ b/config/legacy_untested_classes.txt @@ -1,6 +1,7 @@ org/apache/aurora/Protobufs$1 org/apache/aurora/auth/UnsecureAuthModule$UnsecureCapabilityValidator$1 org/apache/aurora/auth/UnsecureAuthModule$UnsecureCapabilityValidator$2 +org/apache/aurora/scheduler/app/SchedulerMain$1 org/apache/aurora/scheduler/app/SchedulerMain$2 org/apache/aurora/scheduler/app/SchedulerMain$3 org/apache/aurora/scheduler/app/SchedulerMain$4 http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/app/AppModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java index 78071ed..967e10d 100644 --- a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java +++ b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java @@ -13,28 +13,15 @@ */ package org.apache.aurora.scheduler.app; -import java.util.List; -import java.util.logging.Logger; - import javax.inject.Singleton; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import org.apache.aurora.GuiceUtils; import org.apache.aurora.common.inject.TimedInterceptor; -import org.apache.aurora.common.net.pool.DynamicHostSet; import org.apache.aurora.common.stats.Stats; import org.apache.aurora.common.stats.StatsProvider; -import org.apache.aurora.common.thrift.ServiceInstance; import org.apache.aurora.common.util.Clock; -import org.apache.aurora.common.zookeeper.ServerSet; -import org.apache.aurora.common.zookeeper.ServerSetImpl; -import org.apache.aurora.common.zookeeper.SingletonService; -import org.apache.aurora.common.zookeeper.ZooKeeperClient; -import org.apache.aurora.common.zookeeper.ZooKeeperClient.Credentials; -import org.apache.aurora.common.zookeeper.ZooKeeperUtils; -import org.apache.aurora.gen.ServerInfo; import org.apache.aurora.scheduler.SchedulerModule; import org.apache.aurora.scheduler.SchedulerServicesModule; import org.apache.aurora.scheduler.async.AsyncModule; @@ -52,40 +39,13 @@ import org.apache.aurora.scheduler.scheduling.SchedulingModule; import org.apache.aurora.scheduler.sla.SlaModule; import org.apache.aurora.scheduler.state.StateModule; import org.apache.aurora.scheduler.stats.AsyncStatsModule; -import org.apache.aurora.scheduler.storage.entities.IServerInfo; import org.apache.aurora.scheduler.updater.UpdaterModule; -import org.apache.aurora.scheduler.zookeeper.guice.client.ZooKeeperClientModule.ClientConfig; import org.apache.mesos.Scheduler; -import org.apache.zookeeper.data.ACL; - -import static java.util.Objects.requireNonNull; - -import static org.apache.aurora.common.base.MorePreconditions.checkNotBlank; -import static org.apache.aurora.gen.apiConstants.THRIFT_API_VERSION; /** * Binding module for the aurora scheduler application. */ public class AppModule extends AbstractModule { - private static final Logger LOG = Logger.getLogger(AppModule.class.getName()); - - private final String clusterName; - private final String serverSetPath; - private final ClientConfig zkClientConfig; - private final String statsUrlPrefix; - - AppModule( - String clusterName, - String serverSetPath, - ClientConfig zkClientConfig, - String statsUrlPrefix) { - - this.clusterName = checkNotBlank(clusterName); - this.serverSetPath = checkNotBlank(serverSetPath); - this.zkClientConfig = requireNonNull(zkClientConfig); - this.statsUrlPrefix = statsUrlPrefix; - } - @Override protected void configure() { // Enable intercepted method timings and context classloader repair. @@ -94,14 +54,6 @@ public class AppModule extends AbstractModule { GuiceUtils.bindExceptionTrap(binder(), Scheduler.class); bind(Clock.class).toInstance(Clock.SYSTEM_CLOCK); - - bind(IServerInfo.class).toInstance( - IServerInfo.build( - new ServerInfo() - .setClusterName(clusterName) - .setThriftAPIVersion(THRIFT_API_VERSION) - .setStatsUrlPrefix(statsUrlPrefix))); - install(new PubsubEventModule()); // Filter layering: notifier filter -> base impl PubsubEventModule.bindSchedulingFilterDelegate(binder()).to(SchedulingFilterImpl.class); @@ -125,40 +77,4 @@ public class AppModule extends AbstractModule { install(new UpdaterModule()); bind(StatsProvider.class).toInstance(Stats.STATS_PROVIDER); } - - @Provides - @Singleton - List<ACL> provideAcls() { - if (zkClientConfig.credentials == Credentials.NONE) { - LOG.warning("Running without ZooKeeper digest credentials. ZooKeeper ACLs are disabled."); - return ZooKeeperUtils.OPEN_ACL_UNSAFE; - } else { - return ZooKeeperUtils.EVERYONE_READ_CREATOR_ALL; - } - } - - @Provides - @Singleton - ServerSet provideServerSet(ZooKeeperClient client, List<ACL> zooKeeperAcls) { - return new ServerSetImpl(client, zooKeeperAcls, serverSetPath); - } - - @Provides - @Singleton - DynamicHostSet<ServiceInstance> provideSchedulerHostSet(ServerSet serverSet) { - // Used for a type re-binding of the serverset. - return serverSet; - } - - @Provides - @Singleton - SingletonService provideSingletonService( - ZooKeeperClient client, - ServerSet serverSet, - List<ACL> zookeeperAcls) { - - return new SingletonService( - serverSet, - SingletonService.createSingletonCandidate(client, serverSetPath, zookeeperAcls)); - } } http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/app/Modules.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/Modules.java b/src/main/java/org/apache/aurora/scheduler/app/Modules.java deleted file mode 100644 index cad7c38..0000000 --- a/src/main/java/org/apache/aurora/scheduler/app/Modules.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Licensed 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. - */ -package org.apache.aurora.scheduler.app; - -import com.google.inject.AbstractModule; -import com.google.inject.Module; -import com.google.inject.PrivateModule; - -import static java.util.Objects.requireNonNull; - -/** - * A utility class for managing guice modules. - */ -public 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 a module in a PrivateModule that only exposes requested keys to ensure that - * we don't depend on surprise extra bindings across different implementations. - * - * @param module Module to wrap. - * @param exposedClasses Keys to expose. - * @return A private module that exposes the requested keys. - */ - public static Module wrapInPrivateModule( - final Module module, - final Iterable<Class<?>> exposedClasses) { - - requireNonNull(module); - requireNonNull(exposedClasses); - - 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); - } - - /** - * Creates a module that will lazily instantiate and install another module. - * <p/> - * This serves as an indirection between module procurement and installation, which is necessary - * in cases where a module is referenced within a static initializer. In this scenario, a module - * must not be instantiated if it reads command line arguments, as the args system has not yet - * had a chance to populate them. - * - * @param moduleClass Module to install. - * @return An installer that will install {@code moduleClass}. - */ - public static Module lazilyInstantiated(final Class<? extends Module> moduleClass) { - return new AbstractModule() { - @Override - protected void configure() { - install(getModule(moduleClass)); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/app/MoreModules.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/MoreModules.java b/src/main/java/org/apache/aurora/scheduler/app/MoreModules.java new file mode 100644 index 0000000..b79ccc8 --- /dev/null +++ b/src/main/java/org/apache/aurora/scheduler/app/MoreModules.java @@ -0,0 +1,98 @@ +/** + * Licensed 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. + */ +package org.apache.aurora.scheduler.app; + +import com.google.inject.AbstractModule; +import com.google.inject.Module; +import com.google.inject.PrivateModule; + +import static java.util.Objects.requireNonNull; + +/** + * A utility class for managing guice modules. + */ +public final class MoreModules { + + private MoreModules() { + // 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 a module in a PrivateModule that only exposes requested keys to ensure that + * we don't depend on surprise extra bindings across different implementations. + * + * @param module Module to wrap. + * @param exposedClasses Keys to expose. + * @return A private module that exposes the requested keys. + */ + public static Module wrapInPrivateModule( + final Module module, + final Iterable<Class<?>> exposedClasses) { + + requireNonNull(module); + requireNonNull(exposedClasses); + + 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); + } + + /** + * Creates a module that will lazily instantiate and install another module. + * <p/> + * This serves as an indirection between module procurement and installation, which is necessary + * in cases where a module is referenced within a static initializer. In this scenario, a module + * must not be instantiated if it reads command line arguments, as the args system has not yet + * had a chance to populate them. + * + * @param moduleClass Module to install. + * @return An installer that will install {@code moduleClass}. + */ + public static Module lazilyInstantiated(final Class<? extends Module> moduleClass) { + return new AbstractModule() { + @Override + protected void configure() { + install(getModule(moduleClass)); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java index 11f04da..99b8744 100644 --- a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java +++ b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java @@ -13,10 +13,14 @@ */ package org.apache.aurora.scheduler.app; +import java.lang.Thread.UncaughtExceptionHandler; import java.net.InetSocketAddress; +import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; @@ -24,18 +28,20 @@ import javax.inject.Inject; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.net.HostAndPort; import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; import com.google.inject.Module; +import com.google.inject.util.Modules; import org.apache.aurora.GuavaUtils.ServiceManagerIface; -import org.apache.aurora.common.application.AppLauncher; -import org.apache.aurora.common.application.Application; import org.apache.aurora.common.application.Lifecycle; -import org.apache.aurora.common.application.modules.AppLauncherModule; import org.apache.aurora.common.args.Arg; +import org.apache.aurora.common.args.ArgScanner; +import org.apache.aurora.common.args.ArgScanner.ArgScanException; import org.apache.aurora.common.args.CmdLine; import org.apache.aurora.common.args.constraints.NotEmpty; import org.apache.aurora.common.args.constraints.NotNull; @@ -43,9 +49,11 @@ import org.apache.aurora.common.inject.Bindings; import org.apache.aurora.common.logging.RootLogConfig; import org.apache.aurora.common.quantity.Amount; import org.apache.aurora.common.quantity.Data; +import org.apache.aurora.common.stats.Stats; import org.apache.aurora.common.zookeeper.Group; import org.apache.aurora.common.zookeeper.SingletonService; import org.apache.aurora.common.zookeeper.SingletonService.LeadershipListener; +import org.apache.aurora.gen.ServerInfo; import org.apache.aurora.gen.Volume; import org.apache.aurora.scheduler.AppStartup; import org.apache.aurora.scheduler.ResourceSlot; @@ -60,6 +68,7 @@ import org.apache.aurora.scheduler.stats.StatsModule; import org.apache.aurora.scheduler.storage.Storage; import org.apache.aurora.scheduler.storage.backup.BackupModule; import org.apache.aurora.scheduler.storage.db.DbModule; +import org.apache.aurora.scheduler.storage.entities.IServerInfo; import org.apache.aurora.scheduler.storage.log.LogStorageModule; import org.apache.aurora.scheduler.storage.log.SnapshotStoreImpl; import org.apache.aurora.scheduler.zookeeper.guice.client.ZooKeeperClientModule; @@ -67,11 +76,12 @@ import org.apache.aurora.scheduler.zookeeper.guice.client.ZooKeeperClientModule. import org.apache.aurora.scheduler.zookeeper.guice.client.flagged.FlaggedClientConfig; import static org.apache.aurora.common.logging.RootLogConfig.Configuration; +import static org.apache.aurora.gen.apiConstants.THRIFT_API_VERSION; /** * Launcher for the aurora scheduler. */ -public class SchedulerMain implements Application { +public class SchedulerMain { private static final Logger LOG = Logger.getLogger(SchedulerMain.class.getName()); @NotNull @@ -138,93 +148,6 @@ public class SchedulerMain implements Application { @AppStartup private ServiceManagerIface startupServices; - private static Iterable<? extends Module> getExtraModules() { - Builder<Module> modules = ImmutableList.builder(); - - for (Class<? extends Module> moduleClass : EXTRA_MODULES.get()) { - modules.add(Modules.getModule(moduleClass)); - } - - return modules.build(); - } - - @VisibleForTesting - Iterable<? extends Module> getModules( - String clusterName, - String serverSetPath, - ClientConfig zkClientConfig, - String statsURLPrefix) { - - return ImmutableList.<Module>builder() - .add(new StatsModule()) - .add(new AppModule(clusterName, serverSetPath, zkClientConfig, statsURLPrefix)) - .addAll(getExtraModules()) - .add(getPersistentStorageModule()) - .add(new CronModule()) - .add(DbModule.productionModule(Bindings.annotatedKeyFactory(Storage.Volatile.class))) - .add(new DbModule.GarbageCollectorModule()) - .build(); - } - - protected Module getPersistentStorageModule() { - return new AbstractModule() { - @Override - protected void configure() { - install(new LogStorageModule()); - } - }; - } - - protected Module getMesosModules() { - final ClientConfig zkClientConfig = FlaggedClientConfig.create(); - return new AbstractModule() { - @Override - protected void configure() { - install(new CommandLineDriverSettingsModule()); - install(new LibMesosLoadingModule()); - install(new MesosLogStreamModule(zkClientConfig)); - } - }; - } - - @Override - public Iterable<? extends Module> getModules() { - ClientConfig zkClientConfig = FlaggedClientConfig.create(); - return ImmutableList.<Module>builder() - .add(new LifecycleModule()) - .add(new AppLauncherModule()) - .add(new BackupModule(SnapshotStoreImpl.class)) - .addAll( - getModules( - CLUSTER_NAME.get(), - SERVERSET_PATH.get(), - zkClientConfig, - STATS_URL_PREFIX.get())) - .add(new ZooKeeperClientModule(zkClientConfig)) - .add(new AbstractModule() { - @Override - protected void configure() { - ResourceSlot executorOverhead = new ResourceSlot( - EXECUTOR_OVERHEAD_CPUS.get(), - EXECUTOR_OVERHEAD_RAM.get(), - Amount.of(0L, Data.MB), - 0); - - bind(ExecutorSettings.class) - .toInstance(ExecutorSettings.newBuilder() - .setExecutorPath(THERMOS_EXECUTOR_PATH.get()) - .setExecutorResources(THERMOS_EXECUTOR_RESOURCES.get()) - .setThermosObserverRoot(THERMOS_OBSERVER_ROOT.get()) - .setExecutorFlags(Optional.fromNullable(THERMOS_EXECUTOR_FLAGS.get())) - .setExecutorOverhead(executorOverhead) - .setGlobalContainerMounts(GLOBAL_CONTAINER_MOUNTS.get()) - .build()); - } - }) - .add(getMesosModules()) - .build(); - } - private void stop() { LOG.info("Stopping scheduler services."); try { @@ -235,7 +158,7 @@ public class SchedulerMain implements Application { appLifecycle.shutdown(); } - public void run() { + void run() { startupServices.startAsync(); Runtime.getRuntime().addShutdownHook(new Thread(SchedulerMain.this::stop, "ShutdownHook")); startupServices.awaitHealthy(); @@ -267,7 +190,122 @@ public class SchedulerMain implements Application { stop(); } + @VisibleForTesting + static Module getUniversalModule() { + return Modules.combine( + new LifecycleModule(), + new StatsModule(), + new AppModule(), + new CronModule(), + DbModule.productionModule(Bindings.annotatedKeyFactory(Storage.Volatile.class)), + new DbModule.GarbageCollectorModule()); + } + + /** + * Runs the scheduler by including modules configured from command line arguments in + * addition to the provided environment-specific module. + * + * @param appEnvironmentModule Additional modules based on the execution environment. + */ + @VisibleForTesting + public static void flagConfiguredMain(Module appEnvironmentModule) { + AtomicLong uncaughtExceptions = Stats.exportLong("uncaught_exceptions"); + Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + uncaughtExceptions.incrementAndGet(); + LOG.log(Level.SEVERE, "Uncaught exception from " + t + ":" + e, e); + } + }); + + ClientConfig zkClientConfig = FlaggedClientConfig.create(); + Module module = Modules.combine( + appEnvironmentModule, + getUniversalModule(), + new ZooKeeperClientModule(zkClientConfig), + new ServiceDiscoveryModule(SERVERSET_PATH.get(), zkClientConfig.credentials), + new BackupModule(SnapshotStoreImpl.class), + new AbstractModule() { + @Override + protected void configure() { + ResourceSlot executorOverhead = new ResourceSlot( + EXECUTOR_OVERHEAD_CPUS.get(), + EXECUTOR_OVERHEAD_RAM.get(), + Amount.of(0L, Data.MB), + 0); + + bind(ExecutorSettings.class) + .toInstance(ExecutorSettings.newBuilder() + .setExecutorPath(THERMOS_EXECUTOR_PATH.get()) + .setExecutorResources(THERMOS_EXECUTOR_RESOURCES.get()) + .setThermosObserverRoot(THERMOS_OBSERVER_ROOT.get()) + .setExecutorFlags(Optional.fromNullable(THERMOS_EXECUTOR_FLAGS.get())) + .setExecutorOverhead(executorOverhead) + .setGlobalContainerMounts(GLOBAL_CONTAINER_MOUNTS.get()) + .build()); + + bind(IServerInfo.class).toInstance( + IServerInfo.build( + new ServerInfo() + .setClusterName(CLUSTER_NAME.get()) + .setThriftAPIVersion(THRIFT_API_VERSION) + .setStatsUrlPrefix(STATS_URL_PREFIX.get()))); + } + }); + + Lifecycle lifecycle = null; + try { + Injector injector = Guice.createInjector(module); + lifecycle = injector.getInstance(Lifecycle.class); + SchedulerMain scheduler = new SchedulerMain(); + injector.injectMembers(scheduler); + try { + scheduler.run(); + } finally { + LOG.info("Application run() exited."); + } + } finally { + if (lifecycle != null) { + lifecycle.shutdown(); + } + } + } + public static void main(String... args) { - AppLauncher.launch(SchedulerMain.class, args); + applyStaticArgumentValues(args); + + List<Module> modules = ImmutableList.<Module>builder() + .add( + new CommandLineDriverSettingsModule(), + new LibMesosLoadingModule(), + new MesosLogStreamModule(FlaggedClientConfig.create()), + new LogStorageModule()) + .addAll(Iterables.transform(EXTRA_MODULES.get(), MoreModules::getModule)) + .build(); + flagConfiguredMain(Modules.combine(modules)); + } + + private static void exit(String message, Exception error) { + LOG.log(Level.SEVERE, message + "\n" + error, error); + System.exit(1); + } + + /** + * Applies {@link CmdLine} arg values throughout the classpath. This must be invoked before + * attempting to read any argument values in the system. + * + * @param args Command line arguments. + */ + @VisibleForTesting + public static void applyStaticArgumentValues(String... args) { + try { + if (!new ArgScanner().parse(Arrays.asList(args))) { + System.exit(0); + } + } catch (ArgScanException e) { + exit("Failed to scan arguments", e); + } catch (IllegalArgumentException e) { + exit("Failed to apply arguments", e); + } } } http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/app/ServiceDiscoveryModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/app/ServiceDiscoveryModule.java b/src/main/java/org/apache/aurora/scheduler/app/ServiceDiscoveryModule.java new file mode 100644 index 0000000..078042b --- /dev/null +++ b/src/main/java/org/apache/aurora/scheduler/app/ServiceDiscoveryModule.java @@ -0,0 +1,91 @@ +/** + * Licensed 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. + */ +package org.apache.aurora.scheduler.app; + +import java.util.List; +import java.util.logging.Logger; + +import javax.inject.Singleton; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; + +import org.apache.aurora.common.net.pool.DynamicHostSet; +import org.apache.aurora.common.thrift.ServiceInstance; +import org.apache.aurora.common.zookeeper.ServerSet; +import org.apache.aurora.common.zookeeper.ServerSetImpl; +import org.apache.aurora.common.zookeeper.SingletonService; +import org.apache.aurora.common.zookeeper.ZooKeeperClient; +import org.apache.aurora.common.zookeeper.ZooKeeperClient.Credentials; +import org.apache.aurora.common.zookeeper.ZooKeeperUtils; +import org.apache.zookeeper.data.ACL; + +import static java.util.Objects.requireNonNull; + +/** + * Binding module for utilities to advertise the network presence of the scheduler. + */ +public class ServiceDiscoveryModule extends AbstractModule { + + private static final Logger LOG = Logger.getLogger(ServiceDiscoveryModule.class.getName()); + + private final String serverSetPath; + private final Credentials zkCredentials; + + public ServiceDiscoveryModule(String serverSetPath, Credentials zkCredentials) { + this.serverSetPath = requireNonNull(serverSetPath); + this.zkCredentials = requireNonNull(zkCredentials); + } + + @Override + protected void configure() { + // provider-only module. + } + + @Provides + @Singleton + List<ACL> provideAcls() { + if (zkCredentials == Credentials.NONE) { + LOG.warning("Running without ZooKeeper digest credentials. ZooKeeper ACLs are disabled."); + return ZooKeeperUtils.OPEN_ACL_UNSAFE; + } else { + return ZooKeeperUtils.EVERYONE_READ_CREATOR_ALL; + } + } + + @Provides + @Singleton + ServerSet provideServerSet(ZooKeeperClient client, List<ACL> zooKeeperAcls) { + return new ServerSetImpl(client, zooKeeperAcls, serverSetPath); + } + + @Provides + @Singleton + DynamicHostSet<ServiceInstance> provideSchedulerHostSet(ServerSet serverSet) { + // Used for a type re-binding of the serverset. + return serverSet; + } + + @Provides + @Singleton + SingletonService provideSingletonService( + ZooKeeperClient client, + ServerSet serverSet, + List<ACL> zookeeperAcls) { + + return new SingletonService( + serverSet, + SingletonService.createSingletonCandidate(client, serverSetPath, zookeeperAcls)); + } +} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/http/api/security/HttpSecurityModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/http/api/security/HttpSecurityModule.java b/src/main/java/org/apache/aurora/scheduler/http/api/security/HttpSecurityModule.java index f317b68..4b6a872 100644 --- a/src/main/java/org/apache/aurora/scheduler/http/api/security/HttpSecurityModule.java +++ b/src/main/java/org/apache/aurora/scheduler/http/api/security/HttpSecurityModule.java @@ -38,7 +38,7 @@ import org.apache.aurora.common.args.Arg; import org.apache.aurora.common.args.CmdLine; import org.apache.aurora.gen.AuroraAdmin; import org.apache.aurora.gen.AuroraSchedulerManager; -import org.apache.aurora.scheduler.app.Modules; +import org.apache.aurora.scheduler.app.MoreModules; import org.apache.aurora.scheduler.thrift.aop.AnnotatedAuroraAdmin; import org.apache.shiro.SecurityUtils; import org.apache.shiro.guice.aop.ShiroAopModule; @@ -74,7 +74,7 @@ public class HttpSecurityModule extends ServletModule { @CmdLine(name = "shiro_realm_modules", help = "Guice modules for configuring Shiro Realms.") private static final Arg<Set<Module>> SHIRO_REALM_MODULE = Arg.create( - ImmutableSet.of(Modules.lazilyInstantiated(IniShiroRealmModule.class))); + ImmutableSet.of(MoreModules.lazilyInstantiated(IniShiroRealmModule.class))); @VisibleForTesting static final Matcher<Method> AURORA_SCHEDULER_MANAGER_SERVICE = http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/http/api/security/ModuleParser.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/http/api/security/ModuleParser.java b/src/main/java/org/apache/aurora/scheduler/http/api/security/ModuleParser.java index 63ab955..ccd9a20 100644 --- a/src/main/java/org/apache/aurora/scheduler/http/api/security/ModuleParser.java +++ b/src/main/java/org/apache/aurora/scheduler/http/api/security/ModuleParser.java @@ -20,7 +20,7 @@ import com.google.inject.Module; import org.apache.aurora.common.args.ArgParser; import org.apache.aurora.common.args.parsers.NonParameterizedTypeParser; -import org.apache.aurora.scheduler.app.Modules; +import org.apache.aurora.scheduler.app.MoreModules; /** * ArgParser for Guice modules. Constructs an instance of a Module with a given alias or FQCN if it @@ -49,6 +49,6 @@ public class ModuleParser extends NonParameterizedTypeParser<Module> { @SuppressWarnings("unchecked") Class<? extends Module> moduleClass = (Class<? extends Module>) rawClass; - return Modules.lazilyInstantiated(moduleClass); + return MoreModules.lazilyInstantiated(moduleClass); } } http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/main/java/org/apache/aurora/scheduler/thrift/auth/ThriftAuthModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/auth/ThriftAuthModule.java b/src/main/java/org/apache/aurora/scheduler/thrift/auth/ThriftAuthModule.java index 3ccee66..e1a21f6 100644 --- a/src/main/java/org/apache/aurora/scheduler/thrift/auth/ThriftAuthModule.java +++ b/src/main/java/org/apache/aurora/scheduler/thrift/auth/ThriftAuthModule.java @@ -30,7 +30,7 @@ import org.apache.aurora.auth.UnsecureAuthModule; import org.apache.aurora.common.args.Arg; import org.apache.aurora.common.args.CmdLine; import org.apache.aurora.common.args.constraints.NotEmpty; -import org.apache.aurora.scheduler.app.Modules; +import org.apache.aurora.scheduler.app.MoreModules; import static java.util.Objects.requireNonNull; @@ -78,6 +78,6 @@ public class ThriftAuthModule extends AbstractModule { requireBinding(SessionValidator.class); requireBinding(CapabilityValidator.class); - install(Modules.wrapInPrivateModule(authModule, AUTH_MODULE_CLASSES)); + install(MoreModules.wrapInPrivateModule(authModule, AUTH_MODULE_CLASSES)); } } http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/SchedulerLifecycleTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/SchedulerLifecycleTest.java b/src/test/java/org/apache/aurora/scheduler/SchedulerLifecycleTest.java index d9f7b20..bab4567 100644 --- a/src/test/java/org/apache/aurora/scheduler/SchedulerLifecycleTest.java +++ b/src/test/java/org/apache/aurora/scheduler/SchedulerLifecycleTest.java @@ -13,7 +13,6 @@ */ package org.apache.aurora.scheduler; -import java.lang.Thread.UncaughtExceptionHandler; import java.util.concurrent.TimeUnit; import org.apache.aurora.GuavaUtils.ServiceManagerIface; @@ -82,12 +81,7 @@ public class SchedulerLifecycleTest extends EasyMockTest { schedulerLifecycle = new SchedulerLifecycle( storageUtil.storage, - new Lifecycle(shutdownRegistry, new UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - fail(e.getMessage()); - } - }), + new Lifecycle(shutdownRegistry), driver, delayedActions, eventSink, http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/app/ModulesTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/app/ModulesTest.java b/src/test/java/org/apache/aurora/scheduler/app/ModulesTest.java deleted file mode 100644 index 01137e9..0000000 --- a/src/test/java/org/apache/aurora/scheduler/app/ModulesTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Licensed 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. - */ -package org.apache.aurora.scheduler.app; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class ModulesTest { - private static final String STRING = "string"; - - @Test - public void testLazilyInstantiated() { - Injector injector = Guice.createInjector(Modules.lazilyInstantiated(StringInstaller.class)); - assertEquals(STRING, injector.getInstance(String.class)); - } - - static class StringInstaller extends AbstractModule { - @Override - protected void configure() { - bind(String.class).toInstance(STRING); - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/app/MoreModulesTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/app/MoreModulesTest.java b/src/test/java/org/apache/aurora/scheduler/app/MoreModulesTest.java new file mode 100644 index 0000000..b2fb3c9 --- /dev/null +++ b/src/test/java/org/apache/aurora/scheduler/app/MoreModulesTest.java @@ -0,0 +1,39 @@ +/** + * Licensed 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. + */ +package org.apache.aurora.scheduler.app; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class MoreModulesTest { + private static final String STRING = "string"; + + @Test + public void testLazilyInstantiated() { + Injector injector = Guice.createInjector(MoreModules.lazilyInstantiated(StringInstaller.class)); + assertEquals(STRING, injector.getInstance(String.class)); + } + + static class StringInstaller extends AbstractModule { + @Override + protected void configure() { + bind(String.class).toInstance(STRING); + } + } +} http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java index a44b9da..1530ef8 100644 --- a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java +++ b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java @@ -46,7 +46,6 @@ import com.google.inject.Module; import org.apache.aurora.GuavaUtils; import org.apache.aurora.codec.ThriftBinaryCodec.CodingException; import org.apache.aurora.common.application.Lifecycle; -import org.apache.aurora.common.application.modules.AppLauncherModule; import org.apache.aurora.common.net.pool.DynamicHostSet.HostChangeMonitor; import org.apache.aurora.common.quantity.Amount; import org.apache.aurora.common.quantity.Data; @@ -55,12 +54,14 @@ import org.apache.aurora.common.thrift.ServiceInstance; import org.apache.aurora.common.zookeeper.ServerSet; import org.apache.aurora.common.zookeeper.ServerSetImpl; import org.apache.aurora.common.zookeeper.ZooKeeperClient; +import org.apache.aurora.common.zookeeper.ZooKeeperClient.Credentials; import org.apache.aurora.common.zookeeper.testing.BaseZooKeeperTest; import org.apache.aurora.gen.AssignedTask; import org.apache.aurora.gen.Identity; import org.apache.aurora.gen.JobKey; import org.apache.aurora.gen.ScheduleStatus; import org.apache.aurora.gen.ScheduledTask; +import org.apache.aurora.gen.ServerInfo; import org.apache.aurora.gen.TaskConfig; import org.apache.aurora.gen.TaskEvent; import org.apache.aurora.gen.storage.LogEntry; @@ -80,6 +81,7 @@ import org.apache.aurora.scheduler.mesos.DriverFactory; import org.apache.aurora.scheduler.mesos.DriverSettings; import org.apache.aurora.scheduler.mesos.ExecutorSettings; import org.apache.aurora.scheduler.storage.backup.BackupModule; +import org.apache.aurora.scheduler.storage.entities.IServerInfo; import org.apache.aurora.scheduler.storage.log.EntrySerializer; import org.apache.aurora.scheduler.storage.log.LogStorageModule; import org.apache.aurora.scheduler.storage.log.SnapshotStoreImpl; @@ -100,6 +102,7 @@ import org.junit.Before; import org.junit.Test; import static org.apache.aurora.common.testing.easymock.EasyMockTest.createCapture; +import static org.apache.aurora.gen.apiConstants.THRIFT_API_VERSION; import static org.apache.mesos.Protos.FrameworkInfo; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.createControl; @@ -202,25 +205,32 @@ public class SchedulerIT extends BaseZooKeeperTest { .setExecutorOverhead(executorOverhead) .build()); install(new BackupModule(backupDir, SnapshotStoreImpl.class)); + + bind(IServerInfo.class).toInstance( + IServerInfo.build( + new ServerInfo() + .setClusterName(CLUSTER_NAME) + .setThriftAPIVersion(THRIFT_API_VERSION) + .setStatsUrlPrefix(STATS_URL_PREFIX))); } }; + Credentials credentials = ZooKeeperClient.digestCredentials("mesos", "mesos"); ClientConfig zkClientConfig = ClientConfig .create(ImmutableList.of(InetSocketAddress.createUnresolved("localhost", getPort()))) - .withCredentials(ZooKeeperClient.digestCredentials("mesos", "mesos")); - final SchedulerMain main = SchedulerMain.class.newInstance(); + .withCredentials(credentials); + SchedulerMain main = SchedulerMain.class.newInstance(); injector = Guice.createInjector( ImmutableList.<Module>builder() - .addAll(main.getModules(CLUSTER_NAME, SERVERSET_PATH, zkClientConfig, STATS_URL_PREFIX)) - .add(new LifecycleModule()) - .add(new AppLauncherModule()) + .add(SchedulerMain.getUniversalModule()) + .add(new LogStorageModule()) .add(new ZooKeeperClientModule(zkClientConfig)) + .add(new ServiceDiscoveryModule(SERVERSET_PATH, credentials)) .add(testModule) .build() ); injector.injectMembers(main); lifecycle = injector.getInstance(Lifecycle.class); - // Mimic AppLauncher running main. executor.submit(new Runnable() { @Override public void run() { http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/app/local/LocalSchedulerMain.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/app/local/LocalSchedulerMain.java b/src/test/java/org/apache/aurora/scheduler/app/local/LocalSchedulerMain.java index 738c8b6..4716b66 100644 --- a/src/test/java/org/apache/aurora/scheduler/app/local/LocalSchedulerMain.java +++ b/src/test/java/org/apache/aurora/scheduler/app/local/LocalSchedulerMain.java @@ -24,10 +24,8 @@ import com.google.common.io.Files; import com.google.inject.AbstractModule; import com.google.inject.Key; import com.google.inject.Module; +import com.google.inject.util.Modules; -import org.apache.aurora.codec.ThriftBinaryCodec.CodingException; -import org.apache.aurora.common.application.AppLauncher; -import org.apache.aurora.gen.storage.Snapshot; import org.apache.aurora.scheduler.app.SchedulerMain; import org.apache.aurora.scheduler.app.local.simulator.ClusterSimulatorModule; import org.apache.aurora.scheduler.mesos.DriverFactory; @@ -42,7 +40,10 @@ import org.apache.shiro.io.ResourceUtils; /** * A main class that runs the scheduler in local mode, using fakes for external components. */ -public class LocalSchedulerMain extends SchedulerMain { +public final class LocalSchedulerMain { + private LocalSchedulerMain() { + // Utility class. + } private static final DriverSettings DRIVER_SETTINGS = new DriverSettings( "fakemaster", @@ -52,41 +53,9 @@ public class LocalSchedulerMain extends SchedulerMain { .setName("test framework") .build()); - @Override - protected Module getPersistentStorageModule() { - return new AbstractModule() { - @Override - protected void configure() { - bind(Storage.class).to(Key.get(Storage.class, Storage.Volatile.class)); - bind(NonVolatileStorage.class).to(FakeNonVolatileStorage.class); - bind(DistributedSnapshotStore.class).toInstance(new DistributedSnapshotStore() { - @Override - public void persist(Snapshot snapshot) throws CodingException { - // No-op. - } - }); - } - }; - } - - @Override - protected Module getMesosModules() { - return new AbstractModule() { - @Override - protected void configure() { - bind(DriverSettings.class).toInstance(DRIVER_SETTINGS); - bind(SchedulerDriver.class).to(FakeMaster.class); - bind(DriverFactory.class).to(FakeMaster.class); - bind(FakeMaster.class).in(Singleton.class); - install(new ClusterSimulatorModule()); - } - }; - } - public static void main(String[] args) { File backupDir = Files.createTempDir(); backupDir.deleteOnExit(); - List<String> arguments = ImmutableList.<String>builder() .add(args) .add("-cluster_name=local") @@ -103,7 +72,28 @@ public class LocalSchedulerMain extends SchedulerMain { + "org/apache/aurora/scheduler/http/api/security/shiro-example.ini") .add("-enable_h2_console=true") .build(); + SchedulerMain.applyStaticArgumentValues(arguments.toArray(new String[] {})); + + Module persistentStorage = new AbstractModule() { + @Override + protected void configure() { + bind(Storage.class).to(Key.get(Storage.class, Storage.Volatile.class)); + bind(NonVolatileStorage.class).to(FakeNonVolatileStorage.class); + bind(DistributedSnapshotStore.class).toInstance(snapshot -> { }); + } + }; + + Module fakeMesos = new AbstractModule() { + @Override + protected void configure() { + bind(DriverSettings.class).toInstance(DRIVER_SETTINGS); + bind(SchedulerDriver.class).to(FakeMaster.class); + bind(DriverFactory.class).to(FakeMaster.class); + bind(FakeMaster.class).in(Singleton.class); + install(new ClusterSimulatorModule()); + } + }; - AppLauncher.launch(LocalSchedulerMain.class, arguments.toArray(new String[0])); + SchedulerMain.flagConfiguredMain(Modules.combine(fakeMesos, persistentStorage)); } } http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/http/QuitCallbackTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/http/QuitCallbackTest.java b/src/test/java/org/apache/aurora/scheduler/http/QuitCallbackTest.java index e50bdc5..62837c7 100644 --- a/src/test/java/org/apache/aurora/scheduler/http/QuitCallbackTest.java +++ b/src/test/java/org/apache/aurora/scheduler/http/QuitCallbackTest.java @@ -13,12 +13,9 @@ */ package org.apache.aurora.scheduler.http; -import java.lang.Thread.UncaughtExceptionHandler; - import org.apache.aurora.common.application.Lifecycle; import org.apache.aurora.common.base.Command; import org.apache.aurora.common.testing.easymock.EasyMockTest; - import org.junit.Before; import org.junit.Test; @@ -30,8 +27,7 @@ public class QuitCallbackTest extends EasyMockTest { @Before public void setUp() { shutdownCommand = createMock(Command.class); - handler = new QuitCallback( - new Lifecycle(shutdownCommand, createMock(UncaughtExceptionHandler.class))); + handler = new QuitCallback(new Lifecycle(shutdownCommand)); } @Test http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/log/mesos/MesosLogTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/log/mesos/MesosLogTest.java b/src/test/java/org/apache/aurora/scheduler/log/mesos/MesosLogTest.java index cb33b03..9189bde 100644 --- a/src/test/java/org/apache/aurora/scheduler/log/mesos/MesosLogTest.java +++ b/src/test/java/org/apache/aurora/scheduler/log/mesos/MesosLogTest.java @@ -79,7 +79,7 @@ public class MesosLogTest extends EasyMockTest { .toInstance(WRITE_TIMEOUT); bind(byte[].class).annotatedWith(MesosLog.NoopEntry.class) .toInstance(DUMMY_CONTENT.getBytes(StandardCharsets.UTF_8)); - bind(Lifecycle.class).toInstance(new Lifecycle(shutdownHooks, null)); + bind(Lifecycle.class).toInstance(new Lifecycle(shutdownHooks)); } }); http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/mesos/MesosSchedulerImplTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/MesosSchedulerImplTest.java b/src/test/java/org/apache/aurora/scheduler/mesos/MesosSchedulerImplTest.java index 7e1d13b..ecef202 100644 --- a/src/test/java/org/apache/aurora/scheduler/mesos/MesosSchedulerImplTest.java +++ b/src/test/java/org/apache/aurora/scheduler/mesos/MesosSchedulerImplTest.java @@ -13,7 +13,6 @@ */ package org.apache.aurora.scheduler.mesos; -import java.lang.Thread.UncaughtExceptionHandler; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; @@ -153,15 +152,13 @@ public class MesosSchedulerImplTest extends EasyMockTest { private void initializeScheduler(Logger logger) { storageUtil = new StorageTestUtil(this); shutdownCommand = createMock(Command.class); - final Lifecycle lifecycle = - new Lifecycle(shutdownCommand, createMock(UncaughtExceptionHandler.class)); statusHandler = createMock(TaskStatusHandler.class); offerManager = createMock(OfferManager.class); eventSink = createMock(EventSink.class); scheduler = new MesosSchedulerImpl( storageUtil.storage, - lifecycle, + new Lifecycle(shutdownCommand), statusHandler, offerManager, eventSink, http://git-wip-us.apache.org/repos/asf/aurora/blob/44e47264/src/test/java/org/apache/aurora/scheduler/sla/SlaModuleTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/sla/SlaModuleTest.java b/src/test/java/org/apache/aurora/scheduler/sla/SlaModuleTest.java index 3e9ef10..00a872c 100644 --- a/src/test/java/org/apache/aurora/scheduler/sla/SlaModuleTest.java +++ b/src/test/java/org/apache/aurora/scheduler/sla/SlaModuleTest.java @@ -26,7 +26,6 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; -import org.apache.aurora.common.application.modules.AppLauncherModule; import org.apache.aurora.common.quantity.Amount; import org.apache.aurora.common.quantity.Time; import org.apache.aurora.common.stats.Stat; @@ -73,7 +72,6 @@ public class SlaModuleTest extends EasyMockTest { ImmutableList.<Module>builder() .add(module) .add(new LifecycleModule()) - .add(new AppLauncherModule()) .add(new AbstractModule() { @Override protected void configure() {
