About Supporting Vendor Devices

Oracle Communications Unified Assurance is designed to monitor, discover, and manage a diverse ecosystem of network and communication devices from various vendors. This chapter provides guidance on enabling support for vendor-specific devices within Unified Assurance by leveraging SNMP object models, MIBs, and ACOM files.

About Supporting Sonus Devices

Sonus Session Border Controller (SBC) devices feature two primary types of ports:

You can monitor the availability of these two ports using two distinct SNMP objects, each with its own Object Identifier (OID). SNMP object sonusEthernetPortPacketPortStatusLinkState with OID .1.3.6.1.4.1.2879.2.10.4.1.1.5 provides the state of the Packet port and sonusEthernetPortMgmtPortStatusTable object with OID .1.3.6.1.4.1.2879.2.10.4.3.1.6 provides the state of the Management port. Both objects are available in the SONUS-PORT MIB.

Naming conventions, processors in use, and other metadata captured during device discovery and polling are defined in the sonus-ACOM.json file. You can access it in the Rules UI at the following location:

Core Rules (core)/Default read-write branch (default)/collection/metric/snmp/_objects/acom/sonus-ACOM.json

Unlike network interfaces discovered through IF-MIB, Sonus ports do not appear on the Network Details panel of Device Overview dashboards. Instead, you add them to the Graph database so that the Graph Sink microservice picks them up, and you can see them in Graph dashboards.

To add the vertex types and edge types along with the vertex constraints to the Graph database:

  1. On the Unified Assurance server with the Database.Graph role, switch to the assure1 user:

    su - assure1
    
  2. Open the command line interface for the Graph database by running the following command:

    a1neo4j
    
  3. Run the following cypher queries:

    OPTIONAL MATCH (n:VertexTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:VertexTypes {
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'SonusEthernetPacketPort',
      Icon: 'fugue/network-ethernet.png'
    })
    RETURN newNode;
    
    
    OPTIONAL MATCH (n:VertexTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:VertexTypes {
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'SonusEthernetMgmtPort',
      Icon: 'fugue/network-ethernet.png'
    })
    RETURN newNode;
    
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n._id)                          IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n._type)                        IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n.DeviceName)                   IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n.Name)                         IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n.TimestampModified)            IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n.ZoneID)                       IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE n._id                            IS UNIQUE;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetPacketPort) REQUIRE (n.Name, n.DeviceName, n.ZoneID) IS NODE KEY;
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetPacketPort) ON      (n._type);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetPacketPort) ON      (n.DeviceName, n.ZoneID);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetPacketPort) ON      (n.TimestampModified);
    
    
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n._id)                          IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n._type)                        IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n.DeviceName)                   IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n.Name)                         IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n.TimestampModified)            IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n.ZoneID)                       IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE n._id                            IS UNIQUE;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) REQUIRE (n.Name, n.DeviceName, n.ZoneID) IS NODE KEY;
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) ON      (n._type);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) ON      (n.DeviceName, n.ZoneID);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:SonusEthernetMgmtPort) ON      (n.TimestampModified);
    
    OPTIONAL MATCH (n:EdgeTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:EdgeTypes {
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'HasSonusEthernetPacketPort',
      LineStyle: 'Solid',
      Direction: 'Directed'
    })
    RETURN newNode;
    
    OPTIONAL MATCH (n:EdgeTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:EdgeTypes {
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'HasSonusEthernetMgmtPort',
      LineStyle: 'Solid',
      Direction: 'Directed'
    })
    RETURN newNode;
    
    
    
    CREATE CONSTRAINT  IF NOT EXISTS FOR ()-[n:HasSonusEthernetPacketPort]-() REQUIRE (n._id) IS NOT NULL;
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetPacketPort]-() ON (n._id);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetPacketPort]-() ON (n.Name);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetPacketPort]-() ON (n._source);
    
    CREATE CONSTRAINT IF NOT EXISTS FOR ()-[n:HasSonusEthernetMgmtPort]-() REQUIRE (n._id) IS NOT NULL;
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetMgmtPort]-() ON (n._id);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetMgmtPort]-() ON (n.Name);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasSonusEthernetMgmtPort]-() ON (n._source);
    
  4. Restart all the pods for the Graph Sink microservice by running the following command:

    a1k rollout restart deployment graph-sink -n <namespace>
    
  5. Validate if the Vertex Types and Edge Types have been created correctly from the Vertex Types and Edge Types UI.

    To open the Vertex Types and Edge Types UI, from the main navigation menu, select Configuration, then Graph, and then Vertex Types or Edge Types.

Note:

The default discovery process does not automatically construct connections between Sonus devices through Sonus ports. You need to write a custom rules file and add it to collection/topology/inventory in the Rules UI to make connections between the devices by creating a ConnectsLayer2 edge.

About Supporting Frequentis Devices

The availability status of hardware interfaces (HwInterfaces) on Frequentis devices is monitored using two SNMP objects from the FREQUENTIS-GENERIC-HARDWAREINFO-MIB. The administrative status is provided by the hwInterfaceStateAdmin object with OID 1.3.6.1.4.1.3043.6.3.2.2.10.1.5, while the operational status is provided by the hwInterfaceStateOper object with OID 1.3.6.1.4.1.3043.6.3.2.2.10.1.6.

The hardware interfaces for Frequentis devices can have non-unique names. For these devices, the SNMP Poller uses a set processor with three fields to generate the unique interface names that are stored in the Graph database in the following format: <hwInterfaceName> (<hwInterfaceId>/<hwInterfaceModuleId>)

For example, the device returns the following interface information:

{     "hwInterfaceId": 1,
      "hwInterfaceModuleId": 10,
      "hwInterfaceName": "Line Analog" 
}

In this case, the generated interface name would be Line Analog (1/10). For more information on the naming convention, processors in use, and other metadata captured during device discovery and polling, refer to the frequentis-ACOM.json file. You can access it in the Rules UI at the following location:

Core Rules (core)/Default read-only branch (RO_LOCKED)/collection/metric/snmp/_objects/acom/frequentis-1-ACOM.json

Unlike other interfaces, Frequentis hardware interfaces do not appear on the Network Details panel of Device Overview dashboards. You can see them in Graph dashboards.

Before initiating discovery and monitoring, you must add vertex types and edge types specific to the devices you want to monitor to the Graph database along with vertex constraints.

To add the vertex types and edge types along with the vertex constraints to the Graph database:

  1. On the Unified Assurance server with the Database.Graph role, switch to the assure1 user:

    su - assure1
    
  2. Open the command line interface for the Graph database by running the following command:

    a1neo4j
    
  3. Run the following cypher queries:

    OPTIONAL MATCH (n:VertexTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:VertexTypes {
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'HwInterface',
      Icon: 'fugue/network-ethernet.png'
    })
    RETURN newNode;
    
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n._id)                          IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n._type)                        IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n.DeviceName)                   IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n.Name)                         IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n.TimestampModified)            IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n.ZoneID)                       IS NOT NULL;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE n._id                            IS UNIQUE;
    CREATE CONSTRAINT  IF NOT EXISTS FOR (n:HwInterface) REQUIRE (n.Name, n.DeviceName, n.ZoneID) IS NODE KEY;
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:HwInterface) ON      (n._type);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:HwInterface) ON      (n.DeviceName, n.ZoneID);
    CREATE RANGE INDEX IF NOT EXISTS FOR (n:HwInterface) ON      (n.TimestampModified);
    
    OPTIONAL MATCH (n:EdgeTypes)
    WITH COALESCE(MAX(n.TypeID), 0) AS currentMax
    WITH (CASE WHEN currentMax < 999 THEN 999 ELSE currentMax END) + 1 AS nextID
    CREATE (newNode:META:EdgeTypes {    
      _id: randomUUID(),
      TypeID: nextID,
      Name: 'HasHwInterface',
      LineStyle: 'Solid',
      Direction: 'Directed'   
    })
    RETURN newNode; 
    
    CREATE CONSTRAINT  IF NOT EXISTS FOR ()-[n:HasHwInterface]-() REQUIRE (n._id) IS NOT NULL;
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasHwInterface]-() ON (n._id);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasHwInterface]-() ON (n.Name);
    CREATE RANGE INDEX IF NOT EXISTS FOR ()-[n:HasHwInterface]-() ON (n._source);   
    
  4. Restart all the pods for the Graph Sink microservice by running the following command:

    a1k rollout restart deployment graph-sink -n <namespace>
    
  5. Validate if the Vertex Types and Edge Types have been created correctly from the Vertex Types and Edge Types UI.

    To open the Vertex Types and Edge Types UI, from the main navigation menu, select Configuration, then Graph, and then Vertex Types or Edge Types.