Name

global.Scheduler

Description

Facade over our scheduler to make certain operations easier from script.

Script

/*
* Use SchedulerScriptFactory script include to get Scheduler object
*/

gs.include("PrototypeServer");
var Scheduler = Class.create();

Scheduler.prototype = {
 initialize : function() {

    this.local_id = GlideClusterSynchronizer.getSystemID();
 },

 stop : function(node_id) {
    this._queueAction(node_id, 'stop');
 },

 start : function(node_id) {
    this._queueAction(node_id, 'start');

 },

 /*_________________________________________________________________
 * Description: Ensures child sys_trigger entries for the specified node
                for any run "ALL NODES" scheduled jobs. Handles insertions
                and deletions of nodes.
 * Parameters:
 * Returns:
 ________________________________________________________________*/
 propagateRATriggersForNode: function(node) {
    var trig = new GlideRecord("sys_trigger");
    trig.addQuery("system_id", "IN", "ALL NODES, ACTIVE NODES");
    trig.query();
    while (trig.next()){
       this._propagateAllNodes(node, trig);
    }
 },

 /*_________________________________________________________________
 * Description: Ensures run "ALL NODES" for a given scheduled job are
                propagated to all nodes.
 * Parameters:
 * Returns:
 ________________________________________________________________*/
 propagateRANodesForTrigger: function(trigger) {
    var nd = new GlideRecord("sys_cluster_state");
    nd.addQuery("status", "online");
    if (trigger.system_id == "ACTIVE NODES")
  	  nd.addQuery("schedulers", "any");
    nd.query();
    while (nd.next()){
       this._propagateAllNodes(nd, trigger);
    }
 },

 /*_________________________________________________________________
  * Description: Will create or delete sys_trigger entries for run "ALL NODES" jobs.
  * Parameters: GlideRecord(SYS_CLUSTER_STATE), GlideRecord(SYS_TRIGGER)
 ________________________________________________________________*/
 _propagateAllNodes: function(node_gr, trigger_gr) {
    var nc = new GlideRecord("sys_trigger");
    nc.addQuery("sys_id", trigger_gr.sys_id);
    nc.query();
    //Don't recreate in the case of a delete op (ref cascade handles actual delete)
    if (!nc.next())
       return;

    gs.print("Scheduler()._propogateAllNodes node - "+node_gr.system_id+", job name - "+trigger_gr.name+", job id - "+trigger_gr.sys_id);
    var ch = GlideRecord("sys_trigger");
    ch.addQuery("system_id", node_gr.system_id);
    ch.addQuery("parent", trigger_gr.sys_id);
    ch.query();
     if (ch.next()) {
      gs.print("Deleting the existing child job (id- "+ch.sys_id+" ) of parent - "+trigger_gr.name+" for node - "+node_gr.system_id);
      ch.deleteRecord();
    }

    if (nc.system_id != trigger_gr.system_id)
       return;

    if (node_gr.status == "offline") {
       gs.print("Node " + node_gr.system_id + " status is offline, not adding any child job (for "+trigger_gr.name+") pinned to this node");
       return;
    }

    if (node_gr.schedulers == "none") {
       gs.print("Node " + node_gr.system_id + " scheduler mode is none, not adding any child job (for "+trigger_gr.name+") pinned to this node");
       return;
    }

    if (trigger_gr.system_id == "ACTIVE NODES" && node_gr.schedulers != "any") {
  	 gs.print("Node scheduler is not set to ANY (mode is "+ node_gr.schedulers+ ") , not adding any child job (for "+trigger_gr.name+") pinned to this node");
  	 return;
    }

    nc.parent = trigger_gr.sys_id;
    nc.system_id = node_gr.system_id;
    var nextAction = new GlideDateTime(nc.getValue("next_action"));
    var now = new GlideDateTime();
    if (now.after(nextAction))
        nc.setValue("next_action", now.toString());
    nc.insert();
    gs.print("Inserted child entry for parent job "+trigger_gr.name+" for node - "+node_gr.system_id);
 },

 _queueAction : function(node_id, action) {
    this.node_id = node_id;
    var node_list = this._getNodeList();
    for (var i =0; i < node_list.length; i++)
       GlideClusterMessage.postDirected('scheduler.action', action, node_list[i]);

 },

 _getNodeList : function() {
    var node_list = new Array();
    if (this.node_id == 'ALL') {
       var gr = new GlideRecord('sys_cluster_state');
       gr.query();
       while (gr.next())
          node_list.push(gr.system_id + '');
    } else
    node_list.push(this.node_id);

    return node_list;
 }
};

Sys ID

3ccfaa880a0a0b840081b39494c1418f

Offical Documentation

Official Docs: