Need guidance in committing an update set using a Server Side Code

Harshal Aditya
Mega Sage
Mega Sage

Hello ServiceNow Experts,

 

We are currently working on logic to commit an update set using Server Side Script (Scripted Rest API).
The code on the Commit button uses a Ajax call.


Script Include - com.glide.update.UpdateSetCommitAjaxProcessor is hidden 


Below is the OOB code on commit button.

 

var commitInProgress = false;

function commitRemoteUpdateSet(control) {
    if (commitInProgress)
        return;

    // get remoteUpdateSetId from g_form if invoked on remote update set page
    var rusId = typeof g_form != 'undefined' && g_form != null ? g_form.getUniqueValue() : null;
    var ajaxHelper = new GlideAjax('com.glide.update.UpdateSetCommitAjaxProcessor');
    ajaxHelper.addParam('sysparm_type', 'validateCommitRemoteUpdateSet');
    ajaxHelper.addParam('sysparm_remote_updateset_sys_id', rusId);
    ajaxHelper.getXMLAnswer(getValidateCommitUpdateSetResponse);
}

function getValidateCommitUpdateSetResponse(answer) {
    try {
        if (answer == null) {
            console.log('validateCommitRemoteUpdateSet answer was null');
            return;
        }
        console.log('validateCommitRemoteUpdateSet answer was ' + answer);
        var returnedInfo = answer.split(';');

        var sysId = returnedInfo[0];
        var encodedQuery = returnedInfo[1];
        var delObjList = returnedInfo[2];

        if (delObjList !== "NONE") {
            console.log('showing data loss confirm dialog');
            showDataLossConfirmDialog(sysId, delObjList, encodedQuery);
        }
        else {
            console.log('skipping data loss confirm dialog');
            var ga = new GlideAjax('UpdateSetCommitAjax');
            ga.addParam('sysparm_type', 'shouldShowConfirmAppInstall');
            ga.addParam('sysparm_rus_sys_id', sysId);
            ga.addParam('sysparm_in_hierarchy', false);
            ga.getXMLWait();
            var showDialog = ga.getAnswer();
            console.log("showDialog = " + showDialog);
            if (showDialog == 'true') {
                var dialogClass = window.GlideModal ? GlideModal : GlideDialogWindow;
                var dialog = new dialogClass('commit_app_install_confirm');
                dialog.setTitle(getMessage("Confirm app installs"));
                dialog.setWidth(450);
                dialog.setPreference('onConfirm', runTheCommit);
                dialog.setPreference('rus_sys_id', sysId);
                dialog.setPreference('in_hierarchy', false);
                dialog.render();
            } else
                runTheCommit(sysId, false, false);
        }
    } catch (err) {

    }
}

function runTheCommit(sysId, skipAppInstalls, dontDisplayAgain) {
    console.log('running commit on ' + sysId);
    console.log('dontDisplayAgain = ' + dontDisplayAgain);
    if (dontDisplayAgain)
        disableConfirmAppInstallDialog();

    commitInProgress = true;
    var ajaxHelper = new GlideAjax('com.glide.update.UpdateSetCommitAjaxProcessor');
    ajaxHelper.addParam('sysparm_type', 'commitRemoteUpdateSet');
    ajaxHelper.addParam('sysparm_remote_updateset_sys_id', sysId);
    if (skipAppInstalls != null && (typeof skipAppInstalls !== 'undefined') && skipAppInstalls)
        ajaxHelper.addParam('sysparm_skip_app_installs', true);
    else
        ajaxHelper.addParam('sysparm_skip_app_installs', false);
       
    ajaxHelper.getXMLAnswer(getCommitRemoteUpdateSetResponse);
}

function disableConfirmAppInstallDialog() {
    var ga = new GlideAjax('UpdateSetCommitAjax');
    ga.addParam('sysparm_type', 'setShowConfirmAppInstallPreference');
    ga.addParam('sysparm_show_confirm_app_install', 'false');
    ga.getXMLWait();
}

var dataLossConfirmDialog;
function destroyDialog() {
    dataLossConfirmDialog.destroy();
}

function showDataLossConfirmDialog(sysId, delObjList, encodedQuery) {
    var dialogClass = typeof GlideModal != 'undefined' ? GlideModal : GlideDialogWindow;
    var dlg = new dialogClass('update_set_data_loss_commit_confirm');
    dataLossConfirmDialog = dlg;
    dlg.setTitle('Confirm Data Loss');
    if(delObjList == null) {
        dlg.setWidth(300);
    } else {
        dlg.setWidth(450);
    }

    dlg.setPreference('sysparm_sys_id', sysId);
    dlg.setPreference('sysparm_encodedQuery', encodedQuery);
    dlg.setPreference('sysparm_del_obj_list', delObjList);
    console.log('rendering data loss confirm dialog');
    dlg.render();
}


function getCommitRemoteUpdateSetResponse(answer) {
    try {
        if (answer == null)
            return;

        var map = new GwtMessage().getMessages(["Close", "Cancel", "Are you sure you want to cancel this update set?", "Update Set Commit", "Go to Subscription Management"]);

        var returnedIds = answer.split(',');

        var workerId = returnedIds[0];
        var sysId = returnedIds[1];
        var shouldRefreshNav = returnedIds[2];
        var shouldRefreshApps = returnedIds[3];
        var dialogClass = window.GlideModal ? GlideModal : GlideDialogWindow;
        var dd = new dialogClass("hierarchical_progress_viewer", false, "40em", "10.5em");
        dd.setTitle(map["Update Set Commit"]);
        dd.setPreference('sysparm_renderer_execution_id', workerId);
        dd.setPreference('sysparm_renderer_expanded_levels', '0'); // collapsed root node by default
        dd.setPreference('sysparm_renderer_hide_drill_down', true);

        dd.setPreference('sysparm_button_subscription', map["Go to Subscription Management"]);
        dd.setPreference('sysparm_button_close', map["Close"]);


        dd.on("bodyrendered", function(trackerObj) {
            var buttonsPanel = $("buttonsPanel");
            var table = new Element("table", {cellpadding: 0, cellspacing: 0, width : "100%"});
            buttonsCell = table.appendChild(new Element("tr")).appendChild(new Element("td"));
            buttonsCell.align = "right";
            buttonsPanel.appendChild(table);

            var closeBtn = $("sysparm_button_close");
            if (closeBtn)
                closeBtn.disable();

            var cancelBtn = new Element("button");
            cancelBtn.id = "sysparm_button_cancel";
            cancelBtn.type = "button";
            cancelBtn.innerHTML = map["Cancel"];
            cancelBtn.onclick = function() {
                var response = confirm(map["Are you sure you want to cancel this update set?"]);
                if (response != true)
                    return;

                var ajaxHelper = new GlideAjax('UpdateSetCommitAjax');
                ajaxHelper.addParam('sysparm_type', 'cancelRemoteUpdateSet');
                ajaxHelper.addParam('sysparm_worker_id', workerId);
                ajaxHelper.getXMLAnswer(getCancelRemoteUpdateSetResponse);
            };
            buttonsCell.appendChild(cancelBtn);
        });

        dd.on("executionComplete", function(trackerObj) {

            var subBtn = $("sysparm_button_subscription");
            var tableCount = 0;
            if (trackerObj.result && trackerObj.result.custom_table_count)
                tableCount = Number(trackerObj.result.custom_table_count);

            if (tableCount > 0) {
                  if (subBtn) {
                      subBtn.enable();
                      subBtn.onclick = function() {
                          window.open(trackerObj.result.inventory_uri);
                      };
                 }
            } else {
                subBtn.hide();
            }

            var closeBtn = $("sysparm_button_close");
            if (closeBtn) {
                closeBtn.enable();
                closeBtn.onclick = function() {
                    dd.destroy();
                };
            }

            var cancelBtn = $("sysparm_button_cancel");
            if (cancelBtn)
                cancelBtn.hide();
        });

        dd.on("beforeclose", function() {
            if (shouldRefreshNav)
                refreshNav();

            var top = getTopWindow();
            if (shouldRefreshApps && typeof top.g_application_picker != 'undefined')
                top.g_application_picker.fillApplications();

            reloadWindow(window); //reload current form after closing the progress viewer dialog
        });

        dd.render();
    } catch (err) {

    }
}

function getCancelRemoteUpdateSetResponse(answer) {
    if (answer == null)
        return;

    // Nothing really to do here.
}
 
Could you please suggest how can we utilize the above code in our Server Side script ?
 
Thanks in advance 
 
 

 

 

1 ACCEPTED SOLUTION

OlaN
Giga Sage
Giga Sage

Hi,

Do you know that there are built in capabilities available?

You shouldn't need to create your own scripted REST apis.

Check out this video for example: CICD Update Set APIs - Part 1 (Pull) - YouTube

View solution in original post

4 REPLIES 4

GlideFather
Tera Patron

Hi @Harshal Aditya,

 

what's the business justification for this?

 

Committing update set is one of the things that shall be secured and hold the control over... 

———
/* If my response wasn’t a total disaster ↙️ drop a Kudos or Accept as Solution ↘️ Cheers! */


Harshal Aditya
Mega Sage
Mega Sage

Hi @GlideFather -

 

We are doing a POC where we are automating update set deployment using scripted Rest API.
Will also be keeping the process secure by adding necessary checks

OlaN
Giga Sage
Giga Sage

Hi,

Do you know that there are built in capabilities available?

You shouldn't need to create your own scripted REST apis.

Check out this video for example: CICD Update Set APIs - Part 1 (Pull) - YouTube

Harshal Aditya
Mega Sage
Mega Sage

Hi @OlaN - Thanks for sharing the video. This is what that I was looking for.
Will try this solution in PDI