(三)ODL Openflowplugin Switch生命周期对象ContextChain创建源码分析

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

由于篇幅问题,我们将“Openflowplugin中Switch生命周期”这个大问题拆分为几个篇章:Switch生命周期对象ContextChain创建;控制节点的Master选举及ContextChain/Context服务实例化;MastershipChangeService以ReconciliationFramework;控制节点成为Slave;Switch下线过程。
本文为Openflowplugin(0.6.2)源码分析第三篇,也是Openflowplugin为上层北向应用提供服务的关键逻辑的开篇!

附:
第一篇:(一)ODL OpenflowPlugin启动流程源码分析
第二篇:(二)ODL Openflowplugin Switch连上控制器Handshake过程源码分析

读者约定:基本掌握Opendaylight的思想/有一定实践经验,想要深入理解openflowplugin源码/想对openflowplugin源码修改。

回顾第二篇笔记,在Switch连上控制器Handshake完成后,会调用ContextChainHolderImpl.deviceConnected方法,会为Switch创建其对应的ContextChain对象则创建。

先给出总结:在Openflowplugin中,每个Switch都有唯一的ContextChain对象,管理其在Openflowplugin的生命周期。

1.创建生命周期管理对象ContextChain

为连上的switch创建contextChain对象,通过调用ContextChainHolderImpl.createContextChain方法。在创建ContextChain前,会先为Switch创建四个对象DeviceContext、RpcContext、StatisticsContext、RoleContext,四个对象封装了Switch的四种类型操作:Device基本信息、Rpc请求、Statistics数据收集、Master/Slava角色调用。最后,将四个Context对象都传入ContextChain中管理。在下面会详细展开,每个步骤。

ContextChainHolderImpl.createContextChain方法是Switch连上控制器Handshake完成后的核心调用,这个方法主要逻辑:

1.1 创建DeviceContext

创建deviceContext,且传入自身对象(ContextChainHolderImpl)引用

创建deviceContext处理:

  • 设置ConnectionAdapterImpl对象中设置packetIn filter为true,目的是为了过滤后续过程中收到底层switch的packetIn message;
    • 注:可以看到在ContextChainHolderImpl.createContextChain方法后面会将packetIn filter恢复为false
  • 创建OutboundQueueHandler对象并传入对象引用到connectionAdapterImplconnectionContext
    • OutboundQueueHandler对象用于Packet output先到Queue,再到ConnectionAdapterImpl对象。另外一篇:《Openflowplugin outbound机制》会展开,在此不深入;
  • 创建DeviceContextImpl对象
  • 创建OpenflowProtocolListenerFullImpl对象,并传入引用到connectionAdapterImpl对象(setMessageListenersetAlienMessageListener),用于处理底层switch传递给控制器的所有message。
    • 注意:在上两篇笔记中,当switch连上控制器时调用ConnectionManagerImpl.onSwitchConnected()方法,会同样会传入一个MessageListener对象OpenflowProtocolListenerInitialImpl,此对象仅能出来Hello message,在Handshake阶段使用。而此时Handshake已经结束,重新传入OpenflowProtocolListenerFullImpl用于处理所有message。

1.2 创建RpcContext

创建rpcContext,且传入自身对象(ContextChainHolderImpl)引用

创建rpcContext处理:

  • 创建RpcContextImpl对象

1.3 创建StatisticsContext

创建statisticsContext,且传入自身对象(ContextChainHolderImpl)引用

创建statisticsContext处理:

  • 创建MultipartWriterProvider对象
    • 注意这里传入了deviceContext,是为了write到device的operational yang。deviceContextImpl中有写入device对应yang需要的TransactionChain
  • 创建StatisticsContextImpl对象
    • 传入了MultipartWriterProvider对象,目的是StatisticsContextImpl收集的数据可以写入device operational yang节点

1.4 创建RoleContext

创建roleContext,且传入自身对象(ContextChainHolderImpl)引用

创建roleContext处理:

  • 创建RoleContextImpl对象;
  • 创建SalRoleServiceImpl对象,传入RoleContextImpl。用于后续步骤,设置Switch的Master/Slave role。

1.5 创建ContextChain

在创建4个context后,创建ContextChainImpl对象。然后向ContextChainImpl对象注册/加入各个对象:
1.且给ContextChainImpl对象注册registerDeviceRemovedHandler,用于后续Switch下线过程清除Manger中各个Context的索引。
2.给ContextChainImpl对象添加context(addContext)。
3.最后将ContextChainImpl对象保存到ContextChainHolderImpl.contextChainMap中,相当于一个索引。ContextChainHolderImpl维护了各个Switch的ContextChain对象。

注意addContext是把传入的deviceContext/rpcContext/statisticsContext/roleContext封装到GuardedContextImpl对象。GuardedContextImpl对象仅做多一层封装,会记录具体Context的状态等。

最后,完成创建ContextChainImpl对象后,将设备从connectingDevices索引中删除。表示已经在控制器connected。

且设置ConnectionAdapterImpl中设置packetIn filter为false:

注意在上面创建deviceContext时会设置为ture。表示在contextChain创建过程中不处理packetIn message,完成创建contextChain后表示connect完成。

1.6 开始选举Master/Slave

上文基本展开了ContextChainHolderImpl.createContextChain方法详细讲解,唯独缺少最后一行代码,这也是最关键一行!调用ContextChain的registerServices方法:

在展开这一行代码的逻辑之前,我们先回顾一下全文!可以看到,在Switch完成Handshake后,Openflowplugin会为switch创建ContextChain对象(包括各个Context)。考虑到多个控制器情况下,当Switch设置多个控制器(比如ovs:set-controller),那么哪个控制器能够对Switch操作,比如下发流表。因为在每个控制器,Openflowplugin都会为switch创建ContextChain对象。

Openflow协议,支持多个控制器,且控制器有角色有三类master、slave、equal。为了控制层高可用使用master/slave模式;为了控制器负载均衡使用equal模式;

在此,我们不讨论equal模式,我们讨论Master/slave模型。Openflowplugin默认是以集群模型实现的,假设存在三个控制器节点,那么就会选举出一个节点作为某一个Switch的Master(不同Switch,Master不一定相同);如果Openflowplugin作为单点控制器运行,那么它就是所有连上的Switch的Master。

假设在三节点的集群情况下,Switch连上所有控制节点,此时每个控制节点都有Switch的ContextChain对象,那么哪个节点是该Switch的Master?关键就是上面的这一行代码!由于篇幅问题,我们在下篇展开!

2.总结

在Switch完成Handshake后,Openflowplugin会为Switch创建各个Context对象(Device/Rpc/Statistics/Role),以及ContextChain对象。


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

登录后才可以评论

陈卓文 发表于18-09-06
1