node-deadline
Version:
Module to interface with Deadline Compute Management System by Thinkbox Software
220 lines (199 loc) • 6.38 kB
JavaScript
var Err = require( "../utils/Error" ),
FrameRange = require( "./FrameRange" ),
PropertyMap = require( "../utils/PropertyMap" ),
utils = require( "../utils/utils" );
var Job = module.exports = function( data, deadlineNetSet ) {
this._data = {};
this._updated = {};
if ( "undefined" == typeof data ) {
throw new Err(
Err.PARAM,
"You need job data or another Job instance to create a new job object.",
"This should usually be handled by Deadline get functions."
);
}
else if ( data instanceof Job ) {
this.copy( data );
return;
}
else {
this._populate( data, deadlineNetSet );
}
};
//populates with deadline server data
Job.prototype._populate = function( data, deadlineNetSet ) {
try {
//convert necessary properties
data.LastWriteTime = new Date( data.LastWriteTime );
data.Props.Frames = new FrameRange( data.Props.Frames );
data.Date = new Date( data.Date );
data.DateStart = new Date( data.DateStart );
data.DateComp = new Date( data.DateComp );
//map the object
Job.propertyMap.mapObj( data, this );
//sum chunks
this.chunks.total = (
this.chunks.completed +
this.chunks.queued +
this.chunks.suspended +
this.chunks.rendering +
this.chunks.failed +
this.chunks.pending
);
//convert custom extra info names
if ( "undefined" != typeof deadlineNetSet ) {
this.extraInfo[ utils.mapExtraJobProperty( "Ex0", deadlineNetSet ) ] = this.extraInfo.Ex0;
this.extraInfo[ utils.mapExtraJobProperty( "Ex1", deadlineNetSet ) ] = this.extraInfo.Ex1;
this.extraInfo[ utils.mapExtraJobProperty( "Ex2", deadlineNetSet ) ] = this.extraInfo.Ex2;
this.extraInfo[ utils.mapExtraJobProperty( "Ex3", deadlineNetSet ) ] = this.extraInfo.Ex3;
this.extraInfo[ utils.mapExtraJobProperty( "Ex4", deadlineNetSet ) ] = this.extraInfo.Ex4;
this.extraInfo[ utils.mapExtraJobProperty( "Ex5", deadlineNetSet ) ] = this.extraInfo.Ex5;
this.extraInfo[ utils.mapExtraJobProperty( "Ex6", deadlineNetSet ) ] = this.extraInfo.Ex6;
this.extraInfo[ utils.mapExtraJobProperty( "Ex7", deadlineNetSet ) ] = this.extraInfo.Ex7;
this.extraInfo[ utils.mapExtraJobProperty( "Ex8", deadlineNetSet ) ] = this.extraInfo.Ex8;
this.extraInfo[ utils.mapExtraJobProperty( "Ex9", deadlineNetSet ) ] = this.extraInfo.Ex9;
}
}
catch ( e ) {
throw new Err(
Err.PARAM,
"Failed to populate job: " + e.message
);
}
this._data = data;
};
Job.prototype._calcChanges = function() {
var now, then, prop;
for ( prop in Job.propertyMap.map ) {
//get the new value and the original vale
now = PropertyMap.readProp( this, prop );
then = PropertyMap.readProp( this._data, Job.propertyMap.map[ prop ] );
//if they're not different, move on
if ( now == then ) {
continue;
}
//make sure its a valid change
if ( !Job.changeAllowed( prop ) ) {
throw new Err( Err.PARAM, "Changes not allowed to property: " + prop );
}
//log the change on our updates object
this._updated[ Job.propertyMap.map[ prop ] ] = now;
}
return this._updated;
};
//copies all properties from another Job instance
Job.prototype.copy = function( src ) {
throw new Err(
Err.NOIMPL,
"the copy feature hasn't been implemented yet... sorry"
);
};
Job.changeAllowed = function( propertyName ) {
switch ( propertyName ) {
case "updated":
case "name":
case "user":
case "batch":
case "comment":
case "commentTag":
case "department":
case "frames":
case "group":
case "pool":
case "secondaryPool":
case "priority":
case "requiredAssets":
case "scriptDependancies":
case "concurrentTasks":
case "limitConcurrent":
case "auxSync":
case "interruptable":
case "interruptLimit":
case "sequential":
case "reload":
case "suppressEvents":
case "protected":
case "timout":
case "frameTimeout":
case "limits":
case "listedSlaves":
case "listedWhite":
case "ExtraInfo.Ex0":
case "ExtraInfo.Ex1":
case "ExtraInfo.Ex2":
case "ExtraInfo.Ex3":
case "ExtraInfo.Ex4":
case "ExtraInfo.Ex5":
case "ExtraInfo.Ex6":
case "ExtraInfo.Ex7":
case "ExtraInfo.Ex8":
case "ExtraInfo.Ex9":
case "ExtraInfo.ExDic":
case "Plug":
case "outputDirectories":
case "outputFiles":
case "badSlaves":
return true;
default:
return false;
}
};
Job.propertyMap = new PropertyMap( {
id: "_id",
status: "Stat",
updated: "LastWriteTime",
name: "Props.Name",
user: "Props.User",
batch: "Props.Batch",
comment: "Props.Cmmt",
commentTag: "Props.CmmtTag",
department: "Props.Dept",
frames: "Props.Frames",
tasks: "Props.Tasks",
group: "Props.Grp",
pool: "Props.Pool",
secondaryPool: "Props.SecPool",
priority: "Props.Pri",
requiredAssets: "Props.ReqAss",
scriptDependancies: "Props.ScrDept",
concurrentTasks: "Props.Conc",
limitConcurrent: "Props.ConcLimt",
auxSync: "Props.AuxSync",
interruptable: "Props.Int",
interruptLimit: "Props.IntPer",
sequential: "Props.Seq",
reload: "Props.Reload",
suppressEvents: "Props.NoEvt",
protected: "Props.Protect",
timeout: "Props.Timeout",
frameTimeout: "Props.FrameTimoutWeather",
limits: "Props.Limits",
listedSlaves: "Props.ListedSlavesSlaves",
listedWhite: "Props.White",
"extraInfo.Ex0": "Props.Ex0",
"extraInfo.Ex1": "Props.Ex1",
"extraInfo.Ex2": "Props.Ex2",
"extraInfo.Ex3": "Props.Ex3",
"extraInfo.Ex4": "Props.Ex4",
"extraInfo.Ex5": "Props.Ex5",
"extraInfo.Ex6": "Props.Ex6",
"extraInfo.Ex7": "Props.Ex7",
"extraInfo.Ex8": "Props.Ex8",
"extraInfo.Ex9": "Props.Ex9",
"extraInfo.dic": "Props.ExDic",
machine: "Mach",
date: "Date",
dateStarted: "DateStart",
dateCompleted: "DateComp",
plugin: "Plug",
outputDirectories: "OutDir",
outputFiles: "OutFile",
badSlaves: "Bad",
"chunks.completed": "CompletedChunks",
"chunks.queued": "QueuedChunks",
"chunks.suspended": "SuspendedChunks",
"chunks.rendering": "RenderingChunks",
"chunks.failed": "FailedChunks",
"chunks.pending": "PendingChunks",
errors: "Errs"
} );