看看有趣的ONOS Ⅱ:NETCONF

说明:翻译自NETCONF,学习自用

目录

  • 目录
  • 贡献者
  • 总览
  • 接口和类
  • 支持的NETCONF操作
  • 设备发现
  • 将您自己的设备连接到ONOS
  • 超时时间
  • SSH客户端
  • 示例:获取和设置控制器。
  • 示例:测试基础结构
  • 故障管理
  • 未来的工作

贡献者

名称 组织 角色 电子邮件
Andrea Campanella ONF Developer [email protected]
吴海伦 Developer

总览

本节概述了ONOS中NETCONF协议​​的实现。

接口和类

  • NetconfController.java实现自NetconfControllerImpl.java:跟踪所有NETCONF设备,用作连接和获取设备的一站式服务,并取消或注册设备事件的侦听器。

  • NetconfDevice.java实现自NetconfDeviceImpl.java:表示一个具有NETCONF功能的设备,该设备使用自己的NetconfSession连接到ONOS核心,并将其信息保存在NetconfDeviceInfo实例中

  • NetconfSession.java:与NETCONF设备的每种传输连接都必须实现的接口,表示该设备上任何操作的single access point。一个例子是NetconfSessionImpl:使用SSH2连接和会话与物理NETCONF设备交换信息并执行诸如get/set-config的操作。可以在此处启动启动设备通知订阅的功能。

  • NetconfSessionDelegate.java:由NetconfSessionImpl中的NetconfSessionDelegateImpl实现的delegate(委托)接口。服务于完成线程返回的future的目的,以便会话可以将特定请求的正确回复返回给调用方,从而有效地阻止了对Future的请求调用。

  • NetconfDeviceProvider.java:管理任何NETCONF设备角色以及与ONOS core的所有交互。提供者负责定期检查NETCONF设备可用性的变化,这在checkAndUpdateDevices()中进行。

  • NetconfDeviceListener.java实现自NetconfDeviceProvider中的InnerNetconfDeviceListener.java:通知ONOS核心中的提供商NETCONF设备已连接/断开。

  • NetconfDeviceOutputEvent.java代表设备会话流中的输出事件,它可以是回复、通知、网络注销、error。

  • NetconfDeviceOutputEventListenerImpl.java实现自NetconfDeviceOutputEventListener.java:从设备流中接收通知的侦听器的接口和实现:答复、通知、断开连接和error。NetconfSession具有将它们设置为基础流处理程序类的方法,例如NetconfStreamThread。

  • NetconfDeviceInfo.java:包含NETCONF设备的ip,端口,协议,用户名,密码和DeviceId;它用于交换有关设备的信息,而不必传递设备实例本身。

  • NetconfAlarmProvider.java:管理从设备捕获相关的通知,并基于这些通知创建和警报警报的core。

  • NetconfAlarmTranslator.java:使用来自通知消息的信息,将NETCONF通知的一般情况转换为Alarm.java定义的警报。

  • NetconfException.java表示NETCONF协议​​实现中发生的异常。

通过实现NetconfDeviceOutputEventListener.java并将listener添加到任何需要获取设备通知的会话中,这些会话都可以侦听由设备侦听器实现拾取的设备生成的消息,该消息位于StreamHandler实现(现在为NetconfStreamThread.java)的通知侦听器集中。

支持的NETCONF操作

  • sendHello,发送打开问候消息,以交换设备功能
  • get,请求来自指定配置的信息
  • getConfig,获取指定的配置
  • editConfig,编辑指定的配置
  • copyConfig,复制指定的配置
  • deleteConfig,删除指定的配置(除外)
  • lock,锁定指定的配置
  • unlock,解锁指定的配置
  • startSubscription,以交错方式启动对指定设备的所有通知的订阅
  • endSubscription,终止对指定设备的通知的订阅-使现有SSH会话保持活动状态
  • closeSession/killSession,关闭/杀死SSH会话

有关NETCONF操作的更多背景,请参考此参考源中的NETCONF协议​​操作。

设备发现

当前,ONOS通过使用网络配置服务JSON文件来了解NETCONF设备,该文件代表设备的配置并提供有关设备的信息。如果您没有签出源代码,或者${ONOS_ROOT}/tools/test/configs/netconf-cfg.json中的ONOS源代码中没有提供源代码,请在GitHub上提供此类文件的示例。推送时,此JSON文件会通知ONOS这些设备的存在,但是在设备提供程序NetconfDeviceProvider中会确认其可访问性和可用性。有关设备子系统的更多信息,请参阅设备子系统Wiki页面。将JSON文件中的NETCONF设备推送到ONOS时,将在默认可用性设置为false的情况下创建设备,表示无法使用该设备。不久之后(将设备配置推送到ONOS后大约3秒),然后每隔30秒检查一次配置中所有设备的可访问性,并根据收集的信息将设备标记为在线(可用= true),标记为离线(available = false)或可用性状态保持不变。

将您自己的设备连接到ONOS

如果您拥有使用NETCONF协议​​的设备,请遵循本节。否则,如果您想通过测试VM尝试ONOS NETCONF实施,请转到示例部分。

一旦您的设备在某个IP地址和某个端口上运行,为了使ONOS能够看到它,您应该遵循以下步骤。

  • 启动ONOS

  • 激活netconf应用程序:

    onos> app activate org.onosproject.netconf
    
  • 如果您为设备编写了自己的驱动程序,请激活该特定驱动程序(即):

    onos> app activate org.onosproject.drivers.fujitsu
    
  • 在json文件中为ONOS提供信息以连接到设备以及为您的设备使用哪个驱动程序。您需要指定用户名,密码,IP和端口。如果您编写了也必须从标准“ netconf”更改的特定驱动程序。

    {
        "devices": {
            "netconf::": {
                "netconf": {
                    "ip": "",
                    "port": ,
                    "username": "",
                    "password": ""
                },
                "basic": {
                    "driver": ""
                }
            }
        }
    }
    

    如果您有源代码,可以在GitHub这里上或$ONOS_ROOT/tools/test/configs/netconf-cfg.json中找到一个有效的示例。更改顶部的DeviceId和devices阵列中的IP。 NETCONF上的默认端口号是830,因此,除非您对此进行了任何更改,否则请保持原样。也可以通过SSH密钥访问设备。只需在json文件中将sshkey:指定为键,值对即可。

    您还可以在基本设备配置信息中添加除驱动程序以外的其他信息:“ type”:“ ”,“ manufacturer”:“ ”,“ hwVersion”:“ “,” swVersion“:” “。 如果您在基本配置中未指定任何驱动程序名称,则ONOS将分配默认名称。作为与OpenFlow设备密切相关的默认选项。建议始终使用您的驱动程序名称或“netconf”指定驱动程序名称。

  • 将您刚刚编写的配置上传到您正在运行的ONOS实例,在本例中为localhost:

    ~$ curl -X POST -H "content-type:application/json" http://localhost:8181/onos/v1/network/configuration -d @ --user onos:rocks
    

    或者

    ~$ onos-netcfg localhost 
    
  • 检查设备是否存在于ONOS中:

    onos> devices
    

    应该返回,以及其他设备,例如:

    onos> id=netconf:10.1.9.24:830, available=true, role=MASTER, type=SWITCH, mfr=unknown, hw=unknown, sw=unknown, serial=unknown, ipaddress=10.1.9.24, driver=ovs-netconf, name=netconf:10.1.9.24:830
    

    如果设备不存在,则可能是该设备并出现错误,您必须检查日志。

    • 对于本地主机日志

      ~$ tl
      

      或对于远程日志

      ~$ ol 
      
    • 验证日志中是否不包含与NETCONF相关的异常,并且不会出现此警告:

      WARN  | event-dispatch-0 | ListenerRegistry <.....> org.onosproject.netconf.NetconfException: Can't connect to NETCONF device on 10.1.9.24:830
      

      如果存在日志,则意味着设备无法在给定的IP和端口上进行回复。在您发布的Json文件中验证Ip和Port,然后重试。如果存在其他任何异常(例如没有设备名称),请阅读日志并做出相应的反应。

  • 一旦设备出现在ONOS中,您就可以与其进行交互。

超时时间

NETCONF控制器具有3个超时参数,这些参数控制基础SSH客户端如何连接到远程NETCONF设备。

  • 连接超时—SSH连接协议完成所允许的时间长度(以秒为单位)—默认为5秒

  • 回复超时—回复NETCONF命令所允许的时间长度(以秒为单位)—默认为5秒

  • 空闲超时—如果未检测到流量,SSH连接自动关闭后的时间长度(以秒为单位)—默认为300秒

    这3个参数可以通过配置服务在系统范围内更改,也可以通过网络配置服务在每个NETCONF设备上更改。

    可以通过ONOS CLI进行系统范围的调整,“cfg get”显示值,“cfg set”更改值:

    onos> cfg get org.onosproject.netconf.ctl.impl.NetconfControllerImpl
    org.onosproject.netconf.ctl.impl.NetconfControllerImpl
    name=sshLibrary, type=string, value=apache-mina, defaultValue=apache-mina, description=Ssh Library instead of apache_mina (i.e. ethz-ssh2
    name=netconfIdleTimeout, type=integer, value=300, defaultValue=300, description=Time (in seconds) SSH session will close if no traffic seen
    name=netconfConnectTimeout, type=integer, value=5, defaultValue=5, description=Time (in seconds) to wait for a NETCONF connect.
    name=netconfReplyTimeout, type=integer, value=5, defaultValue=5, description=Time (in seconds) waiting for a NetConf reply
    onos>
    

可通过网络配置服务来设置各个设备的值。在“netconf”分组下,可以选择以任何顺序添加以下附加属性

  • connect-timeout”:

  • reply-timeout”:

  • idle-timeout”:

    如果某个设备存在单个设备设置,则它们将优先于该设备的系统范围设置。在创建NETCONF会话时,将考虑值并在此之后更改它们不会对该会话产生影响。但是,如果会话已关闭,而新会话已打开,则将考虑任何新值。

    例如

    "devices": {
       : {
       "netconf": {
             "username": ,
             "password": ,
             "ip": ,
             "port": ,
             "connect-timeout": 20,
             "reply-timeout": 25
       },
    

SSH客户端

ONOS上有两个用于NETCONF连接的不同的SSH客户端库—Apache Mina SSH客户端和Ganymede SSH客户端—Apache Mina是默认库。

同样,客户端库可以设置为系统范围的或每个设备单独设置的。要通过设备配置每个设备,请通过网络配置服务配置以下设备。

  • "ssh-client": ethz-ssh2" or "apache-mina">

示例:获取和设置控制器。

NETCONF基础结构用法的一个示例是在设备上获取和设置控制器。这些操作在ONOS Behavior(在我们的示例中为NetconfControllerConfig.java)中定义,该Behavior实现ControllerConfig的常规行为。要在设备上执行Behavior操作,您需要NetconfController,可以通过DriverHandler获得。 NetconfController实例现在使您可以访问所有设备或单个设备。一旦有了基于deviceId的感兴趣的设备,就可以获取NetconfSession对象与该设备通信并在物理设备上进行操作,例如在get controllers方法中获取配置或为该对象setControllers设置预构建的新对象。XmlConfigParser.java提供了一种从设备的XML响应中提取所需信息的方法,以及另一种生成正确的XML以在特定设备上设置一个或多个控制器的方法。

您可以在NetconfControllerConfig.java类中查看get和set控制器操作的实际实现。对于可以实现的其他操作的示例,OVSDB基础结构提供了一个很好的起点。

要调用getControllers和setControllers方法,您需要获取ControllerConfig Behavior,然后在此实例上调用这些方法。例如,在两个命令行界面命令中提供的DeviceControllersCommand.javaDeviceSetControllersCommand.java中实现了set和get命令。

onos> device-controllers
onos> device-setcontrollers

示例:测试基础结构

要在本地(不是在真正的交换机上)测试NETCONF实现,您需要安装了of-config的Mininet计算机(链接到mininet计算机)。

虚拟机 描述 注释
onos-ofconfig-mininet.ova 安装了配置的Mininet机器 用户名/密码:mininet / mininet

of-config是openvswitch实例的包装程序,该实例使用NETCONF协议​​并将其转换为OVSDB以使用该数据库实现。

基础架构设置:

  • 使用Virtual-Box下安装的of-config启动Mininet机器

  • [可选]如果您正在本地主机(127.0.0.1)之外运行一个ONOS实例,请使用set controller命令设置一个控制器。例如,您的ONOS实例将具有不同的IP。

    mininet-vm:~$ sudo ovs-vsctl set-controller ofc-bridge tcp:10.128.12.1:6653
    
  • [可选]如果您正在运行多个外部ONOS实例,

    mininet-vm:~$ sudo ovs-vsctl set-controller ofc-bridge tcp:10.128.12.1:6653 tcp:10.128.12.2:6653 tcp: 10.128.12.3:6653
    
  • 在Mininet计算机中启动ofc服务器

    mininet-vm:~$ sudo ofc-server -v 3 -f
    
  • 启动ONOS

  • 激活netconf应用程序:

    onos> app activate org.onosproject.netconf
    
  • 激活netconf驱动程序:

    onos> app activate org.onosproject.drivers.netconf
    
  • 在$ONOS_ROOT/tools/test/configs/netconf-cfg.json文件中为ONOS提供连接设备的信息以及要使用的驱动程序。更改顶部的DeviceId和devices阵列中的IP。NETCONF上的默认端口号是830,因此,除非您对此进行了任何更改,否则请保持原样。

  • 将刚修改的配置上传到您正在运行的ONOS实例,在本例中为localhost:

    ~$ curl -X POST -H "content-type:application/json" http://localhost:8181/onos/v1/network/configuration -d @$ONOS_ROOT/tools/test/configs/netconf-cfg.json --user onos:rocks
    

    或者

    ~$ onos-netcfg localhost $ONOS_ROOT/tools/test/configs/netconf-cfg.json
    
  • 打开onos日志
    对于本地主机日志

    ~$ tl
    

    或对于远程日志

    ~$ ol
    
  • 验证日志中是否不包含与NETCONF相关的异常,并且不会出现此警告:

    | WARN | event-dispatch-0 | NetconfDeviceProvider | 186 - org.onosproject.onos-netconf-provider-device - 1.4.0.SNAPSHOT | Can't connect to NETCONF device on :
    

    如果预设了日志,则意味着设备无法在给定的IP和端口上进行回复。在您发布的Json文件中验证Ip和Port,然后重试。如果存在其他任何异常(例如没有设备名称),请阅读日志并做出相应的反应。

  • 调用命令或运行您编写的应用程序。例如:

    onos> device-controllers netconf:@10.1.9.24:830
    

故障管理

如果使用createSubscription启动对设备的订阅,则ONOS将从NETCONF设备接收 XML消息。NetconfAlarmProviderNetconfAlarmTranslator将这些通知消息转换为警报(如Alarm.java中所定义),并向核心通知新警报。有关故障管理的更多信息,请参考NETCONF故障管理。

未来的工作

有很多改进和测试的空间,这只是基础架构的基本框架。改进应该集中在提取NetconfSessionImpl方法中已编码的XML并测试每个操作。将来,可以通过YANG模型生成XML,因此它可以特定于我们要连接的每种类型的设备。

你可能感兴趣的:(看看有趣的ONOS Ⅱ:NETCONF)