瀏覽代碼

HUE-8330 [cluster] Split cluster and service creation in two

Romain Rigaux 7 年之前
父節點
當前提交
0b32fb6

+ 0 - 1
apps/beeswax/src/beeswax/api.py

@@ -673,7 +673,6 @@ def _get_sample_data(db, database, table, column, async=False, cluster=None, ope
       notebook = make_notebook(
           name=_('Table sample for `%(database)s`.`%(table)s`.`%(column)s`') % {'database': database, 'table': table, 'column': column},
           editor_type=_get_servername(db),
-          compute=cluster,
           statement=sample_data,
           status='ready-execute',
           skip_historify=True,

+ 3 - 0
apps/jobbrowser/src/jobbrowser/apis/base_api.py

@@ -31,6 +31,7 @@ LOG = logging.getLogger(__name__)
 def get_api(user, interface):
   from jobbrowser.apis.bundle_api import BundleApi
   from jobbrowser.apis.data_eng_api import DataEngClusterApi, DataEngJobApi
+  from jobbrowser.apis.clusters import ClusterApi
   from jobbrowser.apis.data_warehouse import DataWarehouseClusterApi
   from jobbrowser.apis.livy_api import LivySessionsApi, LivyJobApi
   from jobbrowser.apis.job_api import JobApi
@@ -48,6 +49,8 @@ def get_api(user, interface):
     return ScheduleApi(user)
   elif interface == 'bundles':
     return BundleApi(user)
+  elif interface == 'engines':
+    return ClusterApi(user)
   elif interface == 'dataeng-clusters':
     return DataEngClusterApi(user)
   elif interface == 'dataware-clusters':

+ 129 - 0
apps/jobbrowser/src/jobbrowser/apis/clusters.py

@@ -0,0 +1,129 @@
+#!/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 logging
+
+from datetime import datetime
+from dateutil import parser
+
+from django.utils import timezone
+from django.utils.translation import ugettext as _
+
+from notebook.connectors.altus import DataWarehouse2Api
+
+from jobbrowser.apis.base_api import Api
+
+
+
+LOG = logging.getLogger(__name__)
+
+
+RUNNING_STATES = ('QUEUED', 'RUNNING', 'SUBMITTING')
+
+
+class ClusterApi(Api):
+
+  def __init__(self, user, version=1):
+    super(ClusterApi, self).__init__(user)
+
+    self.version = version
+    self.api = DataWarehouse2Api(self.user) 
+
+
+  def apps(self, filters):
+    #jobs = self.api.list_clusters()
+
+    return {
+      u'status': 0,
+      u'total': 3,
+      u'apps': [
+        {u'status': u'ONLINE', u'name': u'Internal EDH', u'submitted': u'2018-10-04 08:34:39.128886', u'queue': u'group', u'user': u'jo0', u'canWrite': True, u'duration': 0, u'progress': u'1 / 1', u'type': u'GKE 100 nodes 100CPU 20TB', u'id': u'crn:altus:engine:k8s:12a0079b-1591-4ca0-b721-a446bda74e67:cluster:jo0/cbf7bbb1-f956-45e4-a269-d239efbc9996', u'apiStatus': u'RUNNING'},
+        {u'status': u'ONLINE', u'name': u'gke_gcp-eng-dsdw_us-west2-b_impala-demo', u'submitted': u'2018-10-04 08:34:39.128881', u'queue': u'group', u'user': u'r0', u'canWrite': True, u'duration': 0, u'progress': u'1 / 1', u'type': u'GKE 4 nodes 16CPU 64GB', u'id': u'crn:altus:engine:k8s:12a0079b-1591-4ca0-b721-a446bda74e67:cluster:r0/0da5e627-ee33-45c5-9179-cc6b95008d2e', u'apiStatus': u'RUNNING'},
+        {u'status': u'ONLINE', u'name': u'DW-fraud', u'submitted': u'2018-10-04 08:34:39.128881', u'queue': u'group', u'user': u'r0', u'canWrite': True, u'duration': 0, u'progress': u'1 / 1', u'type': u'OpenShift 50 nodes 30CPU 2TB', u'id': u'crn:altus:engine:k8s:12a0079b-1591-4ca0-b721-a446bda74e67:cluster:r0/0da5e627-ee33-45c5-9179-cc6b95008d2e', u'apiStatus': u'RUNNING'},
+      ]
+    }
+
+    return {
+      'apps': [{
+        'id': app['crn'],
+        'name': '%(clusterName)s' % app,
+        'status': app['status'],
+        'apiStatus': self._api_status(app['status']),
+        'type': 'Altus %(workersGroupSize)sX %(instanceType)s %(cdhVersion)s' % app,
+        'user': app['clusterName'].split('-', 1)[0],
+        'progress': app.get('progress', 100),
+        'queue': 'group',
+        'duration': ((datetime.now() - parser.parse(app['creationDate']).replace(tzinfo=None)).seconds * 1000) if app['creationDate'] else 0,
+        'submitted': app['creationDate'],
+        'canWrite': True
+      } for app in sorted(jobs['clusters'], key=lambda a: a['creationDate'], reverse=True)],
+      'total': len(jobs['clusters'])
+    }
+
+
+  def app(self, appid):
+    handle = self.api.describe_cluster(cluster_id=appid)
+
+    cluster = handle['cluster']
+
+    common = {
+        'id': cluster['crn'],
+        'name': cluster['clusterName'],
+        'status': cluster['status'],
+        'apiStatus': self._api_status(cluster['status']),
+        'progress': 50 if self._api_status(cluster['status']) == 'RUNNING' else 100,
+        'duration': 10 * 3600,
+        'submitted': cluster['creationDate'],
+        'type': 'dataware2-cluster' if self.version == 2 else 'dataware-cluster',
+        'canWrite': True
+    }
+
+    common['properties'] = {
+      'properties': cluster
+    }
+
+    return common
+
+  def action(self, appid, action):
+    message = {'message': '', 'status': 0}
+
+    if action.get('action') == 'kill':
+      for _id in appid:
+        result = self.api.delete_cluster(_id)
+        if result.get('error'):
+          message['message'] = result.get('error')
+          message['status'] = -1
+        elif result.get('contents') and message.get('status') != -1:
+          message['message'] = result.get('contents')
+
+    return message;
+
+
+  def logs(self, appid, app_type, log_name=None, is_embeddable=False):
+    return {'logs': ''}
+
+
+  def profile(self, appid, app_type, app_property):
+    return {}
+
+  def _api_status(self, status):
+    if status in ['CREATING', 'CREATED', 'ONLINE', 'SCALING_UP', 'SCALING_DOWN', 'STOPPED', 'STARTING']: # ONLINE ... are from K8s
+      return 'RUNNING'
+    elif status in ['ARCHIVING', 'COMPLETED', 'TERMINATING']:
+      return 'SUCCEEDED'
+    else:
+      return 'FAILED' # KILLED and FAILED

+ 1 - 1
apps/jobbrowser/src/jobbrowser/apis/data_warehouse.py

@@ -53,7 +53,7 @@ class DataWarehouseClusterApi(Api):
         'name': '%(clusterName)s' % app,
         'status': app['status'],
         'apiStatus': self._api_status(app['status']),
-        'type': 'Altus %(workersGroupSize)sX %(instanceType)s %(cdhVersion)s' % app,
+        'type': '%(instanceType)s' % app, #'Altus %(workersGroupSize)sX %(instanceType)s %(cdhVersion)s' % app,
         'user': app['clusterName'].split('-', 1)[0],
         'progress': app.get('progress', 100),
         'queue': 'group',

+ 128 - 10
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -106,18 +106,29 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         <div class="nav-collapse">
           <ul class="nav">
             <li class="app-header">
+              <!-- ko ifnot: $root.cluster() && $root.cluster()['type'].indexOf("altus-dw") !== -1 -->
               <a href="/${app_name}">
                 <img src="${ static('jobbrowser/art/icon_jobbrowser_48.png') }" class="app-icon" alt="${ _('Job browser icon') }"/>
                 <!-- ko if: !$root.cluster() || $root.cluster()['type'].indexOf("altus") == -1 -->
                   ${ _('Job Browser') }
                 <!-- /ko -->
-                <!-- ko if: $root.cluster() && $root.cluster()['type'].indexOf("altus-dw") !== -1 -->
-                  ${ _('Data Warehouse') }
+                <!-- ko if: $root.cluster() && $root.cluster()['type'].indexOf("altus-engines") !== -1 -->
+                  ${ _('Clusters') }
                 <!-- /ko -->
                 <!-- ko if: $root.cluster() && $root.cluster()['type'].indexOf("altus-de") !== -1 -->
                   ${ _('Data Engineering') }
                 <!-- /ko -->
               </a>
+              <!-- /ko -->
+              <!-- ko if: $root.cluster() && $root.cluster()['type'].indexOf("altus-dw") !== -1 -->
+                <span>
+                  <a data-bind="click: function() { huePubSub.publish('context.selector.set.cluster', 'engines'); }">
+                    <img src="${ static('jobbrowser/art/icon_jobbrowser_48.png') }" class="app-icon" alt="${ _('Job browser icon') }"/>
+                    ${ _('Clusters') }
+                  </a>
+                  > gke_gcp-eng-dsdw_us-west2-b_impala-demo
+                </span>
+              <!-- /ko -->
             </li>
             <!-- ko foreach: availableInterfaces -->
               <li data-bind="css: {'active': $parent.interface() === interface}, visible: condition()">
@@ -233,6 +244,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
                 <!-- ko ifnot: $root.isMini -->
                 <!-- ko if: $root.interface() !== 'schedules' && $root.interface() !== 'bundles' -->
+
+                  <!-- ko if: $root.interface() && $root.interface().indexOf('engines') === -1 && $root.interface().indexOf('cluster') === -1 -->
                   ${_('in the last')} <input class="input-mini no-margin" type="number" min="1" max="3650" data-bind="value: jobs.timeValueFilter">
                   <select class="input-small no-margin" data-bind="value: jobs.timeUnitFilter, options: jobs.timeUnitFilterUnits, optionsText: 'name', optionsValue: 'value'">
                     <option value="days">${_('days')}</option>
@@ -243,19 +256,41 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
                   <a class="btn" title="${ _('Refresh') }" data-bind="click: jobs.updateJobs">
                     <i class="fa fa-refresh"></i>
                   </a>
+                  <!-- /ko -->
 
                   <a class="btn" title="${ _('Create cluster') }" data-bind="visible: $root.cluster() && $root.cluster()['type'].indexOf('altus') >= 0, toggle: jobs.createClusterShow">
-                    <!-- ko if: jobs.createClusterShow-->
+                    <!-- ko if: jobs.createClusterShow -->
                       ${ _('Cancel') }
                     <!-- /ko -->
-                    <!-- ko ifnot: jobs.createClusterShow-->
-                      ${ _('Create') }
+                    <!-- ko if: !jobs.createClusterShow() && $root.cluster() && $root.cluster()['type'] != 'altus-engines' -->
+                      ${ _('Add Service') }
+                    <!-- /ko -->
+                    <!-- ko if: !jobs.createClusterShow() && $root.cluster() && $root.cluster()['type'] == 'altus-engines' -->
+                      ${ _('Create / Register') }
                     <!-- /ko -->
                   </a>
 
                   <span data-bind="visible: jobs.createClusterShow">
-                    <input type="text" data-bind="clearable: jobs.createClusterName, valueUpdate: 'afterkeydown'" placeholder="${_('Cluster name')}">
-                    <input type="number" data-bind="value: jobs.createClusterWorkers, valueUpdate: 'afterkeydown'" class="input-small" placeholder="${_('Size')}">${ _('workers') }
+                    <input type="text" data-bind="clearable: jobs.createClusterName, valueUpdate: 'afterkeydown'" class="input-small" placeholder="${_('Name')}">
+                    <input type="number" data-bind="value: jobs.createClusterWorkers, valueUpdate: 'afterkeydown'" class="input-mini" placeholder="${_('Size')}">
+                    <!-- ko if: $root.cluster() && $root.cluster()['type'] != 'altus-engines' -->
+                      ${ _('workers') }
+                      <select class="input-medium">
+                        <option>Data Warehouse</option>
+                        <option>IoT</option>
+                        <option>Auditing</option>
+                        <option>Troubleshooting</option>
+                      </select>
+                    <!-- /ko -->
+                    <!-- ko if: $root.cluster() && $root.cluster()['type'] == 'altus-engines' -->
+                      ${ _('nodes') }
+                      Environment
+                      <select>
+                        <option>AWS-finance-secure</option>
+                        <option>GCE-east</option>
+                        <option>OpenShift-prem</option>
+                      </select>
+                    <!-- /ko -->
 
                     <button class="btn" data-bind="click: jobs.createCluster, enable: jobs.createClusterName().length > 0 && jobs.createClusterWorkers() > 0" title="${ _('Start creation') }">
                       <i class="fa fa-plus"></i>
@@ -339,6 +374,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
                   <div data-bind="template: { name: 'dataware2-clusters-page${ SUFFIX }' }"></div>
                 <!-- /ko -->
 
+                <!-- ko if: mainType() == 'engines' -->
+                  <div data-bind="template: { name: 'engines-page${ SUFFIX }' }"></div>
+                <!-- /ko -->
+
                 <!-- ko if: mainType() == 'livy-sessions' -->
                   <div class="jb-panel" data-bind="template: { name: 'livy-session-page${ SUFFIX }' }"></div>
                 <!-- /ko -->
@@ -1166,6 +1205,74 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 </script>
 
 
+<script type="text/html" id="engines-page${ SUFFIX }">
+
+  <div class="row-fluid">
+    <div data-bind="css:{'span2': !$root.isMini(), 'span12': $root.isMini() }">
+      <div class="sidebar-nav">
+        <ul class="nav nav-list">
+          <li class="nav-header">${ _('Id') }</li>
+          <li><span class="break-word" data-bind="text: id"></span></li>
+          <li class="nav-header">${ _('Type') }</li>
+          <li><span data-bind="text: properties['properties']['cdhVersion']"></span></li>
+          <li class="nav-header">${ _('Status') }</li>
+          <li><span data-bind="text: status"></span></li>
+          <li class="nav-header">${ _('Workers Online') }</li>
+          <li>
+            <span data-bind="text: properties['properties']['workerReplicasOnline']"></span>
+            /
+            <span data-bind="text: properties['properties']['workerReplicas']"></span>
+            <!-- ko if: status() == 'SCALING_UP' || status() == 'SCALING_DOWN' -->
+              <i class="fa fa-spinner fa-spin fa-fw"></i>
+            <!-- /ko -->
+          </li>
+          <li>
+            ##<div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-warning': apiStatus() !== 'FAILED' && progress() < 100, 'progress-success': apiStatus() !== 'FAILED' && progress() === 100, 'progress-danger': apiStatus() === 'FAILED'}">
+            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-warning': status() == 'SCALING_UP' || status() == 'SCALING_DOWN', 'progress-success': status() == 'ONLINE', 'progress-danger': apiStatus() === 'FAILED'}">
+              <div class="bar" data-bind="style: {'width': Math.min(properties['properties']['workerReplicas'](), properties['properties']['workerReplicasOnline']()) / Math.max(properties['properties']['workerReplicasOnline'](), properties['properties']['workerReplicas']()) * 100 + '%'}"></div>
+            </div>
+          </li>
+          <li class="nav-header">${ _('Impalad') }</li>
+          <li>
+            <a href="#" data-bind="attr: { 'href': properties['properties']['coordinatorEndpoint']['publicHost']() + ':25000' }">
+              <span data-bind="text: properties['properties']['coordinatorEndpoint']['publicHost']"></span>
+              <i class="fa fa-external-link fa-fw"></i>
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div data-bind="css:{'span10': !$root.isMini(), 'span12 no-margin': $root.isMini() }">
+      <div class="pull-right" data-bind="template: { name: 'job-actions${ SUFFIX }' }"></div>
+    </div>
+    <div>
+
+    <a class="btn" title="${ _('Refresh') }" data-bind="click: function() { fetchJob(); }">
+      <i class="fa fa-refresh"></i>
+    </a>
+
+    <button class="btn" title="${ _('Resize cluster') }" data-bind="enable: status() == 'ONLINE', visible: $root.cluster() && $root.cluster()['type'] == 'altus-dw2', toggle: updateClusterShow">
+      <!-- ko if: updateClusterShow-->
+        ${ _('Cancel') }
+      <!-- /ko -->
+      <!-- ko ifnot: updateClusterShow-->
+        ${ _('Resize') }
+      <!-- /ko -->
+    </button>
+
+    <span data-bind="visible: updateClusterShow">
+      <input type="number" data-bind="value: updateClusterWorkers, valueUpdate: 'afterkeydown'" class="input-small" placeholder="${_('Size')}">${ _('workers') }
+
+      <button class="btn" data-bind="click: updateCluster, enable: updateClusterWorkers() > 0 && updateClusterWorkers() != properties['properties']['workerReplicas']()" title="${ _('Start resizing') }">
+        <i class="fa fa-refresh"></i>
+      </button>
+    </span>
+
+    </div>
+  </div>
+</script>
+
+
 <script type="text/html" id="dataware2-clusters-page${ SUFFIX }">
 
   <div class="row-fluid">
@@ -2298,6 +2405,11 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       var lastUpdateJobRequest = null;
 
       self._fetchJob = function (callback) {
+        if (vm.interface() == 'engines') {
+          huePubSub.publish('context.selector.set.cluster', 'AltusV2');
+          return;
+        }
+
         return $.post("/jobbrowser/api/job/" + vm.interface(), {
           app_id: ko.mapping.toJSON(self.id),
           interface: ko.mapping.toJSON(vm.interface)
@@ -2527,7 +2639,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           self.updateClusterWorkers(self.properties['properties']['workerReplicas']());
         }
       });
-      self.updateClusterWorkers = ko.observable(3);
+      self.updateClusterWorkers = ko.observable(1);
 
       ## TODO Move to control
       self.updateCluster = function() {
@@ -2653,7 +2765,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       self.selectedJobs = ko.observableArray();
 
       self.hasKill = ko.pureComputed(function() {
-        return ['jobs', 'workflows', 'schedules', 'bundles', 'queries', 'dataeng-jobs', 'dataeng-clusters', 'dataware-clusters', 'dataware2-clusters'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
+        return ['jobs', 'workflows', 'schedules', 'bundles', 'queries', 'dataeng-jobs', 'dataeng-clusters', 'dataware-clusters', 'dataware2-clusters', 'engines'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
       });
       self.killEnabled = ko.pureComputed(function() {
         return self.hasKill() && self.selectedJobs().length > 0 && $.grep(self.selectedJobs(), function(job) {
@@ -2966,6 +3078,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         var dataEngInterfaceCondition = function () {
           return self.cluster() && self.cluster()['type'] == 'altus-de';
         };
+        var enginesInterfaceCondition = function () {
+          return self.cluster() && self.cluster()['type'] == 'altus-engines';
+        };
         var dataWarehouseInterfaceCondition = function () {
           return self.cluster() && self.cluster()['type'] == 'altus-dw';
         };
@@ -2990,7 +3105,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           {'interface': 'dataeng-jobs', 'label': '${ _ko('Jobs') }', 'condition': dataEngInterfaceCondition},
           {'interface': 'dataeng-clusters', 'label': '${ _ko('Clusters') }', 'condition': dataEngInterfaceCondition},
           {'interface': 'dataware-clusters', 'label': '${ _ko('Clusters') }', 'condition': dataWarehouseInterfaceCondition},
-          {'interface': 'dataware2-clusters', 'label': '${ _ko('Clusters') }', 'condition': dataWarehouse2InterfaceCondition},
+          {'interface': 'dataware2-clusters', 'label': '${ _ko('Services') }', 'condition': dataWarehouse2InterfaceCondition},
+          {'interface': 'engines-cluster-permissions', 'label': '${ _ko('Permissions') }', 'condition': dataWarehouse2InterfaceCondition},
+          {'interface': 'engines', 'label': '${ _ko('Engines') }', 'condition': enginesInterfaceCondition},
           {'interface': 'queries', 'label': '${ _ko('Queries') }', 'condition': queryInterfaceCondition},
           {'interface': 'workflows', 'label': '${ _ko('Workflows') }', 'condition': schedulerInterfaceCondition},
           {'interface': 'schedules', 'label': '${ _ko('Schedules') }', 'condition': schedulerInterfaceCondition},
@@ -3176,6 +3293,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           case 'dataeng-clusters':
           case 'dataware-clusters':
           case 'dataware2-clusters':
+          case 'engines':
           case 'dataeng-jobs':
           case 'livy-sessions':
             self.selectInterface(h);

+ 1 - 1
desktop/core/src/desktop/api2.py

@@ -82,7 +82,7 @@ def get_context_namespaces(request, interface):
   namespaces = []
 
   clusters = get_clusters(request.user).values()
-
+ 
   namespaces.extend([{
       'id': cluster['id'],
       'name': cluster['name'],

+ 23 - 21
desktop/core/src/desktop/conf.py

@@ -1612,29 +1612,31 @@ def get_clusters(user):
   clusters = []
   cluster_config = CLUSTERS.get()
 
-  # Get core standalone config if there
-  if not IS_MULTICLUSTER_ONLY.get() or [cluster_config for i in cluster_config if i == 'Default']:
-    clusters.append(
-      (CLUSTER_ID.get(), {
-        'id': CLUSTER_ID.get(),
-        'name': CLUSTER_ID.get(),
-        'type': 'direct',
-        'interface': 'all',
-        'server_host': 'all'
+  for i in cluster_config:
+    if i != 'Default':
+      # Get additional remote multi clusters
+      clusters.append(
+        (i, {
+          'id': i,
+          'name': cluster_config[i].NAME.get() or i,
+          'type': cluster_config[i].TYPE.get(),
+          'interface': cluster_config[i].INTERFACE.get() or 'hive',
+          'server_host': cluster_config[i].SERVER_HOST.get()
         }
       )
-    )
-
-  # Get additional remote multi clusters
-  clusters.extend([
-    (i, {
-      'id': i,
-      'name': cluster_config[i].NAME.get() or i,
-      'type': cluster_config[i].TYPE.get(),
-      'interface': cluster_config[i].INTERFACE.get() or 'hive',
-      'server_host': cluster_config[i].SERVER_HOST.get()
-    }) for i in cluster_config if i != 'Default'
-  ])
+      )
+    elif not IS_MULTICLUSTER_ONLY.get() or i == 'Default':
+      # Get core standalone config if there
+      clusters.append(
+        (CLUSTER_ID.get(), {
+          'id': CLUSTER_ID.get(),
+          'name': CLUSTER_ID.get(),
+          'type': 'direct',
+          'interface': 'all',
+          'server_host': 'all'
+          }
+        )
+      )
 
   return OrderedDict(clusters)
 

+ 9 - 8
desktop/core/src/desktop/templates/ko_components/ko_multi_cluster_sidebar.mako

@@ -114,7 +114,8 @@ from desktop.views import _ko
           url: '/',
           icon: 'fa fa-home'
         }, {
-          label: '${ _('Data Assistant') }',
+          ##label: '${ _('Data Assistant') }',
+          label: '${ _('Data Warehouse') }',
           icon: 'altus-icon altus-adb-query',
           items: [{
               label: '${ _('Editor') }',
@@ -126,12 +127,12 @@ from desktop.views import _ko
               label: '${ _('Files') }',
               url: '/filebrowser/view=S3A://'
             },{
-              label: '${ _('Dashboard') }',
-              url: '/dashboard/new_search'
-            },{
-              label: '${ _('Scheduler') }',
-              url: '/oozie/editor/coordinator/new/'
-            },{
+##              label: '${ _('Dashboard') }',
+##              url: '/dashboard/new_search'
+##            },{
+##              label: '${ _('Scheduler') }',
+##              url: '/oozie/editor/coordinator/new/'
+##            },{
               label: '${ _('Importer') }',
               url: '/indexer/importer'
             }
@@ -174,7 +175,7 @@ from desktop.views import _ko
       }, {
         label: '${ _('Admin') }',
         items: [{
-            label: '${ _('Clusters') }',
+            label: '${ _('Engines') }',
             url: '/hue/jobbrowser',
             icon: 'altus-icon altus-de'
           },{

+ 14 - 1
desktop/libs/notebook/src/notebook/connectors/altus.py

@@ -288,6 +288,17 @@ class DataWarehouse2Api():
     self._root = Resource(self._client)
 
 
+  def list_k8_clusters(self):
+    clusters = self._root.post('listClusters', contenttype="application/json")
+    for cluster in clusters['clusters']:
+      cluster['clusterName'] = cluster['name']
+      cluster['workersGroupSize'] = cluster['workerReplicas']
+      cluster['instanceType'] = '%(workerCpuCores)s CPU %(workerMemoryInGib)s Memory' % cluster
+      cluster['progress'] = '%(workerReplicasOnline)s / %(workerReplicas)s' % cluster
+      cluster['creationDate'] = str(datetime.now())
+    return clusters
+
+
   def create_cluster(self, cloud_provider, cluster_name, cdh_version, public_key, instance_type, environment_name, workers_group_size=3, namespace_name=None,
         cloudera_manager_username='hue', cloudera_manager_password='hue'):
     data = {
@@ -306,7 +317,7 @@ class DataWarehouse2Api():
     for cluster in clusters['clusters']:
       cluster['clusterName'] = cluster['name']
       cluster['workersGroupSize'] = cluster['workerReplicas']
-      cluster['instanceType'] = '%(workerCpuCores)s CPU %(workerMemoryInGib)s Memory' % cluster
+      cluster['instanceType'] = 'Data Warehouse'# '%(workerCpuCores)s CPU %(workerMemoryInGib)s Memory' % cluster
       cluster['progress'] = '%(workerReplicasOnline)s / %(workerReplicas)s' % cluster
       cluster['creationDate'] = str(datetime.now())
     return clusters
@@ -334,3 +345,5 @@ class DataWarehouse2Api():
 
     
     return self._root.post('updateCluster', data=json.dumps(data), contenttype="application/json")
+
+