Эх сурвалжийг харах

HUE-8522 [jb] Make paused tasks more obvious. Add queued state to Impala

jdesjean 7 жил өмнө
parent
commit
d4e0bd02a7

+ 22 - 28
apps/jobbrowser/src/jobbrowser/apis/query_api.py

@@ -66,6 +66,7 @@ class QueryApi(Api):
         'user': job['effective_user'],
         'queue': job.get('resource_pool'),
         'progress': job['progress'],
+        'isRunning': job['start_time'] > job['end_time'],
         'canWrite': job in jobs['in_flight_queries'],
         'duration': self._time_in_ms_groups(re.search(r"\s*(([\d.]*)([a-z]*))(([\d.]*)([a-z]*))?(([\d.]*)([a-z]*))?", job['duration'], re.MULTILINE).groups()),
         'submitted': job['start_time'],
@@ -114,27 +115,18 @@ class QueryApi(Api):
       }
     app = apps.get('apps')[0]
     progress_groups = re.search(r"([\d\.\,]+)%", app.get('progress'))
+    app.update({
+      'progress': float(progress_groups.group(1)) if progress_groups and progress_groups.group(1) else 100 if self._api_status(app.get('status')) in ['SUCCEEDED', 'FAILED'] else 1,
+      'type': 'queries',
+      'doc_url': "%s/query_plan?query_id=%s" % (self.api.url, appid),
+      'properties': {
+        'memory': '',
+        'profile': '',
+        'plan': ''
+      }
+    })
 
-    common = {
-        'id': app.get('id'),
-        'name': app.get('name'),
-        'status': app.get('status'),
-        'apiStatus': app.get('apiStatus'),
-        'user': app.get('user'),
-        'progress': float(progress_groups.group(1)) if progress_groups and progress_groups.group(1) else 100,
-        'duration': app.get('duration'),
-        'submitted': app.get('submitted'),
-        'type': 'queries',
-        'doc_url': "%s/query_plan?query_id=%s" % (self.api.url, appid)
-    }
-
-    common['properties'] = {
-      'memory': '',
-      'profile': '',
-      'plan': ''
-    }
-
-    return common
+    return app
 
 
   def action(self, appid, action):
@@ -177,20 +169,22 @@ class QueryApi(Api):
     return self.api.get_query_profile(query_id=appid)
 
   def _api_status_filter(self, status):
-    if status in ['RUNNING', 'CREATED']:
-      return 'RUNNING'
-    elif status in ['FINISHED']:
+    if status == 'FINISHED':
       return 'COMPLETED'
-    else:
+    elif status == 'EXCEPTION':
       return 'FAILED'
+    elif status == 'RUNNING':
+      return 'RUNNING'
 
   def _api_status(self, status):
-    if status in ['RUNNING', 'CREATED']:
-      return 'RUNNING'
-    elif status in ['FINISHED']:
+    if status == 'FINISHED':
       return 'SUCCEEDED'
-    else:
+    elif status == 'EXCEPTION':
       return 'FAILED'
+    elif status == 'RUNNING':
+      return 'RUNNING'
+    else:
+      return 'PAUSED'
 
   def _get_filter_list(self, filters):
     filter_list = []

+ 1 - 0
apps/jobbrowser/src/jobbrowser/static/jobbrowser/js/impala_dagre.js

@@ -42,6 +42,7 @@ function impalaDagre(id) {
 
   // Recursively build a list of edges and states that comprise the plan graph
   function build(node, parent, edges, states, colour_idx, max_node_time) {
+    if (!node["output_card"]) return;
     states.push({ "name": node["label"],
                   "detail": node["label_detail"],
                   "num_instances": node["num_instances"],

+ 14 - 9
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -132,7 +132,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     </tr>
     </thead>
     <tbody data-bind="foreach: apps">
-      <tr class="status-border pointer" data-bind="css: {'completed': apiStatus() == 'SUCCEEDED', 'running': isRunning(), 'failed': apiStatus() == 'FAILED'}, click: fetchJob">
+      <tr class="status-border pointer" data-bind="css: {'completed': apiStatus() == 'SUCCEEDED', 'info': apiStatus() == 'PAUSED', 'running': apiStatus() == 'RUNNING', 'failed': apiStatus() == 'FAILED'}, click: fetchJob">
         <td data-bind="click: function() {}, clickBubble: false">
           <div class="hue-checkbox fa" data-bind="click: function() {}, clickBubble: false, multiCheck: '#' + $parent.tableId, value: $data, hueChecked: $parent.selectedJobs"></div>
         </td>
@@ -228,7 +228,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
               <!-- ko ifnot: jobs.loadingJobs() -->
                 <!-- ko if: $root.isMini -->
                 <ul class="unstyled status-border-container" id="jobsTable" data-bind="foreach: jobs.apps">
-                  <li class="status-border pointer" data-bind="css: {'completed': apiStatus() == 'SUCCEEDED', 'running': isRunning(), 'failed': apiStatus() == 'FAILED'}, click: fetchJob">
+                  <li class="status-border pointer" data-bind="css: {'completed': apiStatus() == 'SUCCEEDED', 'info': apiStatus() === 'PAUSED', 'running': apiStatus() === 'RUNNING', 'failed': apiStatus() == 'FAILED'}, click: fetchJob">
                     <span class="muted pull-left" data-bind="momentFromNow: {data: submitted, interval: 10000, titleFormat: 'LLL'}"></span><span class="muted">&nbsp;-&nbsp;</span><span class="muted" data-bind="text: status"></span></td>
                     <span class="muted pull-right" data-bind="text: duration().toHHMMSS()"></span>
                     <div class="clearfix"></div>
@@ -1128,8 +1128,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           <li class="nav-header">${ _('Id') }</li>
           <li class="break-word"><span data-bind="text: id"></span></li>
           <!-- /ko -->
-          <li class="nav-header">${ _('Status') }</li>
-          <li><span data-bind="text: status"></span></li>
           <li class="nav-header">${ _('User') }</li>
           <li><span data-bind="text: user"></span></li>
           <li class="nav-header">${ _('Progress') }</li>
@@ -1137,10 +1135,16 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           <span data-bind="text: progress"></span>%
           </li>
           <li>
-            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': isRunning(), 'progress-success': apiStatus() === 'SUCCEEDED' }">
+            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': apiStatus() === 'RUNNING', 'progress-success': apiStatus() === 'SUCCEEDED' }">
               <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
             </div>
           </li>
+          <li class="nav-header">${ _('Status') }</li>
+          <li><span data-bind="text: status"></span></li>
+          <!-- ko if: properties.plan && properties.plan().status && properties.plan().status.length > 2 -->
+          <li class="nav-header">${ _('Status Text') }</li>
+          <li><span data-bind="text: properties.plan().status"></span></li>
+          <!-- /ko -->
           <!-- ko if: !$root.isMini() -->
           <li class="nav-header">${ _('Open Duration') }</li>
           <li><span data-bind="text: duration() && duration().toHHMMSS()"></span></li>
@@ -1241,7 +1245,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           <li class="nav-header">${ _('Progress') }</li>
           <li><span data-bind="text: progress"></span>%</li>
           <li>
-            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': isRunning(), 'progress-success': apiStatus() === 'SUCCEEDED' }">
+            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': apiStatus() === 'RUNNING', 'progress-success': apiStatus() === 'SUCCEEDED' }">
               <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
             </div>
           </li>
@@ -1358,7 +1362,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           <li class="nav-header">${ _('Progress') }</li>
           <li><span data-bind="text: progress"></span>%</li>
           <li>
-            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': isRunning(), 'progress-success': apiStatus() === 'SUCCEEDED' }, attr: {title: status}">
+            <div class="progress-job progress" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-danger': apiStatus() === 'FAILED', 'progress-warning': apiStatus() === 'RUNNING', 'progress-success': apiStatus() === 'SUCCEEDED' }, attr: {title: status}">
               <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
             </div>
           </li>
@@ -1969,7 +1973,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       self.apiStatus = ko.observableDefault(job.apiStatus);
       self.progress = ko.observableDefault(job.progress);
       self.isRunning = ko.computed(function() {
-        return self.apiStatus() == 'RUNNING' || self.apiStatus() == 'PAUSED';
+        return self.apiStatus() == 'RUNNING' || self.apiStatus() == 'PAUSED' || job.isRunning;
       });
 
       self.user = ko.observableDefault(job.user);
@@ -1987,6 +1991,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       self.properties = ko.mapping.fromJS(job.properties || {});
       self.mainType = ko.observable(vm.interface());
+      self.lastEvent = ko.observable(job.lastEvent || '');
 
       self.coordinatorActions = ko.pureComputed(function() {
         if (self.mainType() == 'schedules' && self.properties['tasks']) {
@@ -2066,7 +2071,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       });
       self.killEnabled = ko.pureComputed(function() {
         // Impala can kill queries that are finished, but not yet terminated
-        return self.hasKill() && self.canWrite() && (vm.interface() === 'queries' || (self.apiStatus() == 'RUNNING' || self.apiStatus() == 'PAUSED'));
+        return self.hasKill() && self.canWrite() && self.isRunning();
       });
 
       self.hasResume = ko.pureComputed(function() {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue-embedded.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue3-extra.css


+ 9 - 0
desktop/core/src/desktop/static/desktop/less/hue-cross-version.less

@@ -368,6 +368,9 @@ input[type='password']::-ms-reveal {
   &.failed {
     border-color: @cui-red!important;
   }
+  &.info {
+    border-color: @hue-primary-color-dark!important;
+  }
 }
 
 .status-background {
@@ -380,6 +383,9 @@ input[type='password']::-ms-reveal {
   &.failed {
     background-color: @cui-red!important;
   }
+  &.info {
+    background-color: @hue-primary-color-dark!important;
+  }
 }
 
 .status-content {
@@ -392,6 +398,9 @@ input[type='password']::-ms-reveal {
   &.failed {
     color: @cui-red!important;
   }
+  &.info {
+    color: @hue-primary-color-dark!important;
+  }
 }
 
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
desktop/libs/notebook/src/notebook/static/notebook/css/notebook.css


+ 1 - 1
desktop/libs/notebook/src/notebook/static/notebook/less/notebook.less

@@ -639,7 +639,7 @@
   }
 
   .progress-starting .bar {
-    background-color: @cui-orange-500;
+    background-color: @hue-primary-color-dark;
   }
 
   @-webkit-keyframes pulsate {

+ 2 - 2
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -660,7 +660,7 @@ ${ sqlSyntaxDropdown.sqlSyntaxDropdown() }
 </script>
 
 <script type="text/html" id="snippet-log${ suffix }">
-  <div class="snippet-log-container margin-bottom-10" data-bind="visible: showLogs() && status() != 'ready' && status() != 'loading'" style="display: none;">
+  <div class="snippet-log-container margin-bottom-10">
     <div data-bind="delayedOverflow: 'slow', css: resultsKlass" style="margin-top: 5px; position: relative;">
       <a href="javascript: void(0)" class="inactive-action close-logs-overlay" data-bind="click: function(){ showLogs(false) }">&times;</a>
       %if not IS_EMBEDDED.get():
@@ -681,7 +681,7 @@ ${ sqlSyntaxDropdown.sqlSyntaxDropdown() }
       </ul>
       %endif
       <span data-bind="visible: !$root.isPresentationMode() || !$root.isHidingCode()">
-        <pre data-bind="visible: result.logs() && result.logs().length == 0" class="logs logs-bigger">${ _('No logs available at this moment.') }</pre>
+        <pre data-bind="visible: (!result.logs() || result.logs().length == 0) && jobs().length > 0" class="logs logs-bigger">${ _('No logs available at this moment.') }</pre>
         <pre data-bind="visible: result.logs() && result.logs().length > 0, text: result.logs, logScroller: result.logs, logScrollerVisibilityEvent: showLogs" class="logs logs-bigger logs-populated"></pre>
       </span>
     </div>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно