Sfoglia il codice sorgente

[metadata] API to support pulling the top tables

$.post('/metadata/api/optimizer_api/top_tables')

{"status": 0, "top_tables": [{"columnCount": 5, "name": "part", "patternCount": 4, "workloadPercent": 28, "total": 2, "type": "Dimension", "eid": "65"}, {"columnCount": 5, "name": "emps", "patternCount": 4, "workloadPercent": 28, "total": 2, "type": "Dimension", "eid": "64"},...]}
Romain Rigaux 9 anni fa
parent
commit
2a5d744

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

@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+
+from django.http import Http404
+from django.utils.translation import ugettext as _
+from django.views.decorators.http import require_POST
+
+from desktop.lib.django_util import JsonResponse
+from desktop.lib.i18n import force_unicode
+
+from metadata.optimizer_client import OptimizerApi
+
+LOG = logging.getLogger(__name__)
+
+
+def error_handler(view_fn):
+  def decorator(*args, **kwargs):
+    try:
+      return view_fn(*args, **kwargs)
+    except Http404, e:
+      raise e
+    except Exception, e:
+      LOG.exception(e)
+      response = {
+        'status': -1,
+        'message': force_unicode(str(e))
+      }
+    return JsonResponse(response, status=500)
+  return decorator
+
+
+@require_POST
+@error_handler
+def top_tables(request):
+  response = {'status': -1}
+
+  api = OptimizerApi()
+
+  response['top_tables'] = api.top_tables()
+  response['status'] = 0
+
+  return JsonResponse(response)

+ 13 - 1
desktop/libs/metadata/src/metadata/optimizer_client.py

@@ -58,6 +58,15 @@ class OptimizerApi(object):
     self._client.set_verify(ssl_cert_ca_verify)
 
     self._root = resource.Resource(self._client)
+    self._token = None
+
+
+  def _authenticate(self, force=False):
+    if self._token is None or force:
+      self._token = self.authenticate()['token']
+
+    return self._token
+
 
   def create_product(self, product_name=None, product_secret=None, authCode=None):
     try:
@@ -133,7 +142,10 @@ class OptimizerApi(object):
       raise PopupException(e, title=_('Error while accessing Optimizer'))
 
 
-  def top_tables(self, token, email=None):
+  def top_tables(self, token=None, email=None):
+    if token is None:
+      token = self._authenticate()
+
     try:
       data = {
           'email': email if email is not None else self._email,

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

@@ -26,3 +26,9 @@ urlpatterns = patterns('metadata.navigator_api',
   url(r'^api/navigator/update_properties/?$', 'update_properties', name='update_properties'),
   url(r'^api/navigator/delete_properties/?$', 'delete_properties', name='delete_properties'),
 )
+
+
+# Optimizer API
+urlpatterns = patterns('metadata.optimizer_api',
+  url(r'^api/optimizer_api/top_tables/?$', 'top_tables', name='top_tables'),
+)