|
|
@@ -20,7 +20,7 @@ from desktop.conf import CUSTOM, IS_K8S_ONLY
|
|
|
from desktop.views import commonheader, commonfooter, _ko
|
|
|
from metadata.conf import PROMETHEUS
|
|
|
|
|
|
-from jobbrowser.conf import DISABLE_KILLING_JOBS, MAX_JOB_FETCH, ENABLE_QUERY_BROWSER, ENABLE_HIVE_QUERY_BROWSER
|
|
|
+from jobbrowser.conf import DISABLE_KILLING_JOBS, MAX_JOB_FETCH, ENABLE_QUERY_BROWSER, ENABLE_HIVE_QUERY_BROWSER, ENABLE_HISTORY_V2
|
|
|
%>
|
|
|
|
|
|
<%
|
|
|
@@ -403,6 +403,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
|
|
|
<!-- ko if: $root.job() -->
|
|
|
<!-- ko with: $root.job() -->
|
|
|
+ <!-- ko if: mainType() == 'history' -->
|
|
|
+ <div class="jb-panel" data-bind="template: { name: 'history-page${ SUFFIX }' }"></div>
|
|
|
+ <!-- /ko -->
|
|
|
+
|
|
|
<!-- ko if: mainType() == 'jobs' -->
|
|
|
<div class="jb-panel" data-bind="template: { name: 'job-page${ SUFFIX }' }"></div>
|
|
|
<!-- /ko -->
|
|
|
@@ -691,9 +695,88 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
<!-- ko if: type() == 'SPARK_EXECUTOR' -->
|
|
|
<div data-bind="template: { name: 'job-spark-executor-page${ SUFFIX }', data: $root.job() }"></div>
|
|
|
<!-- /ko -->
|
|
|
+</script>
|
|
|
|
|
|
+
|
|
|
+<script type="text/html" id="history-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': apiStatus() === 'RUNNING', '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="#history-page-statements${ SUFFIX }" data-bind="click: function(){ fetchProfile('properties'); $('a[href=\'#history-page-statements${ SUFFIX }\']').tab('show'); }">
|
|
|
+ ${ _('Properties') }
|
|
|
+ </a>
|
|
|
+ </li>
|
|
|
+ <li class="pull-right" data-bind="template: { name: 'job-actions${ SUFFIX }' }"></li>
|
|
|
+ </ul>
|
|
|
+
|
|
|
+ <div class="clearfix"></div>
|
|
|
+
|
|
|
+ <div class="tab-content">
|
|
|
+ <div class="tab-pane active" id="history-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="job-yarn-page${ SUFFIX }">
|
|
|
<div class="row-fluid">
|
|
|
<div data-bind="css:{'span2': !$root.isMini(), 'span12': $root.isMini() }">
|
|
|
@@ -1302,7 +1385,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
|
|
|
|
|
|
<script type="text/html" id="dataware-clusters-page${ SUFFIX }">
|
|
|
-
|
|
|
<div class="row-fluid">
|
|
|
<div data-bind="css:{'span2': !$root.isMini(), 'span12': $root.isMini() }">
|
|
|
<div class="sidebar-nav">
|
|
|
@@ -1334,7 +1416,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
<button class="btn" title="${ _('Troubleshoot') }" data-bind="click: troubleshoot">
|
|
|
<i class="fa fa-tachometer"></i> ${ _('Troubleshoot') }
|
|
|
</button>
|
|
|
-
|
|
|
</script>
|
|
|
|
|
|
|
|
|
@@ -2743,7 +2824,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
|
|
|
self.hasKill = ko.pureComputed(function() {
|
|
|
return self.type() && (
|
|
|
- ['MAPREDUCE', 'SPARK', 'workflow', 'schedule', 'bundle', 'QUERY', 'TEZ', 'YarnV2', 'DDL', 'celery-beat'].indexOf(self.type()) != -1 ||
|
|
|
+ ['MAPREDUCE', 'SPARK', 'workflow', 'schedule', 'bundle', 'QUERY', 'TEZ', 'YarnV2', 'DDL', 'celery-beat', 'history'].indexOf(self.type()) != -1 ||
|
|
|
self.type().indexOf('Data Warehouse') != -1 ||
|
|
|
self.type().indexOf('Altus') != -1
|
|
|
);
|
|
|
@@ -2754,7 +2835,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
});
|
|
|
|
|
|
self.hasResume = ko.pureComputed(function() {
|
|
|
- return ['workflow', 'schedule', 'bundle', 'celery-beat'].indexOf(self.type()) != -1;
|
|
|
+ return ['workflow', 'schedule', 'bundle', 'celery-beat', 'history'].indexOf(self.type()) != -1;
|
|
|
});
|
|
|
self.resumeEnabled = ko.pureComputed(function() {
|
|
|
return self.hasResume() && self.canWrite() && self.apiStatus() == 'PAUSED';
|
|
|
@@ -2768,7 +2849,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
});
|
|
|
|
|
|
self.hasPause = ko.pureComputed(function() {
|
|
|
- return ['workflow', 'schedule', 'bundle', 'celery-beat'].indexOf(self.type()) != -1;
|
|
|
+ return ['workflow', 'schedule', 'bundle', 'celery-beat', 'history'].indexOf(self.type()) != -1;
|
|
|
});
|
|
|
self.pauseEnabled = ko.pureComputed(function() {
|
|
|
return self.hasPause() && self.canWrite() && self.apiStatus() == 'RUNNING';
|
|
|
@@ -3321,7 +3402,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
'dataeng-clusters',
|
|
|
'dataware-clusters',
|
|
|
'dataware2-clusters',
|
|
|
- 'celery-beat'
|
|
|
+ 'celery-beat',
|
|
|
+ 'history'
|
|
|
].indexOf(vm.interface()) != -1 && !self.isCoordinator();
|
|
|
});
|
|
|
self.killEnabled = ko.pureComputed(function() {
|
|
|
@@ -3331,7 +3413,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
});
|
|
|
|
|
|
self.hasResume = ko.pureComputed(function() {
|
|
|
- return ['workflows', 'schedules', 'bundles', 'dataware2-clusters', 'celery-beat'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
|
|
|
+ return ['workflows', 'schedules', 'bundles', 'dataware2-clusters', 'celery-beat', 'history'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
|
|
|
});
|
|
|
self.resumeEnabled = ko.pureComputed(function() {
|
|
|
return self.hasResume() && self.selectedJobs().length > 0 && $.grep(self.selectedJobs(), function(job) {
|
|
|
@@ -3349,7 +3431,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
});
|
|
|
|
|
|
self.hasPause = ko.pureComputed(function() {
|
|
|
- return ['workflows', 'schedules', 'bundles', 'dataware2-clusters', 'celery-beat'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
|
|
|
+ return ['workflows', 'schedules', 'bundles', 'dataware2-clusters', 'celery-beat', 'history'].indexOf(vm.interface()) != -1 && !self.isCoordinator();
|
|
|
});
|
|
|
self.pauseEnabled = ko.pureComputed(function() {
|
|
|
return self.hasPause() && self.selectedJobs().length > 0 && $.grep(self.selectedJobs(), function(job) {
|
|
|
@@ -3659,6 +3741,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
});
|
|
|
|
|
|
self.availableInterfaces = ko.pureComputed(function () {
|
|
|
+ var historyInterfaceCondition = function () {
|
|
|
+ return '${ ENABLE_HISTORY_V2.get() }' == 'True';
|
|
|
+ };
|
|
|
var jobsInterfaceCondition = function () {
|
|
|
return self.appConfig() && self.appConfig()['browser'] && self.appConfig()['browser']['interpreter_names'].indexOf('yarn') != -1 && (!self.cluster() || self.cluster()['type'].indexOf('altus') == -1);
|
|
|
};
|
|
|
@@ -3703,6 +3788,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
{'interface': 'queries-impala', 'label': '${ _ko('Impala') }', 'condition': queryInterfaceCondition},
|
|
|
{'interface': 'queries-hive', 'label': '${ _ko('Hive') }', 'condition': queryHiveInterfaceCondition},
|
|
|
{'interface': 'celery-beat', 'label': '${ _ko('Scheduled Tasks') }', 'condition': schedulerBeatInterfaceCondition},
|
|
|
+ {'interface': 'history', 'label': '${ _ko('History') }', 'condition': historyInterfaceCondition},
|
|
|
{'interface': 'workflows', 'label': '${ _ko('Workflows') }', 'condition': schedulerInterfaceCondition},
|
|
|
{'interface': 'schedules', 'label': '${ _ko('Schedules') }', 'condition': schedulerInterfaceCondition},
|
|
|
{'interface': 'bundles', 'label': '${ _ko('Bundles') }', 'condition': schedulerExtraInterfaceCondition},
|
|
|
@@ -3893,6 +3979,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
|
|
|
case 'queries-impala':
|
|
|
case 'queries-hive':
|
|
|
case 'celery-beat':
|
|
|
+ case 'history':
|
|
|
case 'workflows':
|
|
|
case 'schedules':
|
|
|
case 'bundles':
|