From 66d85da21e171ed9940670697d0d79d33c213c23 Mon Sep 17 00:00:00 2001 From: Leiqing Cai Date: Sun, 15 Nov 2020 21:35:51 -0800 Subject: [PATCH] Supply default values for Bootstrap options via System properties This allows specify default values for several options in Bootstrap for all Bootstrap object within a binary. --- .../facebook/airlift/bootstrap/Bootstrap.java | 25 ++++++-- .../airlift/bootstrap/TestBootstrap.java | 62 +++++++++++++++++++ .../discovery/client/TestDiscoveryModule.java | 1 - .../http/client/TestHttpClientBinder.java | 9 --- ...thorizationEnabledServletInHttpServer.java | 1 - .../server/testing/TestTestingHttpServer.java | 3 - .../TestAuthorizationFilterInHttpServer.java | 1 - .../TestOverrideMethodFilterInHttpServer.java | 1 - .../jmx/http/rpc/TestMBeanServerResource.java | 1 - .../airlift/jmx/TestMBeanResource.java | 1 - .../com/facebook/airlift/sample/Main.java | 2 +- .../facebook/airlift/sample/TestServer.java | 1 - .../com/facebook/airlift/skeleton/Main.java | 2 +- .../facebook/airlift/skeleton/TestServer.java | 1 - 14 files changed, 84 insertions(+), 27 deletions(-) diff --git a/bootstrap/src/main/java/com/facebook/airlift/bootstrap/Bootstrap.java b/bootstrap/src/main/java/com/facebook/airlift/bootstrap/Bootstrap.java index fc9add5534..9598f2c609 100644 --- a/bootstrap/src/main/java/com/facebook/airlift/bootstrap/Bootstrap.java +++ b/bootstrap/src/main/java/com/facebook/airlift/bootstrap/Bootstrap.java @@ -49,6 +49,7 @@ import static com.facebook.airlift.configuration.ConfigurationLoader.getSystemProperties; import static com.facebook.airlift.configuration.ConfigurationLoader.loadPropertiesFrom; +import static java.lang.Boolean.parseBoolean; /** * Entry point for an application built using the platform codebase. @@ -69,9 +70,9 @@ public class Bootstrap private Map requiredConfigurationProperties; private Map optionalConfigurationProperties; private boolean initializeLogging = true; - private boolean quiet; - private boolean strictConfig; - private boolean requireExplicitBindings = true; + private boolean quiet = getDefaultFromProperties("bootstrap.quiet", false); + private boolean strictConfig = getDefaultFromProperties("bootstrap.strict-config", true); + private boolean requireExplicitBindings = getDefaultFromProperties("bootstrap.require-explicit-bindings", true); private boolean initialized; @@ -138,9 +139,14 @@ public Bootstrap quiet() return this; } - public Bootstrap strictConfig() + /** + * Disable the requirement that required configuration property must be used + * in some Config classes. This could be useful for testing purpose when + * deploying an old Presto version with the latest set of config properties. + */ + public Bootstrap noStrictConfig() { - this.strictConfig = true; + this.strictConfig = false; return this; } @@ -291,4 +297,13 @@ private static ColumnPrinter makePrinterForConfiguration(ConfigurationFactory co } return columnPrinter; } + + private boolean getDefaultFromProperties(String propertyName, boolean defaultValue) + { + String propertyValue = System.getProperty(propertyName); + if (propertyValue != null) { + return parseBoolean(propertyValue); + } + return defaultValue; + } } diff --git a/bootstrap/src/test/java/com/facebook/airlift/bootstrap/TestBootstrap.java b/bootstrap/src/test/java/com/facebook/airlift/bootstrap/TestBootstrap.java index f99ec3ada1..3b3abd19ba 100644 --- a/bootstrap/src/test/java/com/facebook/airlift/bootstrap/TestBootstrap.java +++ b/bootstrap/src/test/java/com/facebook/airlift/bootstrap/TestBootstrap.java @@ -15,15 +15,22 @@ */ package com.facebook.airlift.bootstrap; +import com.facebook.airlift.configuration.Config; +import com.google.common.collect.ImmutableMap; +import com.google.inject.Binder; import com.google.inject.ConfigurationException; +import com.google.inject.CreationException; +import com.google.inject.Module; import com.google.inject.ProvisionException; import org.testng.annotations.Test; import javax.inject.Inject; +import static com.facebook.airlift.configuration.ConfigBinder.configBinder; import static com.facebook.airlift.testing.Assertions.assertContains; import static org.testng.Assert.fail; +@Test(singleThreaded = true) public class TestBootstrap { @Test @@ -58,6 +65,34 @@ public void testDoesNotAllowCircularDependencies() } } + @Test(expectedExceptions = CreationException.class, expectedExceptionsMessageRegExp = ".*Configuration property 'not-supported' was not used.*") + public void testStrictConfigDefault() + { + new Bootstrap(new ConfigModule()) + .setRequiredConfigurationProperties(ImmutableMap.of("not-supported", "1")) + .initialize(); + } + + @Test(expectedExceptions = CreationException.class, expectedExceptionsMessageRegExp = ".*Configuration property 'not-supported' was not used.*") + public void testStrictConfig() + { + System.setProperty("bootstrap.strict-config", "true"); + new Bootstrap(new ConfigModule()) + .setRequiredConfigurationProperties(ImmutableMap.of("not-supported", "1")) + .initialize(); + } + + @Test + public void testNoStrictConfig() + { + System.setProperty("bootstrap.strict-config", "false"); + new Bootstrap(new ConfigModule()) + .setRequiredConfigurationProperties(ImmutableMap.of("not-supported", "1")) + .initialize() + .getInstance(LifeCycleManager.class) + .stop(); + } + public static class Instance {} public static class InstanceA @@ -71,4 +106,31 @@ public static class InstanceB @Inject public InstanceB(InstanceA a) {} } + + public static class TestingConfig + { + private String value; + + public String getValue() + { + return value; + } + + @Config("value") + public TestingConfig setValue(String value) + { + this.value = value; + return this; + } + } + + private static class ConfigModule + implements Module + { + @Override + public void configure(Binder binder) + { + configBinder(binder).bindConfig(TestingConfig.class); + } + } } diff --git a/discovery/src/test/java/com/facebook/airlift/discovery/client/TestDiscoveryModule.java b/discovery/src/test/java/com/facebook/airlift/discovery/client/TestDiscoveryModule.java index 5af08dade4..a8fa73245a 100644 --- a/discovery/src/test/java/com/facebook/airlift/discovery/client/TestDiscoveryModule.java +++ b/discovery/src/test/java/com/facebook/airlift/discovery/client/TestDiscoveryModule.java @@ -32,7 +32,6 @@ public void testExecutorShutdown() new DiscoveryModule()); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); diff --git a/http-client/src/test/java/com/facebook/airlift/http/client/TestHttpClientBinder.java b/http-client/src/test/java/com/facebook/airlift/http/client/TestHttpClientBinder.java index fe9f39e899..bd786dbbc5 100644 --- a/http-client/src/test/java/com/facebook/airlift/http/client/TestHttpClientBinder.java +++ b/http-client/src/test/java/com/facebook/airlift/http/client/TestHttpClientBinder.java @@ -54,7 +54,6 @@ public void testConfigDefaults() .withConfigDefaults(config -> config.setRequestTimeout(new Duration(33, MINUTES))), new TraceTokenModule()) .quiet() - .strictConfig() .initialize(); JettyHttpClient httpClient = (JettyHttpClient) injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -82,7 +81,6 @@ public void testGlobalFilterBinding() }, new TraceTokenModule()) .quiet() - .strictConfig() .initialize(); JettyHttpClient fooClient = (JettyHttpClient) injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -115,7 +113,6 @@ public void testBindingMultipleFiltersAndClients() }, new TraceTokenModule()) .quiet() - .strictConfig() .initialize(); assertFilterCount(injector.getInstance(Key.get(HttpClient.class, FooClient.class)), 3); @@ -133,7 +130,6 @@ public void testBindClientWithFilter() .withTracing(), new TraceTokenModule()) .quiet() - .strictConfig() .initialize(); HttpClient httpClient = injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -147,7 +143,6 @@ public void testWithoutFilters() Injector injector = new Bootstrap( binder -> httpClientBinder(binder).bindHttpClient("foo", FooClient.class)) .quiet() - .strictConfig() .initialize(); assertNotNull(injector.getInstance(Key.get(HttpClient.class, FooClient.class))); @@ -162,7 +157,6 @@ public void testAliases() .withAlias(FooAlias1.class) .withAliases(ImmutableList.of(FooAlias2.class, FooAlias3.class))) .quiet() - .strictConfig() .initialize(); HttpClient client = injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -180,7 +174,6 @@ public void testBindClientWithAliases() .withAlias(FooAlias1.class) .withAlias(FooAlias2.class)) .quiet() - .strictConfig() .initialize(); HttpClient client = injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -198,7 +191,6 @@ public void testMultipleClients() httpClientBinder(binder).bindHttpClient("bar", BarClient.class); }) .quiet() - .strictConfig() .initialize(); HttpClient fooClient = injector.getInstance(Key.get(HttpClient.class, FooClient.class)); @@ -216,7 +208,6 @@ public void testClientShutdown() httpClientBinder(binder).bindHttpClient("bar", BarClient.class); }) .quiet() - .strictConfig() .initialize(); HttpClient fooClient = injector.getInstance(Key.get(HttpClient.class, FooClient.class)); diff --git a/http-server/src/test/java/com/facebook/airlift/http/server/TestAuthorizationEnabledServletInHttpServer.java b/http-server/src/test/java/com/facebook/airlift/http/server/TestAuthorizationEnabledServletInHttpServer.java index 8c1c5dcf37..bedefa51ad 100644 --- a/http-server/src/test/java/com/facebook/airlift/http/server/TestAuthorizationEnabledServletInHttpServer.java +++ b/http-server/src/test/java/com/facebook/airlift/http/server/TestAuthorizationEnabledServletInHttpServer.java @@ -328,7 +328,6 @@ public Map createTheServletParams() .build(); return new Bootstrap(modules) - .strictConfig() .doNotInitializeLogging() .setOptionalConfigurationProperties(serverProperties) .quiet() diff --git a/http-server/src/test/java/com/facebook/airlift/http/server/testing/TestTestingHttpServer.java b/http-server/src/test/java/com/facebook/airlift/http/server/testing/TestTestingHttpServer.java index dd7893ae64..bfc4aecda3 100644 --- a/http-server/src/test/java/com/facebook/airlift/http/server/testing/TestTestingHttpServer.java +++ b/http-server/src/test/java/com/facebook/airlift/http/server/testing/TestTestingHttpServer.java @@ -157,7 +157,6 @@ public void testGuiceInjectionWithoutFilters() }); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); @@ -192,7 +191,6 @@ public void testGuiceInjectionWithFilters() }); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); @@ -231,7 +229,6 @@ public void testGuiceInjectionWithResources() }); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); diff --git a/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestAuthorizationFilterInHttpServer.java b/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestAuthorizationFilterInHttpServer.java index 3e0f9b0a56..b5ad69c2b1 100644 --- a/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestAuthorizationFilterInHttpServer.java +++ b/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestAuthorizationFilterInHttpServer.java @@ -398,7 +398,6 @@ private static TestingHttpServer createServer(Map serverProperti .build(); return new Bootstrap(modules) - .strictConfig() .doNotInitializeLogging() .setOptionalConfigurationProperties(serverProperties) .quiet() diff --git a/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestOverrideMethodFilterInHttpServer.java b/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestOverrideMethodFilterInHttpServer.java index 07e26817a8..9a52a9a07a 100644 --- a/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestOverrideMethodFilterInHttpServer.java +++ b/jaxrs/src/test/java/com/facebook/airlift/jaxrs/TestOverrideMethodFilterInHttpServer.java @@ -296,7 +296,6 @@ private static TestingHttpServer createServer(final TestResource resource) .build(); return new Bootstrap(modules) - .strictConfig() .doNotInitializeLogging() .quiet() .initialize() diff --git a/jmx-http-rpc/src/test/java/com/facebook/airlift/jmx/http/rpc/TestMBeanServerResource.java b/jmx-http-rpc/src/test/java/com/facebook/airlift/jmx/http/rpc/TestMBeanServerResource.java index 6432c79db1..30e654c0bc 100644 --- a/jmx-http-rpc/src/test/java/com/facebook/airlift/jmx/http/rpc/TestMBeanServerResource.java +++ b/jmx-http-rpc/src/test/java/com/facebook/airlift/jmx/http/rpc/TestMBeanServerResource.java @@ -75,7 +75,6 @@ public void setup() }); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); diff --git a/jmx-http/src/test/java/com/facebook/airlift/jmx/TestMBeanResource.java b/jmx-http/src/test/java/com/facebook/airlift/jmx/TestMBeanResource.java index 8608ee05bd..267722d1f2 100644 --- a/jmx-http/src/test/java/com/facebook/airlift/jmx/TestMBeanResource.java +++ b/jmx-http/src/test/java/com/facebook/airlift/jmx/TestMBeanResource.java @@ -66,7 +66,6 @@ public void setup() Injector injector = app .quiet() - .strictConfig() .initialize(); lifeCycleManager = injector.getInstance(LifeCycleManager.class); diff --git a/sample-server/src/main/java/com/facebook/airlift/sample/Main.java b/sample-server/src/main/java/com/facebook/airlift/sample/Main.java index 723370e5fa..fd2c164fd6 100644 --- a/sample-server/src/main/java/com/facebook/airlift/sample/Main.java +++ b/sample-server/src/main/java/com/facebook/airlift/sample/Main.java @@ -57,7 +57,7 @@ public static void main(String[] args) new MainModule()); try { - Injector injector = app.strictConfig().initialize(); + Injector injector = app.initialize(); injector.getInstance(Announcer.class).start(); } catch (Throwable e) { diff --git a/sample-server/src/test/java/com/facebook/airlift/sample/TestServer.java b/sample-server/src/test/java/com/facebook/airlift/sample/TestServer.java index 69980a2473..eb2b3ec73a 100644 --- a/sample-server/src/test/java/com/facebook/airlift/sample/TestServer.java +++ b/sample-server/src/test/java/com/facebook/airlift/sample/TestServer.java @@ -89,7 +89,6 @@ public void setup() new MainModule()); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize(); diff --git a/skeleton-server/src/main/java/com/facebook/airlift/skeleton/Main.java b/skeleton-server/src/main/java/com/facebook/airlift/skeleton/Main.java index 471252eee6..552995e05c 100644 --- a/skeleton-server/src/main/java/com/facebook/airlift/skeleton/Main.java +++ b/skeleton-server/src/main/java/com/facebook/airlift/skeleton/Main.java @@ -57,7 +57,7 @@ public static void main(String[] args) new MainModule()); try { - Injector injector = app.strictConfig().initialize(); + Injector injector = app.initialize(); injector.getInstance(Announcer.class).start(); } catch (Throwable e) { diff --git a/skeleton-server/src/test/java/com/facebook/airlift/skeleton/TestServer.java b/skeleton-server/src/test/java/com/facebook/airlift/skeleton/TestServer.java index b3a861e17a..8cd434d166 100644 --- a/skeleton-server/src/test/java/com/facebook/airlift/skeleton/TestServer.java +++ b/skeleton-server/src/test/java/com/facebook/airlift/skeleton/TestServer.java @@ -46,7 +46,6 @@ public void setup() new MainModule()); Injector injector = app - .strictConfig() .doNotInitializeLogging() .initialize();