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

HUE-6132 [navopt] Catch early NavOpt API 500

Romain Rigaux 8 жил өмнө
parent
commit
9df3fbc

+ 2 - 14
desktop/libs/metadata/src/metadata/optimizer_api.py

@@ -24,13 +24,13 @@ from django.http import Http404
 from django.views.decorators.http import require_POST
 
 from desktop.lib.django_util import JsonResponse
-from desktop.lib.i18n import force_unicode, smart_unicode
+from desktop.lib.i18n import force_unicode
 from desktop.models import Document2
 from libsentry.privilege_checker import PrivilegeChecker
 from notebook.models import Notebook
 
 from metadata.conf import NAVIGATOR
-from metadata.optimizer_client import OptimizerApi
+from metadata.optimizer_client import OptimizerApi, NavOptException
 
 LOG = logging.getLogger(__name__)
 
@@ -43,15 +43,6 @@ except ImportError, e:
   LOG.warn("Hive lib not enabled")
 
 
-class NavOptException(Exception):
-  def __init__(self, message=None):
-    self.message = message or _('No error message, please check the logs.')
-
-  def __unicode__(self):
-    return smart_unicode(self.message)
-
-
-
 def error_handler(view_fn):
   def decorator(*args, **kwargs):
     try:
@@ -104,9 +95,6 @@ def top_tables(request):
   api = OptimizerApi()
   data = api.top_tables(database_name=database, page_size=limit)
 
-  if data['code'] == 'UNKNOWN':
-    raise NavOptException(data.get('message'))
-
   tables = [{
       'eid': table['eid'],
       'database': _get_table_name(table['name'])['database'],

+ 26 - 37
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -28,6 +28,7 @@ from django.utils.translation import ugettext as _
 
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib import export_csvxls
+from desktop.lib.i18n import smart_unicode
 from desktop.lib.rest.http_client import RestException
 from navoptapi.api_lib import ApiLib
 
@@ -40,9 +41,12 @@ LOG = logging.getLogger(__name__)
 _JSON_CONTENT_TYPE = 'application/json'
 
 
+class NavOptException(Exception):
+  def __init__(self, message=None):
+    self.message = message or _('No error message, please check the logs.')
 
-class OptimizerApiException(PopupException):
-  pass
+  def __unicode__(self):
+    return smart_unicode(self.message)
 
 
 class OptimizerApi(object):
@@ -64,35 +68,20 @@ class OptimizerApi(object):
 
     return self._token
 
+  def _call(self, *kwargs):
+    data = self._api.call_api(*kwargs).json()
+
+    if data.get('code') == 'UNKNOWN':
+      raise NavOptException(data.get('message'))
+    else:
+      return data
 
   def get_tenant(self, email=None):
-    return self._api.call_api("getTenant", {"email" : email or self._email}).json()
+    return self._call("getTenant", {"email" : email or self._email})
 
 
   def create_tenant(self, group):
-    return self._api.call_api('createTenant', {'userGroup' : group}).json()
-
-
-  def authenticate(self):
-    try:
-      data = {
-          'productName': self._product_name,
-          'productSecret': self._product_secret,
-      }
-      return self._root.post('/api/authenticate', data=json.dumps(data), contenttype=_JSON_CONTENT_TYPE)
-    except RestException, e:
-      raise PopupException(e, title=_('Error while accessing Optimizer'))
-
-
-  def delete_workload(self, token, email=None):
-    try:
-      data = {
-          'email': email if email is not None else self._email,
-          'token': token,
-      }
-      return self._root.post('/api/deleteWorkload', data=json.dumps(data), contenttype=_JSON_CONTENT_TYPE)
-    except RestException, e:
-      raise PopupException(e, title=_('Error while accessing Optimizer'))
+    return self._call('createTenant', {'userGroup' : group})
 
 
   def upload(self, data, data_type='queries', source_platform='generic', workload_id=None):
@@ -151,27 +140,27 @@ class OptimizerApi(object):
 
 
   def upload_status(self, workload_id):
-    return self._api.call_api('uploadStatus', {'tenant' : self._product_name, 'workloadId': workload_id}).json()
+    return self._call('uploadStatus', {'tenant' : self._product_name, 'workloadId': workload_id})
 
 
   def top_tables(self, workfloadId=None, database_name='default', page_size=1000, startingToken=None):
-    return self._api.call_api('getTopTables', {'tenant' : self._product_name, 'dbName': database_name.lower(), 'pageSize': page_size, startingToken: None}).json()
+    return self._call('getTopTables', {'tenant' : self._product_name, 'dbName': database_name.lower(), 'pageSize': page_size, startingToken: None})
 
 
   def table_details(self, database_name, table_name, page_size=100, startingToken=None):
-    return self._api.call_api('getTablesDetail', {'tenant' : self._product_name, 'dbName': database_name.lower(), 'tableName': table_name.lower(), 'pageSize': page_size, startingToken: None}).json()
+    return self._call('getTablesDetail', {'tenant' : self._product_name, 'dbName': database_name.lower(), 'tableName': table_name.lower(), 'pageSize': page_size, startingToken: None})
 
 
   def query_compatibility(self, source_platform, target_platform, query, page_size=100, startingToken=None):
-    return self._api.call_api('getQueryCompatible', {'tenant' : self._product_name, 'query': query, 'sourcePlatform': source_platform, 'targetPlatform': target_platform, }).json()
+    return self._call('getQueryCompatible', {'tenant' : self._product_name, 'query': query, 'sourcePlatform': source_platform, 'targetPlatform': target_platform, })
 
 
   def query_risk(self, query, page_size=100, startingToken=None):
-    return self._api.call_api('getQueryRisk', {'tenant' : self._product_name, 'query': query, 'pageSize': page_size, startingToken: None}).json()
+    return self._call('getQueryRisk', {'tenant' : self._product_name, 'query': query, 'pageSize': page_size, startingToken: None})
 
 
   def similar_queries(self, source_platform, query, page_size=100, startingToken=None):
-    return self._api.call_api('getSimilarQueries', {'tenant' : self._product_name, 'sourcePlatform': source_platform, 'query': query, 'pageSize': page_size, startingToken: None}).json()
+    return self._call('getSimilarQueries', {'tenant' : self._product_name, 'sourcePlatform': source_platform, 'query': query, 'pageSize': page_size, startingToken: None})
 
 
   def top_filters(self, db_tables=None, page_size=100, startingToken=None):
@@ -183,7 +172,7 @@ class OptimizerApi(object):
     if db_tables:
       args['dbTableList'] = [db_table.lower() for db_table in db_tables]
 
-    return self._api.call_api('getTopFilters', args).json()
+    return self._call('getTopFilters', args)
 
 
   def top_aggs(self, db_tables=None, page_size=100, startingToken=None):
@@ -195,7 +184,7 @@ class OptimizerApi(object):
     if db_tables:
       args['dbTableList'] = [db_table.lower() for db_table in db_tables]
 
-    return self._api.call_api('getTopAggs', args).json()
+    return self._call('getTopAggs', args)
 
 
   def top_columns(self, db_tables=None, page_size=100, startingToken=None):
@@ -207,7 +196,7 @@ class OptimizerApi(object):
     if db_tables:
       args['dbTableList'] = [db_table.lower() for db_table in db_tables]
 
-    return self._api.call_api('getTopColumns', args).json()
+    return self._call('getTopColumns', args)
 
 
   def top_joins(self, db_tables=None, page_size=100, startingToken=None):
@@ -219,7 +208,7 @@ class OptimizerApi(object):
     if db_tables:
       args['dbTableList'] = [db_table.lower() for db_table in db_tables]
 
-    return self._api.call_api('getTopJoins', args).json()
+    return self._call('getTopJoins', args)
 
 
   def top_databases(self, db_tables=None, page_size=100, startingToken=None):
@@ -229,7 +218,7 @@ class OptimizerApi(object):
       'startingToken': None
     }
 
-    return self._api.call_api('getTopDataBases', args).json()
+    return self._call('getTopDataBases', args)
 
 
   UPLOAD = {