jobHistoryModule = angular.module('HccGoApp.jobHistoryCtrl', ['ngRoute' ]);
/**
* Used to manage the job history.
* @class jobService
*/
jobHistoryModule.service('jobService', ['$q', 'connectionService', 'dbService', function($q, connectionService, dbService) {
var job = null;
var getJob = function() {
var temp = job;
job = null;
return temp;
}
var setJob = function(value) {
job = value;
}
var getDBJobs = function() {
var toReturn = $q.defer();
dbService.getJobHistoryDB().then(function(jobHistoryDB) {
jobHistoryDB.find({}, function (err, docs) {
// if data already loaded, just add them to the list
return toReturn.resolve(docs);
if(err) console.log("Error fetching completed jobs: " + err);
});
});
return toReturn.promise;
}
/**
* Add a job to the job history
* Required attributes:
* * runtime
* * memory
* * jobname
* * location
* * error
* * output
* * modules (Array)
* * commands (multi line, with `\n`s)
*
* @memberof jobService
* @param {Object} job The job data structure
* @returns {Promise}
*/
var addDBJob = function(job) {
var toReturn = $q.defer();
var now = Date.now();
var set_default = function(obj, attribute_name, default_val) {
if (attribute_name in obj) {
return true;
} else {
obj[attribute_name] = default_val;
return false;
}
}
set_default(job, "runtime", "1:00:00");
set_default(job, "memory", 1024);
set_default(job, "jobname", "Default Job Name");
set_default(job, "location", "$WORK/submit.slurm");
set_default(job, "error", "$WORK/job.err");
set_default(job, "output", "$WORK/job.out");
set_default(job, "modules", []);
if (!set_default(job, "commands", null)) {
toReturn.reject("No Commands in job");
}
// Use a whitelist to only put some stuff in
var newJob = {
"runtime": job.runtime,
"memory": job.memory,
"jobname": job.jobname,
"location": job.location,
"error": job.error,
"output": job.output,
"modules": ((job.modules != null) ? job.modules : []),
"commands": job.commands,
"timestamp": now,
"cluster": connectionService.connectionDetails.shorthost
};
dbService.getJobHistoryDB().then(function(jobHistoryDB) {
jobHistoryDB.insert(newJob, function(err, newDoc) {
if(err) {
$log.error(err);
return toReturn.reject(err);
}
toReturn.resolve();
});
});
return toReturn.promise;
}
return {
getJob: getJob,
setJob: setJob,
getDBJobs: getDBJobs,
addDBJob: addDBJob
}
}]).controller('jobHistoryCtrl', ['$scope', '$log', '$timeout', 'connectionService', '$routeParams', '$location', '$q', 'preferencesManager', 'jobService', 'dbService', function($scope, $log, $timeout, connectionService, $routeParams, $location, $q, preferencesManager, jobService, dbService) {
$scope.params = $routeParams;
$scope.cancel = function() {
$location.path("/cluster");
}
$scope.loadDefault = function() {
$location.path("/jobSubmission");
}
$scope.loadJob = function(job, clone) {
job.clone = clone;
jobService.setJob(job);
$location.path("/jobSubmission");
}
// Get completed jobs from db file
jobService.getDBJobs().then(function(jobs) {
$scope.jobs = jobs;
});
$scope.deleteJob = function(job) {
bootbox.confirm({
message: "Are you sure you want to delete this job?",
callback: function(result) {
if(result) {
// remove panel
$("#panel"+job._id).fadeOut(500, function() {
$(this).css({"visibility":"hidden",display:'block'}).slideUp();
});
// remove from angular binding
for(var i=0; i<$scope.jobs.length; i++) {
if($scope.jobs[i]._id == job._id) {
$scope.jobs.splice(i,1);
}
}
dbService.getJobHistoryDB().then(function(db) {
db.remove({ _id: job._id }, { multi: true }, function (err, numRemoved) {
if(err) $log.error("Error deleting document " + err);
});
});
}
}
});
}
}]);