Forráskód Böngészése

HUE-6245 [cluster] Load back persisted cluster

Romain Rigaux 8 éve
szülő
commit
e95220a

+ 14 - 3
desktop/core/src/desktop/api2.py

@@ -38,6 +38,7 @@ from metadata.navigator_api import search_entities_interactive as metadata_searc
 from notebook.connectors.base import Notebook
 from notebook.views import upgrade_session_properties
 
+from desktop.conf import get_clusters
 from desktop.lib.django_util import JsonResponse
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.export_csvxls import make_response
@@ -68,10 +69,20 @@ def api_error_handler(func):
 
 @api_error_handler
 def get_config(request):
-  cluster_config = ClusterConfig(request.user)
+  if request.POST.get('cluster'):
+    cluster_type = json.loads(request.POST['cluster'])['type']
+    # TODO persist
+  else:
+    default_cluster = get_user_preferences(request.user, key='cluster')
+    if default_cluster:
+      clusters = get_clusters()
+      cluster_name = json.loads(default_cluster['cluster']).get('name')
+      cluster_type = cluster_name and clusters.get(cluster_name) and clusters[cluster_name]['type'] or 'ini'
+    else:
+      cluster_type = 'ini'
 
-  cluster_type = request.POST.get('type', 'ini') # TODO pref
-  app_config = cluster_config.get_apps(cluster_type)
+  cluster_config = ClusterConfig(request.user, cluster_type=cluster_type)
+  app_config = cluster_config.get_apps()
 
   return JsonResponse({
     'status': 0,

+ 8 - 4
desktop/core/src/desktop/conf.py

@@ -1345,15 +1345,19 @@ def get_clusters():
     clusters = CLUSTERS.get()
   else:
     clusters = []
-    
-  return OrderedDict([
+
+  cl = OrderedDict([
     (i, {
       'name': i,
       'type': clusters[i].TYPE.get(),
-      'interfaces': clusters[i].INTERFACES.get()
+      'interfaces': [{'name': i, 'type': clusters[i].TYPE.get(), 'interface': interface} for interface in clusters[i].INTERFACES.get()]
     }) for i in clusters]
   )
 
+  cl['Data Eng']['interfaces'].append({'name': 'Data Eng', 'type': 'dataeng', 'interface': 'c1'})
+  cl['Data Eng']['interfaces'].append({'name': 'Data Eng', 'type': 'dataeng', 'interface': 'c2'})
+  return cl
+
 
 CLUSTERS = UnspecifiedConfigSection(
   "clusters",
@@ -1371,7 +1375,7 @@ CLUSTERS = UnspecifiedConfigSection(
           "interfaces",
           help=_("List of cluster instances of the cluster (optional)."),
           default=[],
-          type=list,
+          type=coerce_csv,
       ),
 
       PRODUCT_SECRET=Config(

+ 19 - 18
desktop/core/src/desktop/models.py

@@ -1531,9 +1531,10 @@ class Document2Permission(models.Model):
 
 class ClusterConfig():
 
-  def __init__(self, user, apps=None):
+  def __init__(self, user, apps=None, cluster_type='ini'):
     self.user = user
     self.apps = appmanager.get_apps_dict(self.user) if apps is None else apps
+    self.cluster_type = cluster_type
 
 
   def refreshConfig(self):
@@ -1568,7 +1569,7 @@ class ClusterConfig():
       return default_app
 
 
-  def _get_editor(self, cluster_type):
+  def _get_editor(self):
     interpreters = []
 
     if SHOW_NOTEBOOKS.get():
@@ -1581,7 +1582,7 @@ class ClusterConfig():
       })
 
     _interpreters = get_ordered_interpreters(self.user)
-    if cluster_type == 'dataeng':
+    if self.cluster_type == 'dataeng':
       _interpreters = [interpreter for interpreter in _interpreters if interpreter['type'] in ('hive', 'spark2', 'java')]
 
     for interpreter in _interpreters:
@@ -1603,10 +1604,10 @@ class ClusterConfig():
     else:
       return None
 
-  def _get_dashboard(self, cluster_type):
+  def _get_dashboard(self):
     interpreters = [] # TODO Integrate SQL Dashboards and Solr 6 configs
 
-    if IS_DASHBOARD_ENABLED.get() and cluster_type != 'dataeng':
+    if IS_DASHBOARD_ENABLED.get() and self.cluster_type != 'dataeng':
       return {
         'name': 'dashboard',
         'displayName': _('Dashboard'),
@@ -1616,10 +1617,10 @@ class ClusterConfig():
     else:
       return None
 
-  def _get_browser(self, cluster_type):
+  def _get_browser(self):
     interpreters = []
 
-    if 'filebrowser' in self.apps and cluster_type != 'dataeng':
+    if 'filebrowser' in self.apps and self.cluster_type != 'dataeng':
       interpreters.append({
         'type': 'hdfs',
         'displayName': _('Files'),
@@ -1643,7 +1644,7 @@ class ClusterConfig():
         'page': '/metastore/tables'
       })
 
-    if 'search' in self.apps and cluster_type != 'dataeng':
+    if 'search' in self.apps and self.cluster_type != 'dataeng':
       interpreters.append({
         'type': 'indexes',
         'displayName': _('Indexes'),
@@ -1652,7 +1653,7 @@ class ClusterConfig():
       })
 
     if 'jobbrowser' in self.apps:
-      if cluster_type == 'dataeng':
+      if self.cluster_type == 'dataeng':
         interpreters.append({
           'type': 'dataeng',
           'displayName': _('Jobs'),
@@ -1669,7 +1670,7 @@ class ClusterConfig():
             'page': '/jobbrowser/'
           })
 
-    if 'hbase' in self.apps and cluster_type != 'dataeng':
+    if 'hbase' in self.apps and self.cluster_type != 'dataeng':
       interpreters.append({
         'type': 'hbase',
         'displayName': _('HBase'),
@@ -1677,7 +1678,7 @@ class ClusterConfig():
         'page': '/hbase/'
       })
 
-    if 'security' in self.apps and cluster_type != 'dataeng':
+    if 'security' in self.apps and self.cluster_type != 'dataeng':
       interpreters.append({
         'type': 'security',
         'displayName': _('Security'),
@@ -1685,7 +1686,7 @@ class ClusterConfig():
         'page': '/security/hive'
       })
 
-    if 'sqoop' in self.apps and cluster_type != 'dataeng':
+    if 'sqoop' in self.apps and self.cluster_type != 'dataeng':
       interpreters.append({
         'type': 'sqoop',
         'displayName': _('Sqoop'),
@@ -1704,7 +1705,7 @@ class ClusterConfig():
       return None
 
 
-  def _get_scheduler(self, cluster_type):
+  def _get_scheduler(self):
     interpreters = [{
         'type': 'oozie-workflow',
         'displayName': _('Workflow'),
@@ -1757,12 +1758,12 @@ class ClusterConfig():
       return None
 
 
-  def get_apps(self, cluster_type):
+  def get_apps(self):
     apps = OrderedDict([app for app in [
-      ('editor', self._get_editor(cluster_type)),
-      ('dashboard', self._get_dashboard(cluster_type)),
-      ('browser', self._get_browser(cluster_type)),
-      ('scheduler', self._get_scheduler(cluster_type)),
+      ('editor', self._get_editor()),
+      ('dashboard', self._get_dashboard()),
+      ('browser', self._get_browser()),
+      ('scheduler', self._get_scheduler()),
       ('sdkapps', self._get_sdk_apps()),
     ] if app[1]])
 

+ 40 - 23
desktop/core/src/desktop/templates/hue.mako

@@ -157,7 +157,7 @@ ${ hueIcons.symbols() }
 
         <!-- ko if: cluster.clusters().length > 0 -->
         <div class="btn-group pull-right">
-          <button class="btn" data-bind="text: cluster.cluster().name"></button>
+          <button class="btn" data-bind="text: cluster.cluster().name() + (cluster.cluster().interface ? ' ' + cluster.cluster().interface() : '')"></button>
           <button class="btn dropdown-toggle" data-toggle="dropdown">
             <span class="caret"></span>
           </button>
@@ -165,29 +165,28 @@ ${ hueIcons.symbols() }
           <ul class="dropdown-menu">
             <!-- ko foreach: cluster.clusters -->
               <li>
-              <!-- ko switch: type -->
-                <!-- ko case: 'dataeng' -->
+              <!-- ko if: ['dataeng', 'cm'].indexOf(type()) != -1 && interfaces().length > 0 -->
                 <li class="dropdown-submenu">
                   <a data-rel="navigator-tooltip" href="javascript: void(0)">
                     <i class="fa fa-fw fa-th-large inline-block"></i> <span data-bind="text: name"></span>
                   </a>
                   <ul class="dropdown-menu">
-                    <li>
+                    <li data-bind="visible: type() == 'dataeng'">
                       <a data-rel="navigator-tooltip" href="#">
                         <span class="dropdown-no-icon"><i class="fa fa-fw fa-plus inline-block"></i></span>
                       </a>
                     </li>
-                    <!-- ko foreach: $data['clusters'] -->
+                    <!-- ko foreach: interfaces -->
                       <li>
                         <a href="javascript: void(0)" data-bind="click: function() { $root.cluster.cluster($data) }">
-                          <span class="dropdown-no-icon" data-bind="text: name"></span>
+                          <span class="dropdown-no-icon" data-bind="text: interface"></span>
                         </a>
                       </li>
                     <!-- /ko -->
                   </ul>
                 </li>
                 <!-- /ko -->
-                <!-- ko case: $default -->
+                <!-- ko if: ['dataeng', 'cm'].indexOf(type()) == -1 || interfaces().length == 0 -->
                   <li><a href="javascript: void(0)" data-bind="click: function(){  $root.cluster.cluster($data) }">
                     <i class="fa fa-fw fa-square"></i> <span data-bind="text: name"></span></a>
                   </li>
@@ -1186,28 +1185,46 @@ ${ smart_unicode(login_modal(request).content) | n,unicode }
           self.clusters = ko.mapping.fromJS(${ clusters_config_json | n,unicode });
           self.cluster = ko.observable(self.clusters().length > 0 ? self.clusters()[${ default_cluster_index }] : null);
           self.cluster.subscribe(function(newValue) {
-            new ClusterConfig(ko.mapping.toJS(newValue));
+            new ClusterConfig({'cluster': ko.mapping.toJSON(newValue)});
           });
 
           self.contextPanelVisible = ko.observable(false);
 
-          $.post("/jobbrowser/api/jobs", {
-            interface: ko.mapping.toJSON('dataeng-clusters'),
-            filters: ko.mapping.toJSON([]),
-          }, function (data) {
-            if (data.status == 0) {
-              var clusters = [];
-              if (data && data.apps) {
-                data.apps.forEach(function (cluster) {
-                  clusters.push({'name': cluster.id, 'type': 'dataeng'});
-                });
-              }
-              self.clusters()[3]['clusters'](clusters);
-            } else {
-              $(document).trigger("error", data.message);
-            }
+          var dataEngCluster = $.grep(self.clusters(), function(cluster) {
+            return cluster.type() == 'dataeng';
           });
+          if (dataEngCluster.length > 0) {
+            $.post("/jobbrowser/api/jobs", {
+              interface: ko.mapping.toJSON('dataeng-clusters'),
+              filters: ko.mapping.toJSON([]),
+            }, function (data) {
+              if (data.status == 0) {
+                var interfaces = [];
+                if (data && data.apps) {
+                  data.apps.forEach(function(cluster) {
+                    interfaces.push(ko.mapping.fromJS({'name': dataEngCluster[0].name(), 'type': 'dataeng', 'interface': cluster.id}));
+                  });
+                }
+                dataEngCluster[0]['interfaces'](interfaces);
+
+                if (dataEngCluster[0].type() == 'dataeng') {
+                  self._loadInterface();
+                }
+              } else {
+                $(document).trigger("error", data.message);
+              }
+            });
+          }
+          if (self.cluster().type() != 'dataeng') {
+            self._loadInterface();
+          }
         }
+        self._loadInterface = function() {
+          var interfaces = self.cluster().interfaces().filter(function (i) {return i.interface() == '${ default_cluster_interface }'});
+          if (interfaces.length > 0) {
+            self.cluster(interfaces[0]);
+          }
+        };
         self.cluster = new ClusterPanelViewModel();
 
         self.searchAutocompleteSource = function (request, callback) {

+ 13 - 2
desktop/core/src/desktop/views.py

@@ -69,9 +69,19 @@ def is_alive(request):
 
 def hue(request):
   apps = appmanager.get_apps_dict(request.user)
+
+  default_cluster_index = 0
+  default_cluster_interface = ''
+
   clusters = get_clusters()
   default_cluster = get_user_preferences(request.user, key='cluster')
-  default_cluster_index = clusters and default_cluster and default_cluster in clusters.keys() and clusters.keys().index(default_cluster) or 0
+
+  if clusters and default_cluster:
+    default_cluster_json = json.loads(default_cluster['cluster'])
+    default_cluster_name = default_cluster_json.get('name')
+
+    default_cluster_index = default_cluster_name in clusters.keys() and clusters.keys().index(default_cluster_name) or 0
+    default_cluster_interface = default_cluster_json.get('interface', '')
 
   return render('hue.mako', request, {
     'apps': apps,
@@ -85,7 +95,8 @@ def hue(request):
     'banner_message': get_banner_message(request),
     'user_preferences': dict((x.key, x.value) for x in UserPreferences.objects.filter(user=request.user)),
     'clusters_config_json': json.dumps(get_clusters().values()),
-    'default_cluster_index': default_cluster_index
+    'default_cluster_index': default_cluster_index,
+    'default_cluster_interface': default_cluster_interface
   })
 
 

+ 3 - 0
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -204,6 +204,9 @@ def get_api(request, snippet):
   if snippet.get('wasBatchExecuted'):
     return OozieApi(user=request.user, request=request)
 
+  # Get user pref
+  # if cluster type == 'dataeng', switch interface
+
   interpreter = [interpreter for interpreter in get_ordered_interpreters(request.user) if interpreter['type'] == snippet['type']]
   if not interpreter:
     raise PopupException(_('Snippet type %(type)s is not configured in hue.ini') % snippet)