Browse Source

HUE-8330 [editor] Add compute cluster dropdown

Still need:
- pull from compute list API
- update autocomplete with the namespace of the compute
- add the namespace of the compute to the API
- unify dropdown to look like the DB and namespace dropdown, probably use fa-cluster icon for it
Romain Rigaux 7 years ago
parent
commit
beac9d54f7

+ 16 - 16
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -229,7 +229,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def execute(self, notebook, snippet):
   def execute(self, notebook, snippet):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     statement = self._get_current_statement(db, snippet)
     statement = self._get_current_statement(db, snippet)
     session = self._get_session(notebook, snippet['type'])
     session = self._get_session(notebook, snippet['type'])
@@ -263,7 +263,7 @@ class HS2Api(Api):
   @query_error_handler
   @query_error_handler
   def check_status(self, notebook, snippet):
   def check_status(self, notebook, snippet):
     response = {}
     response = {}
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     handle = self._get_handle(snippet)
     handle = self._get_handle(snippet)
     operation = db.get_operation_status(handle)
     operation = db.get_operation_status(handle)
@@ -284,7 +284,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def fetch_result(self, notebook, snippet, rows, start_over):
   def fetch_result(self, notebook, snippet, rows, start_over):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     handle = self._get_handle(snippet)
     handle = self._get_handle(snippet)
     try:
     try:
@@ -332,7 +332,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def cancel(self, notebook, snippet):
   def cancel(self, notebook, snippet):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     handle = self._get_handle(snippet)
     handle = self._get_handle(snippet)
     db.cancel_operation(handle)
     db.cancel_operation(handle)
@@ -341,7 +341,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def get_log(self, notebook, snippet, startFrom=None, size=None):
   def get_log(self, notebook, snippet, startFrom=None, size=None):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     handle = self._get_handle(snippet)
     handle = self._get_handle(snippet)
     return db.get_log(handle, start_over=startFrom == 0)
     return db.get_log(handle, start_over=startFrom == 0)
@@ -353,7 +353,7 @@ class HS2Api(Api):
       from impala import conf as impala_conf
       from impala import conf as impala_conf
 
 
     if (snippet['type'] == 'hive' and beeswax_conf.CLOSE_QUERIES.get()) or (snippet['type'] == 'impala' and impala_conf.CLOSE_QUERIES.get()):
     if (snippet['type'] == 'hive' and beeswax_conf.CLOSE_QUERIES.get()) or (snippet['type'] == 'impala' and impala_conf.CLOSE_QUERIES.get()):
-      db = self._get_db(snippet)
+      db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
       try:
       try:
         handle = self._get_handle(snippet)
         handle = self._get_handle(snippet)
@@ -371,7 +371,7 @@ class HS2Api(Api):
   @query_error_handler
   @query_error_handler
   def download(self, notebook, snippet, format, user_agent=None):
   def download(self, notebook, snippet, format, user_agent=None):
     try:
     try:
-      db = self._get_db(snippet)
+      db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
       handle = self._get_handle(snippet)
       handle = self._get_handle(snippet)
       # Test handle to verify if still valid
       # Test handle to verify if still valid
       db.fetch(handle, start_over=True, rows=1)
       db.fetch(handle, start_over=True, rows=1)
@@ -471,7 +471,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def explain(self, notebook, snippet):
   def explain(self, notebook, snippet):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     session = self._get_session(notebook, snippet['type'])
     session = self._get_session(notebook, snippet['type'])
 
 
@@ -493,7 +493,7 @@ class HS2Api(Api):
 
 
   @query_error_handler
   @query_error_handler
   def export_data_as_hdfs_file(self, snippet, target_file, overwrite):
   def export_data_as_hdfs_file(self, snippet, target_file, overwrite):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     handle = self._get_handle(snippet)
     handle = self._get_handle(snippet)
     max_rows = DOWNLOAD_ROW_LIMIT.get()
     max_rows = DOWNLOAD_ROW_LIMIT.get()
@@ -505,7 +505,7 @@ class HS2Api(Api):
 
 
 
 
   def export_data_as_table(self, notebook, snippet, destination, is_temporary=False, location=None):
   def export_data_as_table(self, notebook, snippet, destination, is_temporary=False, location=None):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     session = self._get_session(notebook, snippet['type'])
     session = self._get_session(notebook, snippet['type'])
@@ -529,7 +529,7 @@ class HS2Api(Api):
 
 
 
 
   def export_large_data_to_hdfs(self, notebook, snippet, destination):
   def export_large_data_to_hdfs(self, notebook, snippet, destination):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     session = self._get_session(notebook, snippet['type'])
     session = self._get_session(notebook, snippet['type'])
@@ -563,7 +563,7 @@ DROP TABLE IF EXISTS `%(table)s`;
 
 
 
 
   def statement_risk(self, notebook, snippet):
   def statement_risk(self, notebook, snippet):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     query = response['statement']
     query = response['statement']
@@ -574,7 +574,7 @@ DROP TABLE IF EXISTS `%(table)s`;
 
 
 
 
   def statement_compatibility(self, notebook, snippet, source_platform, target_platform):
   def statement_compatibility(self, notebook, snippet, source_platform, target_platform):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     query = response['statement']
     query = response['statement']
@@ -585,7 +585,7 @@ DROP TABLE IF EXISTS `%(table)s`;
 
 
 
 
   def statement_similarity(self, notebook, snippet, source_platform):
   def statement_similarity(self, notebook, snippet, source_platform):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     response = self._get_current_statement(db, snippet)
     response = self._get_current_statement(db, snippet)
     query = response['statement']
     query = response['statement']
@@ -736,11 +736,11 @@ DROP TABLE IF EXISTS `%(table)s`;
 
 
 
 
   def get_browse_query(self, snippet, database, table, partition_spec=None):
   def get_browse_query(self, snippet, database, table, partition_spec=None):
-    db = self._get_db(snippet)
+    db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
     table = db.get_table(database, table)
     table = db.get_table(database, table)
     if table.is_impala_only:
     if table.is_impala_only:
       snippet['type'] = 'impala'
       snippet['type'] = 'impala'
-      db = self._get_db(snippet)
+      db = self._get_db(snippet, cluster=snippet.get('selectedCompute'))
 
 
     if partition_spec is not None:
     if partition_spec is not None:
       decoded_spec = urllib.unquote(partition_spec)
       decoded_spec = urllib.unquote(partition_spec)

+ 4 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -356,6 +356,9 @@ var EditorViewModel = (function() {
       return ApiHelper.getInstance(vm);
       return ApiHelper.getInstance(vm);
     };
     };
 
 
+    self.computes = ko.observableArray(['default', 'nightlyc6', 'selfserviceanalytics']);
+    self.selectedCompute = ko.observable(typeof snippet.selectedCompute != "undefined" && snippet.selectedCompute != null ? snippet.selectedCompute : null);
+
     self.database = ko.observable();
     self.database = ko.observable();
     var previousDatabase = null;
     var previousDatabase = null;
     self.sourceContext = ko.observable(snippet.sourceContext || vm.sourceContext);
     self.sourceContext = ko.observable(snippet.sourceContext || vm.sourceContext);
@@ -1128,6 +1131,7 @@ var EditorViewModel = (function() {
         properties: self.properties,
         properties: self.properties,
         result: self.result.getContext(),
         result: self.result.getContext(),
         database: self.database,
         database: self.database,
+        selectedCompute: self.selectedCompute(),
         wasBatchExecuted: self.wasBatchExecuted()
         wasBatchExecuted: self.wasBatchExecuted()
       };
       };
     };
     };

+ 3 - 0
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -940,6 +940,9 @@ ${ sqlSyntaxDropdown.sqlSyntaxDropdown() }
     <!-- ko template: { name: 'query-redacted${ suffix }' } --><!-- /ko -->
     <!-- ko template: { name: 'query-redacted${ suffix }' } --><!-- /ko -->
     <!-- ko template: { name: 'longer-operation${ suffix }' } --><!-- /ko -->
     <!-- ko template: { name: 'longer-operation${ suffix }' } --><!-- /ko -->
     <span class="execution-timer" data-bind="visible: type() != 'text' && status() != 'ready' && status() != 'loading', text: result.executionTime().toHHMMSS()" title="${ _('Execution time') }"></span>
     <span class="execution-timer" data-bind="visible: type() != 'text' && status() != 'ready' && status() != 'loading', text: result.executionTime().toHHMMSS()" title="${ _('Execution time') }"></span>
+
+    <select data-bind="selectize: computes, value: selectedCompute" class="input-medium"></select>
+
     <!-- ko if: availableDatabases().length > 0 && isSqlDialect() -->
     <!-- ko if: availableDatabases().length > 0 && isSqlDialect() -->
     <div class="margin-left-10" data-bind="component: { name: 'hue-drop-down', params: { icon: 'fa-database', value: database, entries: availableDatabases, foreachVisible: true, searchable: true, linkTitle: '${ _ko('Active database') }' } }" style="display: inline-block"></div>
     <div class="margin-left-10" data-bind="component: { name: 'hue-drop-down', params: { icon: 'fa-database', value: database, entries: availableDatabases, foreachVisible: true, searchable: true, linkTitle: '${ _ko('Active database') }' } }" style="display: inline-block"></div>
     <!-- /ko -->
     <!-- /ko -->