Extending the CDM mapping
The following example shows how to extend the default CDM mapping for a host to create BMC_PhysicalLocation CIs from location information determined in BMC Discovery and relate these to BMC_ComputerSystem CIs.
The first pattern is used to determine the location of the host. Taken from Using TPL to enrich discovered data:
Using a table in a pattern to relate subnets to locations
Subnets can be used to identify locations of hosts. You can extend the template_host_location
pattern to map subnets to locations. The following TPL snippet shows how you could use a table to map the subnet to hosts. You could also hard code a mapping of hostnames to locations if that information is available. See TPL Guide for more information on tables.
table SubnetLocations 1.0 "10.10.10.0/24" -> "London Victoria"; "10.10.11.0/24" -> "London Egham"; "172.17.94.0/24" -> "Houston"; "172.18.95.0/24" -> "Dallas"; default -> "unknown"; end table;
The following TPL snippet shows the search from the host to associated subnet or subnets.
subnet_list := search(in host traverse DeviceWithAddress:DeviceAddress:IPv4Address:IPAddress traverse DeviceOnSubnet:DeviceSubnet:Subnet:Subnet where ip_address_range defined show ip_address_range); list_size := size(subnet_list); log.debug("subnet_list size is %list_size%"); // The search returns a list. We pick the first IP range for which there // is an entry in the SubnetLocations table location_name := none; for ip_address_range in subnet_list do if ip_address_range in SubnetLocations then // Matched, so set the location_name and break out of the loop location_name := SubnetLocations[ip_address_range]; break; end if; end for;
Now you can create or update the relationship between the host and location node. The following code snippet uses the model.uniquerel
function to create or update the relationship.
// Relate host to location. Using "uniquerel" rather than "rel" means that // any existing Location relationships between this Host (the first // parameter) and any Location nodes other than the one given (the second // parameter) are removed. If a host has changed location, this keeps the // model up-to-date. log.info("Subnet_2_Locations: model.uniquerel.Location %host% %location%"); model.uniquerel.Location( ElementInLocation := host, Location := location );
The host is now related to the location node which represents its physical location.
The second pattern is the template_cmdb_location
template which is available in the Pattern Templates section of the Pattern Management page. See Pattern templates for more information on the template patterns supplied with BMC Discovery. The syncmapping is described in the TPL Guide.
The template_cmdb_location
syncmapping extends the root mapping for Host nodes. The mapping section specifies the extension to the root mapping using the from keyword. The traversal finds related location nodes, and the mapping from phys_loc
to BMC_PhysicalLocation
is defined.
The name defined by the traversal can only be used in a for each expression; it cannot be used in any other context.
mapping from Host_ComputerSystem.host as host traverse ElementInLocation:Location:Location:Location as location phys_loc -> BMC_PhysicalLocation; end traverse; end mapping;
The body of the template_cmdb_location
pattern loops through each location reached by the traversal, and transforms the subgraph of data in the Discovery model into a subgraph of CIs in the target CMDB model. This is copied across and then the relationship is created between the BMC_ComputerSystem
and the new BMC_PhysicalLocation
in the CMDB.
body computersystem := Host_ComputerSystem.computersystem; for each location do // ADDM Location nodes created by patterns have a key // attribute, but those created in the UI do not. We use // the name attribute if the key is not present. if location.key then key := location.key; else key := location.name; end if; // Specify the BMC_PhysicalLocation CI. You may wish to // add more attributes to the ADDM Location node and copy // them across here. phys_loc := sync.shared.BMC_PhysicalLocation( key := key, Name := location.name, ShortDescription := location.name, Description := location.description, Address := location.address, Category := "Reference Configuration", Type := "Facilities", Item := "Space Management" ); // Relate the BMC_ComputerSystem to the new BMC_PhysicalLocation sync.rel.BMC_ElementLocation( Source := computersystem, Destination := phys_loc, Name := "ELEMENTLOCATION" ); end for; end body;
Comments
Log in or register to comment.