Name
global.ChangeScheduleRESTUtilSNC
Description
Base Change Schedule REST Util API. Use the ChangeScheduleRESTUtil script include to override functionality in this script if required
Script
var ChangeScheduleRESTUtilSNC = Class.create();
ChangeScheduleRESTUtilSNC.PAYLOAD = 'payload';
ChangeScheduleRESTUtilSNC.prototype = {
initialize: function(chgMgtWorker) {
this._log = new GSLog(ChangeCommon.LOG_PROPERTY, this.type);
if (chgMgtWorker)
this.setChgMgtWorker(chgMgtWorker);
},
getSpans: function(nameValuePairs) {
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[getSpans] nameValuePairs: ' + JSON.stringify(nameValuePairs));
if (!nameValuePairs)
return;
if (nameValuePairs.change_sys_id)
this._getSpansByChange(nameValuePairs.change_sys_id + '', nameValuePairs.timezone);
else
this._getSpansByNameValuePairs(nameValuePairs);
},
_getSpansByNameValuePairs: function(nameValuePairs) {
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[_getSpansByNameValuePairs] nameValuePairs: ' + JSON.stringify(nameValuePairs));
if (!nameValuePairs.cmdb_ci_sys_id || !nameValuePairs.duration_in_seconds || !nameValuePairs.timezone) {
this._log.error('[_getSpansByNameValuePairs] missing parameters cmdb_ci/duration/timezone from: ' + JSON.stringify(nameValuePairs));
return;
}
var chgGr = new GlideRecord('change_request');
chgGr.initialize();
var gr = new GlideRecord('cmdb_ci');
if (!gr.get(nameValuePairs.cmdb_ci_sys_id)) {
this.getChgMgtWorker().addErrorMsg(gs.getMessage('cmdb ci not found'));
return;
}
chgGr.setValue('cmdb_ci', nameValuePairs.cmdb_ci_sys_id);
this._setPlannedDate(chgGr, nameValuePairs.planned_start_time, nameValuePairs.duration_in_seconds);
this._process(chgGr, nameValuePairs.timezone);
},
_getSpansByChange: function(chgSysID, timezone) {
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[_getSpansByChange] chgSysID: ' + chgSysID);
var chgGr = new GlideRecord('change_request');
if (!chgGr.get(chgSysID)) {
this.getChgMgtWorker().addErrorMsg(gs.getMessage('Change Request not found'));
return;
}
if (!timezone) {
this._log.error('[_getSpansByChange] missing timezone');
return;
}
if (chgSysID !== this.getChgMgtWorker().getRequestParam('change_sys_id')) {
this._log.error('[_getSpansByChange] change_sys_id ' + chgSysID + ' does not match chgMgtWorkChangeSysId ' + request.changeSysId);
return;
}
if (!chgGr.cmdb_ci || !chgGr.start_date || !chgGr.end_date) {
this._log.error('[_getSpansByChange] missing cmdb_ci/start_date/end_date from Change ');
return;
}
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[_getSpansByChange] chgSysID: ' + chgSysID);
this._process(chgGr, timezone);
},
_process: function(chgGr, timezone) {
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[_process] Searching for span of Change with cmdb_ci: ' + chgGr.cmdb_ci + ', planned start time: ' + chgGr.start_date + ', planned end time: ' + chgGr.end_date);
var chgSchedule = new ChangeConflictSchedule(chgGr);
chgSchedule.setTimeZoneId(timezone);
var spanResult = chgSchedule.findScheduleWindows();
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[_process] spanResult: ' + JSON.stringify(spanResult));
var payload = {
spans:[]
};
if (spanResult && Array.isArray(spanResult.spans) && spanResult.spans.length > 0)
payload.spans = spanResult.spans;
else
this.getChgMgtWorker().addInfoMsg(this._getSpansNotFoundMsg(chgGr.start_date));
this.getChgMgtWorker().setResponseParam(ChangeScheduleRESTUtil.PAYLOAD, payload);
},
updateChangeScheduleTime: function(nameValuePairs) {
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[updateChangeScheduleTime] nameValuePairs: ' + JSON.stringify(nameValuePairs));
if (!nameValuePairs || !nameValuePairs.change_sys_id || !nameValuePairs.duration_in_seconds || !nameValuePairs.timezone) {
this._log.error('[updateChangeScheduleTime] missing parameter change_sys_id or duration or timezone, nameValuePairs: ' + JSON.stringify(nameValuePairs));
return;
}
var chgSysID = nameValuePairs.change_sys_id;
var chgGr = new GlideRecord('change_request');
if (!chgGr.get(chgSysID)) {
this.getChgMgtWorker().addErrorMsg(gs.getMessage('Change Request not found'));
return;
}
this._setPlannedDate(chgGr, nameValuePairs.planned_start_time, nameValuePairs.duration_in_seconds);
var chgSchedule = new ChangeConflictSchedule(chgGr);
chgSchedule.setTimeZoneId(nameValuePairs.timezone);
var spanResult = chgSchedule.findScheduleWindows();
if (this._log.atLevel(GSLog.DEBUG))
this._log.debug('[updateChangeScheduleTime] spanResult: ' + JSON.stringify(spanResult));
if (spanResult && spanResult.spans && spanResult.spans.length > 0) {
chgGr.setValue('start_date', spanResult.spans[0].start.value);
chgGr.setValue('end_date', spanResult.spans[0].end.value);
if (chgGr.update()) {
this.getChgMgtWorker().addInfoMsg(gs.getMessage('Change has been updated'));
} else
this.getChgMgtWorker().addErrorMsg(gs.getMessage('Change cannot be updated'));
} else
this.getChgMgtWorker().addInfoMsg(this._getSpansNotFoundMsg(nameValuePairs.planned_start_time));
},
_setPlannedDate: function(chgGr, planned_start_time, duration_in_seconds) {
var now = new GlideDateTime();
var startDate = (planned_start_time) ? new GlideDateTime(planned_start_time) : new GlideDateTime(now);
var endDate = (planned_start_time) ? new GlideDateTime(planned_start_time) : new GlideDateTime(now);
endDate.addSeconds(duration_in_seconds);
chgGr.setValue('start_date', startDate);
chgGr.setValue('end_date', endDate);
},
_getSpansNotFoundMsg: function(startTime) {
startTime = startTime ? startTime : 'now';
return gs.getMessage('No slots found for {0} days from {1}', [gs.getProperty('change.conflict.next_available.schedule_window', '90'), startTime]);
},
setChgMgtWorker: ChangeManagementWorkerSNC.methods.setChgMgtWorker,
getChgMgtWorker: ChangeManagementWorkerSNC.methods.getChgMgtWorker,
type: 'ChangeScheduleRESTUtilSNC'
};
Sys ID
68fc27bcc3222010a282a539e540dd9e