看看有趣的ONOS Ⅱ:NETCONF

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

目录

贡献者

名称 组织 角色 电子邮件
Andrea Campanella ONF Developer andrea@opennetworking.us
吴海伦 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,删除指定的配置(<running/>除外)
  • 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:<ip>:<port>": {
                "netconf": {
                    "ip": "<ip>",
                    "port": <port>,
                    "username": "<username>",
                    "password": "<password>"
                },
                "basic": {
                    "driver": "<driver-name>"
                }
            }
        }
    }
    

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

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

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

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

    或者

    <your_machine>~$ onos-netcfg localhost <path_to_your_json_configuration_file>
    
  • 检查设备是否存在于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
    

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

    • 对于本地主机日志

      <your_machine>~$ tl
      

      或对于远程日志

      <your_machine>~$ ol <IP Address with ONOS instance>
      
    • 验证日志中是否不包含与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”:<int — 小于1的值将被忽略>

  • reply-timeout”:<int — 小于1的值将被忽略>

  • idle-timeout”:<int — 小于1的值将被忽略>

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

    例如

    "devices": {
       <device-id>: {
       "netconf": {
             "username": <user>,
             "password": <pw>,
             "ip": <ip>,
             "port": <port>,
             "connect-timeout": 20,
             "reply-timeout": 25
       },
    

SSH客户端

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

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

  • "ssh-client": <value - either "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:

    <your_machine>~$ 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
    

    或者

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

    <your_machine>~$ tl
    

    或对于远程日志

    <your_machine>~$ 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>:<port>
    

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

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

    onos> device-controllers netconf:@10.1.9.24:830
    

故障管理

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

未来的工作

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342