../../_images/openl2m_logo.png

Implementing New Drivers

Book Keeping

All drivers need to implement various interfaces, as described below and in the Connector() class. <connector>

Additionally, in order for the web interface to show these changes (if succesful), drivers need to call “bookkeeping” calls in the base Connector() class.

If you inherit directly from Connector(), you can call these with super().set_xyz()

If you have multiple inheritance in in your driver (DriverB, inherits from DriversA which inherits from Connector()), you should use the notation Connector.set_xyz(self=self, <other params>)

Supporting a new vendor device - SNMP

Create Vendor Sub-directory

In openl2m/switches/connect/snmp/, create a vendor sub-directory.

In this folder you need a __init__.py (copy from somewhere else :-)), and a minimum file called connector.py, and likely constants.py

In connector.py, create your new driver class that inherits from the SnmpConnector() class. Call the class SnmpConnector*VendorName*

Override whatever function are needed (see the samples in vendor/cisco, vendor/procurve and vendor/comware)

Use The New Driver Class*

Driver classes are loaded from openl2m/switches/connect/connect.py

  • Include your driver to connect.py around line 40. E.g.:

from switches.connect.snmp.vendors.procurve.constants import *
from switches.connect.snmp.vendors.procurve.snmp import SnmpConnectorProcurve
  • Now reference your drive in the get_connection_object() function around line 90, add code to call the new vendor class when that vendor is detected. E.g.:

if enterprise == ENTERPRISE_ID_HP:
  return SnmpConnectorProcurve(request, group, switch)

Supporting a new vendor device - Custom

You can also extend OpenL2M for vendors that support their own API’s, such as REST. An example of this Aruba AOS-CX devices. To add a customer driver, follow these steps:

Add Connector Type

in /openl2m/switches/constants, add lines similar to the following to the connector type definition:

CONNECTOR_TYPE_AOSCX = 2
CONNECTOR_TYPE_CHOICES = [
    ..
    [CONNECTOR_TYPE_AOSCX, 'Aruba AOS-CX'],
]

After this, you will need to create a new Django “migration” to handle this data field update:

python3 manage.py makemigrations

Create the Custom Driver

In openl2m/switches/connect/, create a sub-directory representing your connector type. Eg. “aruba_aoscx”. Use all lower case, and underscores only.

In this folder you need a __init__.py (copy from somewhere else :-)), and a minimum file called connector.py, and likely constants.py

In connector.py, create your new driver class that inherits from the base Connector() class. Call the class YourTypeName*Connector(). Eg. AosCxConnector()

Implement the functions needed to support this device class. At a minimum, you need to create

def get_my_basic_info(self) to load interfaces, etc.

Optionally, def get_my_client_data(self) is needed if you want to provide ethernet and lldp neighbor data.

Call the Customer Driver

Driver classes are loaded from openl2m/switches/connect/connect.py

  • Include your driver to connect.py around line 40. E.g.:

from switches.connect.aruba_aoscx.constants import *
from switches.connect.aruba_aoscx.connector import AosCxConnector
  • Now reference your drive in the get_connection_object() function around line 110:

elif switch.connector_type == CONNECTOR_TYPE_ARUBA_AOSCX:
  connection = AosCxConnector(request, group, switch)

Validate New Devices Using This Driver

You may need to edit the clean() function of the Switch(models.Model) class in switches/models.py to facilitate checking for the right settings. E.g. an API driver will need a credential profile.

Customizing the Information Tab

In your vendor implementation, you can add custom data to the Information tab by implementing the _get_vendor_data() method in your class. Collect your data, then call “add_vendor_data(category_name, item_name, item_value)” to add data. You can read whatever specific MIB counters you like, or any other data you can get your hands on via e.g. SSH/Netmiko

Here is a hard-coded example. See snmp/procurve and snmp/comware for additional examples:

def _get_vendor_data(self):
    """
    Implement vendor-specific data, add whatever you want here.
    This shows in the "Information" tab
    """
    self.add_vendor_data('Cat 1', 'Item 1', "some data")
    self.add_vendor_data('Cat 1', 'CPU Temp', "75.4 C")
    self.add_vendor_data('Cat 1', 'Fan Speed', "1400rpm")
    self.add_vendor_data('Memory Stats', 'Item 1', "some data")
    self.add_vendor_data('Memory Stats', 'CPU Temp', "75.4 C")
    self.add_vendor_data('Memory Stats', 'Fan Speed', "1400rpm")

Customizing SSH/CLI commands

If your device needs to change how CLI commands are run (ie. not use standard SSH), your driver needs to implement (override) the Connector()._execute_command() function.

See more at implementing SSH.