You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2020/04/06 06:21:23 UTC
[phoenix-queryserver] branch master updated: PHOENIX-5772
Streamline the kerberos logic in thin client java code
This is an automated email from the ASF dual-hosted git repository.
stoty pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix-queryserver.git
The following commit(s) were added to refs/heads/master by this push:
new 8ad2347 PHOENIX-5772 Streamline the kerberos logic in thin client java code
8ad2347 is described below
commit 8ad23479e27e90aac48e3c68d203c0b914c1f5bf
Author: Istvan Toth <st...@apache.org>
AuthorDate: Thu Mar 12 15:16:58 2020 +0100
PHOENIX-5772 Streamline the kerberos logic in thin client java code
move hbase config parameter processing to python
remove hadoop dependency from queryserver-client
use shaded avatica client everywhere
update sqlline to 1.9
don't shade sqlline + deps into thin client
remove unnecessary interdependencies between modules
Closes #20
---
assembly/cluster.xml | 9 +++
assembly/pom.xml | 7 +-
bin/phoenix_utils.py | 17 +++--
bin/sqlline-thin.py | 51 ++++++++++---
pom.xml | 15 +---
queryserver-client/pom.xml | 73 +------------------
.../client/KerberosLoginFromTicketCache.java | 85 ++++++++++++++++++++++
.../phoenix/queryserver/client/SqllineWrapper.java | 83 +++++++--------------
queryserver-orchestrator/pom.xml | 4 -
queryserver/pom.xml | 13 ++--
.../phoenix/end2end/QueryServerBasicsIT.java | 2 +-
.../phoenix/end2end/QueryServerEnvironment.java | 2 +-
.../phoenix/end2end/QueryServerTestUtil.java | 2 +-
.../end2end/SecureQueryServerPhoenixDBIT.java | 2 +-
.../org/apache/phoenix/util}/ThinClientUtil.java | 11 +--
.../org/apache/phoenix/DriverCohabitationTest.java | 2 +-
16 files changed, 200 insertions(+), 178 deletions(-)
diff --git a/assembly/cluster.xml b/assembly/cluster.xml
index ad08c25..fe91478 100644
--- a/assembly/cluster.xml
+++ b/assembly/cluster.xml
@@ -51,4 +51,13 @@
</includes>
</fileSet>
</fileSets>
+ <dependencySets>
+ <dependencySet>
+ <unpack>false</unpack>
+ <outputDirectory>${project.parent.artifactId}-${project.parent.version}/lib</outputDirectory>
+ <includes>
+ <include>sqlline:sqlline:jar:jar-with-dependencies</include>
+ </includes>
+ </dependencySet>
+ </dependencySets>
</assembly>
diff --git a/assembly/pom.xml b/assembly/pom.xml
index da4f3f3..d381fde 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -44,10 +44,15 @@
<artifactId>queryserver-client</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>sqlline</groupId>
+ <artifactId>sqlline</artifactId>
+ <classifier>jar-with-dependencies</classifier>
+ </dependency>
</dependencies>
<build>
- <directory>${project.basedir}/../target</directory>
+ <directory>target</directory>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
diff --git a/bin/phoenix_utils.py b/bin/phoenix_utils.py
index d85a857..677761f 100755
--- a/bin/phoenix_utils.py
+++ b/bin/phoenix_utils.py
@@ -68,13 +68,14 @@ def findClasspath(command_name):
return subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).stdout.read()
def setPath():
- PHOENIX_CLIENT_JAR_PATTERN = "phoenix-*-client.jar"
+ PHOENIX_CLIENT_JAR_PATTERN = "phoenix-*[!n]-client.jar"
PHOENIX_THIN_CLIENT_JAR_PATTERN = "phoenix-*-thin-client.jar"
PHOENIX_QUERYSERVER_JAR_PATTERN = "phoenix-*-queryserver.jar"
PHOENIX_LOADBALANCER_JAR_PATTERN = "phoenix-load-balancer-*[!t][!e][!s][!t][!s].jar"
PHOENIX_TRACESERVER_JAR_PATTERN = "phoenix-tracing-webapp-*-runnable.jar"
PHOENIX_TESTS_JAR_PATTERN = "phoenix-core-*-tests*.jar"
PHOENIX_PHERF_JAR_PATTERN = "phoenix-pherf-*-minimal*.jar"
+ SQLLINE_WITH_DEPS_PATTERN = "sqlline-*-jar-with-dependencies.jar"
# Backward support old env variable PHOENIX_LIB_DIR replaced by PHOENIX_CLASS_PATH
global phoenix_class_path
@@ -111,7 +112,7 @@ def setPath():
phoenix_jar_path = os.path.join(current_dir, "..", "phoenix-client", "target","*")
global phoenix_client_jar
- phoenix_client_jar = find("phoenix-*-client.jar", phoenix_jar_path)
+ phoenix_client_jar = find("phoenix-*[!n]-client.jar", phoenix_jar_path)
if phoenix_client_jar == "":
phoenix_client_jar = findFileInPathWithoutRecursion(PHOENIX_CLIENT_JAR_PATTERN, os.path.join(current_dir, ".."))
if phoenix_client_jar == "":
@@ -133,18 +134,18 @@ def setPath():
global hadoop_classpath
if (os.name != 'nt'):
- hadoop_classpath = findClasspath('hadoop')
+ hadoop_classpath = findClasspath('hadoop').rstrip()
else:
- hadoop_classpath = os.getenv('HADOOP_CLASSPATH', '')
+ hadoop_classpath = os.getenv('HADOOP_CLASSPATH', '').rstrip()
global hadoop_common_jar_path
- hadoop_common_jar_path = os.path.join(current_dir, "..", "phoenix-client", "target","*")
+ hadoop_common_jar_path = os.path.join(current_dir, "..", "phoenix-client", "target","*").rstrip()
global hadoop_common_jar
hadoop_common_jar = find("hadoop-common*.jar", hadoop_common_jar_path)
global hadoop_hdfs_jar_path
- hadoop_hdfs_jar_path = os.path.join(current_dir, "..", "phoenix-client", "target","*")
+ hadoop_hdfs_jar_path = os.path.join(current_dir, "..", "phoenix-client", "target","*").rstrip()
global hadoop_hdfs_jar
hadoop_hdfs_jar = find("hadoop-hdfs*.jar", hadoop_hdfs_jar_path)
@@ -189,6 +190,9 @@ def setPath():
if phoenix_thin_client_jar == "":
phoenix_thin_client_jar = findFileInPathWithoutRecursion(PHOENIX_THIN_CLIENT_JAR_PATTERN, os.path.join(current_dir, ".."))
+ global sqlline_with_deps_jar
+ sqlline_with_deps_jar = findFileInPathWithoutRecursion(SQLLINE_WITH_DEPS_PATTERN, os.path.join(current_dir, "..","lib"))
+
return ""
def shell_quote(args):
@@ -229,3 +233,4 @@ if __name__ == "__main__":
print "phoenix_loadbalancer_jar:", phoenix_loadbalancer_jar
print "phoenix_thin_client_jar:", phoenix_thin_client_jar
print "hadoop_classpath:", hadoop_classpath
+ print "sqlline_with_deps_jar", sqlline_with_deps_jar
diff --git a/bin/sqlline-thin.py b/bin/sqlline-thin.py
index ff5ad77..4d15b18 100755
--- a/bin/sqlline-thin.py
+++ b/bin/sqlline-thin.py
@@ -56,6 +56,9 @@ parser.add_argument('-s', '--serialization', help='Serialization type for HTTP A
# Avatica authentication
parser.add_argument('-au', '--auth-user', help='Username for HTTP authentication.')
parser.add_argument('-ap', '--auth-password', help='Password for HTTP authentication.')
+# Avatica principal and keytab
+parser.add_argument('-p', '--principal', help='Kerberos principal for SPNEGO authenction from keytab.')
+parser.add_argument('-kt', '--keytab', help='Kerberos keytab file for SPNEGO authenction from keytab.')
# Avatica HTTPS truststore
parser.add_argument('-t', '--truststore', help='Truststore file that contains the TLS certificate of the server.')
parser.add_argument('-tp', '--truststore-password', help='Password for the server TLS certificate truststore')
@@ -68,7 +71,13 @@ phoenix_utils.setPath()
url = args.url
sqlfile = args.sqlfile
+
serialization_key = 'phoenix.queryserver.serialization'
+default_serialization='PROTOBUF'
+hbase_authentication_key = 'hbase.security.authentication'
+default_hbase_authentication = ''
+spnego_auth_disabled_key = 'phoenix.queryserver.spnego.auth.disabled'
+default_spnego_auth_disabled = 'false'
def cleanup_url(url):
parsed = urlparse.urlparse(url)
@@ -79,8 +88,7 @@ def cleanup_url(url):
url = url + ":8765"
return url
-def get_serialization():
- default_serialization='PROTOBUF'
+def get_hbase_param(key, default):
env=os.environ.copy()
if os.name == 'posix':
hbase_exec_name = 'hbase'
@@ -92,25 +100,34 @@ def get_serialization():
hbase_cmd = phoenix_utils.which(hbase_exec_name)
if hbase_cmd is None:
- print 'Failed to find hbase executable on PATH, defaulting serialization to %s.' % default_serialization
- return default_serialization
+ print 'Failed to find hbase executable on PATH, defaulting %s to %s.' % key, default
+ return default
env['HBASE_CONF_DIR'] = phoenix_utils.hbase_conf_dir
- proc = subprocess.Popen([hbase_cmd, 'org.apache.hadoop.hbase.util.HBaseConfTool', serialization_key],
+ proc = subprocess.Popen([hbase_cmd, 'org.apache.hadoop.hbase.util.HBaseConfTool', key],
env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if proc.returncode != 0:
- print 'Failed to extract serialization from hbase-site.xml, defaulting to %s.' % default_serialization
- return default_serialization
+ print 'Failed to extract %s from hbase-site.xml, defaulting to %s.' % key, default
+ return default
# Don't expect this to happen, but give a default value just in case
if stdout is None:
- return default_serialization
+ return default
stdout = stdout.strip()
if stdout == 'null':
- return default_serialization
+ return default
return stdout
+def get_serialization():
+ return get_hbase_param(serialization_key, default_serialization)
+
+def get_hbase_authentication():
+ return get_hbase_param(hbase_authentication_key, default_hbase_authentication)
+
+def get_spnego_auth_disabled():
+ return get_hbase_param(spnego_auth_disabled_key, default_spnego_auth_disabled)
+
url = cleanup_url(url)
if sqlfile != "":
@@ -164,15 +181,27 @@ if args.auth_user:
jdbc_url += ';avatica_user=' + args.auth_user
if args.auth_password:
jdbc_url += ';avatica_password=' + args.auth_password
+if args.principal:
+ jdbc_url += ';principal=' + args.principal
+if args.keytab:
+ jdbc_url += ';keytab=' + args.keytab
if args.truststore:
jdbc_url += ';truststore=' + args.truststore
if args.truststore_password:
jdbc_url += ';truststore_password=' + args.truststore_password
+
+# Add SPENGO auth if this cluster uses it, and there are no conflicting HBase parameters
+if (get_hbase_authentication() == 'kerberos' and get_spnego_auth_disabled() == 'false'
+ and 'authentication=' not in jdbc_url and 'avatica_user=' not in jdbc_url):
+ jdbc_url += ';authentication=SPNEGO'
+
java_cmd = java + ' $PHOENIX_OPTS ' + \
- ' -cp "' + phoenix_utils.hbase_conf_dir + os.pathsep + phoenix_utils.phoenix_thin_client_jar + \
- os.pathsep + phoenix_utils.hadoop_conf + os.pathsep + phoenix_utils.hadoop_classpath + '" -Dlog4j.configuration=file:' + \
+ ' -cp "' + phoenix_utils.sqlline_with_deps_jar \
+ + os.pathsep + phoenix_utils.phoenix_thin_client_jar + \
+ '" -Dlog4j.configuration=file:' + \
os.path.join(phoenix_utils.current_dir, "log4j.properties") + \
+ ' -Djavax.security.auth.useSubjectCredsOnly=false ' + \
" org.apache.phoenix.queryserver.client.SqllineWrapper -d org.apache.phoenix.queryserver.client.Driver " + \
' -u "' + jdbc_url + '"' + " -n none -p none " + \
" --color=" + colorSetting + " --fastConnect=" + args.fastconnect + " --verbose=" + args.verbose + \
diff --git a/pom.xml b/pom.xml
index 53b0181..6caf5ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,8 +74,7 @@
<phoenix.version>4.14.2-HBase-1.4</phoenix.version>
<!-- Dependency versions -->
- <sqlline.version>1.2.0</sqlline.version>
- <jline.version>2.11</jline.version>
+ <sqlline.version>1.9.0</sqlline.version>
<commons-logging.version>1.2</commons-logging.version>
<!-- Do not change jodatime.version until HBASE-15199 is fixed -->
<avatica.version>1.16.0</avatica.version>
@@ -403,23 +402,13 @@
</dependency>
<dependency>
<groupId>org.apache.calcite.avatica</groupId>
- <artifactId>avatica-core</artifactId>
- <version>${avatica.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.calcite.avatica</groupId>
<artifactId>avatica-server</artifactId>
<version>${avatica.version}</version>
</dependency>
-
- <dependency>
- <groupId>jline</groupId>
- <artifactId>jline</artifactId>
- <version>${jline.version}</version>
- </dependency>
<dependency>
<groupId>sqlline</groupId>
<artifactId>sqlline</artifactId>
+ <classifier>jar-with-dependencies</classifier>
<version>${sqlline.version}</version>
</dependency>
<dependency>
diff --git a/queryserver-client/pom.xml b/queryserver-client/pom.xml
index 30bcb82..f0ac6ea 100644
--- a/queryserver-client/pom.xml
+++ b/queryserver-client/pom.xml
@@ -107,70 +107,6 @@
</excludes>
</filter>
</filters>
-
- <relocations>
-
- <!-- COM relocation -->
-
- <relocation>
- <pattern>com.fasterxml</pattern>
- <shadedPattern>${shaded.package}.com.fasterxml</shadedPattern>
- </relocation>
- <relocation>
- <pattern>com.google.collect</pattern>
- <shadedPattern>${shaded.package}.com.google.collect</shadedPattern>
- </relocation>
- <relocation>
- <pattern>com.google.protobuf</pattern>
- <shadedPattern>${shaded.package}.com.google.protobuf</shadedPattern>
- </relocation>
- <!-- ORG relocation -->
- <relocation>
- <pattern>org.apache.calcite.avatica</pattern>
- <shadedPattern>${shaded.package}.org.apache.calcite.avatica</shadedPattern>
- <!-- The protobuf messages can't be relocated due to a limitation
- in the Avatica protocol. -->
- <excludes>
- <exclude>org.apache.calcite.avatica.proto.*</exclude>
- </excludes>
- </relocation>
- <relocation>
- <pattern>org.apache.commons</pattern>
- <shadedPattern>${shaded.package}.org.apache.commons</shadedPattern>
- <excludes>
- <exclude>org.apache.commons.logging.**</exclude>
- </excludes>
- </relocation>
- <relocation>
- <pattern>org.apache.http</pattern>
- <shadedPattern>${shaded.package}.org.apache.http</shadedPattern>
- </relocation>
-
- <relocation>
- <pattern>org.fusesource</pattern>
- <shadedPattern>${shaded.package}.org.fusesource</shadedPattern>
- </relocation>
- <relocation>
- <pattern>org.hamcrest</pattern>
- <shadedPattern>${shaded.package}.org.hamcrest</shadedPattern>
- </relocation>
- <relocation>
- <pattern>org.junit</pattern>
- <shadedPattern>${shaded.package}.org.junit</shadedPattern>
- </relocation>
-
- <!-- MISC relocations -->
-
- <relocation>
- <pattern>jline</pattern>
- <shadedPattern>${shaded.package}.jline</shadedPattern>
- </relocation>
- <relocation>
- <pattern>junit</pattern>
- <shadedPattern>${shaded.package}.junit</shadedPattern>
- </relocation>
-
- </relocations>
</configuration>
</execution>
</executions>
@@ -190,16 +126,13 @@
<dependencies>
<dependency>
<groupId>org.apache.calcite.avatica</groupId>
- <artifactId>avatica-core</artifactId>
+ <artifactId>avatica</artifactId>
</dependency>
<dependency>
- <!-- a dependency for the thin-client uberjar -->
<groupId>sqlline</groupId>
<artifactId>sqlline</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-common</artifactId>
+ <scope>provided</scope>
+ <classifier>jar-with-dependencies</classifier>
</dependency>
</dependencies>
</project>
diff --git a/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/KerberosLoginFromTicketCache.java b/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/KerberosLoginFromTicketCache.java
new file mode 100644
index 0000000..9c5fa15
--- /dev/null
+++ b/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/KerberosLoginFromTicketCache.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.queryserver.client;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+public class KerberosLoginFromTicketCache {
+
+ public static Subject login() throws LoginException {
+
+ Configuration kerberosConfig = new KerberosConfiguration();
+ Subject subject = new Subject();
+
+ LoginContext lc = new LoginContext("PhoenixThinClient", subject, new CallbackHandler() {
+ @Override
+ public void handle(Callback[] callbacks)
+ throws IOException, UnsupportedCallbackException {
+ throw new UnsupportedCallbackException(callbacks[0],
+ "Only ticket cache is supported");
+ }
+ }, kerberosConfig);
+
+ lc.login();
+ return subject;
+ }
+
+ private static class KerberosConfiguration extends Configuration {
+ private static final String IBM_KRB5_LOGIN_MODULE =
+ "com.ibm.security.auth.module.Krb5LoginModule";
+ private static final String SUN_KRB5_LOGIN_MODULE =
+ "com.sun.security.auth.module.Krb5LoginModule";
+
+ private static final String JAVA_VENDOR_NAME = System.getProperty("java.vendor");
+ private static final boolean IS_IBM_JAVA = JAVA_VENDOR_NAME.contains("IBM");
+
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ HashMap<String, Object> options = new HashMap<>();
+
+ if(IS_IBM_JAVA) {
+ //Also see https://www.ibm.com/support/pages/how-enable-strong-encryption-128-bit
+
+ // This is inferior to the sun class, as it won't work if the kerberos and unix
+ // users don't match, while that one take any principal from the cache
+ options.put("principal", System.getProperty("user.name"));
+ options.put("useDefaultCcache", "true");
+ return new AppConfigurationEntry[] { new AppConfigurationEntry(
+ IBM_KRB5_LOGIN_MODULE, AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options) };
+ } else {
+ options.put("useTicketCache", "true");
+ options.put("doNotPrompt", "true");
+ return new AppConfigurationEntry[] { new AppConfigurationEntry(
+ SUN_KRB5_LOGIN_MODULE, AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+ options) };
+ }
+ }
+ }
+
+}
diff --git a/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/SqllineWrapper.java b/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/SqllineWrapper.java
index 90fe8e1..0bb35a9 100644
--- a/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/SqllineWrapper.java
+++ b/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/SqllineWrapper.java
@@ -18,8 +18,8 @@ package org.apache.phoenix.queryserver.client;
import java.security.PrivilegedExceptionAction;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.security.UserGroupInformation;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
import sqlline.SqlLine;
@@ -28,71 +28,40 @@ import sqlline.SqlLine;
* make a pre-populated ticket cache (via kinit before launching) transparently work.
*/
public class SqllineWrapper {
- public static final String HBASE_AUTHENTICATION_ATTR = "hbase.security.authentication";
- public static final String QUERY_SERVER_SPNEGO_AUTH_DISABLED_ATTRIB = "phoenix.queryserver.spnego.auth.disabled";
- public static final boolean DEFAULT_QUERY_SERVER_SPNEGO_AUTH_DISABLED = false;
- static UserGroupInformation tryLogin(Configuration conf) {
- // Try to avoid HBase dependency too. Sadly, we have to bring in all of hadoop-common for this..
- if ("kerberos".equalsIgnoreCase(conf.get(HBASE_AUTHENTICATION_ATTR))) {
- // sun.security.krb5.principal is the property for setting the principal name, if that
- // isn't set, fall back to user.name and hope for the best.
- String principal = System.getProperty("sun.security.krb5.principal", System.getProperty("user.name"));
- try {
- // We got hadoop-auth via hadoop-common, so might as well use it.
- return UserGroupInformation.getUGIFromTicketCache(null, principal);
- } catch (Exception e) {
- //Fall through
- System.err.println("Kerberos login failed using ticket cache. Did you kinit?");
+ public static String getUrl(String[] args) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ args[i] = arg;
+ if (arg.equals("-u") && args.length > i+1) {
+ return args[i+1];
}
}
return null;
}
- private static String[] updateArgsForKerberos(String[] origArgs) {
- String[] newArgs = new String[origArgs.length];
- for (int i = 0; i < origArgs.length; i++) {
- String arg = origArgs[i];
- newArgs[i] = arg;
-
- if (arg.equals("-u")) {
- // Get the JDBC url which is the next argument
- i++;
- arg = origArgs[i];
- if (!arg.contains("authentication=")) {
- arg = arg + ";authentication=SPNEGO";
- }
- newArgs[i] = arg;
- }
- }
- return newArgs;
- }
-
public static void main(String[] args) throws Exception {
- final Configuration conf = new Configuration(false);
- conf.addResource("hbase-site.xml");
+ String url = getUrl(args);
- // Check if the server config says SPNEGO auth is actually disabled.
- final boolean disableSpnego = conf.getBoolean(QUERY_SERVER_SPNEGO_AUTH_DISABLED_ATTRIB,
- DEFAULT_QUERY_SERVER_SPNEGO_AUTH_DISABLED);
- if (disableSpnego) {
- SqlLine.main(args);
+ if(url.contains(";authentication=SPNEGO") && !url.contains(";principal=")) {
+ try {
+ Subject subject = KerberosLoginFromTicketCache.login();
+ System.out.println("Kerberos login from ticket cache successful");
+ Subject.doAs(subject, new PrivilegedExceptionAction<Void>() {
+ @Override
+ public Void run() throws Exception {
+ SqlLine.main(args);
+ return null;
+ }
+ });
+ return;
+ } catch (LoginException e) {
+ System.out.print("Kerberos login from ticket cache not successful");
+ e.printStackTrace();
+ }
}
- UserGroupInformation ugi = tryLogin(conf);
-
- if (null != ugi) {
- final String[] updatedArgs = updateArgsForKerberos(args);
- ugi.doAs(new PrivilegedExceptionAction<Void>() {
- @Override
- public Void run() throws Exception {
- SqlLine.main(updatedArgs);
- return null;
- }
- });
- } else {
- SqlLine.main(args);
- }
+ SqlLine.main(args);
}
}
diff --git a/queryserver-orchestrator/pom.xml b/queryserver-orchestrator/pom.xml
index 12e559f..ed6cb21 100644
--- a/queryserver-orchestrator/pom.xml
+++ b/queryserver-orchestrator/pom.xml
@@ -39,10 +39,6 @@
<artifactId>queryserver-client</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.calcite.avatica</groupId>
- <artifactId>avatica-core</artifactId>
- </dependency>
- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
diff --git a/queryserver/pom.xml b/queryserver/pom.xml
index d68d8e8..07b0261 100644
--- a/queryserver/pom.xml
+++ b/queryserver/pom.xml
@@ -148,8 +148,8 @@
<artifactId>hbase-common</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.phoenix</groupId>
- <artifactId>queryserver-client</artifactId>
+ <groupId>org.apache.calcite.avatica</groupId>
+ <artifactId>avatica-server</artifactId>
<exclusions>
<!-- Being pulled in via avatica to avoid pb2/pb3 issues.
When we use the "pre-shaded" avatica artifact, we don't
@@ -165,10 +165,6 @@
<artifactId>avatica</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.calcite.avatica</groupId>
- <artifactId>avatica-server</artifactId>
- </dependency>
- <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
@@ -179,6 +175,11 @@
<!-- for tests -->
<dependency>
<groupId>org.apache.phoenix</groupId>
+ <artifactId>queryserver-client</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<scope>test</scope>
</dependency>
diff --git a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerBasicsIT.java b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerBasicsIT.java
index a641c91..767badc 100644
--- a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerBasicsIT.java
+++ b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerBasicsIT.java
@@ -44,7 +44,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.queryserver.QueryServerProperties;
-import org.apache.phoenix.queryserver.client.ThinClientUtil;
+import org.apache.phoenix.util.ThinClientUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
diff --git a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerEnvironment.java b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerEnvironment.java
index 537d5a5..1d80d63 100644
--- a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerEnvironment.java
+++ b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerEnvironment.java
@@ -44,9 +44,9 @@ import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.authentication.util.KerberosName;
import org.apache.phoenix.query.ConfigurationFactory;
import org.apache.phoenix.queryserver.QueryServerProperties;
-import org.apache.phoenix.queryserver.client.ThinClientUtil;
import org.apache.phoenix.queryserver.server.QueryServer;
import org.apache.phoenix.util.InstanceResolver;
+import org.apache.phoenix.util.ThinClientUtil;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
diff --git a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerTestUtil.java b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerTestUtil.java
index 01f73ae..e599c26 100644
--- a/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerTestUtil.java
+++ b/queryserver/src/it/java/org/apache/phoenix/end2end/QueryServerTestUtil.java
@@ -31,9 +31,9 @@ import org.apache.hadoop.hbase.LocalHBaseCluster;
import org.apache.hadoop.hbase.util.FSUtils;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.phoenix.query.ConfigurationFactory;
-import org.apache.phoenix.queryserver.client.ThinClientUtil;
import org.apache.phoenix.queryserver.server.QueryServer;
import org.apache.phoenix.util.InstanceResolver;
+import org.apache.phoenix.util.ThinClientUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/queryserver/src/it/java/org/apache/phoenix/end2end/SecureQueryServerPhoenixDBIT.java b/queryserver/src/it/java/org/apache/phoenix/end2end/SecureQueryServerPhoenixDBIT.java
index b99693a..32c5478 100644
--- a/queryserver/src/it/java/org/apache/phoenix/end2end/SecureQueryServerPhoenixDBIT.java
+++ b/queryserver/src/it/java/org/apache/phoenix/end2end/SecureQueryServerPhoenixDBIT.java
@@ -54,9 +54,9 @@ import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.authentication.util.KerberosName;
import org.apache.phoenix.query.ConfigurationFactory;
import org.apache.phoenix.queryserver.QueryServerProperties;
-import org.apache.phoenix.queryserver.client.ThinClientUtil;
import org.apache.phoenix.queryserver.server.QueryServer;
import org.apache.phoenix.util.InstanceResolver;
+import org.apache.phoenix.util.ThinClientUtil;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.BeforeClass;
diff --git a/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/ThinClientUtil.java b/queryserver/src/main/java/org/apache/phoenix/util/ThinClientUtil.java
similarity index 80%
rename from queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/ThinClientUtil.java
rename to queryserver/src/main/java/org/apache/phoenix/util/ThinClientUtil.java
index 1ea64e7..f3144eb 100644
--- a/queryserver-client/src/main/java/org/apache/phoenix/queryserver/client/ThinClientUtil.java
+++ b/queryserver/src/main/java/org/apache/phoenix/util/ThinClientUtil.java
@@ -15,15 +15,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.phoenix.queryserver.client;
+package org.apache.phoenix.util;
/**
- * Utilities for thin clients.
+ * Utilities for thin client tests
*/
public final class ThinClientUtil {
- // The default serialization is also defined in QueryServerOptions. phoenix-queryserver-client
- // currently doesn't depend on phoenix-core so we have to deal with the duplication.
+ // Duplicating constants from phoenix-core and queryserver-client
+ // to avoid having to depend on them
private static final String DEFAULT_SERIALIZATION = "PROTOBUF";
+ public static final String CONNECT_STRING_PREFIX = "jdbc:phoenix:thin:";
private ThinClientUtil() {}
@@ -36,7 +37,7 @@ public final class ThinClientUtil {
}
public static String getConnectionUrl(String protocol, String hostname, int port, String serialization) {
- String urlFmt = Driver.CONNECT_STRING_PREFIX + "url=%s://%s:%s;serialization=%s";
+ String urlFmt = CONNECT_STRING_PREFIX + "url=%s://%s:%s;serialization=%s";
return String.format(urlFmt, protocol, hostname, port, serialization);
}
}
diff --git a/queryserver/src/test/java/org/apache/phoenix/DriverCohabitationTest.java b/queryserver/src/test/java/org/apache/phoenix/DriverCohabitationTest.java
index 1df6d2c..02286bd 100644
--- a/queryserver/src/test/java/org/apache/phoenix/DriverCohabitationTest.java
+++ b/queryserver/src/test/java/org/apache/phoenix/DriverCohabitationTest.java
@@ -17,8 +17,8 @@
*/
package org.apache.phoenix;
-import org.apache.phoenix.queryserver.client.ThinClientUtil;
import org.apache.phoenix.util.QueryUtil;
+import org.apache.phoenix.util.ThinClientUtil;
import org.junit.Test;
import java.sql.Driver;