Skip to content

Commit ea727ab

Browse files
committed
Feature: Allow special _xy_override_ prefixed event param IDs to override job props at runtime (i.e. targets, algo).
1 parent 2a1f7c0 commit ea727ab

5 files changed

Lines changed: 56 additions & 8 deletions

File tree

htdocs/js/pages/Base.class.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ Page.Base = class Base extends Page {
587587
var self = this;
588588
if (!glue) glue = ', ';
589589
if (!targets || !targets.length) return '(None)';
590+
if (typeof(targets) == 'string') targets = targets.split(/\,\s*/);
590591
return targets.map( function(target) { return self.getNiceTarget(target, link); } ).join(glue);
591592
}
592593

htdocs/js/pages/PageUtils.class.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3691,7 +3691,7 @@ Page.PageUtils = class PageUtils extends Page.Base {
36913691
break;
36923692

36933693
case 'code':
3694-
if (elem_value.toString().length) {
3694+
if (String(elem_value).length) {
36953695
html += '<i class="mdi mdi-' + elem_icon + '">&nbsp;</i>';
36963696
html += '<span class="monospace">' + strip_html(elem_value) + '</span>';
36973697
}
@@ -3713,11 +3713,11 @@ Page.PageUtils = class PageUtils extends Page.Base {
37133713

37143714
case 'select':
37153715
html += '<i class="mdi mdi-' + elem_icon + '">&nbsp;</i>';
3716-
html += strip_html( elem_value.toString().replace(/\,.*$/, '').replace(/^.+\[([\w\-\.]+)\]\s*$/, '$1') );
3716+
html += strip_html( str_value(elem_value).replace(/\,.*$/, '').replace(/^.+\[([\w\-\.]+)\]\s*$/, '$1') );
37173717
break;
37183718

37193719
case 'bucket':
3720-
if (elem_value.toString().length) {
3720+
if (str_value(elem_value).length) {
37213721
html += '<i class="mdi mdi-' + elem_icon + '">&nbsp;</i>';
37223722
html += strip_html( elem_value );
37233723
}
@@ -3726,7 +3726,7 @@ Page.PageUtils = class PageUtils extends Page.Base {
37263726

37273727
case 'system':
37283728
html += '<i class="mdi mdi-' + elem_icon + '">&nbsp;</i>';
3729-
html += strip_html( elem_value.toString() || '(None)' );
3729+
html += strip_html( str_value(elem_value) || '(None)' );
37303730
break;
37313731

37323732
case 'toolset':

lib/api/jobs.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,11 +704,22 @@ class Jobs {
704704
else action.details = sus_details;
705705

706706
// import custom params into job
707-
if (!job.complete) {
707+
if (!job.complete && params.params && Tools.firstKey(params.params)) {
708708
// job is starting, merge params into current job params
709-
Tools.mergeHashInto( job.params, params.params || {} );
709+
Tools.mergeHashInto( job.params, params.params );
710+
711+
for (var key in job.params) {
712+
if (key.match(/^_xy_override_(\w+)$/) && job.params[key]) {
713+
var sub_key = RegExp.$1;
714+
self.logDebug(9, "Overriding job property with param: " + key, { key: sub_key, value: job.params[key] } );
715+
job[sub_key] = job.params[key];
716+
}
717+
} // foreach param
710718
}
711719

720+
// remove job.server so it has to be re-chosen
721+
delete job.server;
722+
712723
self.logTransaction('job_resume', job.id, self.getClientInfo(args, params));
713724

714725
callback({ code: 0 });

lib/job.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,15 @@ class Jobs {
167167
if (typeof(job.params[key]) == 'string') {
168168
job.params[key] = this.messageSub( job.params[key], context );
169169
}
170-
}
171-
}
170+
171+
// allow special prefixed params to override top-level props
172+
if (key.match(/^_xy_override_(\w+)$/) && job.params[key]) {
173+
var sub_key = RegExp.$1;
174+
this.logJob(9, "Overriding job property with param: " + key, { key: sub_key, value: job.params[key] } );
175+
job[sub_key] = job.params[key];
176+
}
177+
} // foreach param
178+
} // job.params
172179

173180
// workflows: filter out notes without 'show' prop
174181
if (job.workflow && job.workflow.nodes) {
@@ -376,6 +383,9 @@ class Jobs {
376383
// branch off for workflows here
377384
if (job.type == 'workflow') return self.startWorkflow(job);
378385

386+
// if job was suspended / resumed, we may need to re-choose a server
387+
if (!job.server && !self.chooseJobServer(job)) return;
388+
379389
// send command to server
380390
var server = self.servers[ job.server ];
381391
if (!server) {
@@ -849,6 +859,9 @@ class Jobs {
849859
// skip this entirely for workflows
850860
if (job.type == 'workflow') return true;
851861

862+
// convert CSV into array if needed
863+
if (typeof(job.targets) == 'string') job.targets = job.targets.split(/\,\s*/);
864+
852865
// gather all server candidates (targets may be groups and/or servers)
853866
(job.targets || []).forEach( function(target) {
854867
if (self.servers[target]) {
@@ -907,6 +920,9 @@ class Jobs {
907920

908921
this.logJob(9, "Choosing server for job: " + job.id);
909922

923+
// convert CSV into array if needed
924+
if (typeof(job.targets) == 'string') job.targets = job.targets.split(/\,\s*/);
925+
910926
// gather all server candidates (targets may be groups and/or servers)
911927
(job.targets || []).forEach( function(target) {
912928
if (self.servers[target]) {

lib/workflow.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,16 @@ class Workflows {
222222
// copy over workflow data so job can share it
223223
new_job.workflowData = this.jobDetails[job.id].workflowData;
224224

225+
// pass workflow-level _xy_override_ params into sub-job props
226+
if (job.params) {
227+
for (var key in job.params) {
228+
if (key.match(/^_xy_override_(\w+)$/) && job.params[key]) {
229+
var sub_key = RegExp.$1;
230+
new_job[sub_key] = job.params[key];
231+
}
232+
} // foreach param
233+
} // job.params
234+
225235
Tools.findObjects( workflow.connections, { source: node.id } ).forEach( function(conn) {
226236
var dest = Tools.findObject( workflow.nodes, { id: conn.dest } );
227237
if (dest.type == 'limit') {
@@ -306,6 +316,16 @@ class Workflows {
306316
// copy over workflow data so job can share it
307317
new_job.workflowData = this.jobDetails[job.id].workflowData;
308318

319+
// pass workflow-level _xy_override_ params into sub-job props
320+
if (job.params) {
321+
for (var key in job.params) {
322+
if (key.match(/^_xy_override_(\w+)$/) && job.params[key]) {
323+
var sub_key = RegExp.$1;
324+
new_job[sub_key] = job.params[key];
325+
}
326+
} // foreach param
327+
} // job.params
328+
309329
// add actions and limits
310330
new_job.actions = [];
311331
new_job.limits = [];

0 commit comments

Comments
 (0)