logo

NJP

Script for Default CSDM Lifecycle Mappings

Import · Aug 02, 2022 · article

Recently, we had the requirement to create the default CSDM Lifecycle mappings for all CI classes. There are more than 713 OOTB CI classes on fresh PDI. Which means there is no way we would do it manually, so we did create this fix script. The Script creates the mapping (same as the parent table) based on existing or default (OOTB) mappings. In order to create the mappings for all the child classes you need to provide the base class name. E.g. providing "cmdb_ci" as base class will create the mappings for all CMDB classes of it, if not already exist. This can be further optimized, but I preferred to post it as is. Any suggestions or improvements are welcomed, We rely on your feedback.

(NOTE: if your instance have custom choices create the mappings for them manually for base class, prior to running this script)

//To get an existing mappings
var grLCM = new GlideAggregate("life_cycle_mapping");
grLCM.groupBy("table");
grLCM.addAggregate("COUNT");
grLCM.query();
var existingMappedRecords = [];
while (grLCM.next()) {
    existingMappedRecords.push(grLCM.getDisplayValue("table"));
}

//Provide the BASE_CLASS_NAME as parameter here
var table = new TableUtils("cmdb_ci");
// var table = new TableUtils("ast_contract");
// var table = new TableUtils("alm_asset");
// var table = new TableUtils("cmdb_model");
var ciTables = table.getAllExtensions();

gs.include("j2js");
var ciTablesArr = j2js(ciTables);

for (var i = 0; i < ciTablesArr.length; i++) {
    if (existingMappedRecords.indexOf(String(ciTablesArr[i])) === -1) {
        //CI classes not having mappings - Get closest parent class having mappings
        var parentMapClass = getMappingsClassParent(ciTablesArr[i]);

        //Apply Parent mappings to child class
        setMappings(ciTablesArr[i], parentMapClass);
    }
}

//Script for Mappings
function setMappings(childToApplyMap, parentToFetchMap) {
    //Get parent mappings
    try {

        var rParentMap = new sn_ws.RESTMessageV2();
        rParentMap.setEndpoint('https://' + gs.getProperty('instance_name') + '.service-now.com/api/now/table/life_cycle_mapping?sysparm_query=active%3Dtrue%5Etable%3D' + String(parentToFetchMap) + '&sysparm_display_value=false&sysparm_exclude_reference_link=true&sysparm_fields=active%2Clegacy_field_name%2Clegacy_field_value%2Clegacy_field_and_value%2Clegacy_subfield_name%2Clegacy_subfield_value%2Clegacy_subfield_and_value%2Clife_cycle_control%2Cpriority%2Clegacy_field_and_value%2Clegacy_subfield_and_value');
        rParentMap.setHttpMethod('GET');

        //Eg. UserName="admin", Password="admin" for this code sample.
        var user = 'admin';
        var password = 'admin_password';

        rParentMap.setBasicAuth(user, password);
        rParentMap.setRequestHeader("Accept", "application/json");

        var responseParentMap = rParentMap.execute();

        var httpParentMapStatus = responseParentMap.getStatusCode();

        if (httpParentMapStatus === 200) {
            var responseParentMapBody = responseParentMap.getBody();
            var parentMapObjResult = JSON.parse(responseParentMapBody);
            var parentMapObj = parentMapObjResult['result'];

            //set child mappings
            parentMapObj.forEach(function(singleObjParent) {
                singleObjParent["table"] = String(childToApplyMap);

                try {


                    var grLCMCreate = new GlideRecord("life_cycle_mapping");
                    grLCMCreate.newRecord();
                    grLCMCreate.setValue('legacy_field_name', singleObjParent["legacy_field_name"]);
                    grLCMCreate.setValue('legacy_field_value', singleObjParent["legacy_field_value"]);
                    grLCMCreate.setValue('legacy_field_and_value', singleObjParent["legacy_field_and_value"]);

                    if (singleObjParent.hasOwnProperty('legacy_subfield_name')) {
                        grLCMCreate.setValue('legacy_subfield_name', singleObjParent["legacy_subfield_name"]);
                        grLCMCreate.setValue('legacy_subfield_value', singleObjParent["legacy_subfield_value"]);
                        grLCMCreate.setValue('legacy_subfield_and_value', singleObjParent["legacy_subfield_and_value"]);
                    }

                    grLCMCreate.setValue('active', 'true');
                    grLCMCreate.setValue('life_cycle_control', singleObjParent["life_cycle_control"]);
                    grLCMCreate.setValue('priority', singleObjParent["priority"]);
                    grLCMCreate.setValue('table', String(childToApplyMap));
                    grLCMCreate.update();


                } catch (err) {
                    gs.info("Error while creating child map for table: " + String(childToApplyMap) + " -> " + err.message);
                }

            });

        }
    } catch (e) {
        gs.info("Error while fetching parent map for table: " + String(parentToFetchMap) + " -> " + e.message);
    }

}

//to remove empty keys from object
function replacer(key, value) {
    if (value === "") {
        return undefined;
    }
    return value;
}

function getMappingsClassParent(orginalCIClass) {

    // Get the hierarchy of tables
    var tableParent = new TableUtils(orginalCIClass);
    var tableParentArrayList = tableParent.getTables();

    var tableParentArray = j2js(tableParentArrayList);

    var j = 1;
    while (j < tableParentArray.length) {
        //Check if parrent have mappings & if  yes, return parent class

        var grCheckLCMofParent = new GlideAggregate("life_cycle_mapping");
        grCheckLCMofParent.addEncodedQuery("table=" + String(tableParentArray[j]));
        grCheckLCMofParent.addAggregate("COUNT");
        grCheckLCMofParent.query();
        var cnt = 0;
        if (grCheckLCMofParent.next()) {
            cnt = grCheckLCMofParent.getAggregate("COUNT");
        }
        if (cnt > 0) {

            return String(tableParentArray[j]);
        }

        j++;
    }

}
View original source

https://www.servicenow.com/community/common-service-data-model/script-for-default-csdm-lifecycle-mappings/ta-p/2309217