diff --git a/presto-common/src/main/java/com/facebook/presto/common/AuthClientConfigs.java b/presto-common/src/main/java/com/facebook/presto/common/AuthClientConfigs.java new file mode 100644 index 0000000000000..713356cda9083 --- /dev/null +++ b/presto-common/src/main/java/com/facebook/presto/common/AuthClientConfigs.java @@ -0,0 +1,110 @@ +/* + * 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 com.facebook.presto.common; + +import java.util.Optional; + +public class AuthClientConfigs +{ + private final String nodeId; + private final String keyStorePath; + private final String keyStorePassword; + private final String trustStorePath; + private final String trustStorePassword; + private final Optional excludeCipherSuites; + private final Optional includedCipherSuites; + private final boolean internalJwtEnabled; + private final Optional sharedSecret; + + public static AuthClientConfigs defaultAuthClientConfigs(String nodeId) + { + return new AuthClientConfigs( + nodeId, + null, + null, + null, + null, + Optional.empty(), + Optional.empty(), + false, + Optional.empty()); + } + + public AuthClientConfigs( + String nodeId, + String keyStorePath, + String keyStorePassword, + String trustStorePath, + String trustStorePassword, + Optional excludeCipherSuites, + Optional includedCipherSuites, + boolean internalJwtEnabled, + Optional sharedSecret) + { + this.nodeId = nodeId; + this.keyStorePath = keyStorePath; + this.keyStorePassword = keyStorePassword; + this.trustStorePath = trustStorePath; + this.trustStorePassword = trustStorePassword; + this.excludeCipherSuites = excludeCipherSuites; + this.includedCipherSuites = includedCipherSuites; + this.internalJwtEnabled = internalJwtEnabled; + this.sharedSecret = sharedSecret; + } + + public String getNodeId() + { + return nodeId; + } + + public String getKeyStorePath() + { + return keyStorePath; + } + + public String getKeyStorePassword() + { + return keyStorePassword; + } + + public String getTrustStorePath() + { + return trustStorePath; + } + + public String getTrustStorePassword() + { + return trustStorePassword; + } + + public Optional getExcludeCipherSuites() + { + return excludeCipherSuites; + } + + public Optional getIncludedCipherSuites() + { + return includedCipherSuites; + } + + public boolean isInternalJwtEnabled() + { + return internalJwtEnabled; + } + + public Optional getSharedSecret() + { + return sharedSecret; + } +} diff --git a/presto-function-namespace-managers/pom.xml b/presto-function-namespace-managers/pom.xml index 1329c0554f9fb..f466d80b0f7a5 100644 --- a/presto-function-namespace-managers/pom.xml +++ b/presto-function-namespace-managers/pom.xml @@ -194,6 +194,22 @@ netty-buffer + + com.facebook.presto + presto-internal-communication + ${project.version} + + + + com.facebook.airlift + jaxrs + + + + jakarta.ws.rs + jakarta.ws.rs-api + + com.facebook.presto @@ -225,24 +241,12 @@ test - - com.facebook.airlift - jaxrs - test - - com.facebook.airlift jaxrs-testing test - - jakarta.ws.rs - jakarta.ws.rs-api - test - - com.facebook.presto presto-function-namespace-managers-common @@ -251,4 +255,19 @@ + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + jakarta.ws.rs:jakarta.ws.rs-api + com.facebook.airlift:jaxrs + + + + + diff --git a/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedCommunicationModule.java b/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedCommunicationModule.java index 7265edcf6bc8f..1216c82b8e04a 100644 --- a/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedCommunicationModule.java +++ b/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedCommunicationModule.java @@ -13,18 +13,29 @@ */ package com.facebook.presto.functionNamespace.rest; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.functionNamespace.ForRestServer; import com.google.inject.Binder; import com.google.inject.Module; import static com.facebook.airlift.http.client.HttpClientBinder.httpClientBinder; +import static com.facebook.presto.server.CommonInternalCommunicationModule.bindInternalAuth; +import static java.util.Objects.requireNonNull; public class RestBasedCommunicationModule implements Module { + private final AuthClientConfigs authClientConfigs; + + public RestBasedCommunicationModule(AuthClientConfigs authClientConfigs) + { + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); + } + @Override public void configure(Binder binder) { + bindInternalAuth(binder, authClientConfigs); httpClientBinder(binder).bindHttpClient("restServer", ForRestServer.class); } } diff --git a/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedFunctionNamespaceManagerFactory.java b/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedFunctionNamespaceManagerFactory.java index 41d0bcabb4222..d549037295f4a 100644 --- a/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedFunctionNamespaceManagerFactory.java +++ b/presto-function-namespace-managers/src/main/java/com/facebook/presto/functionNamespace/rest/RestBasedFunctionNamespaceManagerFactory.java @@ -54,7 +54,7 @@ public FunctionNamespaceManager create(String catalogName, Mapjackson-annotations + + com.facebook.presto + presto-common + + org.testng diff --git a/presto-internal-communication/src/main/java/com/facebook/presto/server/CommonInternalCommunicationModule.java b/presto-internal-communication/src/main/java/com/facebook/presto/server/CommonInternalCommunicationModule.java index b0c3ca45e1b59..a3488a9501ded 100644 --- a/presto-internal-communication/src/main/java/com/facebook/presto/server/CommonInternalCommunicationModule.java +++ b/presto-internal-communication/src/main/java/com/facebook/presto/server/CommonInternalCommunicationModule.java @@ -16,6 +16,7 @@ import com.facebook.airlift.configuration.AbstractConfigurationAwareModule; import com.facebook.airlift.http.client.HttpClientConfig; import com.facebook.airlift.http.client.spnego.KerberosConfig; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.server.security.InternalAuthenticationFilter; import com.google.inject.Binder; import com.google.inject.Module; @@ -59,6 +60,38 @@ protected void setup(Binder binder) jaxrsBinder(binder).bind(InternalAuthenticationFilter.class); } + public static void bindHttpClientDefaults(Binder binder, AuthClientConfigs authClientConfigs) + { + configBinder(binder).bindConfigGlobalDefaults(HttpClientConfig.class, config -> { + config.setKeyStorePath(authClientConfigs.getKeyStorePath()); + config.setKeyStorePassword(authClientConfigs.getKeyStorePassword()); + config.setTrustStorePath(authClientConfigs.getTrustStorePath()); + config.setTrustStorePassword(authClientConfigs.getTrustStorePassword()); + + authClientConfigs.getIncludedCipherSuites() + .ifPresent(config::setHttpsIncludedCipherSuites); + + authClientConfigs.getExcludeCipherSuites() + .ifPresent(config::setHttpsExcludedCipherSuites); + }); + } + + public static void bindInternalAuth(Binder binder, AuthClientConfigs authClientConfigs) + { + bindHttpClientDefaults(binder, authClientConfigs); + + InternalAuthenticationManager manager = + new InternalAuthenticationManager( + authClientConfigs.getSharedSecret(), + authClientConfigs.getNodeId(), + authClientConfigs.isInternalJwtEnabled()); + + binder.bind(InternalAuthenticationManager.class).toInstance(manager); + binder.bind(AuthClientConfigs.class).toInstance(authClientConfigs); + httpClientBinder(binder).bindGlobalFilter(InternalAuthenticationManager.class); + jaxrsBinder(binder).bind(InternalAuthenticationFilter.class); + } + private Module kerberosInternalCommunicationModule() { return binder -> { diff --git a/presto-internal-communication/src/main/java/com/facebook/presto/server/InternalAuthenticationManager.java b/presto-internal-communication/src/main/java/com/facebook/presto/server/InternalAuthenticationManager.java index e98a24cf08a39..51d176a5e66bf 100644 --- a/presto-internal-communication/src/main/java/com/facebook/presto/server/InternalAuthenticationManager.java +++ b/presto-internal-communication/src/main/java/com/facebook/presto/server/InternalAuthenticationManager.java @@ -18,6 +18,7 @@ import com.facebook.airlift.log.Logger; import com.facebook.airlift.node.NodeInfo; import com.facebook.presto.security.BasicPrincipal; +import com.google.common.annotations.VisibleForTesting; import com.google.common.hash.Hashing; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; @@ -43,6 +44,7 @@ public class InternalAuthenticationManager private final boolean internalJwtEnabled; private final byte[] hmac; private final String nodeId; + private final Optional sharedSecret; @Inject public InternalAuthenticationManager(InternalCommunicationConfig internalCommunicationConfig, NodeInfo nodeInfo) @@ -52,7 +54,7 @@ public InternalAuthenticationManager(InternalCommunicationConfig internalCommuni public InternalAuthenticationManager(Optional sharedSecret, String nodeId, boolean internalJwtEnabled) { - requireNonNull(sharedSecret, "sharedSecret is null"); + this.sharedSecret = requireNonNull(sharedSecret, "sharedSecret is null"); requireNonNull(nodeId, "nodeId is null"); this.internalJwtEnabled = internalJwtEnabled; if (internalJwtEnabled) { @@ -130,4 +132,10 @@ public Request filterRequest(Request request) .addHeader(PRESTO_INTERNAL_BEARER, generateJwt()) .build(); } + + @VisibleForTesting + public Optional getSharedSecret() + { + return sharedSecret; + } } diff --git a/presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java b/presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java index 23d724dbcc54d..7164c2f2b48cc 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java +++ b/presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java @@ -15,6 +15,7 @@ import com.facebook.airlift.log.Logger; import com.facebook.presto.Session; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.Page; import com.facebook.presto.common.QualifiedObjectName; @@ -359,12 +360,13 @@ public void loadFunctionNamespaceManager( String functionNamespaceManagerName, String catalogName, Map properties, - NodeManager nodeManager) + NodeManager nodeManager, + AuthClientConfigs authClientConfigs) { requireNonNull(functionNamespaceManagerName, "functionNamespaceManagerName is null"); FunctionNamespaceManagerFactory factory = functionNamespaceManagerFactories.get(functionNamespaceManagerName); checkState(factory != null, "No factory for function namespace manager %s", functionNamespaceManagerName); - FunctionNamespaceManager functionNamespaceManager = factory.create(catalogName, properties, new FunctionNamespaceManagerContext(this, nodeManager, this)); + FunctionNamespaceManager functionNamespaceManager = factory.create(catalogName, properties, new FunctionNamespaceManagerContext(this, nodeManager, this, authClientConfigs)); functionNamespaceManager.setBlockEncodingSerde(blockEncodingSerde); transactionManager.registerFunctionNamespaceManager(catalogName, functionNamespaceManager); diff --git a/presto-main-base/src/main/java/com/facebook/presto/metadata/SessionPropertyManager.java b/presto-main-base/src/main/java/com/facebook/presto/metadata/SessionPropertyManager.java index d013edafb92ac..1ac36f0efc076 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/metadata/SessionPropertyManager.java +++ b/presto-main-base/src/main/java/com/facebook/presto/metadata/SessionPropertyManager.java @@ -18,6 +18,7 @@ import com.facebook.airlift.log.Logger; import com.facebook.presto.Session; import com.facebook.presto.SystemSessionProperties; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.common.block.BlockBuilder; import com.facebook.presto.common.type.ArrayType; import com.facebook.presto.common.type.BigintType; @@ -163,7 +164,7 @@ public static SessionPropertyManager createTestingSessionPropertyManager( new SessionPropertyProviderConfig()); } - public void loadSessionPropertyProviders() + public void loadSessionPropertyProviders(AuthClientConfigs authClientConfigs) throws Exception { if (!sessionPropertyProvidersLoading.compareAndSet(false, true)) { @@ -180,17 +181,22 @@ public void loadSessionPropertyProviders() SESSION_PROPERTY_PROVIDER_NAME); properties = new HashMap<>(properties); properties.remove(SESSION_PROPERTY_PROVIDER_NAME); - loadSessionPropertyProvider(sessionPropertyProviderName, properties, functionAndTypeManager, nodeManager); + loadSessionPropertyProvider(sessionPropertyProviderName, properties, functionAndTypeManager, nodeManager, authClientConfigs); } } } - public void loadSessionPropertyProvider(String sessionPropertyProviderName, Map properties, Optional typeManager, Optional nodeManager) + public void loadSessionPropertyProvider( + String sessionPropertyProviderName, + Map properties, + Optional typeManager, + Optional nodeManager, + AuthClientConfigs authClientConfigs) { log.info("-- Loading %s session property provider --", sessionPropertyProviderName); WorkerSessionPropertyProviderFactory factory = workerSessionPropertyProviderFactories.get(sessionPropertyProviderName); checkState(factory != null, "No factory for session property provider : " + sessionPropertyProviderName); - WorkerSessionPropertyProvider sessionPropertyProvider = factory.create(new SessionPropertyContext(typeManager, nodeManager), properties); + WorkerSessionPropertyProvider sessionPropertyProvider = factory.create(new SessionPropertyContext(typeManager, nodeManager, authClientConfigs), properties); if (workerSessionPropertyProviders.putIfAbsent(sessionPropertyProviderName, sessionPropertyProvider) != null) { throw new IllegalArgumentException("System session property provider is already registered for property provider : " + sessionPropertyProviderName); } diff --git a/presto-main-base/src/main/java/com/facebook/presto/metadata/StaticFunctionNamespaceStore.java b/presto-main-base/src/main/java/com/facebook/presto/metadata/StaticFunctionNamespaceStore.java index a1b7ae89f0033..1f0dd7a543fac 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/metadata/StaticFunctionNamespaceStore.java +++ b/presto-main-base/src/main/java/com/facebook/presto/metadata/StaticFunctionNamespaceStore.java @@ -14,6 +14,7 @@ package com.facebook.presto.metadata; import com.facebook.airlift.log.Logger; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.spi.NodeManager; import com.google.common.collect.ImmutableList; import jakarta.inject.Inject; @@ -46,7 +47,7 @@ public StaticFunctionNamespaceStore(FunctionAndTypeManager functionAndTypeManage this.configDir = config.getFunctionNamespaceConfigurationDir(); } - public void loadFunctionNamespaceManagers() + public void loadFunctionNamespaceManagers(AuthClientConfigs authClientConfigs) throws Exception { if (!functionNamespaceLoading.compareAndSet(false, true)) { @@ -61,24 +62,24 @@ public void loadFunctionNamespaceManagers() "Function namespace configuration %s does not contain %s", file.getAbsoluteFile(), FUNCTION_NAMESPACE_MANAGER_NAME); - loadFunctionNamespaceManager(catalogName, properties); + loadFunctionNamespaceManager(catalogName, properties, authClientConfigs); } } } - public void loadFunctionNamespaceManagers(Map> catalogProperties) + public void loadFunctionNamespaceManagers(Map> catalogProperties, AuthClientConfigs authClientConfigs) { catalogProperties.entrySet().stream() - .forEach(entry -> loadFunctionNamespaceManager(entry.getKey(), entry.getValue())); + .forEach(entry -> loadFunctionNamespaceManager(entry.getKey(), entry.getValue(), authClientConfigs)); } - private void loadFunctionNamespaceManager(String catalogName, Map properties) + private void loadFunctionNamespaceManager(String catalogName, Map properties, AuthClientConfigs authClientConfigs) { log.info("-- Loading function namespace manager for catalog %s --", catalogName); properties = new HashMap<>(properties); String functionNamespaceManagerName = properties.remove(FUNCTION_NAMESPACE_MANAGER_NAME); checkState(!isNullOrEmpty(functionNamespaceManagerName), "%s property must be present", FUNCTION_NAMESPACE_MANAGER_NAME); - functionAndTypeManager.loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, nodeManager); + functionAndTypeManager.loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, nodeManager, authClientConfigs); log.info("-- Added function namespace manager [%s] --", catalogName); } diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java b/presto-main-base/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java index 21216d4f04aee..1b976756750c0 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java @@ -16,6 +16,7 @@ import com.facebook.airlift.log.Logger; import com.facebook.presto.FullConnectorSession; import com.facebook.presto.Session; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.metadata.FunctionAndTypeManager; import com.facebook.presto.nodeManager.PluginNodeManager; import com.facebook.presto.spi.ConnectorSession; @@ -79,12 +80,12 @@ public ExpressionOptimizerManager(PluginNodeManager nodeManager, FunctionAndType expressionOptimizers.put(DEFAULT_EXPRESSION_OPTIMIZER_NAME, new RowExpressionOptimizer(functionAndTypeManager)); } - public void loadExpressionOptimizerFactories() + public void loadExpressionOptimizerFactories(AuthClientConfigs authClientConfigs) { try { for (File file : listFiles(configurationDirectory)) { if (file.isFile() && file.getName().endsWith(".properties")) { - loadExpressionOptimizerFactory(file); + loadExpressionOptimizerFactory(file, authClientConfigs); } } } @@ -93,7 +94,7 @@ public void loadExpressionOptimizerFactories() } } - public void loadExpressionOptimizerFactory(File configurationFile) + public void loadExpressionOptimizerFactory(File configurationFile, AuthClientConfigs authClientConfigs) throws IOException { String optimizerName = getNameWithoutExtension(configurationFile.getName()); @@ -104,10 +105,10 @@ public void loadExpressionOptimizerFactory(File configurationFile) String factoryName = properties.remove(EXPRESSION_MANAGER_FACTORY_NAME); checkArgument(!isNullOrEmpty(factoryName), "%s does not contain %s", configurationFile, EXPRESSION_MANAGER_FACTORY_NAME); - loadExpressionOptimizerFactory(factoryName, optimizerName, properties); + loadExpressionOptimizerFactory(factoryName, optimizerName, properties, authClientConfigs); } - public void loadExpressionOptimizerFactory(String factoryName, String optimizerName, Map properties) + public void loadExpressionOptimizerFactory(String factoryName, String optimizerName, Map properties, AuthClientConfigs authClientConfigs) { requireNonNull(factoryName, "factoryName is null"); checkArgument(expressionOptimizerFactories.containsKey(factoryName), @@ -116,7 +117,7 @@ public void loadExpressionOptimizerFactory(String factoryName, String optimizerN log.info("-- Loading expression optimizer [%s] --", optimizerName); ExpressionOptimizer optimizer = expressionOptimizerFactories.get(factoryName).createOptimizer( properties, - new ExpressionOptimizerContext(nodeManager, rowExpressionSerde, functionAndTypeManager, functionResolution)); + new ExpressionOptimizerContext(nodeManager, rowExpressionSerde, functionAndTypeManager, functionResolution, authClientConfigs)); expressionOptimizers.put(optimizerName, optimizer); log.info("-- Added expression optimizer [%s] --", optimizerName); } diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/sanity/PlanCheckerProviderManager.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/sanity/PlanCheckerProviderManager.java index fe08425d3ffd6..ed93e7a04841e 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/sanity/PlanCheckerProviderManager.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/sanity/PlanCheckerProviderManager.java @@ -14,6 +14,7 @@ package com.facebook.presto.sql.planner.sanity; import com.facebook.airlift.log.Logger; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.plan.PlanCheckerProvider; import com.facebook.presto.spi.plan.PlanCheckerProviderContext; @@ -63,7 +64,7 @@ public void addPlanCheckerProviderFactory(PlanCheckerProviderFactory planChecker } } - public void loadPlanCheckerProviders(NodeManager nodeManager) + public void loadPlanCheckerProviders(NodeManager nodeManager, AuthClientConfigs authClientConfigs) throws IOException { for (File file : listFiles(configDirectory)) { @@ -77,18 +78,18 @@ public void loadPlanCheckerProviders(NodeManager nodeManager) "Plan checker configuration %s does not contain %s", file.getAbsoluteFile(), PLAN_CHECKER_PROVIDER_NAME); - loadPlanCheckerProvider(planCheckerProviderName, properties, nodeManager); + loadPlanCheckerProvider(planCheckerProviderName, properties, nodeManager, authClientConfigs); } } } - public void loadPlanCheckerProvider(String planCheckerProviderName, Map properties, NodeManager nodeManager) + public void loadPlanCheckerProvider(String planCheckerProviderName, Map properties, NodeManager nodeManager, AuthClientConfigs authClientConfigs) { checkArgument(!isNullOrEmpty(planCheckerProviderName), "Plan checker provider name is null or empty"); requireNonNull(properties, "properties is null"); requireNonNull(nodeManager, "nodeManager is null"); - PlanCheckerProviderContext planCheckerProviderContext = new PlanCheckerProviderContext(simplePlanFragmentSerde, nodeManager); + PlanCheckerProviderContext planCheckerProviderContext = new PlanCheckerProviderContext(simplePlanFragmentSerde, nodeManager, authClientConfigs); log.info("-- Loading plan checker provider [%s] --", planCheckerProviderName); PlanCheckerProviderFactory providerFactory = providerFactories.get(planCheckerProviderName); diff --git a/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java b/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java index 3a745229b7521..8825ff6d07dd3 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java +++ b/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java @@ -278,6 +278,7 @@ import static com.facebook.presto.SystemSessionProperties.isHeapDumpOnExceededMemoryLimitEnabled; import static com.facebook.presto.SystemSessionProperties.isVerboseExceededMemoryLimitErrorsEnabled; import static com.facebook.presto.SystemSessionProperties.isVerboseOptimizerInfoEnabled; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.common.RuntimeMetricName.LOGICAL_PLANNER_TIME_NANOS; import static com.facebook.presto.common.RuntimeMetricName.OPTIMIZER_TIME_NANOS; import static com.facebook.presto.cost.StatsCalculatorModule.createNewStatsCalculator; @@ -792,7 +793,7 @@ public void createCatalog(String catalogName, String connectorName, Map properties) { - metadata.getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, pluginNodeManager); + metadata.getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, pluginNodeManager, defaultAuthClientConfigs(pluginNodeManager.getCurrentNode().getNodeIdentifier())); } public LocalQueryRunner printPlan() diff --git a/presto-main-base/src/main/java/com/facebook/presto/testing/QueryRunner.java b/presto-main-base/src/main/java/com/facebook/presto/testing/QueryRunner.java index f6c1a0b9b1405..d9bc36a32298a 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/testing/QueryRunner.java +++ b/presto-main-base/src/main/java/com/facebook/presto/testing/QueryRunner.java @@ -114,6 +114,11 @@ default void loadSessionPropertyProvider(String sessionPropertyProviderName, Map throw new UnsupportedOperationException(); } + default void loadExpressionOptimizer(String expressionOptimizerFactoryName, String expressionOptimizerName, Map properties) + { + throw new UnsupportedOperationException(); + } + Lock getExclusiveLock(); default void loadTypeManager(String typeManagerName) diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java b/presto-main-base/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java index 221685a9cf85d..e77a8728bfcfa 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java @@ -18,6 +18,7 @@ import com.facebook.presto.functionNamespace.json.JsonFileBasedFunctionNamespaceManagerFactory; import com.facebook.presto.metadata.FunctionAndTypeManager; import com.facebook.presto.operator.scalar.FunctionAssertions; +import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.WarningCollector; import com.facebook.presto.spi.relation.ExpressionOptimizer; import com.facebook.presto.spi.relation.RowExpression; @@ -49,6 +50,7 @@ import java.util.stream.IntStream; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.operator.scalar.ApplyFunction.APPLY_FUNCTION; import static com.facebook.presto.spi.relation.ExpressionOptimizer.Level.OPTIMIZED; import static com.facebook.presto.spi.relation.ExpressionOptimizer.Level.SERIALIZABLE; @@ -74,12 +76,14 @@ public void setup() // Run this method exactly once. private void setupJsonFunctionNamespaceManager(FunctionAndTypeManager functionAndTypeManager) { + NodeManager nodeManager = new TestingNodeManager(); functionAndTypeManager.addFunctionNamespaceFactory(new JsonFileBasedFunctionNamespaceManagerFactory()); functionAndTypeManager.loadFunctionNamespaceManager( JsonFileBasedFunctionNamespaceManagerFactory.NAME, "json", ImmutableMap.of("supported-function-languages", "CPP", "function-implementation-type", "CPP"), - new TestingNodeManager()); + nodeManager, + defaultAuthClientConfigs(nodeManager.getCurrentNode().getNodeIdentifier())); } @Test diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/expressions/TestExpressionOptimizerManager.java b/presto-main-base/src/test/java/com/facebook/presto/sql/expressions/TestExpressionOptimizerManager.java index 7340e45b42c1d..febe400db8087 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/expressions/TestExpressionOptimizerManager.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/expressions/TestExpressionOptimizerManager.java @@ -35,6 +35,7 @@ import java.util.Properties; import static com.facebook.airlift.json.JsonCodec.jsonCodec; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.spi.relation.ExpressionOptimizer.Level.OPTIMIZED; import static com.facebook.presto.sql.relational.Expressions.constant; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; @@ -53,6 +54,7 @@ public class TestExpressionOptimizerManager private static final TestingRowExpressionTranslator TRANSLATOR = new TestingRowExpressionTranslator(METADATA); private File directory; private ExpressionOptimizerManager manager; + private PluginNodeManager pluginNodeManager; @BeforeMethod public void setUp() @@ -62,7 +64,7 @@ public void setUp() directory.deleteOnExit(); InMemoryNodeManager nodeManager = new InMemoryNodeManager(); - PluginNodeManager pluginNodeManager = new PluginNodeManager(nodeManager); + pluginNodeManager = new PluginNodeManager(nodeManager); manager = new ExpressionOptimizerManager( pluginNodeManager, METADATA.getFunctionAndTypeManager(), @@ -86,7 +88,7 @@ public void testBasicIntegration() manager.addExpressionOptimizerFactory(getExpressionOptimizerFactory("foo")); manager.addExpressionOptimizerFactory(getExpressionOptimizerFactory("bar")); - manager.loadExpressionOptimizerFactories(); + manager.loadExpressionOptimizerFactories(defaultAuthClientConfigs(pluginNodeManager.getCurrentNode().getNodeIdentifier())); assertOptimizedExpression("1+1", "2", ImmutableMap.of()); assertOptimizedExpression("1+1", "2", ImmutableMap.of("expression_optimizer_name", "default")); @@ -103,7 +105,7 @@ public void testNoNewOptimizerNameCalledDefault() createPropertiesFile("default.properties", ImmutableMap.of("expression-manager-factory.name", "default")); manager.addExpressionOptimizerFactory(getExpressionOptimizerFactory("default")); - assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories()); + assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories(defaultAuthClientConfigs(pluginNodeManager.getCurrentNode().getNodeIdentifier()))); } @Test @@ -113,7 +115,7 @@ public void testNoFactoryName() createPropertiesFile("foo.properties", ImmutableMap.of()); manager.addExpressionOptimizerFactory(getExpressionOptimizerFactory("foo")); - assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories()); + assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories(defaultAuthClientConfigs(pluginNodeManager.getCurrentNode().getNodeIdentifier()))); } @Test @@ -121,7 +123,7 @@ public void testNoFactoryRegistered() throws Exception { createPropertiesFile("foo.properties", ImmutableMap.of("expression-manager-factory.name", "foo")); - assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories()); + assertThrows(IllegalArgumentException.class, () -> manager.loadExpressionOptimizerFactories(defaultAuthClientConfigs(pluginNodeManager.getCurrentNode().getNodeIdentifier()))); } private void assertOptimizedExpression(String originalExpression, String optimizedExpression, Map systemProperties) @@ -150,10 +152,16 @@ private void createPropertiesFile(String fileName, Map propertie public ExpressionOptimizerFactory getExpressionOptimizerFactory(String name) { - return new ExpressionOptimizerFactory() { + return new ExpressionOptimizerFactory() + { @Override public ExpressionOptimizer createOptimizer(Map config, ExpressionOptimizerContext context) { + // verify if AuthClientConfigs properly propagated into ExpressionOptimizerContext + assertEquals( + context.getAuthClientConfigs().getNodeId(), + pluginNodeManager.getCurrentNode().getNodeIdentifier(), + "AuthClientConfigs.nodeId should match current plugin node identifier"); return (expression, level, session, variableResolver) -> constant( Slices.utf8Slice(name), METADATA.getType(TypeSignature.parseTypeSignature(format("varchar(%s)", name.length())))); diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestAddExchangesPlansWithFunctions.java b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestAddExchangesPlansWithFunctions.java index d00291a229e98..3d8fcee450a45 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestAddExchangesPlansWithFunctions.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestAddExchangesPlansWithFunctions.java @@ -38,6 +38,7 @@ import com.facebook.presto.sql.planner.assertions.BasePlanTest; import com.facebook.presto.sql.planner.assertions.PlanMatchPattern; import com.facebook.presto.testing.LocalQueryRunner; +import com.facebook.presto.testing.TestingNodeManager; import com.facebook.presto.tpch.TpchConnectorFactory; import com.facebook.presto.type.BigintOperators; import com.google.common.collect.ImmutableList; @@ -51,6 +52,7 @@ import static com.facebook.presto.SystemSessionProperties.REMOTE_FUNCTIONS_ENABLED; import static com.facebook.presto.SystemSessionProperties.REMOTE_FUNCTION_NAMES_FOR_FIXED_PARALLELISM; import static com.facebook.presto.SystemSessionProperties.SKIP_PUSHDOWN_THROUGH_EXCHANGE_FOR_REMOTE_PROJECTION; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.operator.scalar.annotations.ScalarFromAnnotationsParser.parseFunctionDefinitions; import static com.facebook.presto.spi.function.FunctionVersion.notVersioned; @@ -214,7 +216,11 @@ private static LocalQueryRunner createTestQueryRunner() .map(TestAddExchangesPlansWithFunctions::convertToSqlInvokedFunction) .forEach(function -> queryRunner.getMetadata().getFunctionAndTypeManager().createFunction(function, true)); queryRunner.getExpressionManager().addExpressionOptimizerFactory(new NoOpExpressionOptimizerFactory()); - queryRunner.getExpressionManager().loadExpressionOptimizerFactory(NO_OP_OPTIMIZER, NO_OP_OPTIMIZER, ImmutableMap.of()); + queryRunner.getExpressionManager().loadExpressionOptimizerFactory( + NO_OP_OPTIMIZER, + NO_OP_OPTIMIZER, + ImmutableMap.of(), + defaultAuthClientConfigs(new TestingNodeManager().getCurrentNode().getNodeIdentifier())); return queryRunner; } diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/sanity/TestPlanCheckerProviderManager.java b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/sanity/TestPlanCheckerProviderManager.java index cd0dfdc15d161..bf69f02b7c40f 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/sanity/TestPlanCheckerProviderManager.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/sanity/TestPlanCheckerProviderManager.java @@ -15,6 +15,7 @@ package com.facebook.presto.sql.planner.sanity; import com.facebook.airlift.json.JsonCodec; +import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.plan.PlanCheckerProvider; import com.facebook.presto.spi.plan.PlanCheckerProviderContext; import com.facebook.presto.spi.plan.PlanCheckerProviderFactory; @@ -28,11 +29,14 @@ import java.io.IOException; import java.util.Map; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.sql.planner.sanity.TestPlanCheckerProviderManager.TestingPlanCheckerProvider.TESTING_PLAN_CHECKER_PROVIDER; import static com.facebook.presto.testing.assertions.Assert.assertEquals; public class TestPlanCheckerProviderManager { + private final NodeManager nodeManager = new TestingNodeManager(); + @Test public void testLoadPlanCheckerProviders() throws IOException @@ -41,7 +45,7 @@ public void testLoadPlanCheckerProviders() .setPlanCheckerConfigurationDir(new File("src/test/resources/plan-checkers")); PlanCheckerProviderManager planCheckerProviderManager = new PlanCheckerProviderManager(new JsonCodecSimplePlanFragmentSerde(JsonCodec.jsonCodec(SimplePlanFragment.class)), planCheckerProviderManagerConfig); planCheckerProviderManager.addPlanCheckerProviderFactory(new TestingPlanCheckerProviderFactory()); - planCheckerProviderManager.loadPlanCheckerProviders(new TestingNodeManager()); + planCheckerProviderManager.loadPlanCheckerProviders(nodeManager, defaultAuthClientConfigs(nodeManager.getCurrentNode().getNodeIdentifier())); assertEquals(planCheckerProviderManager.getPlanCheckerProviders(), ImmutableList.of(TESTING_PLAN_CHECKER_PROVIDER)); } @@ -52,7 +56,7 @@ public void testLoadUnregisteredPlanCheckerProvider() PlanCheckerProviderManagerConfig planCheckerProviderManagerConfig = new PlanCheckerProviderManagerConfig() .setPlanCheckerConfigurationDir(new File("src/test/resources/plan-checkers")); PlanCheckerProviderManager planCheckerProviderManager = new PlanCheckerProviderManager(new JsonCodecSimplePlanFragmentSerde(JsonCodec.jsonCodec(SimplePlanFragment.class)), planCheckerProviderManagerConfig); - planCheckerProviderManager.loadPlanCheckerProviders(new TestingNodeManager()); + planCheckerProviderManager.loadPlanCheckerProviders(nodeManager, defaultAuthClientConfigs(nodeManager.getCurrentNode().getNodeIdentifier())); } public static class TestingPlanCheckerProviderFactory diff --git a/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java b/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java index bf64294640107..5bd41be8a06db 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java +++ b/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java @@ -34,6 +34,7 @@ import com.facebook.presto.ClientRequestFilterManager; import com.facebook.presto.ClientRequestFilterModule; import com.facebook.presto.builtin.tools.WorkerFunctionRegistryTool; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.dispatcher.QueryPrerequisitesManager; import com.facebook.presto.dispatcher.QueryPrerequisitesManagerModule; import com.facebook.presto.eventlistener.EventListenerManager; @@ -169,6 +170,12 @@ public void run() injector.getInstance(PluginManager.class).loadPlugins(); + // get all required auth configs to pass down to http clients + AuthClientConfigs authClientConfigs = + createAuthClientConfigs( + injector.getInstance(InternalCommunicationConfig.class), + injector.getInstance(NodeInfo.class)); + ServerConfig serverConfig = injector.getInstance(ServerConfig.class); if (!serverConfig.isResourceManager()) { @@ -187,7 +194,7 @@ public void run() injector.getInstance(Announcer.class), injector.getInstance(DriftServer.class)); - injector.getInstance(StaticFunctionNamespaceStore.class).loadFunctionNamespaceManagers(); + injector.getInstance(StaticFunctionNamespaceStore.class).loadFunctionNamespaceManagers(authClientConfigs); injector.getInstance(StaticTypeManagerStore.class).loadTypeManagers(); injector.getInstance(SessionPropertyDefaults.class).loadConfigurationManager(); injector.getInstance(ResourceGroupManager.class).loadConfigurationManager(); @@ -209,15 +216,15 @@ public void run() injector.getInstance(TracerProviderManager.class).loadTracerProvider(); injector.getInstance(NodeStatusNotificationManager.class).loadNodeStatusNotificationProvider(); injector.getInstance(GracefulShutdownHandler.class).loadNodeStatusNotification(); - injector.getInstance(SessionPropertyManager.class).loadSessionPropertyProviders(); + injector.getInstance(SessionPropertyManager.class).loadSessionPropertyProviders(authClientConfigs); PlanCheckerProviderManager planCheckerProviderManager = injector.getInstance(PlanCheckerProviderManager.class); InternalNodeManager nodeManager = injector.getInstance(DiscoveryNodeManager.class); NodeInfo nodeInfo = injector.getInstance(NodeInfo.class); PluginNodeManager pluginNodeManager = new PluginNodeManager(nodeManager, nodeInfo.getEnvironment()); - planCheckerProviderManager.loadPlanCheckerProviders(pluginNodeManager); + planCheckerProviderManager.loadPlanCheckerProviders(pluginNodeManager, authClientConfigs); injector.getInstance(ClientRequestFilterManager.class).loadClientRequestFilters(); - injector.getInstance(ExpressionOptimizerManager.class).loadExpressionOptimizerFactories(); + injector.getInstance(ExpressionOptimizerManager.class).loadExpressionOptimizerFactories(authClientConfigs); injector.getInstance(FunctionAndTypeManager.class) .getBuiltInPluginFunctionNamespaceManager().triggerConflictCheckWithBuiltInFunctions(); @@ -239,6 +246,20 @@ public void run() } } + public static AuthClientConfigs createAuthClientConfigs(InternalCommunicationConfig config, NodeInfo nodeInfo) + { + return new AuthClientConfigs( + nodeInfo.getNodeId(), + config.getKeyStorePath(), + config.getKeyStorePassword(), + config.getTrustStorePath(), + config.getTrustStorePassword(), + config.getExcludeCipherSuites(), + config.getIncludedCipherSuites(), + config.isInternalJwtEnabled(), + config.getSharedSecret()); + } + protected Iterable getAdditionalModules() { return ImmutableList.of(); diff --git a/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java b/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java index 21a8f4a6d5c2b..11fe90e44d00b 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java +++ b/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java @@ -28,6 +28,7 @@ import com.facebook.airlift.jmx.testing.TestingJmxModule; import com.facebook.airlift.json.JsonModule; import com.facebook.airlift.json.smile.SmileModule; +import com.facebook.airlift.node.NodeInfo; import com.facebook.airlift.node.testing.TestingNodeModule; import com.facebook.airlift.tracetoken.TraceTokenModule; import com.facebook.drift.server.DriftServer; @@ -35,6 +36,7 @@ import com.facebook.presto.ClientRequestFilterManager; import com.facebook.presto.ClientRequestFilterModule; import com.facebook.presto.builtin.tools.WorkerFunctionRegistryTool; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.connector.ConnectorManager; import com.facebook.presto.cost.StatsCalculator; import com.facebook.presto.dispatcher.DispatchManager; @@ -59,6 +61,7 @@ import com.facebook.presto.resourcemanager.ResourceManagerClusterStateProvider; import com.facebook.presto.security.AccessControlManager; import com.facebook.presto.server.GracefulShutdownHandler; +import com.facebook.presto.server.InternalCommunicationConfig; import com.facebook.presto.server.PluginManager; import com.facebook.presto.server.ServerInfoResource; import com.facebook.presto.server.ServerMainModule; @@ -127,6 +130,7 @@ import static com.facebook.airlift.configuration.ConditionalModule.installModuleIf; import static com.facebook.airlift.discovery.client.ServiceAnnouncement.serviceAnnouncement; import static com.facebook.airlift.json.JsonBinder.jsonBinder; +import static com.facebook.presto.server.PrestoServer.createAuthClientConfigs; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Strings.nullToEmpty; import static com.google.common.base.Throwables.throwIfUnchecked; @@ -186,6 +190,7 @@ public class TestingPrestoServer private final PlanCheckerProviderManager planCheckerProviderManager; private final NodeManager pluginNodeManager; private final ClientRequestFilterManager clientRequestFilterManager; + private final AuthClientConfigs authClientConfigs; public static class TestShutdownAction implements ShutdownAction @@ -414,6 +419,10 @@ public TestingPrestoServer( splitManager = injector.getInstance(SplitManager.class); pageSourceManager = injector.getInstance(PageSourceManager.class); expressionManager = injector.getInstance(ExpressionOptimizerManager.class); + authClientConfigs = + createAuthClientConfigs( + injector.getInstance(InternalCommunicationConfig.class), + injector.getInstance(NodeInfo.class)); if (coordinator) { dispatchManager = injector.getInstance(DispatchManager.class); queryManager = injector.getInstance(QueryManager.class); @@ -431,7 +440,7 @@ public TestingPrestoServer( eventListenerManager = ((TestingEventListenerManager) injector.getInstance(EventListenerManager.class)); clusterStateProvider = null; planCheckerProviderManager = injector.getInstance(PlanCheckerProviderManager.class); - expressionManager.loadExpressionOptimizerFactories(); + expressionManager.loadExpressionOptimizerFactories(authClientConfigs); } else if (resourceManager) { dispatchManager = null; @@ -563,6 +572,11 @@ public void close() } } + public AuthClientConfigs getAuthClientConfigs() + { + return authClientConfigs; + } + public PluginManager getPluginManager() { return pluginManager; diff --git a/presto-native-sidecar-plugin/pom.xml b/presto-native-sidecar-plugin/pom.xml index 6a6298953d51c..6abbad7a2a1bb 100644 --- a/presto-native-sidecar-plugin/pom.xml +++ b/presto-native-sidecar-plugin/pom.xml @@ -136,6 +136,12 @@ jakarta.annotation-api + + com.facebook.presto + presto-internal-communication + ${project.version} + + com.facebook.presto @@ -232,12 +238,6 @@ test - - com.facebook.airlift - jaxrs - test - - javax.ws.rs javax.ws.rs-api diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarCommunicationModule.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarCommunicationModule.java index 5f4025898e3d6..ee768717b2331 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarCommunicationModule.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarCommunicationModule.java @@ -13,17 +13,28 @@ */ package com.facebook.presto.sidecar; +import com.facebook.presto.common.AuthClientConfigs; import com.google.inject.Binder; import com.google.inject.Module; import static com.facebook.airlift.http.client.HttpClientBinder.httpClientBinder; +import static com.facebook.presto.server.CommonInternalCommunicationModule.bindInternalAuth; +import static java.util.Objects.requireNonNull; public class NativeSidecarCommunicationModule implements Module { + private final AuthClientConfigs authClientConfigs; + + public NativeSidecarCommunicationModule(AuthClientConfigs authClientConfigs) + { + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); + } + @Override public void configure(Binder binder) { + bindInternalAuth(binder, authClientConfigs); httpClientBinder(binder).bindHttpClient("sidecar", ForSidecarInfo.class); } } diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizer.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizer.java index d5e5702033a16..927fd157a2cd5 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizer.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizer.java @@ -28,6 +28,7 @@ import com.facebook.presto.spi.relation.RowExpressionVisitor; import com.facebook.presto.spi.relation.SpecialFormExpression; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; @@ -394,4 +395,10 @@ private static RowExpression toRowExpression(Optional sourceLoca // If it's not a RowExpression, we assume it's a literal value. return new ConstantExpression(sourceLocation, object, type); } + + @VisibleForTesting + public NativeSidecarExpressionInterpreter getRowExpressionInterpreterService() + { + return rowExpressionInterpreterService; + } } diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizerFactory.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizerFactory.java index b1eb030e7ec0f..a0689975484d1 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizerFactory.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionOptimizerFactory.java @@ -50,11 +50,10 @@ public ExpressionOptimizer createOptimizer(Map config, Expressio try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { Bootstrap app = new Bootstrap( - new NativeSidecarCommunicationModule(), + new NativeSidecarCommunicationModule(context.getAuthClientConfigs()), new NativeExpressionsModule(context.getNodeManager(), context.getRowExpressionSerde(), context.getFunctionMetadataManager(), context.getFunctionResolution())); Injector injector = app - .noStrictConfig() .doNotInitializeLogging() .setRequiredConfigurationProperties(config) .quiet() diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java index 6af455060c8ae..484bb1cd1fd28 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java @@ -25,6 +25,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.relation.ExpressionOptimizer; import com.facebook.presto.spi.relation.RowExpression; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.inject.Inject; @@ -160,4 +161,10 @@ private static Optional rePackageExceptions(List create(String catalogName, Map properties, PlanCheckerPro try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { Bootstrap app = new Bootstrap( new NativePlanCheckerModule(context.getNodeManager(), context.getSimplePlanFragmentSerde()), - new NativeSidecarCommunicationModule()); + new NativeSidecarCommunicationModule(context.getAuthClientConfigs())); Injector injector = app - .noStrictConfig() .doNotInitializeLogging() .setRequiredConfigurationProperties(properties) .quiet() diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/sessionpropertyproviders/NativeSystemSessionPropertyProviderFactory.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/sessionpropertyproviders/NativeSystemSessionPropertyProviderFactory.java index 2eec0f0accb64..b42aec4214071 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/sessionpropertyproviders/NativeSystemSessionPropertyProviderFactory.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/sessionpropertyproviders/NativeSystemSessionPropertyProviderFactory.java @@ -39,11 +39,10 @@ public WorkerSessionPropertyProvider create(SessionPropertyContext context, Map< Bootstrap app = new Bootstrap( new NativeSystemSessionPropertyProviderModule( context.getNodeManager(), context.getTypeManager()), - new NativeSidecarCommunicationModule()); + new NativeSidecarCommunicationModule(context.getAuthClientConfigs())); Injector injector = app .doNotInitializeLogging() - .noStrictConfig() .setRequiredConfigurationProperties(config) .initialize(); return injector.getInstance(NativeSystemSessionPropertyProvider.class); diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java index d03643b6feab9..76c12deaa8744 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java @@ -52,7 +52,7 @@ public static void setupNativeSidecarPlugin(QueryRunner queryRunner) queryRunner.loadTypeManager(NativeTypeManagerFactory.NAME); queryRunner.loadPlanCheckerProviderManager("native", ImmutableMap.of()); - queryRunner.getExpressionManager().loadExpressionOptimizerFactory(NativeExpressionOptimizerFactory.NAME, "native", ImmutableMap.of()); + queryRunner.loadExpressionOptimizer(NativeExpressionOptimizerFactory.NAME, "native", ImmutableMap.of()); queryRunner.installPlugin(new NativeSqlInvokedFunctionsPlugin()); } } diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java index d9c94fe6a2abf..6c49d1cbab361 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java @@ -13,22 +13,32 @@ */ package com.facebook.presto.sidecar; +import com.facebook.airlift.http.client.HttpClient; +import com.facebook.airlift.http.client.HttpRequestFilter; +import com.facebook.airlift.http.client.jetty.JettyHttpClient; import com.facebook.airlift.units.DataSize; import com.facebook.presto.Session; import com.facebook.presto.common.type.Type; import com.facebook.presto.nativeworker.PrestoNativeQueryRunnerUtils; import com.facebook.presto.scalar.sql.NativeSqlInvokedFunctionsPlugin; import com.facebook.presto.scalar.sql.SqlInvokedFunctionsPlugin; +import com.facebook.presto.server.InternalAuthenticationManager; +import com.facebook.presto.sidecar.expressions.NativeExpressionOptimizer; import com.facebook.presto.sidecar.expressions.NativeExpressionOptimizerFactory; +import com.facebook.presto.sidecar.expressions.NativeSidecarExpressionInterpreter; import com.facebook.presto.sidecar.functionNamespace.FunctionDefinitionProvider; import com.facebook.presto.sidecar.functionNamespace.NativeFunctionDefinitionProvider; import com.facebook.presto.sidecar.functionNamespace.NativeFunctionNamespaceManager; import com.facebook.presto.sidecar.functionNamespace.NativeFunctionNamespaceManagerFactory; +import com.facebook.presto.sidecar.nativechecker.NativePlanChecker; +import com.facebook.presto.sidecar.nativechecker.NativePlanCheckerProvider; import com.facebook.presto.sidecar.sessionpropertyproviders.NativeSystemSessionPropertyProvider; import com.facebook.presto.sidecar.sessionpropertyproviders.NativeSystemSessionPropertyProviderFactory; import com.facebook.presto.sidecar.typemanager.NativeTypeManagerFactory; import com.facebook.presto.spi.function.FunctionNamespaceManager; import com.facebook.presto.spi.function.SqlFunction; +import com.facebook.presto.spi.plan.PlanCheckerProvider; +import com.facebook.presto.spi.relation.ExpressionOptimizer; import com.facebook.presto.spi.session.WorkerSessionPropertyProvider; import com.facebook.presto.testing.MaterializedResult; import com.facebook.presto.testing.MaterializedRow; @@ -128,8 +138,14 @@ public static void setupNativeSidecarPlugin(QueryRunner queryRunner) "function-implementation-type", "CPP", "sidecar.http-client.max-content-length", SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB + "MB")); queryRunner.loadTypeManager(NativeTypeManagerFactory.NAME); - queryRunner.loadPlanCheckerProviderManager("native", ImmutableMap.of()); - queryRunner.getExpressionManager().loadExpressionOptimizerFactory(NativeExpressionOptimizerFactory.NAME, "native", ImmutableMap.of()); + queryRunner.loadPlanCheckerProviderManager("native", + ImmutableMap.of( + "sidecar.http-client.max-content-length", SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB + "MB")); + queryRunner.loadExpressionOptimizer( + NativeExpressionOptimizerFactory.NAME, + "native", + ImmutableMap.of( + "sidecar.http-client.max-content-length", SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB + "MB")); queryRunner.installPlugin(new NativeSqlInvokedFunctionsPlugin()); } @@ -138,15 +154,33 @@ public void testHttpClientProperties() { WorkerSessionPropertyProvider sessionPropertyProvider = getQueryRunner().getMetadata().getSessionPropertyManager().getWorkerSessionPropertyProviders().get(NativeSystemSessionPropertyProviderFactory.NAME); checkArgument(sessionPropertyProvider instanceof NativeSystemSessionPropertyProvider, "Expected NativeSystemSessionPropertyProvider but got %s", sessionPropertyProvider); - long sessionProviderHttpClientConfigContentSize = ((NativeSystemSessionPropertyProvider) sessionPropertyProvider).getHttpClient().getMaxContentLength(); - assertEquals(sessionProviderHttpClientConfigContentSize, new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + HttpClient httpClient = ((NativeSystemSessionPropertyProvider) sessionPropertyProvider).getHttpClient(); + assertEquals(httpClient.getMaxContentLength(), new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + testInternalAuthenticationFilter(httpClient); FunctionNamespaceManager functionNamespaceManager = getQueryRunner().getMetadata().getFunctionAndTypeManager().getFunctionNamespaceManagers().get(NativeFunctionNamespaceManagerFactory.NAME); checkArgument(functionNamespaceManager instanceof NativeFunctionNamespaceManager, "Expected NativeFunctionNamespaceManager but got %s", functionNamespaceManager); FunctionDefinitionProvider functionDefinitionProvider = ((NativeFunctionNamespaceManager) functionNamespaceManager).getFunctionDefinitionProvider(); checkArgument(functionDefinitionProvider instanceof NativeFunctionDefinitionProvider, "Expected NativeFunctionDefinitionProvider but got %s", functionDefinitionProvider); - long functionProviderHttpClientConfigContentSize = ((NativeFunctionDefinitionProvider) functionDefinitionProvider).getHttpClient().getMaxContentLength(); - assertEquals(functionProviderHttpClientConfigContentSize, new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + httpClient = ((NativeFunctionDefinitionProvider) functionDefinitionProvider).getHttpClient(); + assertEquals(httpClient.getMaxContentLength(), new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + testInternalAuthenticationFilter(httpClient); + + ExpressionOptimizer expressionOptimizer = getQueryRunner().getExpressionManager().getExpressionOptimizer(NativeExpressionOptimizerFactory.NAME); + checkArgument(expressionOptimizer instanceof NativeExpressionOptimizer, "Expected NativeExpressionOptimizer but got %s", expressionOptimizer); + NativeSidecarExpressionInterpreter interpreter = ((NativeExpressionOptimizer) expressionOptimizer).getRowExpressionInterpreterService(); + httpClient = interpreter.getHttpClient(); + assertEquals(httpClient.getMaxContentLength(), new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + testInternalAuthenticationFilter(httpClient); + + List planCheckerProviders = getQueryRunner().getPlanCheckerProviderManager().getPlanCheckerProviders(); + assertEquals(planCheckerProviders.size(), 1); + PlanCheckerProvider provider = planCheckerProviders.get(0); + checkArgument(provider instanceof NativePlanCheckerProvider, "Expected NativePlanCheckerProvider but got %s", provider); + NativePlanChecker planChecker = (NativePlanChecker) provider.getFragmentPlanCheckers().get(0); + httpClient = planChecker.getHttpClient(); + assertEquals(httpClient.getMaxContentLength(), new DataSize(SIDECAR_HTTP_CLIENT_MAX_CONTENT_SIZE_MB, MEGABYTE).toBytes()); + testInternalAuthenticationFilter(httpClient); } @Test @@ -751,4 +785,20 @@ private List excludeSystemSessionProperties(List Pattern.matches(REGEX_SESSION_NAMESPACE, row.getFields().get(4).toString())) .collect(Collectors.toList()); } + + private static void testInternalAuthenticationFilter(HttpClient httpClient) + { + // check if filter present + List filters = ((JettyHttpClient) httpClient).getRequestFilters(); + + InternalAuthenticationManager authenticationManager = filters.stream() + .filter(InternalAuthenticationManager.class::isInstance) + .map(InternalAuthenticationManager.class::cast) + .findFirst() + .orElseThrow(() -> new AssertionError("InternalAuthenticationManager filter not found")); + + // Verify that the test shared secret is propagated all the way through + assertTrue(authenticationManager.getSharedSecret().isPresent()); + assertEquals(authenticationManager.getSharedSecret().get(), "internal-shared-secret"); + } } diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestPlanCheckerProvider.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestPlanCheckerProvider.java index 5e5db209556fc..8d6fc913fa52a 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestPlanCheckerProvider.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestPlanCheckerProvider.java @@ -50,7 +50,6 @@ import java.util.Set; import static com.facebook.airlift.http.client.testing.TestingResponse.mockResponse; -import static com.facebook.presto.sidecar.nativechecker.NativePlanChecker.PLAN_CONVERSION_ENDPOINT; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.expectThrows; @@ -109,7 +108,7 @@ private NativePlanChecker createChecker(PlanConversionResponse response, HttpSta PLAN_CONVERSION_RESPONSE_JSON_CODEC.toJson(response))); return new NativePlanChecker( - new TestingNodeManager(URI.create("http://localhost" + PLAN_CONVERSION_ENDPOINT)), + new TestingNodeManager(URI.create("http://localhost")), PLAN_FRAGMENT_JSON_CODEC, client); } diff --git a/presto-spark-base/src/main/java/com/facebook/presto/spark/PrestoSparkInjectorFactory.java b/presto-spark-base/src/main/java/com/facebook/presto/spark/PrestoSparkInjectorFactory.java index b30af13018b06..cebeafa9e54f5 100644 --- a/presto-spark-base/src/main/java/com/facebook/presto/spark/PrestoSparkInjectorFactory.java +++ b/presto-spark-base/src/main/java/com/facebook/presto/spark/PrestoSparkInjectorFactory.java @@ -16,6 +16,7 @@ import com.facebook.airlift.bootstrap.Bootstrap; import com.facebook.airlift.json.JsonModule; import com.facebook.airlift.json.smile.SmileModule; +import com.facebook.airlift.node.NodeInfo; import com.facebook.presto.eventlistener.EventListenerManager; import com.facebook.presto.eventlistener.EventListenerModule; import com.facebook.presto.execution.resourceGroups.ResourceGroupManager; @@ -49,6 +50,7 @@ import java.util.Map.Entry; import java.util.Optional; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.server.PrestoSystemRequirements.verifySystemTimeIsReasonable; import static com.facebook.presto.spark.classloader_interface.SparkProcessType.DRIVER; import static com.google.common.collect.ImmutableMap.toImmutableMap; @@ -214,17 +216,18 @@ public Injector create(PrestoSparkBootstrapTimer bootstrapTimer) } } + NodeInfo nodeInfo = injector.getInstance(NodeInfo.class); FeaturesConfig featuresConfig = injector.getInstance(FeaturesConfig.class); if (sparkProcessType.equals(DRIVER) || (!featuresConfig.isNativeExecutionEnabled() && !featuresConfig.isInlineSqlFunctions())) { if (functionNamespaceProperties.isPresent()) { injector.getInstance(StaticFunctionNamespaceStore.class) - .loadFunctionNamespaceManagers(functionNamespaceProperties.get()); + .loadFunctionNamespaceManagers(functionNamespaceProperties.get(), defaultAuthClientConfigs(nodeInfo.getNodeId())); } else { injector.getInstance(StaticFunctionNamespaceStore.class) - .loadFunctionNamespaceManagers(); + .loadFunctionNamespaceManagers(defaultAuthClientConfigs(nodeInfo.getNodeId())); } } bootstrapTimer.endDriverModulesLoading(); diff --git a/presto-spark-base/src/test/java/com/facebook/presto/spark/PrestoSparkQueryRunner.java b/presto-spark-base/src/test/java/com/facebook/presto/spark/PrestoSparkQueryRunner.java index a85aa71ee7de2..8b32d311d8970 100644 --- a/presto-spark-base/src/test/java/com/facebook/presto/spark/PrestoSparkQueryRunner.java +++ b/presto-spark-base/src/test/java/com/facebook/presto/spark/PrestoSparkQueryRunner.java @@ -113,6 +113,7 @@ import static com.facebook.airlift.log.Level.INFO; import static com.facebook.airlift.log.Level.WARN; import static com.facebook.airlift.units.Duration.nanosSince; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.spark.PrestoSparkSessionProperties.getQueryExecutionStrategies; import static com.facebook.presto.spark.PrestoSparkSettingsRequirements.SPARK_EXECUTOR_CORES_PROPERTY; import static com.facebook.presto.spark.PrestoSparkSettingsRequirements.SPARK_TASK_CPUS_PROPERTY; @@ -710,7 +711,7 @@ public void createCatalog(String catalogName, String connectorName, Map properties) { - metadata.getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, nodeManager); + metadata.getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, nodeManager, defaultAuthClientConfigs(nodeManager.getCurrentNode().getNodeIdentifier())); } @Override diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManagerContext.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManagerContext.java index 92c9ba73853ea..2166a988665d4 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManagerContext.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManagerContext.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.function; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.common.type.TypeManager; import com.facebook.presto.spi.NodeManager; @@ -23,15 +24,18 @@ public class FunctionNamespaceManagerContext private final TypeManager typeManager; private final NodeManager nodeManager; private final FunctionMetadataManager functionMetadataManager; + private final AuthClientConfigs authClientConfigs; public FunctionNamespaceManagerContext( TypeManager typeManager, NodeManager nodeManager, - FunctionMetadataManager functionMetadataManager) + FunctionMetadataManager functionMetadataManager, + AuthClientConfigs authClientConfigs) { this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); } public TypeManager getTypeManager() @@ -48,4 +52,9 @@ public FunctionMetadataManager getFunctionMetadataManager() { return functionMetadataManager; } + + public AuthClientConfigs getAuthClientConfigs() + { + return authClientConfigs; + } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/plan/PlanCheckerProviderContext.java b/presto-spi/src/main/java/com/facebook/presto/spi/plan/PlanCheckerProviderContext.java index 7c0d9b3181757..62829226d4749 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/plan/PlanCheckerProviderContext.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/plan/PlanCheckerProviderContext.java @@ -14,6 +14,7 @@ package com.facebook.presto.spi.plan; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.spi.NodeManager; import static java.util.Objects.requireNonNull; @@ -22,11 +23,13 @@ public class PlanCheckerProviderContext { private final SimplePlanFragmentSerde simplePlanFragmentSerde; private final NodeManager nodeManager; + private final AuthClientConfigs authClientConfigs; - public PlanCheckerProviderContext(SimplePlanFragmentSerde simplePlanFragmentSerde, NodeManager nodeManager) + public PlanCheckerProviderContext(SimplePlanFragmentSerde simplePlanFragmentSerde, NodeManager nodeManager, AuthClientConfigs authClientConfigs) { this.simplePlanFragmentSerde = requireNonNull(simplePlanFragmentSerde, "simplePlanFragmentSerde is null"); this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); } public SimplePlanFragmentSerde getSimplePlanFragmentSerde() @@ -38,4 +41,9 @@ public NodeManager getNodeManager() { return nodeManager; } + + public AuthClientConfigs getAuthClientConfigs() + { + return authClientConfigs; + } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/session/SessionPropertyContext.java b/presto-spi/src/main/java/com/facebook/presto/spi/session/SessionPropertyContext.java index 7b778281ebd3e..1c56c3cfd0301 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/session/SessionPropertyContext.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/session/SessionPropertyContext.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.session; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.common.type.TypeManager; import com.facebook.presto.spi.NodeManager; @@ -24,11 +25,13 @@ public class SessionPropertyContext { private final Optional typeManager; private final Optional nodeManager; + private final AuthClientConfigs authClientConfigs; - public SessionPropertyContext(Optional typeManager, Optional nodeManager) + public SessionPropertyContext(Optional typeManager, Optional nodeManager, AuthClientConfigs authClientConfigs) { this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); } public NodeManager getNodeManager() @@ -40,4 +43,9 @@ public TypeManager getTypeManager() { return typeManager.orElseThrow(() -> new IllegalArgumentException("typeManager is not present")); } + + public AuthClientConfigs getAuthClientConfigs() + { + return authClientConfigs; + } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/sql/planner/ExpressionOptimizerContext.java b/presto-spi/src/main/java/com/facebook/presto/spi/sql/planner/ExpressionOptimizerContext.java index 51b7cce149d8f..46195d5347c90 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/sql/planner/ExpressionOptimizerContext.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/sql/planner/ExpressionOptimizerContext.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.sql.planner; +import com.facebook.presto.common.AuthClientConfigs; import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.RowExpressionSerde; import com.facebook.presto.spi.function.FunctionMetadataManager; @@ -26,13 +27,20 @@ public class ExpressionOptimizerContext private final RowExpressionSerde rowExpressionSerde; private final FunctionMetadataManager functionMetadataManager; private final StandardFunctionResolution functionResolution; + private final AuthClientConfigs authClientConfigs; - public ExpressionOptimizerContext(NodeManager nodeManager, RowExpressionSerde rowExpressionSerde, FunctionMetadataManager functionMetadataManager, StandardFunctionResolution functionResolution) + public ExpressionOptimizerContext( + NodeManager nodeManager, + RowExpressionSerde rowExpressionSerde, + FunctionMetadataManager functionMetadataManager, + StandardFunctionResolution functionResolution, + AuthClientConfigs authClientConfigs) { this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.rowExpressionSerde = requireNonNull(rowExpressionSerde, "rowExpressionSerde is null"); this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); this.functionResolution = requireNonNull(functionResolution, "functionResolution is null"); + this.authClientConfigs = requireNonNull(authClientConfigs, "authClientConfigs is null"); } public NodeManager getNodeManager() @@ -54,4 +62,9 @@ public StandardFunctionResolution getFunctionResolution() { return functionResolution; } + + public AuthClientConfigs getAuthClientConfigs() + { + return authClientConfigs; + } } diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java index dd9333fab1ad8..5c0219bb97606 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java @@ -93,6 +93,7 @@ import static com.facebook.airlift.json.JsonCodec.jsonCodec; import static com.facebook.airlift.units.Duration.nanosSince; import static com.facebook.presto.client.PrestoHeaders.PRESTO_USER; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.common.type.TypeUtils.isNumericType; import static com.facebook.presto.spi.NodePoolType.INTERMEDIATE; import static com.facebook.presto.spi.NodePoolType.LEAF; @@ -788,7 +789,21 @@ public void createCatalog(String catalogName, String connectorName, Map properties) { for (TestingPrestoServer server : servers) { - server.getMetadata().getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, server.getPluginNodeManager()); + server.getMetadata().getFunctionAndTypeManager() + .loadFunctionNamespaceManager( + functionNamespaceManagerName, catalogName, properties, server.getPluginNodeManager(), server.getAuthClientConfigs()); + } + } + + @Override + public void loadExpressionOptimizer(String expressionOptimizerFactoryName, String expressionOptimizerName, Map properties) + { + for (TestingPrestoServer server : servers) { + server.getExpressionManager().loadExpressionOptimizerFactory( + expressionOptimizerFactoryName, + expressionOptimizerName, + properties, + server.getAuthClientConfigs()); } } @@ -1058,7 +1073,13 @@ private void loadFunctionNamespaceManager( if (coordinatorOnly && !server.isCoordinator()) { continue; } - server.getMetadata().getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, server.getPluginNodeManager()); + server.getMetadata().getFunctionAndTypeManager() + .loadFunctionNamespaceManager( + functionNamespaceManagerName, + catalogName, + properties, + server.getPluginNodeManager(), + defaultAuthClientConfigs(server.getPluginNodeManager().getCurrentNode().getNodeIdentifier())); } } @@ -1104,7 +1125,8 @@ public void loadSessionPropertyProvider(String sessionPropertyProviderName, Map< sessionPropertyProviderName, properties, Optional.ofNullable(server.getMetadata().getFunctionAndTypeManager()), - Optional.ofNullable(server.getPluginNodeManager())); + Optional.ofNullable(server.getPluginNodeManager()), + server.getAuthClientConfigs()); } } @@ -1120,7 +1142,9 @@ public void loadTypeManager(String typeManagerName) public void loadPlanCheckerProviderManager(String planCheckerProviderName, Map properties) { for (TestingPrestoServer server : servers) { - server.getPlanCheckerProviderManager().loadPlanCheckerProvider(planCheckerProviderName, properties, server.getPluginNodeManager()); + server.getPlanCheckerProviderManager() + .loadPlanCheckerProvider( + planCheckerProviderName, properties, server.getPluginNodeManager(), server.getAuthClientConfigs()); } } diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/StandaloneQueryRunner.java b/presto-tests/src/main/java/com/facebook/presto/tests/StandaloneQueryRunner.java index aad0a6eff8ac1..c5d2171f99ffb 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/StandaloneQueryRunner.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/StandaloneQueryRunner.java @@ -47,6 +47,7 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.tests.AbstractTestQueries.TEST_CATALOG_PROPERTIES; import static com.facebook.presto.tests.AbstractTestQueries.TEST_SYSTEM_PROPERTIES; import static java.util.Objects.requireNonNull; @@ -253,7 +254,13 @@ public void createCatalog(String catalogName, String connectorName, Map properties) { - server.getMetadata().getFunctionAndTypeManager().loadFunctionNamespaceManager(functionNamespaceManagerName, catalogName, properties, server.getPluginNodeManager()); + server.getMetadata().getFunctionAndTypeManager() + .loadFunctionNamespaceManager( + functionNamespaceManagerName, + catalogName, + properties, + server.getPluginNodeManager(), + defaultAuthClientConfigs(server.getPluginNodeManager().getCurrentNode().getNodeIdentifier())); } @Override diff --git a/presto-tests/src/test/java/com/facebook/presto/execution/TestQueues.java b/presto-tests/src/test/java/com/facebook/presto/execution/TestQueues.java index 98b7e4068919a..e2a52b31fd6c2 100644 --- a/presto-tests/src/test/java/com/facebook/presto/execution/TestQueues.java +++ b/presto-tests/src/test/java/com/facebook/presto/execution/TestQueues.java @@ -24,6 +24,7 @@ import com.facebook.presto.plugin.blackhole.BlackHolePlugin; import com.facebook.presto.resourceGroups.ResourceGroupManagerPlugin; import com.facebook.presto.server.BasicQueryInfo; +import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.QueryId; import com.facebook.presto.spi.relation.VariableReferenceExpression; import com.facebook.presto.spi.resourceGroups.ResourceGroupId; @@ -55,6 +56,7 @@ import static com.facebook.airlift.testing.Closeables.closeQuietly; import static com.facebook.presto.SystemSessionProperties.EAGER_PLAN_VALIDATION_ENABLED; import static com.facebook.presto.SystemSessionProperties.HASH_PARTITION_COUNT; +import static com.facebook.presto.common.AuthClientConfigs.defaultAuthClientConfigs; import static com.facebook.presto.execution.QueryState.FAILED; import static com.facebook.presto.execution.QueryState.FINISHED; import static com.facebook.presto.execution.QueryState.QUEUED; @@ -392,7 +394,8 @@ public void testEagerPlanValidation() queryRunner.installPlugin(new ResourceGroupManagerPlugin()); queryRunner.installCoordinatorPlugin(new TestingPlanCheckerProviderPlugin(triggerValidationFailure)); PlanCheckerProviderManager planCheckerProviderManager = queryRunner.getCoordinator().getInstance(Key.get(PlanCheckerProviderManager.class)); - planCheckerProviderManager.loadPlanCheckerProviders(new TestingNodeManager()); + NodeManager nodeManager = new TestingNodeManager(); + planCheckerProviderManager.loadPlanCheckerProviders(nodeManager, defaultAuthClientConfigs(nodeManager.getCurrentNode().getNodeIdentifier())); queryRunner.getCoordinator().getResourceGroupManager().get().forceSetConfigurationManager("file", ImmutableMap.of("resource-groups.config-file", getResourceFilePath("resource_groups_config_eager_plan_validation.json"))); Session.SessionBuilder builder = testSessionBuilder()