浏览代码

HUE-8737 [hive] Fix Hive thrift for Python 3.5

Ying Chen 6 年之前
父节点
当前提交
69153d2df9

+ 2 - 2
apps/beeswax/src/beeswax/api.py

@@ -154,14 +154,14 @@ def _autocomplete(db, database=None, table=None, column=None, nested=None, query
         raise Exception('Could not find column `%s`.`%s`.`%s`' % (database, table, column))
   except (QueryServerTimeoutException, TTransportException) as e:
     response['code'] = 503
-    response['error'] = e.message
+    response['error'] = str(e)
   except TypeError as e:
     response['code'] = 500
     response['error'] = str(e)
   except Exception as e:
     LOG.warn('Autocomplete data fetching error: %s' % e)
     response['code'] = 500
-    response['error'] = e.message
+    response['error'] = str(e)
 
   return response
 

+ 1 - 1
apps/beeswax/src/beeswax/conf.py

@@ -296,7 +296,7 @@ AUTH_PASSWORD_SCRIPT = Config(
 
 def get_use_sasl_default():
   """Get from hive_site or backward compatibility"""
-  from hive_site import get_hiveserver2_authentication, get_use_sasl  # Cyclic dependency
+  from beeswax.hive_site import get_hiveserver2_authentication, get_use_sasl  # Cyclic dependency
   use_sasl = get_use_sasl()
   if use_sasl is not None:
     return use_sasl.upper() == 'TRUE'

+ 5 - 1
apps/beeswax/src/beeswax/models.py

@@ -21,6 +21,7 @@ import base64
 import datetime
 import json
 import logging
+import sys
 
 from django.db import models
 from django.contrib.contenttypes.fields import GenericRelation
@@ -481,7 +482,10 @@ class HiveServerQueryHandle(QueryHandle):
 
   @classmethod
   def get_decoded(cls, secret, guid):
-    return base64.decodestring(secret), base64.decodestring(guid)
+    if sys.version_info[0] > 2:
+      return base64.b64decode(secret), base64.b64decode(guid)
+    else:
+      return base64.decodestring(secret), base64.decodestring(guid)
 
   def get_encoded(self):
     return base64.encodestring(self.secret), base64.encodestring(self.guid)

+ 11 - 4
desktop/core/src/desktop/lib/thrift_sasl.py

@@ -17,6 +17,7 @@
 # under the License.
 #
 """ SASL transports for Thrift. """
+from __future__ import absolute_import
 
 from future import standard_library
 standard_library.install_aliases()
@@ -27,8 +28,11 @@ import sasl
 import struct
 import sys
 
+# TODO: Check whether the following distinction is necessary. Does not appear to
+# break anything when `io.BytesIO` is used everywhere, but there may be some edge
+# cases where things break down.
 if sys.version_info[0] > 2:
-  from io import StringIO as string_io
+  from io import BytesIO as string_io
 else:
   from cStringIO import StringIO as string_io
 
@@ -42,7 +46,7 @@ class TSaslClientTransport(TTransportBase, CReadableTransport):
   def __init__(self, sasl_client_factory, mechanism, trans):
     """
     @param sasl_client_factory: a callable that returns a new sasl.Client object
-    @param mechanism: the SASL mechanism (e.g. "GSSAPI", "PLAIN")
+    @param mechanism: the SASL mechanism (e.g. "GSSAPI")
     @param trans: the underlying transport over which to communicate.
     """
     self._trans = trans
@@ -57,6 +61,9 @@ class TSaslClientTransport(TTransportBase, CReadableTransport):
   def isOpen(self):
     return self._trans.isOpen()
 
+  def is_open(self):
+    return self.isOpen()
+
   def open(self):
     if not self._trans.isOpen():
       self._trans.open()
@@ -154,11 +161,11 @@ class TSaslClientTransport(TTransportBase, CReadableTransport):
 
   def read(self, sz):
     ret = self.__rbuf.read(sz)
-    if len(ret) != 0:
+    if len(ret) == sz:
       return ret
 
     self._read_frame()
-    return self.__rbuf.read(sz)
+    return ret + self.__rbuf.read(sz - len(ret))
 
   def _read_frame(self):
     header = self._trans.readAll(4)

+ 4 - 1
desktop/core/src/desktop/lib/thrift_util.py

@@ -471,7 +471,10 @@ class SuperClient(object):
       while tries_left:
         # clear exception state so our re-raise can't reraise something
         # old. This isn't strictly necessary, but feels safer.
-        sys.exc_clear()
+        # py3 doesn't have this
+        if sys.version_info[0] == 2:
+          sys.exc_clear()
+
         try:
           if not self.transport.isOpen():
             self.transport.open()