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;

Reply via email to