- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-26-2024 10:58 PM
Our network devices are globally distributed (on premises and rented locations). The network engineers are ordering these devices mostly locally and open the discovery via a catalog item.
By discovery the network device is added into the CMDB.
The location itself must be added manually. For the location we are using the cmn_location class for city, building and room.
We use the cmdb_ci_rack class to define the rack and rack location.
I want to establish a CI relationship of the network device i.e. IP Switch and the Rack. There is an article available
Create or edit a CI relationship but we do have hundreds of devices and I don't want to do this manually. How can I do this in a programmatic way?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-26-2024 11:37 PM
Hi @Andreas Cierpka ,
You can use below script and run using fix script or background script.
// Function to create a CI relationship
function createRelationship(sourceCI, targetCI, relationshipType) {
var grRel = new GlideRecord('cmdb_rel_ci');
grRel.initialize();
grRel.setValue('parent', sourceCI); // Source CI sys_id
grRel.setValue('child', targetCI); // Target CI sys_id
grRel.setValue('type', relationshipType); // Relationship Type sys_id
grRel.insert();
}
// Example: Map of devices to racks (replace this with your actual data source)
var deviceToRackMap = [
{ deviceName: 'Switch01', rackName: 'Rack01' },
{ deviceName: 'Switch02', rackName: 'Rack02' },
{ deviceName: 'Switch03', rackName: 'Rack03' }
];
// Relationship Type (e.g., "Installs in::Installed in")
var relationshipTypeName = 'Installs in::Installed in'; // Adjust based on your setup
// Fetch relationship type sys_id
var relType = new GlideRecord('cmdb_rel_type');
relType.addQuery('name', relationshipTypeName);
relType.query();
if (!relType.next()) {
gs.error('Relationship type not found: ' + relationshipTypeName);
} else {
var relationshipTypeSysId = relType.getUniqueValue();
// Iterate through the map and create relationships
for (var i = 0; i < deviceToRackMap.length; i++) {
var device = deviceToRackMap[i];
// Fetch network device sys_id
var deviceGR = new GlideRecord('cmdb_ci_ip_switch');
deviceGR.addQuery('name', device.deviceName);
deviceGR.query();
if (!deviceGR.next()) {
gs.error('Device not found: ' + device.deviceName);
continue;
}
// Fetch rack sys_id
var rackGR = new GlideRecord('cmdb_ci_rack');
rackGR.addQuery('name', device.rackName);
rackGR.query();
if (!rackGR.next()) {
gs.error('Rack not found: ' + device.rackName);
continue;
}
// Create the relationship
createRelationship(deviceGR.getUniqueValue(), rackGR.getUniqueValue(), relationshipTypeSysId);
gs.info('Relationship created between ' + device.deviceName + ' and ' + device.rackName);
}
}
-------------------------------------------------------------------------
If you found my response helpful, please consider selecting "Accept as Solution" and marking it as "Helpful." This not only supports me but also benefits the community.
Regards
Runjay Patel - ServiceNow Solution Architect
YouTube: https://www.youtube.com/@RunjayP
LinkedIn: https://www.linkedin.com/in/runjay
-------------------------------------------------------------------------
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-26-2024 11:37 PM
Hi @Andreas Cierpka ,
You can use below script and run using fix script or background script.
// Function to create a CI relationship
function createRelationship(sourceCI, targetCI, relationshipType) {
var grRel = new GlideRecord('cmdb_rel_ci');
grRel.initialize();
grRel.setValue('parent', sourceCI); // Source CI sys_id
grRel.setValue('child', targetCI); // Target CI sys_id
grRel.setValue('type', relationshipType); // Relationship Type sys_id
grRel.insert();
}
// Example: Map of devices to racks (replace this with your actual data source)
var deviceToRackMap = [
{ deviceName: 'Switch01', rackName: 'Rack01' },
{ deviceName: 'Switch02', rackName: 'Rack02' },
{ deviceName: 'Switch03', rackName: 'Rack03' }
];
// Relationship Type (e.g., "Installs in::Installed in")
var relationshipTypeName = 'Installs in::Installed in'; // Adjust based on your setup
// Fetch relationship type sys_id
var relType = new GlideRecord('cmdb_rel_type');
relType.addQuery('name', relationshipTypeName);
relType.query();
if (!relType.next()) {
gs.error('Relationship type not found: ' + relationshipTypeName);
} else {
var relationshipTypeSysId = relType.getUniqueValue();
// Iterate through the map and create relationships
for (var i = 0; i < deviceToRackMap.length; i++) {
var device = deviceToRackMap[i];
// Fetch network device sys_id
var deviceGR = new GlideRecord('cmdb_ci_ip_switch');
deviceGR.addQuery('name', device.deviceName);
deviceGR.query();
if (!deviceGR.next()) {
gs.error('Device not found: ' + device.deviceName);
continue;
}
// Fetch rack sys_id
var rackGR = new GlideRecord('cmdb_ci_rack');
rackGR.addQuery('name', device.rackName);
rackGR.query();
if (!rackGR.next()) {
gs.error('Rack not found: ' + device.rackName);
continue;
}
// Create the relationship
createRelationship(deviceGR.getUniqueValue(), rackGR.getUniqueValue(), relationshipTypeSysId);
gs.info('Relationship created between ' + device.deviceName + ' and ' + device.rackName);
}
}
-------------------------------------------------------------------------
If you found my response helpful, please consider selecting "Accept as Solution" and marking it as "Helpful." This not only supports me but also benefits the community.
Regards
Runjay Patel - ServiceNow Solution Architect
YouTube: https://www.youtube.com/@RunjayP
LinkedIn: https://www.linkedin.com/in/runjay
-------------------------------------------------------------------------