You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by nb...@apache.org on 2021/04/30 14:05:24 UTC
[atlas] branch master updated: ATLAS-4270: UI: Deferred Actions:
Add a notification about task running in the background fixed
This is an automated email from the ASF dual-hosted git repository.
nbonte pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push:
new a3e3b9c ATLAS-4270: UI: Deferred Actions: Add a notification about task running in the background fixed
a3e3b9c is described below
commit a3e3b9c02167e7832324b99c7c412bfaeeab52a8
Author: prasad pawar <pr...@freestoneinfotech.com>
AuthorDate: Fri Apr 30 16:15:57 2021 +0530
ATLAS-4270: UI: Deferred Actions: Add a notification about task running in the background fixed
Signed-off-by: Nikhil Bonte <nb...@apache.org>
---
dashboardv2/public/css/scss/tab.scss | 16 ++
dashboardv2/public/js/main.js | 5 +-
.../detail_page/DetailPageLayoutView_tmpl.html | 10 +
.../PendingTaskTableLayoutView_tmpl.html | 26 +++
dashboardv2/public/js/utils/Globals.js | 3 +-
dashboardv2/public/js/utils/UrlLinks.js | 5 +-
.../js/views/detail_page/DetailPageLayoutView.js | 11 +-
.../detail_page/PendingTaskTableLayoutView.js | 218 +++++++++++++++++++++
dashboardv3/public/css/scss/tab.scss | 16 ++
dashboardv3/public/js/main.js | 5 +-
.../detail_page/DetailPageLayoutView_tmpl.html | 10 +
.../PendingTaskTableLayoutView_tmpl.html | 26 +++
dashboardv3/public/js/utils/Globals.js | 3 +-
dashboardv3/public/js/utils/UrlLinks.js | 5 +-
.../js/views/detail_page/DetailPageLayoutView.js | 11 +-
.../detail_page/PendingTaskTableLayoutView.js | 218 +++++++++++++++++++++
.../apache/atlas/web/resources/AdminResource.java | 7 +-
17 files changed, 586 insertions(+), 9 deletions(-)
diff --git a/dashboardv2/public/css/scss/tab.scss b/dashboardv2/public/css/scss/tab.scss
index 1da54e0..9c85587 100644
--- a/dashboardv2/public/css/scss/tab.scss
+++ b/dashboardv2/public/css/scss/tab.scss
@@ -190,4 +190,20 @@ ul.tabs li.tab {
}
}
}
+}
+
+.pending-task {
+ padding: 10px 20px 15px 20px !important;
+
+ .pending-refresh-btn {
+ margin-bottom: 10px;
+ }
+
+ table tr th {
+ padding: 6px 8px !important;
+ }
+
+ .panel-heading {
+ font-size: 16px;
+ }
}
\ No newline at end of file
diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js
index 14d9e0f..7c8bbb4 100644
--- a/dashboardv2/public/js/main.js
+++ b/dashboardv2/public/js/main.js
@@ -283,6 +283,9 @@ require(['App',
if (response['atlas.debug.metrics.enabled'] !== undefined) {
Globals.isDebugMetricsEnabled = response["atlas.debug.metrics.enabled"];
}
+ if (response['atlas.tasks.enabled'] !== undefined) {
+ Globals.isTasksEnabled = response['atlas.tasks.enabled'];
+ }
}
--that.asyncFetchCounter;
startApp();
@@ -362,4 +365,4 @@ require(['App',
startApp();
}
});
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
index 5854dd7..ee4b943 100644
--- a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
@@ -58,6 +58,9 @@
<li role="raudits" class="tab replicationTab" style="display:none"><a href="#tab-raudit" aria-controls="tab-raudit" role="tab" data-toggle="tab">Export/Import Audits</a></li>
<li role="schema" class="tab schemaTable" style="display:none"><a href="#tab-schema" aria-controls="tab-schema" role="tab" data-toggle="tab">Schema</a></li>
<li role="profile" class="tab profileTab" style="display:none"><a href="#tab-profile" aria-controls="tab-profile" role="tab" data-toggle="tab">Profile</a></li>
+ {{#if isTasksEnabled}}
+ <li role="pendingTask" class="tab"><a href="#tab-pendingTask" aria-controls="tab-pendingTask" role="tab" data-toggle="tab">Tasks</a></li>
+ {{/if}}
</ul>
</div>
</div>
@@ -119,6 +122,13 @@
</div>
</div>
</div>
+ <div id="tab-pendingTask" role="pendingTask" class="tab-pane animated fadeIn pending-task">
+ <div id="r_pendingTaskTableLayoutView">
+ <div class="fontLoader-relative">
+ <i class="fa fa-refresh fa-spin-custom"></i>
+ </div>
+ </div>
+ </div>
<div id="tab-raudit" role="raudits" class="tab-pane">
<div id="r_replicationAuditTableLayoutView">
<div class="fontLoader-relative">
diff --git a/dashboardv2/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html
new file mode 100644
index 0000000..059c42f
--- /dev/null
+++ b/dashboardv2/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html
@@ -0,0 +1,26 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<div class="position-relative">
+ <button type="button" class="btn btn-action btn-md pull-right pending-refresh-btn" title="Refresh" data-id="refreshPendingTask" onclick="this.blur();" type="button"><i class="fa fa-refresh"></i></button>
+ <div class="tableOverlay"></div>
+ <div class="fontLoader">
+ <i class="fa fa-refresh fa-spin-custom"></i>
+ </div>
+ <div class="auditTable" style="display: none">
+ <div id="r_pendingTaskTableLayoutView"></div>
+ </div>
+</div>
\ No newline at end of file
diff --git a/dashboardv2/public/js/utils/Globals.js b/dashboardv2/public/js/utils/Globals.js
index 8ae89eb..2e94e6b 100644
--- a/dashboardv2/public/js/utils/Globals.js
+++ b/dashboardv2/public/js/utils/Globals.js
@@ -48,6 +48,7 @@ define(["require"], function(require) {
Globals.isTimezoneFormatEnabled = true;
Globals.isDebugMetricsEnabled = false;
+ Globals.isTasksEnabled = true;
return Globals;
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/utils/UrlLinks.js b/dashboardv2/public/js/utils/UrlLinks.js
index 58a65f1..eb2980c 100644
--- a/dashboardv2/public/js/utils/UrlLinks.js
+++ b/dashboardv2/public/js/utils/UrlLinks.js
@@ -46,6 +46,9 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
metricsApiUrl: function() {
return this.baseUrl + '/admin/metrics'
},
+ pendingTaskApiUrl: function() {
+ return this.baseUrl + '/admin/tasks'
+ },
debugMetricsApiUrl: function() {
return this.baseUrl + '/admin/debug/metrics'
},
@@ -263,4 +266,4 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
});
return UrlLinks;
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
index e83212f..d8e10cc 100644
--- a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
+++ b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js
@@ -43,6 +43,7 @@ define(['require',
RTagTableLayoutView: "#r_tagTableLayoutView",
RLineageLayoutView: "#r_lineageLayoutView",
RAuditTableLayoutView: "#r_auditTableLayoutView",
+ RPendingTaskTableLayoutView: "#r_pendingTaskTableLayoutView",
RReplicationAuditTableLayoutView: "#r_replicationAuditTableLayoutView",
RProfileLayoutView: "#r_profileLayoutView",
RRelationshipLayoutView: "#r_relationshipLayoutView",
@@ -71,7 +72,8 @@ define(['require',
},
templateHelpers: function() {
return {
- entityUpdate: Globals.entityUpdate
+ entityUpdate: Globals.entityUpdate,
+ isTasksEnabled: Globals.isTasksEnabled
};
},
/** ui events hash */
@@ -317,6 +319,7 @@ define(['require',
this.renderRelationshipLayoutView(obj);
this.renderAuditTableLayoutView(obj);
this.renderTagTableLayoutView(obj);
+ if (Globals.isTasksEnabled) { this.renderPendingTaskTableLayoutView(); }
// To render profile tab check for attribute "profileData" or typeName = "hive_db","hbase_namespace"
if (collectionJSON && (!_.isUndefined(collectionJSON.attributes['profileData']) || collectionJSON.typeName === "hive_db" || collectionJSON.typeName === "hbase_namespace")) {
@@ -629,6 +632,12 @@ define(['require',
that.RTagTableLayoutView.show(new TagDetailTableLayoutView(obj));
});
},
+ renderPendingTaskTableLayoutView: function() {
+ var that = this;
+ require(['views/detail_page/PendingTaskTableLayoutView'], function(PendingTaskTableLayoutView) {
+ that.RPendingTaskTableLayoutView.show(new PendingTaskTableLayoutView());
+ });
+ },
renderLineageLayoutView: function(obj) {
var that = this;
require(['views/graph/LineageLayoutView'], function(LineageLayoutView) {
diff --git a/dashboardv2/public/js/views/detail_page/PendingTaskTableLayoutView.js b/dashboardv2/public/js/views/detail_page/PendingTaskTableLayoutView.js
new file mode 100644
index 0000000..0e32ebe
--- /dev/null
+++ b/dashboardv2/public/js/views/detail_page/PendingTaskTableLayoutView.js
@@ -0,0 +1,218 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define(['require',
+ 'backbone',
+ 'hbs!tmpl/detail_page/PendingTaskTableLayoutView_tmpl',
+ 'collection/VEntityList',
+ 'utils/Utils',
+ 'utils/Enums',
+ 'utils/UrlLinks',
+ 'utils/CommonViewFunction'
+], function(require, Backbone, PendingTaskTableLayoutView_tmpl, VEntityList, Utils, Enums, UrlLinks, CommonViewFunction) {
+ 'use strict';
+
+ var PendingTaskTableLayoutView = Backbone.Marionette.LayoutView.extend(
+ /** @lends PendingTaskTableLayoutView */
+ {
+ _viewName: 'PendingTaskTableLayoutView',
+
+ template: PendingTaskTableLayoutView_tmpl,
+
+ /** Layout sub regions */
+ regions: {
+ RPendingTaskTableLayoutView: "#r_pendingTaskTableLayoutView",
+ },
+
+ /** ui selector cache */
+ ui: {
+ refreshPendingTask: "[data-id='refreshPendingTask']"
+ },
+ /** ui events hash */
+ events: function() {
+ var events = {};
+ events["click " + this.ui.refreshPendingTask] = function(e) {
+ this.fetchPendingTaskCollection();
+ };
+ return events;
+ },
+ /**
+ * intialize a new PendingTaskTableLayoutView Layout
+ * @constructs
+ */
+ initialize: function(options) {
+ _.extend(this, _.pick(options, 'guid', 'entity', 'entityName', 'attributeDefs'));
+ this.pendingTaskCollection = new VEntityList();
+ this.limit = 25;
+ this.offset = 0;
+ this.pendingTaskCollection.url = UrlLinks.pendingTaskApiUrl();
+ this.entityModel = new this.pendingTaskCollection.model();
+ this.pervOld = [];
+ this.commonTableOptions = {
+ collection: this.pendingTaskCollection,
+ includeFilter: false,
+ includePagination: false,
+ includeAtlasPagination: true,
+ includeAtlasPageSize: true,
+ includeTableLoader: true,
+ includeAtlasTableSorting: false,
+ showDefaultTableSorted: false,
+ columnSorting: false,
+ includeFooterRecords: false,
+ gridOpts: {
+ className: "table table-hover backgrid table-quickMenu",
+ emptyText: 'No records found!'
+ },
+ isApiSorting: false,
+ atlasPaginationOpts: this.getPaginationOptions(),
+ filterOpts: {},
+ paginatorOpts: {}
+ };
+ this.currPage = 1;
+ this.fromSort = false;
+ },
+ onRender: function() {
+ this.fetchPendingTaskCollection();
+ },
+ fetchPendingTaskCollection: function() {
+ this.commonTableOptions['atlasPaginationOpts'] = this.getPaginationOptions();
+ this.fetchCollection();
+ this.pendingTaskCollection.comparator = function(model) {
+ return -model.get('createdBy');
+ }
+ },
+ bindEvents: function() {},
+ getPaginationOptions: function() {
+ return {
+ count: this.getPageCount(),
+ offset: this.pendingTaskCollection.queryParams.offset || this.offset,
+ fetchCollection: this.fetchCollection.bind(this)
+ };
+ },
+ getPageCount: function() {
+ return (this.pendingTaskCollection.queryParams.limit || this.pendingTaskCollection.queryParams.count) || this.limit;
+ },
+ fetchCollection: function(options) {
+ var that = this;
+
+ this.pendingTaskCollection.fetch({
+ success: function(dataOrCollection, response) {
+ that.pendingTaskCollection.state.pageSize = that.getPageCount();
+ that.pendingTaskCollection.fullCollection.reset(response);
+ },
+ complete: function() {
+ that.$('.fontLoader').hide();
+ that.$('.tableOverlay').hide();
+ that.$('.auditTable').show();
+ that.renderTableLayoutView();
+ },
+ silent: true
+ });
+
+ },
+ renderTableLayoutView: function() {
+ var that = this;
+ require(['utils/TableLayout'], function(TableLayout) {
+ var cols = new Backgrid.Columns(that.getAuditTableColumns());
+ that.RPendingTaskTableLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, {
+ columns: cols
+ })));
+
+ });
+ },
+ getAuditTableColumns: function() {
+ var that = this;
+ return this.pendingTaskCollection.constructor.getTableCols({
+ tool: {
+ label: "",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ fixWidth: "20",
+ cell: Backgrid.ExpandableCell,
+ accordion: false,
+ expand: function(el, model) {
+ el.attr('colspan', '8');
+ var count = model.get('attemptCount'),
+ parameters = _.omit(_.extend(model.get('parameters'), { 'attemptCount': model.get('attemptCount'), 'createdBy': model.get('createdBy') }),"entityGuid"),
+ memoryTable = CommonViewFunction.propertyTable({
+ scope: this,
+ formatStringVal: false,
+ valueObject: parameters
+ }),
+ tableData = ' <div class="col-sm-12"> <div class="card-container panel panel-default custom-panel">' +
+ '<div class="panel-heading">Parameters</div> <div class="panel-body">' +
+ '<table class="table stat-table task-details">' +
+ '<tbody data-id="memory-card">' +
+ memoryTable +
+ '</tbody>' +
+ '</table> </div> </div> </div>';
+ $(el).append($('<div>').html(tableData));
+ }
+ },
+ type: {
+ label: "Type",
+ cell: "html",
+ sortable: false,
+ editable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Enums.auditAction[model.get('type')] || rawValue;
+ }
+ })
+ },
+ guid: {
+ label: "Guid",
+ cell: "html",
+ sortable: false,
+ editable: false
+ },
+ status: {
+ label: "Status",
+ cell: "html",
+ sortable: false,
+ editable: false
+ },
+ createdTime: {
+ label: "Created Time",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Utils.formatDate({ date: rawValue });
+ }
+ })
+ },
+ updatedTime: {
+ label: "Updated Time",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Utils.formatDate({ date: rawValue });
+ }
+ })
+ }
+ }, this.pendingTaskCollection);
+
+ }
+ });
+ return PendingTaskTableLayoutView;
+});
\ No newline at end of file
diff --git a/dashboardv3/public/css/scss/tab.scss b/dashboardv3/public/css/scss/tab.scss
index 1da54e0..9c85587 100644
--- a/dashboardv3/public/css/scss/tab.scss
+++ b/dashboardv3/public/css/scss/tab.scss
@@ -190,4 +190,20 @@ ul.tabs li.tab {
}
}
}
+}
+
+.pending-task {
+ padding: 10px 20px 15px 20px !important;
+
+ .pending-refresh-btn {
+ margin-bottom: 10px;
+ }
+
+ table tr th {
+ padding: 6px 8px !important;
+ }
+
+ .panel-heading {
+ font-size: 16px;
+ }
}
\ No newline at end of file
diff --git a/dashboardv3/public/js/main.js b/dashboardv3/public/js/main.js
index 7264a9c..374641e 100644
--- a/dashboardv3/public/js/main.js
+++ b/dashboardv3/public/js/main.js
@@ -312,6 +312,9 @@ require(['App',
if (response['atlas.debug.metrics.enabled'] !== undefined) {
Globals.isDebugMetricsEnabled = response["atlas.debug.metrics.enabled"];
}
+ if (response['atlas.tasks.enabled'] !== undefined) {
+ Globals.isTasksEnabled = response['atlas.tasks.enabled'];
+ }
}
--that.asyncFetchCounter;
startApp();
@@ -393,4 +396,4 @@ require(['App',
startApp();
}
});
-});
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
index 18fc1f9..b209a49 100644
--- a/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
+++ b/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html
@@ -61,6 +61,9 @@
<li role="raudits" class="tab replicationTab" style="display:none"><a href="#tab-raudit" aria-controls="tab-raudit" role="tab" data-toggle="tab">Export/Import Audits</a></li>
<li role="schema" class="tab schemaTable" style="display:none"><a href="#tab-schema" aria-controls="tab-schema" role="tab" data-toggle="tab">Schema</a></li>
<li role="profile" class="tab profileTab" style="display:none"><a href="#tab-profile" aria-controls="tab-profile" role="tab" data-toggle="tab">Profile</a></li>
+ {{#if isTasksEnabled}}
+ <li role="pendingTask" class="tab"><a href="#tab-pendingTask" aria-controls="tab-pendingTask" role="tab" data-toggle="tab">Tasks</a></li>
+ {{/if}}
</ul>
</div>
</div>
@@ -122,6 +125,13 @@
</div>
</div>
</div>
+ <div id="tab-pendingTask" role="pendingTask" class="tab-pane animated fadeIn pending-task">
+ <div id="r_pendingTaskTableLayoutView">
+ <div class="fontLoader-relative">
+ <i class="fa fa-refresh fa-spin-custom"></i>
+ </div>
+ </div>
+ </div>
<div id="tab-raudit" role="raudits" class="tab-pane">
<div id="r_replicationAuditTableLayoutView">
<div class="fontLoader-relative">
diff --git a/dashboardv3/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html b/dashboardv3/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html
new file mode 100644
index 0000000..059c42f
--- /dev/null
+++ b/dashboardv3/public/js/templates/detail_page/PendingTaskTableLayoutView_tmpl.html
@@ -0,0 +1,26 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<div class="position-relative">
+ <button type="button" class="btn btn-action btn-md pull-right pending-refresh-btn" title="Refresh" data-id="refreshPendingTask" onclick="this.blur();" type="button"><i class="fa fa-refresh"></i></button>
+ <div class="tableOverlay"></div>
+ <div class="fontLoader">
+ <i class="fa fa-refresh fa-spin-custom"></i>
+ </div>
+ <div class="auditTable" style="display: none">
+ <div id="r_pendingTaskTableLayoutView"></div>
+ </div>
+</div>
\ No newline at end of file
diff --git a/dashboardv3/public/js/utils/Globals.js b/dashboardv3/public/js/utils/Globals.js
index 8ae89eb..2e94e6b 100644
--- a/dashboardv3/public/js/utils/Globals.js
+++ b/dashboardv3/public/js/utils/Globals.js
@@ -48,6 +48,7 @@ define(["require"], function(require) {
Globals.isTimezoneFormatEnabled = true;
Globals.isDebugMetricsEnabled = false;
+ Globals.isTasksEnabled = true;
return Globals;
-});
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/utils/UrlLinks.js b/dashboardv3/public/js/utils/UrlLinks.js
index 5047fe3..b500ebd 100644
--- a/dashboardv3/public/js/utils/UrlLinks.js
+++ b/dashboardv3/public/js/utils/UrlLinks.js
@@ -46,6 +46,9 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
metricsApiUrl: function() {
return this.baseUrl + '/admin/metrics'
},
+ pendingTaskApiUrl: function() {
+ return this.baseUrl + '/admin/tasks'
+ },
debugMetricsApiUrl: function() {
return this.baseUrl + '/admin/debug/metrics'
},
@@ -254,4 +257,4 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
});
return UrlLinks;
-});
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js b/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js
index a18984e..8e0686b 100644
--- a/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js
+++ b/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js
@@ -43,6 +43,7 @@ define(['require',
RTagTableLayoutView: "#r_tagTableLayoutView",
RLineageLayoutView: "#r_lineageLayoutView",
RAuditTableLayoutView: "#r_auditTableLayoutView",
+ RPendingTaskTableLayoutView: "#r_pendingTaskTableLayoutView",
RReplicationAuditTableLayoutView: "#r_replicationAuditTableLayoutView",
RProfileLayoutView: "#r_profileLayoutView",
RRelationshipLayoutView: "#r_relationshipLayoutView",
@@ -72,7 +73,8 @@ define(['require',
},
templateHelpers: function() {
return {
- entityUpdate: Globals.entityUpdate
+ entityUpdate: Globals.entityUpdate,
+ isTasksEnabled: Globals.isTasksEnabled
};
},
/** ui events hash */
@@ -321,6 +323,7 @@ define(['require',
this.renderRelationshipLayoutView(obj);
this.renderAuditTableLayoutView(obj);
this.renderTagTableLayoutView(obj);
+ if (Globals.isTasksEnabled) { this.renderPendingTaskTableLayoutView(); }
// To render profile tab check for attribute "profileData" or typeName = "hive_db","hbase_namespace"
if (collectionJSON && (!_.isUndefined(collectionJSON.attributes['profileData']) || collectionJSON.typeName === "hive_db" || collectionJSON.typeName === "hbase_namespace")) {
@@ -644,6 +647,12 @@ define(['require',
that.RTagTableLayoutView.show(new TagDetailTableLayoutView(obj));
});
},
+ renderPendingTaskTableLayoutView: function() {
+ var that = this;
+ require(['views/detail_page/PendingTaskTableLayoutView'], function(PendingTaskTableLayoutView) {
+ that.RPendingTaskTableLayoutView.show(new PendingTaskTableLayoutView());
+ });
+ },
renderLineageLayoutView: function(obj) {
var that = this;
require(['views/graph/LineageLayoutView'], function(LineageLayoutView) {
diff --git a/dashboardv3/public/js/views/detail_page/PendingTaskTableLayoutView.js b/dashboardv3/public/js/views/detail_page/PendingTaskTableLayoutView.js
new file mode 100644
index 0000000..0e32ebe
--- /dev/null
+++ b/dashboardv3/public/js/views/detail_page/PendingTaskTableLayoutView.js
@@ -0,0 +1,218 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define(['require',
+ 'backbone',
+ 'hbs!tmpl/detail_page/PendingTaskTableLayoutView_tmpl',
+ 'collection/VEntityList',
+ 'utils/Utils',
+ 'utils/Enums',
+ 'utils/UrlLinks',
+ 'utils/CommonViewFunction'
+], function(require, Backbone, PendingTaskTableLayoutView_tmpl, VEntityList, Utils, Enums, UrlLinks, CommonViewFunction) {
+ 'use strict';
+
+ var PendingTaskTableLayoutView = Backbone.Marionette.LayoutView.extend(
+ /** @lends PendingTaskTableLayoutView */
+ {
+ _viewName: 'PendingTaskTableLayoutView',
+
+ template: PendingTaskTableLayoutView_tmpl,
+
+ /** Layout sub regions */
+ regions: {
+ RPendingTaskTableLayoutView: "#r_pendingTaskTableLayoutView",
+ },
+
+ /** ui selector cache */
+ ui: {
+ refreshPendingTask: "[data-id='refreshPendingTask']"
+ },
+ /** ui events hash */
+ events: function() {
+ var events = {};
+ events["click " + this.ui.refreshPendingTask] = function(e) {
+ this.fetchPendingTaskCollection();
+ };
+ return events;
+ },
+ /**
+ * intialize a new PendingTaskTableLayoutView Layout
+ * @constructs
+ */
+ initialize: function(options) {
+ _.extend(this, _.pick(options, 'guid', 'entity', 'entityName', 'attributeDefs'));
+ this.pendingTaskCollection = new VEntityList();
+ this.limit = 25;
+ this.offset = 0;
+ this.pendingTaskCollection.url = UrlLinks.pendingTaskApiUrl();
+ this.entityModel = new this.pendingTaskCollection.model();
+ this.pervOld = [];
+ this.commonTableOptions = {
+ collection: this.pendingTaskCollection,
+ includeFilter: false,
+ includePagination: false,
+ includeAtlasPagination: true,
+ includeAtlasPageSize: true,
+ includeTableLoader: true,
+ includeAtlasTableSorting: false,
+ showDefaultTableSorted: false,
+ columnSorting: false,
+ includeFooterRecords: false,
+ gridOpts: {
+ className: "table table-hover backgrid table-quickMenu",
+ emptyText: 'No records found!'
+ },
+ isApiSorting: false,
+ atlasPaginationOpts: this.getPaginationOptions(),
+ filterOpts: {},
+ paginatorOpts: {}
+ };
+ this.currPage = 1;
+ this.fromSort = false;
+ },
+ onRender: function() {
+ this.fetchPendingTaskCollection();
+ },
+ fetchPendingTaskCollection: function() {
+ this.commonTableOptions['atlasPaginationOpts'] = this.getPaginationOptions();
+ this.fetchCollection();
+ this.pendingTaskCollection.comparator = function(model) {
+ return -model.get('createdBy');
+ }
+ },
+ bindEvents: function() {},
+ getPaginationOptions: function() {
+ return {
+ count: this.getPageCount(),
+ offset: this.pendingTaskCollection.queryParams.offset || this.offset,
+ fetchCollection: this.fetchCollection.bind(this)
+ };
+ },
+ getPageCount: function() {
+ return (this.pendingTaskCollection.queryParams.limit || this.pendingTaskCollection.queryParams.count) || this.limit;
+ },
+ fetchCollection: function(options) {
+ var that = this;
+
+ this.pendingTaskCollection.fetch({
+ success: function(dataOrCollection, response) {
+ that.pendingTaskCollection.state.pageSize = that.getPageCount();
+ that.pendingTaskCollection.fullCollection.reset(response);
+ },
+ complete: function() {
+ that.$('.fontLoader').hide();
+ that.$('.tableOverlay').hide();
+ that.$('.auditTable').show();
+ that.renderTableLayoutView();
+ },
+ silent: true
+ });
+
+ },
+ renderTableLayoutView: function() {
+ var that = this;
+ require(['utils/TableLayout'], function(TableLayout) {
+ var cols = new Backgrid.Columns(that.getAuditTableColumns());
+ that.RPendingTaskTableLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, {
+ columns: cols
+ })));
+
+ });
+ },
+ getAuditTableColumns: function() {
+ var that = this;
+ return this.pendingTaskCollection.constructor.getTableCols({
+ tool: {
+ label: "",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ fixWidth: "20",
+ cell: Backgrid.ExpandableCell,
+ accordion: false,
+ expand: function(el, model) {
+ el.attr('colspan', '8');
+ var count = model.get('attemptCount'),
+ parameters = _.omit(_.extend(model.get('parameters'), { 'attemptCount': model.get('attemptCount'), 'createdBy': model.get('createdBy') }),"entityGuid"),
+ memoryTable = CommonViewFunction.propertyTable({
+ scope: this,
+ formatStringVal: false,
+ valueObject: parameters
+ }),
+ tableData = ' <div class="col-sm-12"> <div class="card-container panel panel-default custom-panel">' +
+ '<div class="panel-heading">Parameters</div> <div class="panel-body">' +
+ '<table class="table stat-table task-details">' +
+ '<tbody data-id="memory-card">' +
+ memoryTable +
+ '</tbody>' +
+ '</table> </div> </div> </div>';
+ $(el).append($('<div>').html(tableData));
+ }
+ },
+ type: {
+ label: "Type",
+ cell: "html",
+ sortable: false,
+ editable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Enums.auditAction[model.get('type')] || rawValue;
+ }
+ })
+ },
+ guid: {
+ label: "Guid",
+ cell: "html",
+ sortable: false,
+ editable: false
+ },
+ status: {
+ label: "Status",
+ cell: "html",
+ sortable: false,
+ editable: false
+ },
+ createdTime: {
+ label: "Created Time",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Utils.formatDate({ date: rawValue });
+ }
+ })
+ },
+ updatedTime: {
+ label: "Updated Time",
+ cell: "html",
+ editable: false,
+ sortable: false,
+ formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+ fromRaw: function(rawValue, model) {
+ return Utils.formatDate({ date: rawValue });
+ }
+ })
+ }
+ }, this.pendingTaskCollection);
+
+ }
+ });
+ return PendingTaskTableLayoutView;
+});
\ No newline at end of file
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index b812819..e4b6ea9 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -23,6 +23,7 @@ import org.apache.atlas.ApplicationProperties;
import org.apache.atlas.AtlasClient;
import org.apache.atlas.AtlasConfiguration;
import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasConfiguration;
import org.apache.atlas.authorize.AtlasAdminAccessRequest;
import org.apache.atlas.authorize.AtlasAuthorizationUtils;
import org.apache.atlas.authorize.AtlasEntityAccessRequest;
@@ -170,6 +171,7 @@ public class AdminResource {
private final String uiDateFormat;
private final AtlasDebugMetricsSink debugMetricsRESTSink;
private final boolean isDebugMetricsEnabled;
+ private final boolean isTasksEnabled;
static {
try {
@@ -209,11 +211,13 @@ public class AdminResource {
this.isTimezoneFormatEnabled = atlasProperties.getBoolean(UI_DATE_TIMEZONE_FORMAT_ENABLED, true);
this.uiDateFormat = atlasProperties.getString(UI_DATE_FORMAT, UI_DATE_DEFAULT_FORMAT);
this.isDebugMetricsEnabled = AtlasConfiguration.DEBUG_METRICS_ENABLED.getBoolean();
+ this.isTasksEnabled = AtlasConfiguration.TASKS_USE_ENABLED.getBoolean();
} else {
this.defaultUIVersion = UI_VERSION_V2;
this.isTimezoneFormatEnabled = true;
this.uiDateFormat = UI_DATE_DEFAULT_FORMAT;
this.isDebugMetricsEnabled = false;
+ this.isTasksEnabled = false;
}
}
@@ -362,7 +366,8 @@ public class AdminResource {
responseData.put(UI_DATE_TIMEZONE_FORMAT_ENABLED, isTimezoneFormatEnabled);
responseData.put(UI_DATE_FORMAT, uiDateFormat);
responseData.put(AtlasConfiguration.DEBUG_METRICS_ENABLED.getPropertyName(), isDebugMetricsEnabled);
-
+ responseData.put(AtlasConfiguration.TASKS_USE_ENABLED.getPropertyName(), isTasksEnabled);
+
response = Response.ok(AtlasJson.toV1Json(responseData)).build();
if (LOG.isDebugEnabled()) {