Эх сурвалжийг харах

HUE-4452 [metadata] Restore tagging functionality to Navigator API client

Jenny Kim 9 жил өмнө
parent
commit
104e72f

+ 12 - 2
desktop/core/src/desktop/lib/rest/http_client.py

@@ -119,7 +119,8 @@ class HttpClient(object):
       self._session.headers.update(headers)
     return self._session.headers.copy()
 
-  def execute(self, http_method, path, params=None, data=None, headers=None, allow_redirects=False, urlencode=True, files=None):
+  def execute(self, http_method, path, params=None, data=None, headers=None, allow_redirects=False, urlencode=True,
+              files=None, clear_cookies=False):
     """
     Submit an HTTP request.
     @param http_method: GET, POST, PUT, DELETE
@@ -130,6 +131,7 @@ class HttpClient(object):
     @param allow_redirects: requests should automatically resolve redirects.
     @param urlencode: percent encode paths.
     @param files: for posting Multipart-Encoded files
+    @param clear_cookies: flag to force clear any cookies set in the current session
 
     @return: The result of urllib2.urlopen()
     """
@@ -142,15 +144,23 @@ class HttpClient(object):
         self.logger.warn("GET and DELETE methods do not pass any data. Path '%s'" % path)
         data = None
 
-    request_kwargs = {'allow_redirects': allow_redirects}
+    request_kwargs = {}
+
+    if not allow_redirects:
+      request_kwargs['allow_redirects'] = False
     if headers:
       request_kwargs['headers'] = headers
     if data:
       request_kwargs['data'] = data
     if files:
       request_kwargs['files'] = files
+
+    if clear_cookies:
+      self._session.cookies.clear()
+
     try:
       resp = getattr(self._session, http_method.lower())(url, **request_kwargs)
+
       if resp.status_code >= 300:
         resp.raise_for_status()
         raise exceptions.HTTPError(response=resp)

+ 19 - 10
desktop/core/src/desktop/lib/rest/resource.py

@@ -63,7 +63,8 @@ class Resource(object):
     else:
       return resp.content
 
-  def invoke(self, method, relpath=None, params=None, data=None, headers=None, files=None, allow_redirects=False):
+  def invoke(self, method, relpath=None, params=None, data=None, headers=None, files=None, allow_redirects=False,
+             clear_cookies=False):
     """
     Invoke an API method.
     @return: Raw body or JSON dictionary (if response content type is JSON).
@@ -76,7 +77,8 @@ class Resource(object):
                                 headers=headers,
                                 files=files,
                                 allow_redirects=allow_redirects,
-                                urlencode=self._urlencode)
+                                urlencode=self._urlencode,
+                                clear_cookies=clear_cookies)
 
     if self._client.logger.isEnabledFor(logging.DEBUG):
       self._client.logger.debug(
@@ -87,30 +89,33 @@ class Resource(object):
 
     return self._format_response(resp)
 
-  def get(self, relpath=None, params=None, headers=None):
+  def get(self, relpath=None, params=None, headers=None, clear_cookies=False):
     """
     Invoke the GET method on a resource.
     @param relpath: Optional. A relative path to this resource's path.
     @param params: Key-value data.
+    @param clear_cookies: Optional. A flag to force any session cookies to be reset on the request.
 
     @return: A dictionary of the JSON result.
     """
-    return self.invoke("GET", relpath, params, headers=headers, allow_redirects=True)
+    return self.invoke("GET", relpath, params, headers=headers, allow_redirects=True, clear_cookies=clear_cookies)
 
 
-  def delete(self, relpath=None, params=None, headers=None):
+  def delete(self, relpath=None, params=None, headers=None, clear_cookies=False):
     """
     Invoke the DELETE method on a resource.
     @param relpath: Optional. A relative path to this resource's path.
     @param params: Key-value data.
     @param headers: Optional. Base set of headers.
+    @param clear_cookies: Optional. A flag to force any session cookies to be reset on the request.
 
     @return: A dictionary of the JSON result.
     """
-    return self.invoke("DELETE", relpath, params, headers=headers)
+    return self.invoke("DELETE", relpath, params, headers=headers, clear_cookies=clear_cookies)
 
 
-  def post(self, relpath=None, params=None, data=None, contenttype=None, headers=None, files=None, allow_redirects=False):
+  def post(self, relpath=None, params=None, data=None, contenttype=None, headers=None, files=None, allow_redirects=False,
+           clear_cookies=False):
     """
     Invoke the POST method on a resource.
     @param relpath: Optional. A relative path to this resource's path.
@@ -119,13 +124,15 @@ class Resource(object):
     @param contenttype: Optional.
     @param headers: Optional. Base set of headers.
     @param allow_redirects: Optional. Allow request to automatically resolve redirects.
+    @param clear_cookies: Optional. A flag to force any session cookies to be reset on the request.
 
     @return: A dictionary of the JSON result.
     """
-    return self.invoke("POST", relpath, params, data, self._make_headers(contenttype, headers), files, allow_redirects)
+    return self.invoke("POST", relpath, params, data, headers=self._make_headers(contenttype, headers), files=files,
+                       allow_redirects=allow_redirects, clear_cookies=clear_cookies)
 
 
-  def put(self, relpath=None, params=None, data=None, contenttype=None, allow_redirects=False):
+  def put(self, relpath=None, params=None, data=None, contenttype=None, allow_redirects=False, clear_cookies=False):
     """
     Invoke the PUT method on a resource.
     @param relpath: Optional. A relative path to this resource's path.
@@ -133,10 +140,12 @@ class Resource(object):
     @param data: Optional. Body of the request.
     @param contenttype: Optional.
     @param allow_redirects: Optional. Allow request to automatically resolve redirects.
+    @param clear_cookies: Optional. A flag to force any session cookies to be reset on the request.
 
     @return: A dictionary of the JSON result.
     """
-    return self.invoke("PUT", relpath, params, data, self._make_headers(contenttype), allow_redirects)
+    return self.invoke("PUT", relpath, params, data, headers=self._make_headers(contenttype),
+                       allow_redirects=allow_redirects, clear_cookies=clear_cookies)
 
 
   def _make_headers(self, contenttype=None, headers=None):

+ 2 - 1
desktop/libs/metadata/src/metadata/navigator_client.py

@@ -173,7 +173,8 @@ class NavigatorApi(object):
     try:
       # TODO: Check permissions of entity
       data = json.dumps(metadata)
-      return self._root.put('entities/%s' % entity_id, params=self.__params, data=data)
+      return self._root.put('entities/%s' % entity_id, params=self.__params, data=data, allow_redirects=True,
+                            clear_cookies=True)
     except RestException, e:
       msg = 'Failed to update entity %s: %s' % (entity_id, str(e))
       LOG.exception(msg)