Browse Source

HUE-8591 [cluster] Adding cluster resize capabilities on the cluster page

Romain Rigaux 7 năm trước cách đây
mục cha
commit
645a3571b1

+ 51 - 7
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -244,11 +244,11 @@ ${ commonheader("Data Warehouse", "jobbrowser", user, request) | n,unicode }
                       ${ _('Create') }
                     <!-- /ko -->
                   </a>
-                  
+
                   <span data-bind="visible: jobs.createClusterShow">
-                    <input type="text" data-bind="clearable: jobs.createClusterName" placeholder="${_('Cluster name')}">
-                    <input type="number" data-bind="value: jobs.createClusterWorkers" class="input-small" placeholder="${_('Size')}">${ _('workers') }
-                    
+                    <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') }
+
                     <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>
                     </button>
@@ -1150,13 +1150,35 @@ ${ commonheader("Data Warehouse", "jobbrowser", user, request) | n,unicode }
     <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="${ _('Resize cluster') }" data-bind="visible: $root.compute() && $root.compute()['type'] == 'altus-dw2', toggle: updateClusterShow">
+      <!-- ko if: updateClusterShow-->
+        ${ _('Cancel') }
+      <!-- /ko -->
+      <!-- ko ifnot: updateClusterShow-->
+        ${ _('Resize') }
+      <!-- /ko -->
+    </a>
+
+    <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>
 
   <br>
 
-  <button class="btn" title="${ _('Troubleshoot') }" data-bind="click: troubleshoot">
-    <i class="fa fa-tachometer"></i> ${ _('Troubleshoot') }
-  </button>
+  <!-- ko if: mainType() == 'dataeng-clusters' || mainType() == 'dataware-clusters' -->
+    <button class="btn" title="${ _('Troubleshoot') }" data-bind="click: troubleshoot">
+      <i class="fa fa-tachometer"></i> ${ _('Troubleshoot') }
+    </button>
+  <!-- /ko -->
 </script>
 
 
@@ -2444,6 +2466,28 @@ ${ commonheader("Data Warehouse", "jobbrowser", user, request) | n,unicode }
         }
       }
 
+      self.updateClusterShow = ko.observable(false);
+      self.updateClusterShow.subscribe(function(newVal) {
+        if (newVal) {
+          self.updateClusterWorkers(self.properties['properties']['workerReplicas']());
+        }
+      });
+      self.updateClusterWorkers = ko.observable(3);
+
+      ## TODO Move to control
+      self.updateCluster = function() {
+        $.post("/metadata/api/analytic_db/update_cluster/", {
+          "is_k8": vm.interface().indexOf('dataware2-clusters') != -1,
+          "cluster_name": self.id(),
+          "workers_group_size": self.updateClusterWorkers(),
+        }, function(data) {
+          console.log(ko.mapping.toJSON(data));
+          $(document).trigger("info", ko.mapping.toJSON(data));
+          self.updateJob();
+        });
+        self.updateClusterShow(false);
+      }
+
       self.troubleshoot = function (action) {
         $.post('/metadata/api/workload_analytics/get_operation_execution_details', {
           operation_id: ko.mapping.toJSON(self.id())

+ 23 - 0
desktop/libs/metadata/src/metadata/analytic_db_api.py

@@ -77,3 +77,26 @@ def create_cluster(request):
     response['message'] = 'Data Warehouse API: %s' % data['details']
 
   return JsonResponse(response)
+
+
+@require_POST
+@error_handler
+def update_cluster(request):
+  response = {'status': -1}
+
+  cluster_name = request.POST.get('cluster_name') or 'Analytic Cluster'
+  workers_group_size = int(request.POST.get('workers_group_size', '3'))
+
+  api = DataWarehouse2Api(request.user)
+  data = api.update_cluster(
+      cluster_name=cluster_name,
+      workers_group_size=workers_group_size
+  )
+
+  if data:
+    response['status'] = 0
+    response['data'] = data
+  else:
+    response['message'] = 'Data Warehouse API: %s' % data['details']
+
+  return JsonResponse(response)

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

@@ -88,6 +88,7 @@ urlpatterns += [
 # Altus API
 urlpatterns += [
   url(r'^api/analytic_db/create_cluster/?$', analytic_db_api.create_cluster, name='create_cluster'),
+  url(r'^api/analytic_db/update_cluster/?$', analytic_db_api.update_cluster, name='update_cluster'),
 ]
 urlpatterns += [
   url(r'^api/dataeng/create_cluster/?$', dataeng_api.create_cluster, name='create_cluster'),

+ 6 - 11
desktop/libs/notebook/src/notebook/connectors/altus.py

@@ -315,19 +315,14 @@ class DataWarehouse2Api():
 
   def describe_cluster(self, cluster_id):
     data = json.dumps({'clusterName': cluster_id})
-    cluster = self._root.post('describeCluster', data=data, contenttype="application/json")
-    cluster['creationDate'] = str(datetime.now())
-    return {'cluster': cluster}
+    return self._root.post('describeCluster', data=data, contenttype="application/json")
 
 
-  def update_cluster(self, cluster_name, cdh_version, cpu_minimum, cpu_maximum, memory_minimum, memory_maximum):
-    params = {
+  def update_cluster(self, cluster_name, workers_group_size):
+    data = {
       'clusterName': cluster_name,
-      'cdhVersion': cdh_version,
-      'cpuMinimum': cpu_minimum,
-      'cpuMaximum': cpu_maximum,
-      'memoryMinimum': memory_minimum,
-      'memoryMaximum': memory_maximum,
+      'workerReplicas': workers_group_size,
     }
 
-    return _exec('dw', 'updateCluster', params)
+    
+    return self._root.post('updateCluster', data=json.dumps(data), contenttype="application/json")