소스 검색

HUE-9000 [editor] Skeleton for adding an operationId in the API

Romain 6 년 전
부모
커밋
d9e9e5c01f

+ 5 - 0
desktop/core/src/desktop/js/apps/notebook2/execution/executable.js

@@ -57,6 +57,7 @@ export default class Executable {
     this.handle = {
       statement_id: 0 // TODO: Get rid of need for initial handle in the backend
     };
+    this.operationId = undefined;
     this.history = undefined;
     this.status = EXECUTION_STATUS.ready;
     this.progress = 0;
@@ -171,6 +172,7 @@ export default class Executable {
         const response = await this.internalExecute();
         this.handle = response.handle;
         this.history = response.history;
+        this.operationId = response.history.uuid;
       } catch (err) {
         const match = ERROR_REGEX.exec(err);
         if (match) {
@@ -352,10 +354,12 @@ export default class Executable {
   async toContext(id) {
     if (this.executor.snippet) {
       return {
+        operationId: id || this.operationId,
         snippet: this.executor.snippet.toContextJson(),
         notebook: await this.executor.snippet.parentNotebook.toContextJson()
       };
     }
+
     const session = await sessionManager.getSession({ type: this.executor.sourceType() });
     const statement = this.getStatement();
     const snippet = {
@@ -385,6 +389,7 @@ export default class Executable {
     };
 
     return {
+      operationId: id,
       snippet: JSON.stringify(snippet),
       notebook: JSON.stringify(notebook)
     };

+ 1 - 2
desktop/core/src/desktop/js/apps/notebook2/notebook.js

@@ -22,7 +22,6 @@ import apiHelper from 'api/apiHelper';
 import hueAnalytics from 'utils/hueAnalytics';
 import huePubSub from 'utils/huePubSub';
 import hueUtils from 'utils/hueUtils';
-import I18n from 'utils/i18n';
 import sessionManager from 'apps/notebook2/execution/sessionManager';
 
 import Snippet, { STATUS as SNIPPET_STATUS } from 'apps/notebook2/snippet';
@@ -32,7 +31,7 @@ export default class Notebook {
     this.parentVm = vm;
     this.id = ko.observable(notebook.id);
     this.uuid = ko.observable(notebook.uuid || hueUtils.UUID());
-    this.name = ko.observable(notebook.name || I18n('My Notebook'));
+    this.name = ko.observable(notebook.name || '');
     this.description = ko.observable(notebook.description || '');
     this.type = ko.observable(notebook.type || 'notebook');
     this.initialType = this.type().replace('query-', '');

+ 36 - 10
desktop/libs/notebook/src/notebook/api.py

@@ -149,6 +149,8 @@ def _execute_notebook(request, notebook, snippet):
       if historify:
         _snippet = [s for s in notebook['snippets'] if s['id'] == snippet['id']][0]
         if 'handle' in response: # No failure
+          if 'result' not in _snippet: # Editor v2
+            _snippet['result'] = {}
           _snippet['result']['handle'] = response['handle']
           _snippet['result']['statements_count'] = response['handle'].get('statements_count', 1)
           _snippet['result']['statement_id'] = response['handle'].get('statement_id', 0)
@@ -209,12 +211,13 @@ def execute(request, engine=None):
 def check_status(request):
   response = {'status': -1}
 
+  operation_id = request.POST.get('operationId')
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
 
-  if not snippet:
-    nb_doc = Document2.objects.get_by_uuid(user=request.user, uuid=notebook['id'])
-    notebook = Notebook(document=nb_doc).get_data()
+  if operation_id or not snippet: # To unify with _get_snippet
+    nb_doc = Document2.objects.get_by_uuid(user=request.user, uuid=operation_id or notebook['id'])
+    notebook = Notebook(document=nb_doc).get_data() # Used below
     snippet = notebook['snippets'][0]
 
   try:
@@ -259,11 +262,15 @@ def check_status(request):
 def fetch_result_data(request):
   response = {'status': -1}
 
+  operation_id = request.POST.get('operationId')
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
+
   rows = json.loads(request.POST.get('rows', '100'))
   start_over = json.loads(request.POST.get('startOver', 'false'))
 
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
+
   with opentracing.tracer.start_span('notebook-fetch_result_data') as span:
     response['result'] = get_api(request, snippet).fetch_result(notebook, snippet, rows, start_over)
 
@@ -289,9 +296,12 @@ def fetch_result_data(request):
 def fetch_result_metadata(request):
   response = {'status': -1}
 
+  operation_id = request.POST.get('operationId')
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
 
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
+
   with opentracing.tracer.start_span('notebook-fetch_result_metadata') as span:
     response['result'] = get_api(request, snippet).fetch_result_metadata(notebook, snippet)
 
@@ -312,9 +322,12 @@ def fetch_result_metadata(request):
 def fetch_result_size(request):
   response = {'status': -1}
 
+  operation_id = request.POST.get('operationId')
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
 
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
+
   with opentracing.tracer.start_span('notebook-fetch_result_size') as span:
     response['result'] = get_api(request, snippet).fetch_result_size(notebook, snippet)
 
@@ -336,9 +349,10 @@ def cancel_statement(request):
   response = {'status': -1}
 
   notebook = json.loads(request.POST.get('notebook', '{}'))
-  nb_doc = Document2.objects.get_by_uuid(user=request.user, uuid=notebook['uuid'])
-  notebook = Notebook(document=nb_doc).get_data()
-  snippet = notebook['snippets'][0]
+  snippet = None
+  operation_id = request.POST.get('operationId') or notebook['uuid']
+
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
 
   with opentracing.tracer.start_span('notebook-cancel_statement') as span:
     response['result'] = get_api(request, snippet).cancel(notebook, snippet)
@@ -360,14 +374,18 @@ def cancel_statement(request):
 def get_logs(request):
   response = {'status': -1}
 
+  operation_id = request.POST.get('operationId')
   notebook = json.loads(request.POST.get('notebook', '{}'))
   snippet = json.loads(request.POST.get('snippet', '{}'))
+
   startFrom = request.POST.get('from')
   startFrom = int(startFrom) if startFrom else None
   size = request.POST.get('size')
   size = int(size) if size else None
   full_log = smart_str(request.POST.get('full_log', ''))
 
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
+
   db = get_api(request, snippet)
 
   with opentracing.tracer.start_span('notebook-get_logs') as span:
@@ -615,11 +633,11 @@ def close_notebook(request):
 def close_statement(request):
   response = {'status': -1}
 
-  # Passed by check_document_access_permission but unused by APIs
   notebook = json.loads(request.POST.get('notebook', '{}'))
-  nb_doc = Document2.objects.get_by_uuid(user=request.user, uuid=notebook['uuid'])
-  notebook = Notebook(document=nb_doc).get_data()
-  snippet = notebook['snippets'][0]
+  snippet = None
+  operation_id = request.POST.get('operationId') or notebook['uuid']
+
+  snippet = _get_snippet(request.user, notebook, snippet, operation_id)
 
   try:
     with opentracing.tracer.start_span('notebook-close_statement') as span:
@@ -918,3 +936,11 @@ def describe(request, database, table=None, column=None):
   response.update(describe)
 
   return JsonResponse(response)
+
+
+def _get_snippet(user, notebook, snippet, operation_id):
+  if operation_id or not snippet:
+    nb_doc = Document2.objects.get_by_uuid(user=user, uuid=operation_id or notebook['uuid'])
+    notebook = Notebook(document=nb_doc).get_data()
+    snippet = notebook['snippets'][0]
+  return snippet

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -323,7 +323,7 @@ def get_api(request, snippet):
   if snippet.get('wasBatchExecuted') and not TASK_SERVER.ENABLED.get():
     return OozieApi(user=request.user, request=request)
 
-  if snippet['type'] == 'report':
+  if snippet.get('type') == 'report':
     snippet['type'] = 'impala'
 
   interpreter = get_interpreter(connector_type=snippet['type'], user=request.user)