This documentation supports the 20.08 (12.1) version of BMC Discovery.

To view an earlier version of the product, select the version from the Product version menu.

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. For more information about tables, see TPL Guide.

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 BMC 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;
Was this page helpful? Yes No Submitting... Thank you

Comments