瀏覽代碼

[raz_adls] Decouple SAS token fetching from RAZ Http Client

Harshg999 4 年之前
父節點
當前提交
40604db950

+ 2 - 1
desktop/core/src/desktop/lib/raz/raz_client.py

@@ -220,11 +220,12 @@ class RazClient(object):
         relative_path += lib_urlunquote(params['directory'])
     
     if method == 'PUT':
-      access_type = 'rename-source'
       if params.get('resource') == 'file':
         access_type = 'create-file'
       elif params.get('resource') == 'directory':
         access_type = 'create-directory'
+      else:
+        access_type = 'rename-source'
 
     return {'access_type': access_type, 'relative_path': relative_path}
 

+ 13 - 10
desktop/core/src/desktop/lib/rest/raz_http_client.py

@@ -41,22 +41,16 @@ class RazHttpClient(HttpClient):
               files=None, stream=False, clear_cookies=False, timeout=conf.REST_CONN_TIMEOUT.get()):
     """
     From an object URL we get back the SAS token as a GET param string, e.g.:
-    https://[storageaccountname].blob.core.windows.net/[containername]/[blobname]
+    https://{storageaccountname}.dfs.core.windows.net/{container}/{path}
     -->
-    https://[storageaccountname].blob.core.windows.net/[containername]/[blobname]?sv=2014-02-14&sr=b&
+    https://{storageaccountname}.dfs.core.windows.net/{container}/{path}?sv=2014-02-14&sr=b&
     sig=pJL%2FWyed41tptiwBM5ymYre4qF8wzrO05tS5MCjkutc%3D&st=2015-01-02T01%3A40%3A51Z&se=2015-01-02T02%3A00%3A51Z&sp=r
     """
-    raz_client = AdlsRazClient(username=self.username)
 
     url = self._make_url(path, params)
+    sas_token = self.get_sas_token(http_method, self.username, url, params, headers)
 
-    response = raz_client.get_url(action=http_method, path=url, headers=headers)
-
-    signed_url = url
-    if response and response.get('token'):
-      signed_url += ('?' if '?' not in url else '&') + response.get('token')
-    else:
-      raise PopupException(_('No SAS token in RAZ response'), error_code=403)
+    signed_url = url + ('?' if '?' not in url else '&') + sas_token
 
     # Required because `self._make_url` is called in base class execute method also
     signed_path = path + signed_url.partition(path)[2]
@@ -73,3 +67,12 @@ class RazHttpClient(HttpClient):
         clear_cookies=clear_cookies,
         timeout=timeout
     )
+
+  def get_sas_token(self, http_method, username, url, params=None, headers=None):
+    raz_client = AdlsRazClient(username=username)
+    response = raz_client.get_url(action=http_method, path=url, headers=headers)
+
+    if response and response.get('token'):
+      return response.get('token')
+    else:
+      raise PopupException(_('No SAS token in RAZ response'), error_code=403)

+ 5 - 7
desktop/libs/azure/src/azure/abfs/abfs.py

@@ -28,7 +28,7 @@ import threading
 import re
 
 from math import ceil
-from posixpath import join, normpath
+from posixpath import join
 
 from hadoop.hdfs_site import get_umask_mode
 from hadoop.fs.exceptions import WebHdfsException
@@ -36,7 +36,6 @@ from hadoop.fs.exceptions import WebHdfsException
 from desktop.conf import RAZ
 from desktop.lib.rest import http_client, resource
 from desktop.lib.rest.raz_http_client import RazHttpClient
-from desktop.lib.raz.clients import AdlsRazClient
 
 import azure.abfs.__init__ as Init_ABFS
 from azure.abfs.abfsfile import ABFSFile
@@ -576,12 +575,11 @@ class ABFS(object):
 
     # Required to sign the header with SAS token for RAZ
     if RAZ.IS_ENABLED.get():
-      raz_client = AdlsRazClient(username=self._user)
-      source_url = self._url + normpath('/' + headers['x-ms-rename-source'].lstrip('/'))
+      raz_http_client = RazHttpClient(self._user, self._url, exc_class=WebHdfsException, logger=LOG)
+      url = raz_http_client._make_url(headers['x-ms-rename-source'], params=None)
 
-      response = raz_client.get_url(action='PUT', path=source_url)
-      if response and response.get('token'):
-        headers['x-ms-rename-source'] += '?' + response['token']
+      sas_token = raz_http_client.get_sas_token('PUT', self._user, url)
+      headers['x-ms-rename-source'] += '?' + sas_token
 
     try:
       self._create_path(new, headers=headers, overwrite=True)