blob: a984f531ff9593f42db898b985257f17b35a6cb6 [file] [log] [blame]
/**
* 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.
*/
(function () {
'use strict';
var entitiesListModule = angular.module('app.directives.instances-list', ['app.services' ]);
entitiesListModule.controller('InstancesListCtrl', ['$scope', 'Falcon', 'X2jsService', '$window', 'EncodeService', "DateHelper",
function($scope, Falcon, X2jsService, $window, encodeService, DateHelper) {
//$scope.downloadEntity = function(logURL) {
// Falcon.logRequest();
// Falcon.getInstanceLog(logURL) .success(function (data) {
// Falcon.logResponse('success', data, false, true);
// $window.location.href = 'data:application/octet-stream,' + encodeService.encode(data);
// }).error(function (err) {
// Falcon.logResponse('error', err, false);
// });
//};
$scope.downloadEntity = function(logURL) {
$window.location.href = logURL;
};
}]);
entitiesListModule.filter('tagFilter', function () {
return function (items) {
var filtered = [], i;
for (i = 0; i < items.length; i++) {
var item = items[i];
if(!item.list || !item.list.tag) { item.list = {tag:[""]}; }
filtered.push(item);
}
return filtered;
};
});
entitiesListModule.directive('instancesList', ["$timeout", 'Falcon', '$filter', 'DateHelper', function($timeout, Falcon, $filter, DateHelper) {
return {
scope: {
input: "=",
type: "=",
name: "=",
start: "=",
end: "=",
instanceDetails:"=",
refresh: "=",
pages: "=",
nextPages: "=",
prevPages: "=",
goPage: "=",
changePagesSet: "="
},
controller: 'InstancesListCtrl',
restrict: "EA",
templateUrl: 'html/directives/instancesListDv.html',
link: function (scope, element) {
scope.server = Falcon;
scope.$watch(function () { return scope.input; }, function() {
scope.selectedRows = [];
scope.checkButtonsToShow();
}, true);
var resultsPerPage = 10;
var visiblePages = 3;
scope.selectedRows = [];
scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
scope.startSortOrder = "desc";
scope.endSortOrder = "desc";
scope.statusSortOrder = "desc";
var dateFormat = DateHelper.getLocaleDateFormat().toLowerCase();
scope.dateFormat = DateHelper.getLocaleDateFormat() + ' HH:mm';
var dateSeperator;
if(dateFormat.indexOf('.') >=0){
dateSeperator = '.';
}else if (dateFormat.indexOf('-') >=0) {
dateSeperator='-'
}else {
dateSeperator = '/';
}
var splitDate = dateFormat.split(dateSeperator);
var mask ='';
splitDate.forEach(function(value, index){
if(value.indexOf('d')>=0){
mask = mask + dateSeperator +'00'
}else if (value.indexOf('m')>=0) {
mask = mask + dateSeperator +'00'
}else if (value.indexOf('y')>=0) {
if(value.length > 2){
mask = mask + dateSeperator +'0000'
}else{
mask = mask + dateSeperator +'00'
}
}
});
mask = mask + ' 00:00';
console.log(mask);
element.find('.dateInput').mask(mask.substr(1));
scope.checkedRow = function (name) {
var isInArray = false;
scope.selectedRows.forEach(function(item) {
if (name === item.instance) {
isInArray = true;
}
});
return isInArray;
};
scope.simpleFilter = {};
scope.selectedDisabledButtons = {
schedule:true,
suspend:true,
resume:true,
stop:true
};
scope.checkButtonsToShow = function() {
var statusCount = {
"SUBMITTED":0,
"RUNNING":0,
"SUSPENDED":0,
"UNKNOWN":0,
"KILLED":0,
"WAITING":0,
"FAILED":0,
"SUCCEEDED":0
};
$timeout(function() {
if(scope.selectedRows.length === scope.input.length){
scope.selectedAll = true;
}else{
scope.selectedAll = false;
}
scope.selectedRows.forEach(function(instance) {
statusCount[instance.status] = statusCount[instance.status]+1;
});
if(statusCount.SUBMITTED > 0) {
if(statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:false, suspend:true, resume:true, stop:true, rerun:true };
}
}
if(statusCount.RUNNING > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:false, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:false, resume:true, stop:false, rerun:true };
}
}
if (statusCount.SUSPENDED > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:false, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:false, stop:false, rerun:true };
}
}
if (statusCount.KILLED > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
}
}
if(statusCount.WAITING > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
}
if (statusCount.FAILED > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.SUSPENDED > 0 || statusCount.RUNNING > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
}
}
if(statusCount.SUCCEEDED > 0) {
if(statusCount.SUBMITTED > 0 || statusCount.RUNNING > 0 || statusCount.SUSPENDED > 0 || statusCount.UNKNOWN > 0 || statusCount.KILLED > 0 || statusCount.WAITING > 0 || statusCount.FAILED > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
else {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:false };
}
}
if (statusCount.UNKNOWN > 0) {
scope.selectedDisabledButtons = { schedule:true, suspend:true, resume:true, stop:true, rerun:true };
}
if(scope.selectedRows.length === 0) {
scope.selectedDisabledButtons = {
schedule:true,
resume:true,
suspend:true,
stop:true,
rerun:true
};
}
}, 50);
};
var CountDown = function(countParam){
this.count=countParam;
this.down=function(){
this.count--;
}
this.isDone=function(){
return this.count<1;
}
};
var isSelected = function(item){
var selected = false;
scope.selectedRows.forEach(function(entity) {
if(angular.equals(item, entity)){
selected = true;
}
});
return selected;
}
scope.checkAll = function () {
if(scope.selectedRows.length >= scope.input.length){
angular.forEach(scope.input, function (item) {
scope.selectedRows.pop();
});
}else{
angular.forEach(scope.input, function (item) {
var checkbox = {'instance':item.instance, 'startTime':item.startTime, 'endTime':item.endTime, 'status':item.status, 'type':scope.type, 'logFile':item.logFile};
if(!isSelected(checkbox)){
scope.selectedRows.push(checkbox);
}
});
}
};
scope.goInstanceDetails = function(instance) {
scope.instanceDetails(instance);
};
var resumeInstance = function (type, name, start, end, countDown) {
Falcon.logRequest();
Falcon.postResumeInstance(type, name, start, end)
.success(function (message) {
countDown.down();
Falcon.logResponse('success', message, type);
if(countDown.isDone()){
scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
}
})
.error(function (err) {
countDown.down();
Falcon.logResponse('error', err, type);
});
};
var suspendInstance = function (type, name, start, end, countDown) {
Falcon.logRequest();
Falcon.postSuspendInstance(type, name, start, end)
.success(function (message) {
countDown.down();
Falcon.logResponse('success', message, type);
if(countDown.isDone()){
scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
}
})
.error(function (err) {
countDown.down();
Falcon.logResponse('error', err, type);
});
};
var reRunInstance = function (type, name, start, end, countDown) {
Falcon.logRequest();
Falcon.postReRunInstance(type, name, start, end)
.success(function (message) {
countDown.down();
if(countDown.isDone()){
$timeout(function () {
Falcon.logResponse('success', message, type);
scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
}, 10000);
} else {
Falcon.logResponse('success', message, type);
}
})
.error(function (err) {
countDown.down();
Falcon.logResponse('error', err, type);
});
};
var killInstance = function (type, name, start, end, countDown) {
Falcon.logRequest();
Falcon.postKillInstance(type, name, start, end)
.success(function (message) {
countDown.down();
Falcon.logResponse('success', message, type);
if(countDown.isDone()){
scope.$parent.refreshInstanceList(scope.type, scope.name, scope.start, scope.end);
}
})
.error(function (err) {
countDown.down();
Falcon.logResponse('error', err, type);
});
};
scope.scopeResume = function () {
var countDown=new CountDown(scope.selectedRows.length);
for(var i = 0; i < scope.selectedRows.length; i++) {
var multiRequestType = scope.selectedRows[i].type.toLowerCase();
Falcon.responses.multiRequest[multiRequestType] += 1;
var start = scope.selectedRows[i].instance;
var end = addOneMin(start);
resumeInstance(scope.type, scope.name, start, end, countDown);
}
};
scope.scopeSuspend = function () {
var countDown=new CountDown(scope.selectedRows.length);
for(var i = 0; i < scope.selectedRows.length; i++) {
var multiRequestType = scope.selectedRows[i].type.toLowerCase();
Falcon.responses.multiRequest[multiRequestType] += 1;
var start = scope.selectedRows[i].instance;
var end = addOneMin(start);
suspendInstance(scope.type, scope.name, start, end, countDown);
}
};
scope.scopeRerun = function () {
var countDown=new CountDown(scope.selectedRows.length);
for(var i = 0; i < scope.selectedRows.length; i++) {
var multiRequestType = scope.selectedRows[i].type.toLowerCase();
Falcon.responses.multiRequest[multiRequestType] += 1;
var start = scope.selectedRows[i].instance;
var end = addOneMin(start);
reRunInstance(scope.type, scope.name, start, end, countDown);
}
};
scope.scopeKill = function () {
var countDown=new CountDown(scope.selectedRows.length);
for(var i = 0; i < scope.selectedRows.length; i++) {
var multiRequestType = scope.selectedRows[i].type.toLowerCase();
Falcon.responses.multiRequest[multiRequestType] += 1;
var start = scope.selectedRows[i].instance;
var end = addOneMin(start);
killInstance(scope.type, scope.name, start, end, countDown);
}
};
scope.download = function() {
var i;
for(i = 0; i < scope.selectedRows.length; i++) {
scope.downloadEntity(scope.selectedRows[i].logFile);
}
};
scope.scopeGoPage = function (page) {
scope.goPage(page);
};
scope.scopeNextOffset = function (page) {
var offset = (parseInt(scope.pages[0].label)+(visiblePages-1))*resultsPerPage;
scope.changePagesSet(offset, page, 0, scope.start, scope.end);
};
scope.scopePrevOffset = function (page) {
var offset = (parseInt(scope.pages[0].label)-(visiblePages+1))*resultsPerPage;
scope.changePagesSet(offset, page, visiblePages-1, scope.start, scope.end);
};
scope.startDateValid = true;
scope.endDateValid = true;
scope.validateDate = function(event, type){
var which = event.which || event.keyCode;
var charStr = String.fromCharCode(which);
var valueEntered = event.target.value + charStr;
var dateSeperator;
if(dateFormat.indexOf('.') >=0){
dateSeperator = '.';
}else if (dateFormat.indexOf('-') >=0) {
dateSeperator='-'
}else {
dateSeperator = '/';
}
var splitDateFormat = dateFormat.split(dateSeperator);
var dateArr = [];
var completeDate = valueEntered.split(" ");
var dates = completeDate[0].split(dateSeperator);
var timeArr = [];
if(completeDate[1]){
completeDate[1].split(":")
}
splitDateFormat.forEach(function(value, index){
if(value.indexOf('d')>=0){
dateArr[0] = dates[index];
}else if (value.indexOf('m')>=0) {
dateArr[1] = dates[index];
}else if (value.indexOf('y')>=0) {
dateArr[2] = dates[index];
}
});
var dateValid = checkDateTimeValidity(dateArr, timeArr);
if(type === 'start'){
scope.startDateValid = dateValid;
}else if(type === 'end'){
scope.endDateValid = dateValid;
}
};
var checkDateTimeValidity = function(dateArr, timeArr){
var dateValid = false;
if(dateArr[2]){
if(parseInt(dateArr[2]) > 0 && parseInt(dateArr[2]) <= 9999){
dateValid = true;
}else {
return false;
}
}
if(dateArr[1]){
if(parseInt(dateArr[1]) > 0 && parseInt(dateArr[1]) <= 12){
dateValid = true;
}else {
return false;
}
}
if(dateArr[0]) {
if(parseInt(dateArr[0]) > 0 && parseInt(dateArr[0]) <= daysInMonth(dateArr[1], dateArr[2])){
dateValid = true;
}else {
return false;
}
}
if(timeArr[0]){
if(parseInt(timeArr[0]) >= 0 && parseInt(timeArr[0]) < 24){
dateValid = true;
}else {
return false;
}
}
if(timeArr[1]){
if(parseInt(timeArr[1]) >= 0 && parseInt(timeArr[1] < 60)){
dateValid = true;
}else {
return false;
}
}
return dateValid;
}
var changeDateFormat = function(date){
var dateSeperator;
if(dateFormat.indexOf('.') >=0){
dateSeperator = '.';
}else if (dateFormat.indexOf('-') >=0) {
dateSeperator='-'
}else {
dateSeperator = '/';
}
var splitDateFormat = dateFormat.split(dateSeperator);
var dateArr = [];
var completeDate = date.split(" ");
var dates = completeDate[0].split(dateSeperator);
splitDateFormat.forEach(function(value, index){
if(value.indexOf('d')>=0){
dateArr[0] = dates[index];
}else if (value.indexOf('m')>=0) {
dateArr[1] = dates[index];
}else if (value.indexOf('y')>=0) {
dateArr[2] = dates[index];
}
});
date = dateArr[2] + "-" + dateArr[1] + "-" + dateArr[0] + "T" + completeDate[1] + "Z";
return date;
};
var validateDateFormat = function(date){
var date = new Date(changeDateFormat(date));
return !isNaN(date.getTime());
};
function daysInMonth(month, year) {
switch (month) {
case 2 :
return (year % 4 == 0 && year % 100) || year % 400 == 0 ? 29 : 28;
case 9 : case 4 : case 6 : case 11 :
return 30;
default :
return 31
}
}
scope.filterInstances = function(orderBy){
var start;
var end;
var executeFilter = false;
scope.startFilterError = false;
scope.endFilterError = false;
scope.startAfterEndError = false;
scope.startAfterNominalError = false;
scope.startBeforeNominalError = false;
scope.endAfterNominalError = false;
scope.endBeforeNominalError = false;
var nominalStartDate = new Date(scope.start);
var nominalEndDate = new Date(scope.end);
if(scope.startFilter && scope.endFilter){
if(scope.startFilter.length == 16 && scope.endFilter.length == 16){
if(!validateDateFormat(scope.startFilter)){
executeFilter = false;
scope.startFilterError = true;
scope.startDateValid = false;
}else if(!validateDateFormat(scope.endFilter)){
executeFilter = false;
scope.endFilterError = true;
scope.endDateValid = false;
}else{
start = changeDateFormat(scope.startFilter);
var filterStartDate = new Date(start);
end = changeDateFormat(scope.endFilter);
var filterEndDate = new Date(end);
if(filterStartDate > filterEndDate){
executeFilter = false;
scope.startAfterEndError = true;
}else{
if(filterStartDate < nominalStartDate){
executeFilter = false;
scope.startAfterNominalError = true;
}else if(filterStartDate > nominalEndDate){
executeFilter = false;
scope.startBeforeNominalError = true;
}else if(filterEndDate < nominalStartDate){
executeFilter = false;
scope.endAfterNominalError = true;
}else if(filterEndDate > nominalEndDate){
executeFilter = false;
scope.endBeforeNominalError = true;
}else{
executeFilter = true;
}
}
}
}else{
if(scope.startFilter.length != 16){
scope.startFilterError = true;
}
if(scope.endFilter.length != 16){
scope.endFilterError = true;
}
}
}else if(scope.startFilter){
scope.endFilterError = false;
if(scope.startFilter.length == 16){
if(!validateDateFormat(scope.startFilter)){
executeFilter = false;
scope.startFilterError = true;
}else{
start = changeDateFormat(scope.startFilter);
var filterStartDate = new Date(start);
if(filterStartDate < nominalStartDate){
executeFilter = false;
scope.startAfterNominalError = true;
}else if(filterStartDate > nominalEndDate){
executeFilter = false;
scope.startBeforeNominalError = true;
}else{
executeFilter = true;
}
}
}else{
scope.startFilterError = true;
}
}else if(scope.endFilter){
scope.startFilterError = false;
if(scope.endFilter.length == 16){
if(!validateDateFormat(scope.endFilter)){
executeFilter = false;
scope.endFilterError = true;
}else{
end = changeDateFormat(scope.endFilter);
var filterEndDate = new Date(end);
if(filterEndDate < nominalStartDate){
executeFilter = false;
scope.endAfterNominalError = true;
}else if(filterEndDate > nominalEndDate){
executeFilter = false;
scope.endBeforeNominalError = true;
}else{
executeFilter = true;
}
}
}else{
scope.endFilterError = true;
}
}else{
executeFilter = true;
}
if(executeFilter){
var sortOrder = "";
if(orderBy){
if(orderBy === "startTime"){
if(scope.startSortOrder === "desc"){
scope.startSortOrder = "asc";
}else{
scope.startSortOrder = "desc";
}
sortOrder = scope.startSortOrder;
}else if(orderBy === "endTime"){
if(scope.endSortOrder === "desc"){
scope.endSortOrder = "asc";
}else{
scope.endSortOrder = "desc";
}
sortOrder = scope.endSortOrder;
}else if(orderBy === "status"){
if(scope.statusSortOrder === "desc"){
scope.statusSortOrder = "asc";
}else{
scope.statusSortOrder = "desc";
}
sortOrder = scope.statusSortOrder;
}
}else{
orderBy = "startTime";
sortOrder = "desc";
}
if(!start){
start = scope.start;
}
if(!end){
end = scope.end;
}
scope.$parent.refreshInstanceList(scope.type, scope.name, start, end, scope.statusFilter, orderBy, sortOrder);
}
}
var addOneMin = function(time){
var newtime = parseInt(time.substring(time.length-3, time.length-1));
if(newtime === 59){
newtime = 0;
}else{
newtime++;
}
if(newtime < 10){
newtime = "0"+newtime;
}
return time.substring(0, time.length-3) + newtime + "Z";
}
}
};
}]);
})();