ODL Netconf MountPoint及其集群模式实现

作者简介:陈卓文,国内某游戏公司私有云团队开发者,主要从事SDN/NFV开发。

本文实现分析基于ODL Netconf版本1.4.2;
读者约定:了解netconf协议;熟悉ODL Netconf一些基本实现,比如怎样与底层设备建立连接,怎么向底层发起RPC请求;了解ODL集群Singleton Service的实现;

背景

在实现ODL Netconf北向应用层应用情境下,我们调用底层 ODL Netconf 向底层已连接设备发起RPC请求(标准、自定义扩展)都是通过从OSGi中获取一个DOMMountPointService对象,然后获取DOMRpcService对象,再调用其invokeRpc方法向底层发起请求。

那么DOMMountPointService对象是怎样来的,其怎么会包含设备的DOMRpcService对象,为什么调用DOMRpcService.invokeRpc就可以向底层发起请求?更深入的,如果我们使用ODL集群,又会有什么改变,其底层怎么适配及实现?

带着这些问题我们深入源码!

Netconf与MountPoint

Mount定义

一些定义官方:

  • mount是一个逻辑嵌套的MD-SAL实例,可能使用一组单独的YANG模型; a Mount is a logically-nested MD-SAL instance, which may be using a separate set of YANG models;
  • mount支持自己的RPC和Notifications,它允许在网络范围的上下文中重用设备模型和上下文,而无需重新定义控制器中的设备模型;
  • 远程概念数据存储的逻辑挂载点mount。“Mount”, as its name suggests, is basically a logical mount of a remote conceptual data store

Netconf与Mount千丝万缕的关联

当我们将node写入到topology-netconf yang时候,底层Netconf就会进行一系列操作,主动与底层device连接(netconf协议),最终与底层device建立起connection。

我们在rpc调用底层netopeer是通过DOMMoutpoint对象中DOMRpcService对象实现。那么DOMMoutpoint/DOMRpcService与Netconf底层建立连接过程必然存在关系,究竟真相是什么?

MountInstance的创建
当node写入到topology-netconf yang时候,底层NetconfTopologyImpl会监听变化,创建相关对象,并主动发起连接。

在这个过程中,调用了NetconfTopologyImpl.createSalFacade方法,实例化了NetconfDeviceSalFacade对象。

而实例化NetconfDeviceSalFacade对象,又会实例化NetconfDeviceSalProvider。最终,实例化NetconfDeviceSalProvider的内部类类对象MountInstance

MountInstance是封装了对底层DOMMountPointService的注册操作,下面展开。

与Device建立连接
当与Device成功建立起连接时,会首先调用到对象NetconfDeviceonRemoteSessionUp方法。当与底层hello协商后(包括学习底层支持的device rpc),最终会调用NetconfDevice内部类SchemaSetup的setUpSchema方法。

SchemaSetup.setUpSchema方法中,会解析device特定的rpc,并创建NetconfDeviceRpc对象。

NetconfDeviceRpc对象是封装当前device底层所有Netconf RPC的操作,其包含:

  • 沟通底层设备的核心对象RemoteDeviceCommunicator
  • Yang NormalizedNode和NetconfMessage之间转换的MessageTransformer对象(相当于转换我们上层构建的NormalizedNode为对应的RPC的NetconfMessage对象,用于发送;或者将RPC返回消息转换为DOMRpcResult)

在创建好NetconfDeviceRpc对象后,最终会调用到MountInstance的onTopologyDeviceConnected方法!可以看到几个关键点:

  • 通过RemoteDeviceId.getTopologyPath(实际上是Node的YangIId)来创建DOMMountPoint;
  • DOMMountPoint中设置了支持的rpc的SchemaContext、DOMDataBroker、上述创建的DOMRpcService(NetconfDeviceRpc)以及DOMNotificationService
  • 最终将DOMMountPoint注册DOMMountPointService

个人理解:将设备的支持的rpc/notification/schema/databroker直接存储到MountPoint里,控制器无需重复定义设备的yang。比如设备的rpc,控制器无需重复定义,在调用时上层将构建好的normalizeNode直接传到NetconfDeviceRpc,其可以直接转换为NetconfMessage向底层设备发起请求。

看到这里,就知道我们在上层通过DOMMountPointService获取DOMRpcService是怎么来的;调用DOMRpcService就可以对底层设备发生rpc调用是怎么实现的。

DOMMountPointService实现

向DOMMountPointService注册DOMMountPoint过程,只是将DOMMountPoint对象put到DOMMountPointService中的一个HashMap(key是YangIId,value是DOMMountPoint)

而DOMMountPointService注册到OSGi是在controller启动过程中实现:dom-broker.xml

可以看出DOMMountPointService相当于一个简单的类,存储了nodeIId及对应的DOMMountPoint实例。

Netconf集群模式实现

集群基本实现

实现流程大致如下:(netconf-topology-singleton)
1、netconf-topology-singleton.xml中实例化NetconfTopologyManager对象,并调用其init方法;

2、NetconfTopologyManager init注册ClusteredDataTreeChangeListener,监听network-topology YANG的topology-netconf的node节点变化;

3、当topology-netconf新增node节点,即新增netconf device,NetconfTopologyManager创建NetconfTopologyContext对象,并将其注册为singleton service。(调用其registerClusterSingletonService方法)

4、当当前机器选举成为此NetconfTopologyContext singleton service的master时,调用其instantiateServiceInstance方法!

5、NetconfTopologyContext的instantiateServiceInstance方法调用 RemoteDeviceConnectorImpl对象的startRemoteDeviceConnection方法!

6、在RemoteDeviceConnectorImpl对象的startRemoteDeviceConnection方法中实现主动连接netconf device!

Netconf集群下MountPoint实现

从对MountPoint分析,我们知道DOMMountPointService是不支持集群的,在Netconf集群模式下,MountPoint怎么实现?

Master控制器节点
Master控制器节点的实现跟上面“Netconf与Mount千丝万缕的关联”一致,在本地DOMMountPointService存储了MountPoint。相关调用与单节点控制器基本无区别。

那么Slave节点中的能否rpc请求底层设备?
答案是可以的,netconf实现了ProxyDOMRpcService,代理slave节点rpc请求底层设备。这是怎么实现的,下面展开:

Slave控制器节点
在“集群基本实现”中我们了解到当node写入到YANG中,底层处理过程会创建NetconfTopologyContext对象,再将其注册为singleton service。在创建NetconfTopologyContext对象过程中会创建NetconfNodeManager对象,并让其监听当前节点node的operational yang的变化,并作出处理。

NetconfNodeManager对象主要实现了处理Slave节点的MountPoint相关操作。当选举出Master后,并且连接device后,最终会写YANG连接状态connected及记录当前master节点地址,这个时候就会触发NetconfNodeManager的处理,只有slave节点才会触发处理。处理逻辑具体如下:

在Netconf中对Akka消息的处理在NetconfNodeActor对象中,我们可以看看master怎么处理AskForMasterMountPoint消息:

  • master回复RegisterMountPoint消息(其带有sourceIdentifiers,是master节点与device协商后学习device支持的netconf rpc能力)

同样在NetconfNodeActor对象中,slave收到RegisterMountPoint消息进行处理:

  • 从RegisterMountPoint消息中获取device支持的能力并调用registerSlaveMountPoint,最终注册SlaveMountPoint。

registerSlaveMountPoint 方法中做了几个事情:

  • 1.创建SlaveSalFacade
  • 2.创建SchemaContextFactory
  • 3.将device的sourceIdentifiers反解析为SchemaContext(netconf rpc能力)
  • 4.创建ProxyDOMRpcService对象(代理master节点的DOMRpcService,其效果是走akka让master请求底层device)
  • 5.创建ProxyDOMDataBroker对象;
  • 6.调用SlaveSalFacade.registerSlaveMountPoint注册device的本地MountPoint(各种Proxy类,与master节点有区别)到本地DOMMountPointService

这里我们额外关注一下ProxyDOMRpcService对象,其与上面提及的NetconfDeviceRpc对象区别:

  • 其将上层构建的NormalizedNode封装为InvokeRpcMessage消息,通过akka发送到device的Master控制器节点,再由master节点调用其本地的NetconfDeviceRpc对象请求底层设备,最终完成请求后master节点再回复akka消息到slave控制器节点。(具体的akka消息处理都在NetconfNodeActor中)

至此,我们可以清楚理解在DOMMountPointService非集群下,Netconf集群下如何利用akka和本地DOMMountPointService实现,akka至关重要!

Netconf集群总结

  • Netconf集群模式使用SingletonService,当集群某一机器选举为某一个netconf device的master时,主动向netconf device发起连接!
  • master节点存储对底层Device请求的NetconfDeviceRpc对象于其自身DOMMountPointService中,而在slave节点中是存储ProxyDOMRpcSerivce对象,其封装akka请求master节点处理;

TL;DR

总结一下:
1.ODL Netconf如何连接到底层节点:Netconf底层监听了topology-netconf的YANG变化,然后向底层netconf device发起连接;

2.ODL Netconf部署为集群模式时,使用singlton注册选举一个控制器节点为master去连接底层netconf device;

3.ODL Netconf封装对device的请求于MounPoint对象中,其包含了NetconfDeviceRpc(DOMRpcService),notification,schema,databroker等相关类。而MountPoint可以通过DOMMountPointService获得;

4.DOMMountPointService不支持分布式集群,MountPoint在master和slave节点存储不同的对象。在Netconf集群模型下,Master节点的MountPoint存储了真实设备的NetconfDeviceRpc,而Slave节点存储的是相关的Proxy类,比如ProxyDOMRpcService,其构造akka消息将请求发送到master,再由master调用device;


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/22981.html
分享到:
相关文章
条评论

登录后才可以评论

陈卓文 发表于19-02-22
2