说明:翻译自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.java和DeviceSetControllersCommand.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消息。NetconfAlarmProvider和NetconfAlarmTranslator将这些通知消息转换为警报(如Alarm.java中所定义),并向核心通知新警报。有关故障管理的更多信息,请参考NETCONF故障管理。
未来的工作
有很多改进和测试的空间,这只是基础架构的基本框架。改进应该集中在提取NetconfSessionImpl方法中已编码的XML并测试每个操作。将来,可以通过YANG模型生成XML,因此它可以特定于我们要连接的每种类型的设备。