共计 3107 个字符,预计需要花费 8 分钟才能阅读完成。
最近对 onos 进行了二次开发,次要实现了 Juniper 路由器的 driver 开发。在 Driver 中利用 NETCONF 协定读取并批改路由器配置、生成 NETCONF 命令、并下发到路由器是 Driver 开发的重要局部。开发过程中,咱们研读了 onos 里 NETCONF 相干的代码,理解设施是如何进行连贯,session 是如何创立,命令是如何发送的。在这里分享给大家。
一、后期筹备
要进行设施的连贯,有两个很重要的前提。一个是物理设施能够被 onos 控制器所辨认。第二个是该设施对应的驱动曾经在控制器中加载。只有这两个前提条件被满足,onos 能力与设施进行连贯,从而下发管制命令。
对于驱动是如何加载的剖析,咱们将会在后续的文章中进行介绍。
二、设施连贯的建设
进入正题,当控制器要对具体的设施进行管制时,第一步要做的就是与该设施进行连贯。
首先进入的是 org.onosproject.net.device.impl.DeviceManager 的 deviceConnected 办法。
1、依据设施所属的 BasicDeviceConfig 取得设施的根本配置。
2、依据传进来的 deviceDescription 和取得的配置信息从新更新 deviceDescription 并且创立 role(master、none、standby 等)
3、调用 applyRole(deviceId,role) 将设施与 role 绑定。须要留神的是,当调用完这个办法之后就曾经创立了 onos 与设施的连贯,并将创立的 session 保存起来,不便当前调用(具体的实现请往下看)。
4、将 device 的信息存入 store 中。
走到这一步,onos 就实现了与设施的连贯,当须要对设施发送命令时,只有找到对应的 session 就能够进行发送了。
从下面的剖析咱们晓得 applyRole 是一个很重要的办法。接下来咱们就剖析一下 applyRole 是如何实现上述的性能。
从下面的源码中咱们看到,在 applyRole 函数中最要害的就是调用了 DeviceProvider 的 roleChanged(deviceId,newRole) 函数。因为 DeviceProvider 是一个接口,它具体实现的类是 NetconfDeviceProvider,对应的函数是 Rolechanged。
能够看出,在 roleChanged 函数中,依据 role 的类型进行不同的解决。特地留神的是,当 role 显示为 master 时,通过 initiateConnection 函数调用 NetconfControllerImpl 类的 connectDevice(deviceId) 办法,实现 NetconfDeviceInfo 和 NetconfDevice 的创立。并实现与设施的连贯。
上面是 NetconfControllerImpl 类中 connectDevice(deviceId) 函数的具体代码:
首先通过 deviceId 从 deviceService 中取得 username、password 等信息。而后依据失去的用户信息以及之前存储的设施信息生成 NetconfDeviceInfo。再依据生成的 NetconfDeviceInfo,最初通过 createDevice 函数调用 deviceFactory 的 createNetconfDevice 办法生成 NetconfDevice,同时与该设施进行连贯。
createNetconfDevice 办法的具体实现在 NetconfControllerImpl 类中。在该办法中他调用了 DefaultNetconfDevice 的构造函数,创立了 NetconfDevice。从下图构造函数代码中,咱们能够看见,零碎在创立 NetconfDevice 的同时,也创立了 netconfSession,并将 www.sangpi.com 作为 netconfSession 作为 Device 的一个属性保存起来。当用户须要与某设施进行交互时,只须要找到对应的 Device 对象,就能取得与该设施进行交互的 session。
【留神】以下就是 onos 与 device 进行连贯的具体代码。
与 DeviceFactory 一样,SessionFactory 的 createNetconfSession 函数,也是调用了 NetconfSessionImpl 的构造函数,进行 netconfSession 的创立。
与设施进行连贯的操作是通过 NetconfSessionImpl 类 startConnection 函数实现的。
1、依据 deviceInfo 的 ip 和 port 的信息构建 connection。
2、调用 connect 函数游戏进行是否连贯
3、依据 deviceinfo 中的 username 等信息,看用户是否被受权。
4、如果用户被受权则调用 startSshSession
在 startSshSession 中,创立 Stream 线程为当前的交换提供服务。同时向设施发送 hello 的 NETCONF 命令,实现两个设施间所反对性能的同步,为当前应用 NETCONF 命令进行交换打下基础。
至此 onos 就实现了与设施的连贯,并将创立的 session 保留在 netconfController 中。在下一节中咱们将介绍如何应用创立的 session 进行命令的发送。
三、NETCONF 命令的发送
当控制器与设施建设好连贯当前,咱们就能够通过控制器想设施发送命令了。
本文以 onos 中的 device-configuration 命令为例,解说 netconf 命令是如何下发,同时控制器是如何取得路由器返回信息的。
3.1 NETCONF 命令发送
当用户在 onos 的终端输出 device-configuration 命令当前,就进入了 org.onosproject.cli.net.DeviceConfigGetterCommand 中。
零碎依据具体的配置文件,找到 ConfigGetter 接口的具体实习类——NetconfConfigGetter。
在上一节咱们介绍过,在 NetconfControllerImpl 的 createDevice 函数中,零碎将生成的 Device 放入到了 DevicesMap 中,不便日后应用。
所有当须要发送命令的时候,零碎先从 NetconfController 里的 DevicesMap 中取得对应的 Device,而后依据失去的 Device 找到对应的 NetconfSession。
在取得 session 当前,依据用户传入的信息构建对应的 NETCONF 命令。并通过 NetconfSessionImpl 中的 sendRequest 函数将命令发送给设施。
在 sendRequest 中,先对传入的 request 格局进行查看,确保合乎 NETCONF 命令的标准。
确保 request 符合规范当前,应用 request 函数将 request 发送给设施。同时返回 CompletableFuture futureReply。futureReply 次要是用来读取设施返回的信息。如果设施无奈在规定的工夫内返回信息,则零碎会抛出异样。
上面让咱们看一下 onos 是如何发送信息的。
进入到 NetconfSessionImpl 的 request 函数:
3.2 设施返回信息读取
当 NetconfStreamThread 对象中的 run 函数承受到设施返回的信息当前,会对信息进行解析生成事件,发送给监听器,并将信息传播给 CompletableFuture。
此时在主线程的 sendRequest 函数中,通过调用 CompletableFuture 的 get 办法取得返回信息。
至此,NETCONF 命令的下发和信息的返回过程就完结了。
不晓得我有没有讲清楚,欢送大家拍砖探讨。