OpenDaylight supports the NETCONF protocol as a northbound server as well as a southbound plugin. It also includes a set of test tools for simulating NETCONF devices and clients.


The following article explains how to communicate with netconfd-pro server from ODL over the NETCONF protocol.


The netconfd-pro 21.10-4 release and ODL karaf-0.8.4-Oxygen were used for the example.


Netconfd-pro and ODL Integration


The netconfd-pro server does not required any changes and settings to work with ODL or any other tool if the tool is following RFC correctly. The netconfd-pro fully compliant with NETCONF RFC and all standards that specify connection procedure. 


ODL connects to netconfd-pro through the NETCONF interface using the OpenDaylight southbound NETCONF Plugin. The ODL NETCONF Southbound Plugin supports both NETCONF 1.0 and 1.1 over SSH.


ODL requires the following configuration in order to communicate with a NETCONF device:

  • Device name: Any name that can identify the device that ODL connects to
  • IP address: IP address of the NETCONF server
  • Port: This is the NETCONF server’s port number
  • Username: Used for authentication
  • Password: The user password


Enter the Karaf shell in order to install features.

The following ODL features must be installed to support netconfd-pro connection with ODL:

  • odl-netconf-connector-all
  • odl-netconf-topology
  • odl-netconf-clustered-topology


The following ODL features must be installed to support yangcli-pro connection with ODL:

  • odl-netconf-console


The following ODL features must be installed to support RESTCONF connection with ODL:

  • odl-restconf


opendaylight-user@root>feature:install odl-netconf-connector-all
opendaylight-user@root>feature:install odl-netconf-clustered-topology
opendaylight-user@root>feature:install odl-netconf-topology
opendaylight-user@root>feature:install odl-netconf-console
opendaylight-user@root>feature:install odl-restconf

opendaylight-user@root>feature:list | grep netconf
odl-netconf-connector                                           │ 1.8.2            │          │ Started     │ odl-netconf-1.8.2                                               │ OpenDaylight :: Netconf Connector :: Netconf Conn



Configuring the Connector


For the sake of simplicity, we chose to use the Karaf shell our example. (Refer to: https://docs.opendaylight.org/projects/netconf/en/latest/user-guide.htm for more details on how to configure connector with help of RESTCONF northbound interface)


Before configuring the connector, we need to start ODL by running: $ODL_INSTALL_DIR/bin/karaf


The connector allows ODL to connect to a NETCONF device using the credentials, address, and port specified in the connector’s configuration file.


In Karaf shell terminal run the following command to verify that there is no any NETCONF devices already connected:


opendaylight-user@root>show-device -i 127.0.0.1 -p 830                                                                                                                                             
NETCONF ID | NETCONF IP | NETCONF Port | Status | Available Capabilities
------------------------------------------------------------------------


Now connect the netconfd-pro server to the ODL with help of the following command (the netconfd-pro server must be started already):


opendaylight-user@root>connect-device -p 830 -P your_password -U user -i 127.0.0.1 -id example-device
Netconf connector added succesfully


By executing above command ODL will try to connect to NETCONF device located at local-host at port 830 with provided user and password credentials.


There might be an issue on the first connect attempt since ODL does not send get-schema request for the modules that it founds in Hello message capabilities right away. Instead it sends GET request on /netconf-state and only after that ODL tries to resolve the capabilities.
In this case restart the netconfd-pro server to re-connect or wait until ODL tries another attempt to connect to the netconfd-pro server.
Or preload all the modules you want to use to $ODL_INSTALL_DIR/bin/karaf/cache/schemas


If nothing helps from the above try to use the following parameter (only on version 21.10 and later of the netconfd-pro server):
--remove-schema-aug-leafs



Then it will issue a get-schema to get all of the schema modules supported by the NETCONF device. This is how it will be able to mount the data tree and provide a northbound interface to the user.


In order to check if the connection was established successfully refer to the netconfd-pro server log. The log supposed to have records of connection and should not contain any errors that would indicate that connection failed.


Or run the following command from ODL, make sure that the status is "Connected":


opendaylight-user@root>show-device -i 127.0.0.1 -p 830
NETCONF ID                       | NETCONF IP | NETCONF Port | Status    | Available Capabilities                                                                                                   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
example-device     | 127.0.0.1  | 830          | Connected | urn:ietf:params:netconf:base:1.0                                                                                         
                                 |            |              |           | urn:ietf:params:netconf:capability:yang-library:1.0?revision=2016-06-21&module-set-id=4314                               
                                 |            |              |           | urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&also-supported=trim,explicit,report-all-tagged
                                 |            |              |           | urn:ietf:params:netconf:base:1.1                                                                                         
                                 |            |              |           | urn:ietf:params:netconf:capability:xpath:1.0                                                                             
                                 |            |              |           | urn:ietf:params:netconf:capability:partial-lock:1.0                                                                      
                                 |            |              |           | urn:ietf:params:netconf:capability:interleave:1.0                                                                        
                                 |            |              |           | urn:ietf:params:netconf:capability:rollback-on-error:1.0                                                                 
                                 |            |              |           | urn:ietf:params:netconf:capability:notification:1.0                                                                      
                                 |            |              |           | urn:yumaworks:params:xml:ns:netconf:config-id?id=1486062                                                                 
                                 |            |              |           | urn:ietf:params:netconf:capability:writable-running:1.0                                                                  
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-restconf?revision=2017-01-26)ietf-restconf                                             
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-getbulk?revision=2021-08-07)yumaworks-getbulk                                         
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-app-common?revision=2021-08-24)yumaworks-app-common                                   
                                 |            |              |           | (http://create-only-leaf)create-only-leaf                                                                                
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-event-stream?revision=2021-05-15)yumaworks-event-stream                               
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:yumaworks-restconf?revision=2017-07-03)yumaworks-restconf                                   
                                 |            |              |           | (urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf                                                
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-ids?revision=2014-07-12)yumaworks-ids                                                 
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-types?revision=2021-05-15)yumaworks-types                                             
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-netconf-acm?revision=2018-02-14)ietf-netconf-acm                                       
                                 |            |              |           | (http://netconfcentral.org/ns/yuma-app-common?revision=2017-07-25)yuma-app-common                                        
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-extensions?revision=2021-12-14)yumaworks-extensions                                   
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-yang-patch?revision=2017-02-22)ietf-yang-patch                                         
                                 |            |              |           | (urn:ietf:params:xml:ns:netmod:notification?revision=2008-07-14)nc-notifications                                         
                                 |            |              |           | (http://netconfcentral.org/ns/yuma-types?revision=2019-11-29)yuma-types                                                  
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults?revision=2011-06-01)ietf-netconf-with-defaults                   
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-term-msg?revision=2019-05-05)yumaworks-term-msg                                       
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring                         
                                 |            |              |           | (urn:ietf:params:xml:ns:netconf:partial-lock:1.0?revision=2009-10-19)ietf-netconf-partial-lock                           
                                 |            |              |           | (urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2013-03-15)notifications                                       
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring?revision=2017-01-26)ietf-restconf-monitoring                       
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types                                         
                                 |            |              |           | (urn:ietf:params:xml:ns:yang:ietf-yang-library?revision=2016-06-21)ietf-yang-library                                     
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-event-filter?revision=2014-02-09)yumaworks-event-filter                               
                                 |            |              |           | (http://yumaworks.com/ns/yumaworks-system?revision=2022-01-27)yumaworks-system                                           
                                 |            |              |           | (http://netconfcentral.org/ns/yuma-system?revision=2013-07-15)yuma-system                                                

Or alternatively you may send yangcli-pro GET request on /network-topology node to identify that the netconfd-pro server was connected and what capability were loaded:


user@yw-user:~$ yangcli-pro server=localhost user=admin password=admin ncport=2830
user@localhost> sget /network-topology
... 

nc:rpc-reply {
  data {
    nt:network-topology {
      topology  topology-netconf {
        topology-id topology-netconf
        node  example-device {
          node-id example-device
          nettop:available-capabilities {
            available-capability {
              capability urn:ietf:params:netconf:base:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:yang-library:1.0?revision=2016-06-21&module-set-id=4314
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=report-all&also-supported=trim,explicit,report-all-tagged
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:base:1.1
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:xpath:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:partial-lock:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:interleave:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:rollback-on-error:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:notification:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability urn:yumaworks:params:xml:ns:netconf:config-id?id=1486062
              capability-origin device-advertised
            }
            available-capability {
              capability urn:ietf:params:netconf:capability:writable-running:1.0
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-restconf?revision=2017-01-26)ietf-restconf
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-getbulk?revision=2021-08-07)yumaworks-getbulk
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-app-common?revision=2021-08-24)yumaworks-app-common
              capability-origin device-advertised
            }
            available-capability {
              capability (http://create-only-leaf)create-only-leaf
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-event-stream?revision=2021-05-15)yumaworks-event-stream
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:yumaworks-restconf?revision=2017-07-03)yumaworks-restconf
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:netconf:base:1.0?revision=2011-06-01)ietf-netconf
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-ids?revision=2014-07-12)yumaworks-ids
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-types?revision=2021-05-15)yumaworks-types
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-netconf-acm?revision=2018-02-14)ietf-netconf-acm
              capability-origin device-advertised
            }
            available-capability {
              capability (http://netconfcentral.org/ns/yuma-app-common?revision=2017-07-25)yuma-app-common
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-extensions?revision=2021-12-14)yumaworks-extensions
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-yang-patch?revision=2017-02-22)ietf-yang-patch
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:netmod:notification?revision=2008-07-14)nc-notifications
              capability-origin device-advertised
            }
            available-capability {
              capability (http://netconfcentral.org/ns/yuma-types?revision=2019-11-29)yuma-types
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults?revision=2011-06-01)ietf-netconf-with-defaults
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-term-msg?revision=2019-05-05)yumaworks-term-msg
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?revision=2010-10-04)ietf-netconf-monitoring
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:netconf:partial-lock:1.0?revision=2009-10-19)ietf-netconf-partial-lock
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:netconf:notification:1.0?revision=2013-03-15)notifications
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring?revision=2017-01-26)ietf-restconf-monitoring
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types
              capability-origin device-advertised
            }
            available-capability {
              capability (urn:ietf:params:xml:ns:yang:ietf-yang-library?revision=2016-06-21)ietf-yang-library
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-event-filter?revision=2014-02-09)yumaworks-event-filter
              capability-origin device-advertised
            }
            available-capability {
              capability (http://yumaworks.com/ns/yumaworks-system?revision=2022-01-27)yumaworks-system
              capability-origin device-advertised
            }
            available-capability {
              capability (http://netconfcentral.org/ns/yuma-system?revision=2013-07-15)yuma-system
              capability-origin device-advertised
            }
          }
          nettop:clustered-connection-status {
            netconf-master-node akka.tcp://opendaylight-cluster-data@127.0.0.1:2550
          }
          nettop:connection-status connected
          nettop:host 127.0.0.1
          nettop:port 830
          nettop:unavailable-capabilities {
          }
        }
      }
    }
  }
}

..



Netconfd-pro configurations


The netconfd-pro server does not required any changes and settings to work with ODL or any other tool if the tool is following the RFC correctly.

The netconfd-pro fully compliant with NETCONF RFC and all standards that specify connection procedure.


Once ODL is able to connect to the device by establishing a NETCONF session. ODL can start configuring the device.