Name
global.ConnectorQueue
Description
No description available
Script
var ConnectorQueue = Class.create();
ConnectorQueue.prototype = {
PROBE_NAME:"Third Party Connector Probe",
PARAM_PREFIX:"__con_param__",
initialize: function() {
},
dequeueAndProcess: function(){
try {
var grQueue = new GlideRecord("em_connector_update_queue");
grQueue.addQuery("state", "pending");
grQueue.orderBy("sys_updated_on");
grQueue.setLimit(gs.getProperty('evt_mgmt.max_update_source_records', 1000));
grQueue.query();
var connectorManager = new SNC.ConnectorManager();
var connectors = JSON.parse(connectorManager.getBiDirectionalConnectorsInstance());
var map = {};
while(grQueue.next()){
grQueue.state = "processing";
grQueue.update();
var sourceInstance = grQueue.getValue("source_instance");
if (!connectors[sourceInstance]) {
//the alert source instance is not defined to work as bi-directional connector
grQueue.state = "failed";
grQueue.update();
continue;
}
var alertIdentifier = connectors[sourceInstance].alertIdentifier;
var grAlert = new GlideRecord("em_alert");
grAlert.get(grQueue.getValue("alert"));
var alertId = grAlert.getValue(alertIdentifier);
//def0233933: send initial_remote_time of event so that we can get events associated with the alert
//and also alertNumber as we want to add comment on remote system with servicenow alertNumber.
var initial_remote_time = grAlert.getValue("initial_remote_time");
var message_key = grAlert.getValue("message_key");
var alertNumber = grAlert.getValue("number");
var jsonFields = JSON.parse(grQueue.getValue("fields_json"));
var currentRecord = {"key":alertId, "value":jsonFields , "initial_event_time": initial_remote_time, "message_key":message_key, "alert_number":alertNumber};
if (!map[sourceInstance]) {
map[sourceInstance] = [];
}
map[sourceInstance].push(currentRecord);
}
for (var currentInstance in map) {
var ciGr = new GlideRecord('em_connector_instance');
ciGr.addQuery('name', currentInstance);
ciGr.query();
if (ciGr.next()) {
//send to each connector instance the list of alerts that have been changed
var eccOutputId = this.writeToECC(ciGr, JSON.stringify(map[currentInstance]));
if (!eccOutputId) //could not write succesfully to ecc queue
continue;
gs.log("sending " + map[currentInstance].length + " alerts to " + currentInstance);
var queueGr = new GlideRecord('em_connector_update_queue');
queueGr.addQuery("source_instance", currentInstance);
queueGr.addQuery("state", "processing");
queueGr.setValue("ecc_queue_id", eccOutputId);
queueGr.updateMultiple();
}
}
} catch(e) {
gs.logError("ConnectorQueue script include failed: " + e);
}
},
writeToECC:function(ciGr, alerts){
var conUtil = new ConnectorUtil();
var agentName = conUtil.findAgent(ciGr);
if (gs.nil(agentName)) {
gs.log("[ConnectorQueue] Can not continue without a mid server");
ciGr.setValue('last_bi_directional_status','Error');
ciGr.setValue('last_error_message', "Can not execute without a mid server.");
var now = new GlideDateTime();
ciGr.setValue('last_run_time', now);
ciGr.update();
var gr = new GlideRecord("em_connector_update_queue");
gr.addQuery("source_instance", ciGr.getValue("name"));
gr.addQuery("state", "processing");
gr.setValue("state", "failed");
gr.updateMultiple();
return;
}
var probe = SncProbe.get(this.PROBE_NAME);
probe.setSource(ciGr.name);
probe.setEccPriority("0"); //Interactive ecc priority
probe.addParameter('connector', ciGr.sys_id);
probe.addParameter('connector_name', ciGr.name);
var scriptName = ciGr.connector_definition.javascript_to_run.name;
probe.addParameter('script', scriptName);
probe.addParameter('credential_id', ciGr.credential.sys_id);
probe.addParameter('host', ciGr.host);
// add connecter instance parameters
var paramsGr = GlideRecord('em_connector_instance_value');
paramsGr.addQuery('connector_instance', ciGr.sys_id);
paramsGr.query();
while(paramsGr.next()) {
probe.addParameter(this.PARAM_PREFIX + paramsGr.name, paramsGr.value);
}
probe.addParameter('update_source', true);
probe.addParameter(this.PARAM_PREFIX + 'alerts', alerts);
return probe.create(agentName);
},
updateSourceAndQueue:function(connectorId, lastStatus, eccId, lastError, actionPerformed){
var ciGr = new GlideRecord('em_connector_instance');
if (!ciGr.get(connectorId)) {
gs.log('Could not find connector instance ' + connectorId);
return;
}
var connectorName = ciGr.getValue("name");
var status;
if (lastStatus == "SUCCESS") {
lastStatus = "Success";
status = "complete";
} else {
lastStatus = "Error";
status = "failed";
}
if (actionPerformed == 'true'){
ciGr.setValue('last_bi_directional_status', lastStatus);
if (lastStatus != "Success"){
lastError = "BI-DIRECTIONAL\n-------------------------------------------------------------\n" + lastError;
} else {
lastError = "";
}
var lastErrorUtil = new LastErrorUtils();
lastErrorUtil.updateErrorMsg(ciGr, "bi-directional", lastError);
ciGr.update();
}
var gr = new GlideRecord('em_connector_update_queue');
gr.addQuery("source_instance", connectorName);
gr.addQuery("state", "processing");
gr.addQuery("ecc_queue_id", eccId);
gr.setValue("state", status);
gr.updateMultiple();
gs.log("done updating the connector instance and the queue");
},
type: 'ConnectorQueue'
};
ConnectorQueue.get = function(){
return new ConnectorQueue();
};
Sys ID
89a4f1409310120056f8f179077ffb26