Name
sn_appclient.ProgressTracker
Description
No description available
Script
var ProgressTracker = Class.create();
ProgressTracker.prototype = {
initialize: function() {
},
getStatus: function(execId) {
var status = this.getProgress(execId);
return new global.JSON().encode(status);
},
getProgress: function(execId) {
// gs.info("ProgressTracker: " + execId);
var pgr = new GlideRecord('sys_execution_tracker');
pgr.get(execId);
return this.getStatusLayer(pgr);
},
getStatusLayer: function(gr) {
// gs.info("getStatusLayer: " + gr.name.toString());
var obj = {};
obj.name = gr.name.toString();
obj.state = gr.state.toString();
obj.message = gr.message.toString();
obj.sys_id = gr.sys_id.toString();
obj.percent_complete = gr.percent_complete.toString();
var updated_on = new GlideDateTime();
updated_on.setDisplayValue(gr.sys_updated_on.getDisplayValue());
obj.updated_on = updated_on.getNumericValue();
obj.results = [];
var pgr = new GlideRecord("sys_execution_tracker");
pgr.addQuery("parent", gr.sys_id);
pgr.addQuery("state",'1');
pgr.orderBy("order");
pgr.query();
while (pgr.next()) {
obj.results.push(this.getStatusLayer(pgr));
}
return obj;
},
isComplete : function(trackerId){
var trackers = trackerId.split(",");
var pw = new GlideRecord("sys_progress_worker");
pw.addQuery("sys_id", "IN", trackers);
pw.query();
while(pw.next()) {
if(pw.getValue("state") != "complete")
return false;
}
return true;
},
getExecutionTime: function(trackerId) {
var trackers = trackerId.split(",");
var pw = new GlideRecord("sys_progress_worker");
pw.addQuery("sys_id", "IN", trackers);
pw.query();
var obj = {};
while (pw.next()) {
if (pw.getValue("name") == "Checking store app updates")
obj.storeUpdatesTime = new GlideDateTime(pw.getValue("total_execute_time")).getNumericValue();
else if (pw.getValue("name") == "Update plugin cache")
obj.pluginUpdatesTime = new GlideDateTime(pw.getValue("total_execute_time")).getNumericValue();
}
return obj;
},
getBatchInstallStatus: function(batchId) {
var batchAppsPayload = [];
var installationPlanGr = new GlideRecord("sys_batch_install_plan");
installationPlanGr.get(batchId);
if (installationPlanGr.isValidRecord()) {
var batchItemGr = new GlideRecord("sys_batch_install_item");
batchItemGr.addQuery("batch_install_plan.sys_id", installationPlanGr.getUniqueValue());
batchItemGr.query();
while(batchItemGr.next()) {
var batchItem = this._getBatchInstallItem(batchItemGr);
batchAppsPayload.push(batchItem);
}
}
return batchAppsPayload;
},
getExecutionTrackerId: function(batchName) {
var trackerGr = new GlideRecord("sys_execution_tracker");
trackerGr.addQuery("name", batchName);
trackerGr.addQuery("state", "IN", "0,1");
trackerGr.addNullQuery("parent");
trackerGr.query();
if(!trackerGr.next())
return null;
return trackerGr.sys_id.toString();
},
getPendingBatchInstalls: function() {
var pendingBatch = {};
var batchInstallItems = new GlideRecord("sys_batch_install_item");
batchInstallItems.addQuery("state" ,"IN", "ready,in_progress");
batchInstallItems.orderByDesc("sys_updated_on");
batchInstallItems.query();
if(!batchInstallItems.next())
return pendingBatch;
pendingBatch.batch_installation_id = batchInstallItems.batch_install_plan.sys_id.toString();
var batchExecName = batchInstallItems.batch_install_plan.name.toString();
pendingBatch.execution_tracker_id = this.getExecutionTrackerId(batchExecName);
pendingBatch.name = batchExecName;
return pendingBatch;
},
getPendingBatchInstallations: function() {
var list = [];
var batchInstallItems = new GlideRecord("sys_batch_install_item");
batchInstallItems.addQuery("state", "IN", "ready,in_progress");
batchInstallItems.orderByDesc("sys_updated_on");
batchInstallItems.query();
while (batchInstallItems.next()) {
var pendingBatch = this._getBatchInstallItem(batchInstallItems);
pendingBatch.batch_installation_id = batchInstallItems.batch_install_plan.sys_id.toString();
var batchExecName = batchInstallItems.batch_install_plan.name.toString();
pendingBatch.execution_tracker_id = this.getExecutionTrackerId(batchExecName);
pendingBatch.name = batchExecName;
list.push(pendingBatch);
}
return list;
},
_getBatchInstallItem: function(batchItemGr) {
var batch = {};
batch.id = batchItemGr.getValue("id");
batch.state = batchItemGr.getValue("state");
batch.status_message = batchItemGr.getValue("status_message");
batch.type = batchItemGr.getValue("type");
batch.version = batchItemGr.getValue("version");
batch.notes = batchItemGr.getValue("notes");
batch.demo_data = batchItemGr.getValue("demo_data");
batch.name = batchItemGr.getValue("name") || batchItemGr.getValue("id");
return batch;
},
getAllQueuedInstallations: function(params, apiUtil) {
var limit = CommonUtils.getLimit(params.queryParams);
var offset = CommonUtils.getOffset(params.queryParams);
this.getInProgressInstallations(); //sync latest updates from execution tracker
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
this._addStateFilter(gr, params);
gr.orderByDesc("sys_created_on");
gr.chooseWindow(offset, offset + limit);
gr.query();
apiUtil.addTotalCountHeader(gr.getRowCount());
var installtions = [];
while (gr.next()) {
var progressTracker = this._getProgressTrackerInfo(gr);
installtions.push(progressTracker);
}
return installtions;
},
getQueuedInstallationByTrackerId: function(trackerId) {
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
gr.addQuery("tracker_id", trackerId);
gr.query();
var tracker = {};
if (gr.next()) {
if(gr.state <= 1){
var map = this._getExecutionTrackerByIds(trackerId);
this._updateProgressTracker(map[trackerId], gr);
}
tracker = this._getProgressTrackerInfo(gr);
}
return tracker;
},
_addStateFilter: function(gr, params) {
var state = params.queryParams[Constants.STATE];
if (state == "progress")
gr.addQuery(Constants.STATE, "IN", "0,1");
else if (state == "completed")
gr.addQuery(Constants.STATE, "IN", "2,3,4");
},
getInProgressInstallations: function() {
var trackerIds = this._getInProgressTrackerIds();
if (trackerIds.length == 0)
return [];
var map = this._getExecutionTrackerByIds(trackerIds);
return this._updateAndGetStatus(trackerIds, map);
},
getInProgressInstallationByAppId: function(appId) {
var trackerId = this._getInProgressTrackerIdByAppId(appId);
var progressTracker = {};
if (trackerId) {
var gr = new GlideRecord("sys_execution_tracker");
gr.get(trackerId);
var executionTracker = this._getExecutionTrackerInfo(gr);
progressTracker = this._updateAppAndGetStatus(executionTracker);
}
return progressTracker.state < 2 ? progressTracker : {};
},
_getExecutionTrackerByIds: function(trackerIds) {
var gr = new GlideRecord("sys_execution_tracker");
gr.addQuery("sys_id", "IN", trackerIds);
gr.query();
var map = {};
while (gr.next()) {
var tracker = this._getExecutionTrackerInfo(gr);
map[tracker.id] = tracker;
}
return map;
},
_getExecutionTrackerInfo: function(gr) {
var tracker = {};
tracker.id = gr.getValue("sys_id");
tracker.message = gr.getValue("message");
tracker.detail_message = gr.getValue("detail_message");
tracker.percent_complete = gr.getValue("percent_complete");
tracker.state = gr.getValue("state");
tracker.start_time = gr.getValue("start_time");
tracker.completion_time = gr.getValue("completion_time");
return tracker;
},
_getInProgressTrackerIds: function() {
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
gr.addEncodedQuery("state=0^ORstate=1");
gr.orderByDesc("sys_created_on");
gr.query();
var list = [];
while (gr.next()) {
list.push(gr.getValue("tracker_id"));
}
return list;
},
_getInProgressTrackerIdByAppId: function(appId) {
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
gr.addEncodedQuery("state=0^ORstate=1^app_id=" + appId);
gr.orderBy("sys_created_on");
gr.query();
if (gr.next()) {
return gr.getValue("tracker_id");
}
return null;
},
_updateAndGetStatus: function(trackerIds, map) {
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
gr.addQuery("tracker_id", "IN", trackerIds);
gr.query();
var pendingInstallations = [];
while (gr.next()) {
var trackerId = gr.getValue("tracker_id");
var tracker = map[trackerId];
this._updateProgressTracker(tracker, gr);
if (tracker.state < 2)
pendingInstallations.push(this._getProgressTrackerInfo(gr));
}
return pendingInstallations;
},
_updateAppAndGetStatus: function(tracker) {
var gr = new GlideRecord(Constants.TABLE_PROGRESS_TRACKER);
gr.addQuery("tracker_id", tracker.id);
gr.query();
var progressTracker = {};
if (gr.next()) {
this._updateProgressTracker(tracker, gr);
progressTracker = this._getProgressTrackerInfo(gr);
}
return progressTracker;
},
_updateProgressTracker: function(tracker, gr) {
gr.setValue("state", tracker.state);
gr.setValue("message", tracker.message);
gr.setValue("detail_message", tracker.detail_message);
gr.setValue("percent_complete", tracker.percent_complete);
gr.setValue("start_time", tracker.start_time);
gr.setValue("completion_time", tracker.completion_time);
gr.update();
},
_getProgressTrackerInfo: function(gr) {
var tracker = {};
tracker.id = gr.getValue("tracker_id");
tracker.name = gr.getValue("name");
tracker.app_id = gr.getValue("app_id");
tracker.type = gr.getValue("type");
tracker.mode = gr.getValue("mode");
tracker.message = gr.getValue("message");
tracker.detail_message = gr.getValue("detail_message");
tracker.percent_complete = gr.getValue("percent_complete");
tracker.state = gr.getValue("state");
tracker.start_time = gr.getValue("start_time");
tracker.completion_time = gr.getValue("completion_time");
tracker.created_by = gr.getValue("sys_created_by");
return tracker;
},
type: 'ProgressTracker'
};
Sys ID
73270440d73221004a1dcdcf6e61035e