Skip to content

Commit

Permalink
[HOPSWORKS-932] Persist jobs date and pagination size. (dc-sics#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
tkakantousis committed Mar 6, 2019
1 parent c4e7516 commit dc14ee9
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 49 deletions.
2 changes: 0 additions & 2 deletions hopsworks-web/yo/app/scripts/controllers/datasetsCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -913,10 +913,8 @@ angular.module('hopsWorksApp')

ModalService.upload('lg', self.projectId, getPath(self.pathArray), templateId).then(
function (success) {
growl.success(success, {ttl: 5000});
getDirContents();
}, function (error) {
// growl.info("Closed without saving.", {title: 'Info', ttl: 5000});
getDirContents();
});
};
Expand Down
121 changes: 81 additions & 40 deletions hopsworks-web/yo/app/scripts/controllers/jobsCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ angular.module('hopsWorksApp')
self.currentToggledIndex = -1;
self.fetchingLogs = 0;
self.loadingLog = 0;
self.pageSize = 10;
self.pageSize = 8;
self.currentPage = 1;

self.executionsPageSize = 5;
self.executionsCurrentPage = 1;

Expand All @@ -78,8 +80,9 @@ angular.module('hopsWorksApp')
self.reverse = true;
self.getAllJobsStatusIsPending = false;
self.dimTable = false;
self.totalItems = 0;

self.sort = function (keyname) {
self.sort = function (keyname) {
//Untoggle current job
self.untoggle(self.jobs[self.selectedIndex], self.selectedIndex);
if(self.sortKey !== keyname){
Expand Down Expand Up @@ -242,38 +245,35 @@ angular.module('hopsWorksApp')
};


self.pageSize = 8;
self.currentPage = 1;

self.getAllJobsStatus = function (toDimTable, overwriteJobs, limit, offset, sortBy, expansion) {
if(self.getAllJobsStatusIsPending === true){
return;
}
self.getAllJobsStatusIsPending = true;
if(toDimTable !== undefined && toDimTable !== null && toDimTable) {
if(typeof toDimTable !== 'undefined' && toDimTable && self.jobs.length !== 0) {
self.dimTable = true;
} else {
self.dimTable = false;
}
//var jobsTemp = [];
if(limit === undefined || limit === null){
if(typeof limit === 'undefined'){
limit = self.pageSize;
}
if(offset === undefined || offset === null){
if(typeof offset === 'undefined'){
offset = self.pageSize * (self.currentPage - 1);
}
if(expansion === undefined || expansion === null){
if(typeof expansion === 'undefined'){
expansion = "&expand=executions(offset=0;limit=1;sort_by=id:desc)&expand=creator";
}
if(sortBy === undefined || sortBy === null){
if(typeof sortBy === 'undefined'){
//Here we want to use the *_latest sortBy keys of Hopsworks, which return a view of the jobs
// sorted by their latest execution (=subresource) attributes
sortBy = "&sort_by=" + self.sortKey.toLowerCase() + ":" + self.orderBy.toLowerCase();
}

var filterBy = "&filter_by=date_created_lt:" + self.jobsToDate.toISOString().replace('Z','')
+ "&filter_by=date_created_gt:" + self.jobsFromDate.toISOString().replace('Z','');
if(self.jobFilter !== undefined && self.jobFilter !== null && self.jobFilter !== "") {
if(typeof self.jobFilter !== 'undefined' && self.jobFilter !== "") {
filterBy += "&filter_by=latest_execution:" + self.jobFilter;
}

Expand All @@ -282,6 +282,7 @@ angular.module('hopsWorksApp')
if(success.data.count === 0){
self.getAllJobsStatusIsPending = false;
self.jobs.length = 0;
self.totalItems = 0;
return;
}
//If jobs fetched from Hopsworks are non the same count as in browser, reset jobs table
Expand All @@ -292,7 +293,7 @@ angular.module('hopsWorksApp')
var i=0;
//Construct an array of jobs and their latest execution info
angular.forEach(success.data.items, function (job, key) {
if(self.jobs[i] === undefined){
if(typeof self.jobs[i] === 'undefined'){
self.jobs[i] = {};
}
self.jobs[i].name = job.name;
Expand All @@ -302,18 +303,22 @@ angular.module('hopsWorksApp')
self.jobs[i].creator = job.creator;
self.jobs[i].config = job.config;

if(job.executions.items !== undefined && job.executions.items !== null) {
if(typeof job.executions.items !== 'undefined') {
self.jobs[i].running = self.runningStates.includes(job.executions.items[0].state);
self.jobs[i].showing = false;
if(typeof self.currentjob !== 'undefined' && self.currentjob !== null
&& job.name !== self.currentjob.name) {
self.jobs[i].showing = false;
}
self.jobs[i].state = job.executions.items[0].state;
self.jobs[i].finalStatus = job.executions.items[0].finalStatus;
self.jobs[i].progress = job.executions.items[0].progress;
self.jobs[i].duration = job.executions.items[0].duration;
self.jobs[i].submissionTime = job.executions.items[0].submissionTime;

if (self.currentjob != null
if (typeof self.currentjob !== 'undefined'
&& self.currentjob !== null
&& self.currentjob.name === job.name
&& job.executions.items[0].state !== self.currentjob.state
&& (job.executions.items[0].state === 'INITIALIZING' || job.executions.items[0].state === 'STARTING_APP_MASTER' || job.executions.items[0].state === 'ACCEPTED')
&& self.currentjob.showing === true) {
self.showLogs(job.name);
}
Expand All @@ -322,7 +327,7 @@ angular.module('hopsWorksApp')
});

self.totalItems = 0;
if(success.data.count !== undefined && success.data.count !== null) {
if(typeof success.data.count !== 'undefined' && success.data.count !== null) {
self.totalItems = success.data.count;
}

Expand All @@ -335,11 +340,11 @@ angular.module('hopsWorksApp')
if(self.tourService.currentStep_TourNine === 10){
self.tourService.currentStep_TourNine = 11 //Feature Store tour
}
if(toDimTable !== undefined && toDimTable !== null && toDimTable){
if(typeof toDimTable !== 'undefined' && toDimTable){
self.dimTable = false;
}
}, function (error) {
if(toDimTable !== undefined && toDimTable !== null && toDimTable){
if(typeof toDimTable !== 'undefined' && toDimTable){
self.dimTable = false;
}
self.getAllJobsStatusIsPending = false;
Expand All @@ -364,7 +369,7 @@ angular.module('hopsWorksApp')

self.getNumOfExecution = function () {
if (self.hasSelectJob) {
if (self.executionTotalItems === undefined) {
if (typeof self.executionTotalItems === 'undefined') {
return 0;
} else {
return self.executionTotalItems;
Expand All @@ -373,7 +378,6 @@ angular.module('hopsWorksApp')
return 0;
};

self.getAllJobsStatus();

self.runJob = function (job, index) {
ProjectService.uberPrice({id: self.projectId}).$promise.then(
Expand Down Expand Up @@ -483,7 +487,7 @@ angular.module('hopsWorksApp')
self.logset.length = 0;
angular.forEach(success.data.items, function (execution, key) {
var entry = {"jobName": jobName, "executionId": execution.id, "time": execution.submissionTime};
if(execution.appId === undefined){
if(typeof execution.appId === 'undefined'){
entry["appId"] = "N/A";
} else {
entry["appId"] = execution.appId;
Expand Down Expand Up @@ -514,19 +518,19 @@ angular.module('hopsWorksApp')
JobService.getLog(self.projectId, logsetEntry.jobName, logsetEntry.executionId, type).then(
function (success) {
var logContent = success.data;
if (logContent['log'] !== undefined) {
if (typeof logContent['log'] !== 'undefined') {
logsetEntry['log'+type] = logContent['log'];
}
if (logContent['type'] !== undefined) {
if (typeof logContent['type'] !== 'undefined') {
logsetEntry['type'] = logContent['type'];
}
if (logContent['path'] !== undefined) {
if (typeof logContent['path'] !== 'undefined') {
logsetEntry[type + 'path'] = logContent['path'];
}
if (logContent['retriableErr'] !== undefined) {
if (typeof logContent['retriableErr'] !== 'undefined') {
logsetEntry['retriableErr'] = logContent['retriableErr'];
}
if (logContent['retriableOut'] !== undefined) {
if (typeof logContent['retriableOut'] !== 'undefined') {
logsetEntry['retriableOut'] = logContent['retriableOut'];
}
self.loadingLog = 0;
Expand All @@ -541,7 +545,7 @@ angular.module('hopsWorksApp')
};

self.retryLogs = function (appId, type) {
if (appId === '' || appId === undefined) {
if (typeof appId === 'undefined' || appId === '' ) {
growl.error("Can not retry log. The job has not yet been assigned an Id", {title: 'Error', ttl: 5000});
}
JobService.retryLog(self.projectId, appId, type).then(
Expand Down Expand Up @@ -609,10 +613,11 @@ angular.module('hopsWorksApp')

////////////////////////////////////////////////////////////////////
self.untoggle = function (job, index) {
if((job === undefined || job === null) && self.currentjob !== undefined && self.currentjob !== null) {
if(typeof job === 'undefined' && typeof self.currentjob !== 'undefined') {
job = self.currentjob;
StorageService.remove(self.projectId + "_jobui_" + job.name);
}
StorageService.remove(self.projectId + "_jobui_" + job.name);

//reset all jobs showing flag
for (var i = 0; i < self.jobs.length; i++) {
self.jobs[i].showing = false;
Expand All @@ -636,18 +641,9 @@ angular.module('hopsWorksApp')
$interval.cancel(self.poller);
});

var startPolling = function () {
self.poller = $interval(function () {
if (self.getAllJobsStatusIsPending){
return;
}
self.getAllJobsStatus(false, false);
}, 5000);
};
startPolling();

$scope.convertMS = function (ms) {
if (ms === undefined) {
if (typeof ms === 'undefined') {
return "";
}
var m, s;
Expand All @@ -674,8 +670,53 @@ angular.module('hopsWorksApp')
var stored = StorageService.contains(self.projectId + "_newjob");
if (stored) {
$location.path('project/' + self.projectId + '/newjob');
} else {
//Set/recover user dates
//If dates are in local storage, retrieve them and set them. Otherwise set default values

if (StorageService.contains(self.projectId + "_jobsToDate")) {
var to = StorageService.get(self.projectId + "_jobsToDate");
self.jobsToDate = new Date(to);
} else {
self.jobsToDate.setMinutes(self.jobsToDate.getMinutes() + 60*24);
}
if (StorageService.contains(self.projectId + "_jobsFromDate")) {
var from = StorageService.get(self.projectId + "_jobsFromDate");
self.jobsFromDate = new Date(from);
} else {
self.jobsFromDate.setMinutes(self.jobsToDate.getMinutes() - 60*24*31);
}
if (StorageService.contains(self.projectId + "_jobsPageSize")) {
self.pageSize = StorageService.get(self.projectId + "_jobsPageSize");
} else {
self.pageSize = 8;
}
}
};

self.storeDates = function (type) {
if (type === "jobsFromDate") {
self.jobsFromDate.setHours(0,0,0,0);
StorageService.store(self.projectId + "_" + type, self.jobsFromDate.getTime());
} else if (type === "jobsToDate") {
self.jobsToDate.setHours(0,0,0,0);
StorageService.store(self.projectId + "_" + type, self.jobsToDate.getTime());
}
};

self.storePageSize = function() {
StorageService.store(self.projectId + "_jobsPageSize", self.pageSize);
};

init();

var startPolling = function () {
self.poller = $interval(function () {
if (self.getAllJobsStatusIsPending) {
return;
}
self.getAllJobsStatus(false, false);
}, 5000);
};
startPolling();
}]);
8 changes: 4 additions & 4 deletions hopsworks-web/yo/app/styles/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -531,10 +531,10 @@ th:focus {
outline: none !important;
}

tbody > tr > td {
padding: 6px !important;
vertical-align: middle !important;
}
/*tbody > tr > td {*/
/*padding: 6px !important;*/
/*vertical-align: middle !important;*/
/*}*/

md-input-container {
margin-bottom: 0px !important;
Expand Down
11 changes: 8 additions & 3 deletions hopsworks-web/yo/app/views/jobs.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ <h3 id="projectBread" style="display: none;"> {{ projectCtrl.currentProject.proj
ng-model-options="{debounce: 700}" ng-change="jobsCtrl.untoggle(job, $index)">
<i class="fa fa-info-circle"
uib-tooltip="Case sensitive search name, type, owner. Select date range to search based on jobs creation date."></i>
<md-datepicker ng-change="jobsCtrl.getAllJobsStatus()" ng-model="jobsCtrl.jobsFromDate"
<md-datepicker ng-change="jobsCtrl.storeDates('jobsFromDate');jobsCtrl.getAllJobsStatus()"
ng-model="jobsCtrl.jobsFromDate"
md-placeholder="From"></md-datepicker>
<md-datepicker ng-change="jobsCtrl.getAllJobsStatus()" ng-model="jobsCtrl.jobsToDate"
<md-datepicker ng-change="jobsCtrl.storeDates('jobsToDate');jobsCtrl.getAllJobsStatus()"
ng-model="jobsCtrl.jobsToDate"
md-placeholder="To"></md-datepicker>
</label>
</div>
Expand All @@ -87,7 +89,8 @@ <h3 id="projectBread" style="display: none;"> {{ projectCtrl.currentProject.proj
<label>jobs per page:
<input type="number" min="1"
max="50"
class="form-control" ng-model="jobsCtrl.pageSize" ng-model-options="{debounce: 300}">
class="form-control" ng-change="jobsCtrl.storePageSize()" ng-model="jobsCtrl.pageSize"
ng-model-options="{debounce: 300}">
</label>
</div>
</div>
Expand Down Expand Up @@ -142,6 +145,7 @@ <h3 id="projectBread" style="display: none;"> {{ projectCtrl.currentProject.proj
<tbody>
<tr
dir-paginate="job in jobsCtrl.jobs| itemsPerPage:jobsCtrl.pageSize"
pagination-id="jobs_pagination"
current-page="jobsCtrl.currentPage"
total-items="jobsCtrl.totalItems"
ng-class="{'active':$index === jobsCtrl.selectedIndex}" ng-click="jobsCtrl.toggle(job, $index);jobsCtrl.showLogs(job.name);">
Expand Down Expand Up @@ -353,6 +357,7 @@ <h3 id="projectBread" style="display: none;"> {{ projectCtrl.currentProject.proj
<dir-pagination-controls
class="pull-right"
max-size="jobsCtrl.pageSize"
pagination-id="jobs_pagination"
direction-links="true"
boundary-links="true"
on-page-change="jobsCtrl.getJobsNextPage()">
Expand Down

0 comments on commit dc14ee9

Please sign in to comment.