From 88e8423a4e376d5692bc12882ea8794063953ab1 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Fri, 8 Jul 2016 15:12:19 +0900 Subject: [PATCH 1/4] Add filter for job management --- .../app/jobmanager/jobmanager.controller.js | 139 +++++++++++++++++- .../src/app/jobmanager/jobmanager.html | 58 +++++++- 2 files changed, 187 insertions(+), 10 deletions(-) diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js index 760be455188..b298b15a09c 100644 --- a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js @@ -15,14 +15,78 @@ 'use strict'; angular.module('zeppelinWebApp') + .filter('jobManager', function() { + + function filterContext(jobItems, filterConfig) { + var filterValueInterpreter = filterConfig.filterValueInterpreter; + var filterValueNotebookName = filterConfig.filterValueNotebookName; + var isRunningAlwaysTop = filterConfig.isRunningAlwaysTop; + var isSortByAsc = filterConfig.isSortByAsc; + + var filterItems = jobItems; + + if (filterValueInterpreter === undefined) { + filterItems = _.filter(filterItems, function (jobItem) { + return jobItem.interpreter === undefined? true : false; + }); + } else if (filterValueInterpreter !== '*') { + filterItems = _.where(filterItems, {interpreter : filterValueInterpreter}); + } + + if (filterValueNotebookName !== '') { + filterItems = _.filter(filterItems, function(jobItem){ + var lowerFilterValue = filterValueNotebookName.toLocaleLowerCase(); + var lowerNotebookName = jobItem.notebookName.toLocaleLowerCase(); + return lowerNotebookName.match(new RegExp('.*'+lowerFilterValue+'.*')); + }); + } + + if (isSortByAsc === true) { + filterItems = _.sortBy(filterItems, function (sortItem) { + return sortItem.notebookName; + }); + } else { + filterItems = _.sortBy(filterItems, function (sortItem) { + return sortItem.notebookName; + }); + filterItems = filterItems.reverse(); + } + + if (isRunningAlwaysTop === true) { + var runningJobList = _.where(filterItems, {isRunningJob : true}); + filterItems = _.reject(filterItems, {isRunningJob : true}); + runningJobList.map(function (runningJob) { + filterItems.splice(0,0, runningJob); + }); + } + + return filterItems; + } + return filterContext; + }) .controller('JobmanagerCtrl', function($scope, $route, $routeParams, $location, $rootScope, $http, $q, - websocketMsgSrv, baseUrlSrv, $interval, $timeout, SaveAsService) { + websocketMsgSrv, baseUrlSrv, $interval, $timeout, jobManagerFilter) { $scope.$on('setNotebookJobs', function(event, responseData) { $scope.lastJobServerUnixTime = responseData.lastResponseUnixTime; $scope.jobInfomations = responseData.jobs; $scope.jobInfomationsIndexs = $scope.jobInfomations? _.indexBy($scope.jobInfomations, 'notebookId') : {}; + $scope.JobInfomationsByFilter = $scope.jobTypeFilter($scope.jobInfomations, $scope.filterConfig); + $scope.activeInterpreters = [ + { + name : 'ALL', + value : '*' + } + ]; + var interpreterLists = _.uniq(_.pluck($scope.jobInfomations, 'interpreter'), false); + for (var index = 0, length = interpreterLists.length; index < length; index++) { + $scope.activeInterpreters.push({ + name : interpreterLists[index], + value : interpreterLists[index] + }); + } + $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); }); $scope.$on('setUpdateNotebookJobs', function(event, responseData) { @@ -61,20 +125,76 @@ angular.module('zeppelinWebApp') changeOriginTarget.paragraphs = changedItem.paragraphs; } } + $scope.doFiltering(jobInfomations, $scope.filterConfig); }); }); - $scope.filterValueToName = function (filterValue) { - var index = _.findIndex($scope.ACTIVE_INTERPRETERS, {value : filterValue}); + $scope.doFiltering = function (jobInfomations, filterConfig) { + asyncNotebookJobFilter(jobInfomations, filterConfig).then( + function () { + // success + $scope.isLoadingFilter = false; + }, + function (){ + // failed + }); + }; - if ($scope.ACTIVE_INTERPRETERS[index].name !== undefined) { - return $scope.ACTIVE_INTERPRETERS[index].name; + $scope.filterValueToName = function (filterValue, maxStringLength) { + if ($scope.activeInterpreters === undefined) { + return; + } + var index = _.findIndex($scope.activeInterpreters, {value : filterValue}); + if (index < 0) { + console.log('filtervalue [{}]', filterValue, ' ', $scope.activeInterpreters); + } + if ($scope.activeInterpreters[index].name !== undefined) { + if (maxStringLength !== undefined + && maxStringLength > $scope.activeInterpreters[index].name) { + return $scope.activeInterpreters[index].name.substr(0, maxStringLength -3) + '...'; + } + return $scope.activeInterpreters[index].name; } else { - return 'undefined'; + return 'Undefined'; + } + }; + + $scope.setFilterValue = function (filterValue) { + $scope.filterConfig.filterValueInterpreter = filterValue; + $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); + }; + + $scope.onChangeRunJobToAlwaysTopToggle = function () { + $scope.filterConfig.isRunningAlwaysTop = !$scope.filterConfig.isRunningAlwaysTop; + $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); + }; + + $scope.onChangeSortAsc = function () { + $scope.filterConfig.isSortByAsc = !$scope.filterConfig.isSortByAsc; + $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); + }; + + $scope.doFilterInputTyping = function (keyEvent, jobInfomations, filterConfig) { + var RETURN_KEY_CODE = 13; + $timeout.cancel($scope.dofilterTimeoutObject); + $scope.dofilterTimeoutObject = $timeout(function(){ + $scope.doFiltering(jobInfomations, filterConfig); + }, 1000); + if (keyEvent.which === RETURN_KEY_CODE) { + $timeout.cancel($scope.dofilterTimeoutObject); + $scope.doFiltering(jobInfomations, filterConfig); } }; $scope.init = function () { + $scope.isLoadingFilter = true; + $scope.filterConfig = { + isRunningAlwaysTop : true, + filterValueNotebookName : '', + filterValueInterpreter : '*', + isSortByAsc : true + }; + $scope.jobTypeFilter = jobManagerFilter; $scope.jobInfomations = []; $scope.JobInfomationsByFilter = $scope.jobInfomations; @@ -90,4 +210,11 @@ angular.module('zeppelinWebApp') websocketMsgSrv.unsubscribeJobManager(); }); }; + + var asyncNotebookJobFilter = function (jobInfomations, filterConfig) { + return $q(function(resolve, reject) { + $scope.JobInfomationsByFilter = $scope.jobTypeFilter(jobInfomations, filterConfig); + resolve($scope.JobInfomationsByFilter); + }); + }; }); diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.html b/zeppelin-web/src/app/jobmanager/jobmanager.html index 598c3f7c006..63954e48af2 100644 --- a/zeppelin-web/src/app/jobmanager/jobmanager.html +++ b/zeppelin-web/src/app/jobmanager/jobmanager.html @@ -32,8 +32,49 @@

+
+
+ + + + + + + + + +
+
+
+ +  Loading... +
+
+
From 5bf6df08a866eac18202060435f3fe845e35da95 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Fri, 8 Jul 2016 16:43:47 +0900 Subject: [PATCH 2/4] added job management play/stop controller --- .../app/jobmanager/jobmanager.controller.js | 3 +- .../src/app/jobmanager/jobs/job-control.html | 16 ++++- .../src/app/jobmanager/jobs/job.controller.js | 68 ++++++++++++++++++- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js index b298b15a09c..2b123a8ebbd 100644 --- a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js @@ -149,8 +149,7 @@ angular.module('zeppelinWebApp') console.log('filtervalue [{}]', filterValue, ' ', $scope.activeInterpreters); } if ($scope.activeInterpreters[index].name !== undefined) { - if (maxStringLength !== undefined - && maxStringLength > $scope.activeInterpreters[index].name) { + if (maxStringLength !== undefined && maxStringLength > $scope.activeInterpreters[index].name) { return $scope.activeInterpreters[index].name.substr(0, maxStringLength -3) + '...'; } return $scope.activeInterpreters[index].name; diff --git a/zeppelin-web/src/app/jobmanager/jobs/job-control.html b/zeppelin-web/src/app/jobmanager/jobs/job-control.html index 2cd0bf8e05b..f8d56df428d 100644 --- a/zeppelin-web/src/app/jobmanager/jobs/job-control.html +++ b/zeppelin-web/src/app/jobmanager/jobs/job-control.html @@ -18,14 +18,26 @@ - Notebook is RUNNING + RUNNING - Notebook is READY + READY {{getProgress()}}% + + + + + +
diff --git a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js index dcd470a2c58..5abd5a426c4 100644 --- a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js @@ -36,4 +36,70 @@ angular.module('zeppelinWebApp') return isNaN(result)? 0 : result; }; -}); + $scope.lastExecuteTime = function (unixtime) { + return moment.unix(unixtime/1000).fromNow(); + }; + + $scope.runNotebookJob = function (notebookId) { + BootstrapDialog.confirm({ + closable: true, + title: '', + message: 'Run all paragraphs?', + callback: function(result) { + if (result === true) { + $http({ + method: 'POST', + url: baseUrlSrv.getRestApiBase() + '/notebook/job/' + notebookId, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then(function successCallback(response) { + // success + }, function errorCallback(errorResponse) { + var errorText = 'SERVER ERROR'; + if (errorResponse.data.message !== undefined) { + errorText = errorResponse.data.message; + } + BootstrapDialog.alert({ + closable: true, + title: 'Execution Failure', + message: errorText + }); + }); + } + } + }); + }; + + $scope.stopNotebookJob = function (notebookId) { + BootstrapDialog.confirm({ + closable: true, + title: '', + message: 'Stop all paragraphs?', + callback: function(result) { + if (result === true) { + $http({ + method: 'DELETE', + url: baseUrlSrv.getRestApiBase() + '/notebook/job/' + notebookId, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then(function successCallback(response) { + // success + }, function errorCallback(errorResponse) { + var errorText = 'SERVER ERROR'; + if (errorResponse.data.message !== undefined) { + errorText = errorResponse.data.message; + } + BootstrapDialog.alert({ + closable: true, + title: 'Stop Failure', + message: errorText + }); + }); + } + } + }); + }; + + }); From 3e9dde9dcd2e27608f84a58562eee5510b3048fa Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Tue, 12 Jul 2016 15:37:03 +0900 Subject: [PATCH 3/4] job controller js code style --- .../app/jobmanager/jobmanager.controller.js | 66 +++++++++---------- .../src/app/jobmanager/jobs/job.controller.js | 9 ++- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js index 647ce35b7f3..c0bce516c92 100644 --- a/zeppelin-web/src/app/jobmanager/jobmanager.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobmanager.controller.js @@ -26,36 +26,36 @@ angular.module('zeppelinWebApp') var filterItems = jobItems; if (filterValueInterpreter === undefined) { - filterItems = _.filter(filterItems, function (jobItem) { - return jobItem.interpreter === undefined? true : false; + filterItems = _.filter(filterItems, function(jobItem) { + return jobItem.interpreter === undefined ? true : false; }); } else if (filterValueInterpreter !== '*') { - filterItems = _.where(filterItems, {interpreter : filterValueInterpreter}); + filterItems = _.where(filterItems, {interpreter: filterValueInterpreter}); } if (filterValueNotebookName !== '') { - filterItems = _.filter(filterItems, function(jobItem){ + filterItems = _.filter(filterItems, function(jobItem) { var lowerFilterValue = filterValueNotebookName.toLocaleLowerCase(); var lowerNotebookName = jobItem.notebookName.toLocaleLowerCase(); - return lowerNotebookName.match(new RegExp('.*'+lowerFilterValue+'.*')); + return lowerNotebookName.match(new RegExp('.*' + lowerFilterValue + '.*')); }); } if (isSortByAsc === true) { - filterItems = _.sortBy(filterItems, function (sortItem) { + filterItems = _.sortBy(filterItems, function(sortItem) { return sortItem.notebookName; }); } else { - filterItems = _.sortBy(filterItems, function (sortItem) { + filterItems = _.sortBy(filterItems, function(sortItem) { return sortItem.notebookName; }); filterItems = filterItems.reverse(); } if (isRunningAlwaysTop === true) { - var runningJobList = _.where(filterItems, {isRunningJob : true}); - filterItems = _.reject(filterItems, {isRunningJob : true}); - runningJobList.map(function (runningJob) { + var runningJobList = _.where(filterItems, {isRunningJob: true}); + filterItems = _.reject(filterItems, {isRunningJob: true}); + runningJobList.map(function(runningJob) { filterItems.splice(0,0, runningJob); }); } @@ -71,19 +71,19 @@ angular.module('zeppelinWebApp') $scope.$on('setNotebookJobs', function(event, responseData) { $scope.lastJobServerUnixTime = responseData.lastResponseUnixTime; $scope.jobInfomations = responseData.jobs; - $scope.jobInfomationsIndexs = $scope.jobInfomations? _.indexBy($scope.jobInfomations, 'notebookId') : {}; + $scope.jobInfomationsIndexs = $scope.jobInfomations ? _.indexBy($scope.jobInfomations, 'notebookId') : {}; $scope.JobInfomationsByFilter = $scope.jobTypeFilter($scope.jobInfomations, $scope.filterConfig); $scope.activeInterpreters = [ { - name : 'ALL', - value : '*' + name: 'ALL', + value: '*' } ]; var interpreterLists = _.uniq(_.pluck($scope.jobInfomations, 'interpreter'), false); for (var index = 0, length = interpreterLists.length; index < length; index++) { $scope.activeInterpreters.push({ - name : interpreterLists[index], - value : interpreterLists[index] + name: interpreterLists[index], + value: interpreterLists[index] }); } $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); @@ -129,28 +129,28 @@ angular.module('zeppelinWebApp') }); }); - $scope.doFiltering = function (jobInfomations, filterConfig) { + $scope.doFiltering = function(jobInfomations, filterConfig) { asyncNotebookJobFilter(jobInfomations, filterConfig).then( - function () { + function() { // success $scope.isLoadingFilter = false; }, - function (){ + function() { // failed }); }; - $scope.filterValueToName = function (filterValue, maxStringLength) { + $scope.filterValueToName = function(filterValue, maxStringLength) { if ($scope.activeInterpreters === undefined) { return; } - var index = _.findIndex($scope.activeInterpreters, {value : filterValue}); + var index = _.findIndex($scope.activeInterpreters, {value: filterValue}); if (index < 0) { console.log('filtervalue [{}]', filterValue, ' ', $scope.activeInterpreters); } if ($scope.activeInterpreters[index].name !== undefined) { if (maxStringLength !== undefined && maxStringLength > $scope.activeInterpreters[index].name) { - return $scope.activeInterpreters[index].name.substr(0, maxStringLength -3) + '...'; + return $scope.activeInterpreters[index].name.substr(0, maxStringLength - 3) + '...'; } return $scope.activeInterpreters[index].name; } else { @@ -158,25 +158,25 @@ angular.module('zeppelinWebApp') } }; - $scope.setFilterValue = function (filterValue) { + $scope.setFilterValue = function(filterValue) { $scope.filterConfig.filterValueInterpreter = filterValue; $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); }; - $scope.onChangeRunJobToAlwaysTopToggle = function () { + $scope.onChangeRunJobToAlwaysTopToggle = function() { $scope.filterConfig.isRunningAlwaysTop = !$scope.filterConfig.isRunningAlwaysTop; $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); }; - $scope.onChangeSortAsc = function () { + $scope.onChangeSortAsc = function() { $scope.filterConfig.isSortByAsc = !$scope.filterConfig.isSortByAsc; $scope.doFiltering($scope.jobInfomations, $scope.filterConfig); }; - $scope.doFilterInputTyping = function (keyEvent, jobInfomations, filterConfig) { + $scope.doFilterInputTyping = function(keyEvent, jobInfomations, filterConfig) { var RETURN_KEY_CODE = 13; $timeout.cancel($scope.dofilterTimeoutObject); - $scope.dofilterTimeoutObject = $timeout(function(){ + $scope.dofilterTimeoutObject = $timeout(function() { $scope.doFiltering(jobInfomations, filterConfig); }, 1000); if (keyEvent.which === RETURN_KEY_CODE) { @@ -185,13 +185,13 @@ angular.module('zeppelinWebApp') } }; - $scope.init = function () { + $scope.init = function() { $scope.isLoadingFilter = true; $scope.filterConfig = { - isRunningAlwaysTop : true, - filterValueNotebookName : '', - filterValueInterpreter : '*', - isSortByAsc : true + isRunningAlwaysTop: true, + filterValueNotebookName: '', + filterValueInterpreter: '*', + isSortByAsc: true }; $scope.jobTypeFilter = jobManagerFilter; $scope.jobInfomations = []; @@ -210,10 +210,10 @@ angular.module('zeppelinWebApp') }); }; - var asyncNotebookJobFilter = function (jobInfomations, filterConfig) { + var asyncNotebookJobFilter = function(jobInfomations, filterConfig) { return $q(function(resolve, reject) { $scope.JobInfomationsByFilter = $scope.jobTypeFilter(jobInfomations, filterConfig); resolve($scope.JobInfomationsByFilter); }); }; -}); + }); diff --git a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js index 4d91e584d94..bc8bcd72627 100644 --- a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js @@ -36,12 +36,11 @@ angular.module('zeppelinWebApp') return isNaN(result) ? 0 : result; }; - - $scope.lastExecuteTime = function (unixtime) { - return moment.unix(unixtime/1000).fromNow(); + $scope.lastExecuteTime = function(unixtime) { + return moment.unix(unixtime / 1000).fromNow(); }; - $scope.runNotebookJob = function (notebookId) { + $scope.runNotebookJob = function(notebookId) { BootstrapDialog.confirm({ closable: true, title: '', @@ -72,7 +71,7 @@ angular.module('zeppelinWebApp') }); }; - $scope.stopNotebookJob = function (notebookId) { + $scope.stopNotebookJob = function(notebookId) { BootstrapDialog.confirm({ closable: true, title: '', From 16f1befe27cdb3d26c9ebc1b54c4c496ba4fdd87 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Mon, 29 Aug 2016 15:18:09 +0900 Subject: [PATCH 4/4] import $http, baseurlsrv in job.controller --- zeppelin-web/src/app/jobmanager/jobs/job.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js index 296fe866743..22066333156 100644 --- a/zeppelin-web/src/app/jobmanager/jobs/job.controller.js +++ b/zeppelin-web/src/app/jobmanager/jobs/job.controller.js @@ -14,7 +14,7 @@ 'use strict'; angular.module('zeppelinWebApp') - .controller('JobCtrl', function($scope) { + .controller('JobCtrl', function($scope, $http, baseUrlSrv) { $scope.init = function(jobInformation) { $scope.progressValue = 0;