|
@@ -18,7 +18,7 @@
|
|
|
|
|
|
|
|
from desktop import conf
|
|
from desktop import conf
|
|
|
from desktop.views import commonheader, commonfooter, _ko
|
|
from desktop.views import commonheader, commonfooter, _ko
|
|
|
- from jobbrowser.conf import DISABLE_KILLING_JOBS, MAX_JOB_FETCH
|
|
|
|
|
|
|
+ from jobbrowser.conf import DISABLE_KILLING_JOBS, MAX_JOB_FETCH, ENABLE_QUERY_BROWSER
|
|
|
%>
|
|
%>
|
|
|
|
|
|
|
|
<%
|
|
<%
|
|
@@ -227,6 +227,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
<div class="jb-panel" data-bind="template: { name: 'job-page${ SUFFIX }' }"></div>
|
|
<div class="jb-panel" data-bind="template: { name: 'job-page${ SUFFIX }' }"></div>
|
|
|
<!-- /ko -->
|
|
<!-- /ko -->
|
|
|
|
|
|
|
|
|
|
+ <!-- ko if: mainType() == 'queries' -->
|
|
|
|
|
+ <div class="jb-panel" data-bind="template: { name: 'queries-page${ SUFFIX }' }"></div>
|
|
|
|
|
+ <!-- /ko -->
|
|
|
|
|
+
|
|
|
<!-- ko if: mainType() == 'workflows' -->
|
|
<!-- ko if: mainType() == 'workflows' -->
|
|
|
<!-- ko if: type() == 'workflow' -->
|
|
<!-- ko if: type() == 'workflow' -->
|
|
|
<div class="jb-panel" data-bind="template: { name: 'workflow-page${ SUFFIX }' }"></div>
|
|
<div class="jb-panel" data-bind="template: { name: 'workflow-page${ SUFFIX }' }"></div>
|
|
@@ -848,6 +852,85 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+<script type="text/html" id="queries-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 class="break-word"><span data-bind="text: id"></span></li>
|
|
|
|
|
+ <!-- ko if: doc_url -->
|
|
|
|
|
+ <li class="nav-header">${ _('Document') }</li>
|
|
|
|
|
+ <li>
|
|
|
|
|
+ <a data-bind="hueLink: doc_url" href="javascript: void(0);" title="${ _('Open in editor') }">
|
|
|
|
|
+ <span data-bind="text: name"></span>
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ <!-- /ko -->
|
|
|
|
|
+ <!-- ko ifnot: doc_url -->
|
|
|
|
|
+ <li class="nav-header">${ _('Name') }</li>
|
|
|
|
|
+ <li><span data-bind="text: name"></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>
|
|
|
|
|
+ <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="bar" data-bind="style: {'width': progress() + '%'}"></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ <li class="nav-header">${ _('Duration') }</li>
|
|
|
|
|
+ <li><span data-bind="text: duration().toHHMMSS()"></span></li>
|
|
|
|
|
+ <li class="nav-header">${ _('Submitted') }</li>
|
|
|
|
|
+ <li><span data-bind="moment: {data: submitted, format: 'LLL'}"></span></li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div data-bind="css:{'span10': !$root.isMini(), 'span12 no-margin': $root.isMini() }">
|
|
|
|
|
+
|
|
|
|
|
+ <ul class="nav nav-pills margin-top-20">
|
|
|
|
|
+ <li>
|
|
|
|
|
+ <a href="#livy-session-page-statements${ SUFFIX }" data-bind="click: function(){ fetchProfile('properties'); $('a[href=\'#livy-session-page-statements${ SUFFIX }\']').tab('show'); }">
|
|
|
|
|
+ ${ _('Properties') }</a>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="clearfix"></div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="tab-content">
|
|
|
|
|
+ <div class="tab-pane active" id="livy-session-page-statements${ SUFFIX }">
|
|
|
|
|
+ <table id="actionsTable" class="datatables table table-condensed">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <th>${_('Id')}</th>
|
|
|
|
|
+ <th>${_('State')}</th>
|
|
|
|
|
+ <th>${_('Output')}</th>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody data-bind="foreach: properties['statements']">
|
|
|
|
|
+ <tr data-bind="click: function() { $root.job().id(id); $root.job().fetchJob(); }" class="pointer">
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <a data-bind="hueLink: '/jobbrowser/jobs/' + id(), clickBubble: false">
|
|
|
|
|
+ <i class="fa fa-tasks"></i>
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ <td data-bind="text: state"></td>
|
|
|
|
|
+ <td data-bind="text: output"></td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
<script type="text/html" id="livy-session-page${ SUFFIX }">
|
|
<script type="text/html" id="livy-session-page${ SUFFIX }">
|
|
|
|
|
|
|
|
<div class="row-fluid">
|
|
<div class="row-fluid">
|
|
@@ -2281,9 +2364,13 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
var livyInterfaceCondition = function () {
|
|
var livyInterfaceCondition = function () {
|
|
|
return self.appConfig() && self.appConfig()['editor'] && self.appConfig()['editor']['interpreter_names'].indexOf('pyspark') != -1;
|
|
return self.appConfig() && self.appConfig()['editor'] && self.appConfig()['editor']['interpreter_names'].indexOf('pyspark') != -1;
|
|
|
}
|
|
}
|
|
|
|
|
+ var queryInterfaceCondition = function () {
|
|
|
|
|
+ return '${ ENABLE_QUERY_BROWSER.get() }' == 'True' && self.appConfig() && self.appConfig()['editor'] && self.appConfig()['editor']['interpreter_names'].indexOf('impala') != -1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
var interfaces = [
|
|
var interfaces = [
|
|
|
{'interface': 'jobs', 'label': '${ _ko('Jobs') }', 'condition': jobsInterfaceCondition},
|
|
{'interface': 'jobs', 'label': '${ _ko('Jobs') }', 'condition': jobsInterfaceCondition},
|
|
|
|
|
+ {'interface': 'queries', 'label': '${ _ko('Queries') }', 'condition': queryInterfaceCondition},
|
|
|
{'interface': 'dataeng-jobs', 'label': '${ _ko('Jobs') }', 'condition': dataEngInterfaceCondition},
|
|
{'interface': 'dataeng-jobs', 'label': '${ _ko('Jobs') }', 'condition': dataEngInterfaceCondition},
|
|
|
{'interface': 'workflows', 'label': '${ _ko('Workflows') }', 'condition': schedulerInterfaceCondition},
|
|
{'interface': 'workflows', 'label': '${ _ko('Workflows') }', 'condition': schedulerInterfaceCondition},
|
|
|
{'interface': 'schedules', 'label': '${ _ko('Schedules') }', 'condition': schedulerInterfaceCondition},
|
|
{'interface': 'schedules', 'label': '${ _ko('Schedules') }', 'condition': schedulerInterfaceCondition},
|
|
@@ -2437,6 +2524,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
case 'slas':
|
|
case 'slas':
|
|
|
case 'oozie-info':
|
|
case 'oozie-info':
|
|
|
case 'jobs':
|
|
case 'jobs':
|
|
|
|
|
+ case 'queries':
|
|
|
case 'workflows':
|
|
case 'workflows':
|
|
|
case 'schedules':
|
|
case 'schedules':
|
|
|
case 'bundles':
|
|
case 'bundles':
|