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.