소스 검색

[metadata] Add API to retrieve table details

Also add a utility to get_optimizer_url()
Romain Rigaux 9 년 전
부모
커밋
ff008b1993

+ 1 - 1
apps/metastore/src/metastore/templates/metastore.mako

@@ -422,7 +422,7 @@ ${ assist.assistPanel() }
               </td>
               <td data-bind="text: comment"></td>
               % if is_optimizer_enabled:
-              <td>28% workload (8)</td>
+              <td>28% access (8)</td>
               <td>15 columns</td>
               <td>Dimension</td>
               % endif

+ 3 - 0
desktop/libs/metadata/src/metadata/conf.py

@@ -34,6 +34,9 @@ def get_auth_password():
     return password
   return DEFAULT_AUTH_PASSWORD.get()
 
+def get_optimizer_url():
+  return OPTIMIZER.API_URL.get().strip('/')
+
 
 OPTIMIZER = ConfigSection(
   key='optimizer',

+ 15 - 0
desktop/libs/metadata/src/metadata/optimizer_api.py

@@ -57,3 +57,18 @@ def top_tables(request):
   response['status'] = 0
 
   return JsonResponse(response)
+
+
+@require_POST
+@error_handler
+def table_details(request):
+  response = {'status': -1}
+
+  table_name = request.POST.get('tableName')
+
+  api = OptimizerApi()
+
+  response['table_details'] = api.table_details(table_name=table_name)
+  response['status'] = 0
+
+  return JsonResponse(response)

+ 18 - 3
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -27,7 +27,7 @@ from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.rest.http_client import HttpClient, RestException
 from desktop.lib.rest import resource
 
-from metadata.conf import OPTIMIZER
+from metadata.conf import OPTIMIZER, get_optimizer_url
 
 
 LOG = logging.getLogger(__name__)
@@ -37,7 +37,7 @@ _JSON_CONTENT_TYPE = 'application/json'
 
 
 def is_optimizer_enabled():
-  return OPTIMIZER.API_URL.get() and OPTIMIZER.PRODUCT_NAME.get()
+  return get_optimizer_url() and OPTIMIZER.PRODUCT_NAME.get()
 
 
 class OptimizerApiException(Exception):
@@ -47,7 +47,7 @@ class OptimizerApiException(Exception):
 class OptimizerApi(object):
 
   def __init__(self, api_url=None, product_name=None, product_secret=None, ssl_cert_ca_verify=OPTIMIZER.SSL_CERT_CA_VERIFY.get(), product_auth_secret=None):
-    self._api_url = (api_url or OPTIMIZER.API_URL.get()).strip('/')
+    self._api_url = (api_url or get_optimizer_url()).strip('/')
     self._product_name = product_name if product_name else OPTIMIZER.PRODUCT_NAME.get()
     self._product_secret = product_secret if product_secret else OPTIMIZER.PRODUCT_SECRET.get()
     self._product_auth_secret = product_auth_secret if product_auth_secret else OPTIMIZER.PRODUCT_AUTH_SECRET.get()
@@ -156,6 +156,21 @@ class OptimizerApi(object):
       raise PopupException(e, title=_('Error while accessing Optimizer'))
 
 
+  def table_details(self, table_name, token=None, email=None):
+    if token is None:
+      token = self._authenticate()
+
+    try:
+      data = {
+          'email': email if email is not None else self._email,
+          'token': token,
+          'tableName': table_name
+      }
+      return self._root.post('/api/tableDetails', data=json.dumps(data), contenttype=_JSON_CONTENT_TYPE)
+    except RestException, e:
+      raise PopupException(e, title=_('Error while accessing Optimizer'))
+
+
 def OptimizerDataAdapter(queries):
   headers = ['SQL_ID', 'ELAPSED_TIME', 'SQL_FULLTEXT']
   rows = ([str(uuid.uuid4()), 1000, q] for q in queries)

+ 16 - 7
desktop/libs/metadata/src/metadata/optimizer_tests.py

@@ -57,26 +57,26 @@ class TestOptimizerApi(object):
     cls.user.save()
 
 
-  def test_api_create_product(self):
+  def test_create_product(self):
     resp = self.api.create_product()
 
     assert_equal('success', resp['status'], resp)
 
 
-  def test_api_add_email_to_product(self):
+  def test_add_email_to_product(self):
     resp = self.api.add_email_to_product()
 
     assert_equal('success', resp['status'], resp)
 
 
-  def test_api_authenticate(self):
+  def test_authenticate(self):
     resp = self.api.authenticate()
 
     assert_true(resp['token'], resp)
     assert_equal('success', resp['status'], resp)
 
 
-  def test_api_get_status(self):
+  def test_get_status(self):
     resp = self.api.authenticate()
     token = resp['token']
 
@@ -88,7 +88,7 @@ class TestOptimizerApi(object):
     assert_true('finished' in resp['details'], resp)
 
 
-  def test_api_delete_workload(self):
+  def test_delete_workload(self):
     resp = self.api.authenticate()
     token = resp['token']
 
@@ -97,7 +97,7 @@ class TestOptimizerApi(object):
     assert_equal('success', resp['status'], resp)
 
 
-  def test_api_upload(self):
+  def test_upload(self):
     resp = self.api.authenticate()
     token = resp['token']
 
@@ -115,10 +115,19 @@ class TestOptimizerApi(object):
     assert_equal('success', resp['status'], resp)
 
 
-  def test_api_top_tables(self):
+  def test_top_tables(self):
     resp = self.api.authenticate()
     token = resp['token']
 
     resp = self.api.top_tables(token=token)
 
     assert_true(isinstance(resp, list), resp) # No status code currently
+
+
+  def test_table_details(self):  # Requires test_upload to run before
+    resp = self.api.authenticate()
+    token = resp['token']
+
+    resp = self.api.table_details(table_name='orders', token=token)
+
+    assert_equal('success', resp['status'], resp)

+ 1 - 0
desktop/libs/metadata/src/metadata/urls.py

@@ -31,4 +31,5 @@ urlpatterns = patterns('metadata.navigator_api',
 # Optimizer API
 urlpatterns = patterns('metadata.optimizer_api',
   url(r'^api/optimizer_api/top_tables/?$', 'top_tables', name='top_tables'),
+  url(r'^api/optimizer_api/table_details/?$', 'table_details', name='table_details'),
 )