Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Rhino Exception Error

Nitin Kumar2
Kilo Contributor

Hi,

I have a requirement to populate ‘Owning IT Service’ on existing RCCF(custom table) records. I have created an on demand scheduled job with following script to populate the IT Service, this schedule job uses a function from existing script include. I have tested the functionality of this function using a background script and passing an example sys_id of CI. But when I try to send the sys_id of the CI using script it's throwing an error, following is the script and the error I am getting

 

var util = new global.BPCIUtils();

var rccf = new GlideRecord('u_root_cause_cf');

rccf.addQuery('business_service', '');

rccf.query();

gs.log('Total Records: ' + rccf.getRowCount(), 'RCCF');

while(rccf.next()){

                var ci = rccf.cmdb_ci;

                rccf.business_service = util.getOwningITService(ci); // Error Line

                rccf.setWorkflow(false);

                rccf.autoSysFields(false);

                rccf.update();

}

 

It is not working and throwing the following error at line 8 ie., rccf.business_service = util.getOwningITService(ci);

 

type:error, message: Illegal access to getter method getMessage in class org.mozilla.javascript.RhinoException

 

Please help me solve this issue.


Thanks,
Nitin

4 REPLIES 4

Ankur Bawiskar
Tera Patron
Tera Patron

Hi Nitin,

Is your scheduled job also in same scope as that of the script include?

Can you check & share the code inside the function getOwningITService()?

Mark Correct if this solves your issue and also mark 👍 Helpful if you find my response worthy based on the impact.
Thanks
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

The scheduled job and the script include are in the same scope. Following is the code inside funtion

 

getOwningITService: function (ci) {

// This function should return the sys_id of the owning IT Service detemined by the passed sys_id of the ci.

try {
var useIteration = true;
var owningService = '';
var gr = new GlideRecord("cmdb_ci");
gr.get(ci);
var ciClass = gr.sys_class_name;
var extCi = new GlideRecord(ciClass);
extCi.get(ci);

// Apply a forced check for particular CI Classes.
if (owningService == '') {
switch (ciClass.toString()) {
case 'u_cmdb_ci_spkg_application_deploy': //application Deployment
//application packages have parent cation packeges within this would need to be re-written
owningService = extCi.u_application_package.u_it_service;
break;
default:
break;
}
}

//check to see if CI is extended from the business service class.
if (owningService == '') {
var bStable = new TableUtils("cmdb_ci_service");

if (bStable.getHierarchy().indexOf(ciClass) != -1) {
owningService = ci;
}
}

//Check to see if CI It Service rel is available if it is then set
if (extCi.u_it_service != '') {
owningService = extCi.u_it_service;
}

//Iterate through the CI parent relationships 2 levels
if (!owningService && useIteration == true) {
var relCi = new GlideRecord('cmdb_rel_ci');
var child = ci;
relCi.addQuery('child', child);
relCi.addNotNullQuery('parent');
relCi.query();
while (relCi.next()) {
//check parent level 1
if (owningService != '') break;
//check parent class is a business Service
var parent1BS = new TableUtils("cmdb_ci_service");
if (parent1BS.getHierarchy().indexOf(relCi.parent.sys_class_name) != -1) {
owningService = relCi.parent;
break;
}
if (relCi.parent.u_it_service != '') {
owningService = relCi.parent.u_it_service;
break;
} else {
//check the parent level 2
var parentCi = new GlideRecord('cmdb_rel_ci');
var child1 = relCi.parent;
parentCi.addQuery('child', child1);
parentCi.addNotNullQuery('parent');
parentCi.query();
while (parentCi.next()) {

if (owningService != '') break;
//check parent level 2

var parent2BS = new TableUtils("cmdb_ci_service");
if (parent2BS.getHierarchy().indexOf(parentCi.parent.sys_class_name) != -1) {
owningService = parentCi.parent;
break;
}

if (parentCi.parent.u_it_service != '') {
owningService = parentCi.parent.u_it_service;
break;
}
}
}
}
}

//If not found the mark as an orphan and assing to configuration management
// Discuss strategy here

return owningService;

} catch (e) {
this.logError('global.BPCIUtils.getOwningITService', e.message);
} finally { }
},

Hi,

you will have to add log statements one by one in the script include function to check and debug

Regards

Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

As I have mentioned in the post, the function is working if I pass the sys_id of the ci directly. I have tested it in a background script. It is not working when I am passing the sys_id by gliding to a table. So there's nothing wrong with the script include.

 

Thanks,

Nitin.