OpenDayLight 代码学习研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ODL学习
修改记录
1.1ODL概述
Opendaylight是一个以模块化、可插拔、灵活的、基于Java的控制器为核心的开源平台。从北往南,它首先包括供上层应用和业务逻辑使用的北向开放API,有OSGi和REST两类。上层应用程序利用这些北向API获得网络智能信息、运行算法处理分析以及组合新的网络策略;其次,它包括控制器平台本身,它是一组可动态组合的模块用于汇集网络信息,比如网络中有哪些元素、其
统计信息如何等;最南边是能够支持多种协议的南向接口,如Openflow 1.0 1.3 BGP-LS等,这些南向接口可以调用设备上服务抽象层SAL。
1.2ODL架构原则
Open Daylight Controller在设计的时候遵循了六个基本的架构原则:
(1) 运行时模块化和扩展化(Runtime Modularity and Extensibility):支持在控制器运行时进行安装、删除和服务的更新。
(2) 多协议的南向支持(Multiprotocol Southbound):南向支持多种协议。
(3) 服务抽象层(Service Abstraction Layer):南向多种协议对上提供统一的北向服务接口。
(4) 开放的可扩展北向API(Open Extensible Northbound API):提供可扩展的应API,通过REST或者函数调用方式。两者提供的功能要一致。
(5) 支持多租户、切片(Support for Multitenancy/Slicing):允许网络在逻辑上(或物理上)划分成不同的切片或租户。控制器的部分功能和模块可以管理指定切片。控制器根据所管理的分片来呈现不同的控制观测面。
(6) 一致性聚合(Consistent Clustering):提供细粒度复制的聚合和确保网络一致性的横向扩展(scale-out)。
1.3框架概述
上图所示,南向通过plugin的方式来支持多种协议,包括OpenFlow1.0、1.3,BGP-LS 等。
这些模块被动态挂载到服务抽象层(SAL),SAL 为上层提供服务,将来自上层的调用封装为适合底层网络设备的协议格式。控制器需要获取底层设备功能、可达性等方面的信息,这些信息被存放在拓扑管理器(Topology Manager)中。其他的组件,包括ARP handler、HostTracker、Device Manager和Switch Manager,则为Topology Manager生成拓扑数据。
控制器为应用(App)提供开放的北向API。支持OSGi 框架和双向的REST 接口。OSGi框架提供给与控制器运行在同一地址空间的应用,而REST API 则提供给运行在不同地址空间的应用。所有的逻辑和算法都运行在应用中。
控制自带了GUI,这个GUI 使用了跟应用同样的北向API,这些北向API 也可以被其他的应用调用。
1.4功能概述
1.4.1服务抽象层
服务抽象层(SAL)是整个控制器模块化设计的核心,向下支持多种南向协议,向上为模块和应用支持一致性的服务。使用SAL 提供的接口,用户无需关心南向协议的具体实现细节,可以更多的关注到模块实现逻辑本身。
1.4.2 SAL 的演进
SAL已经演进成为了一种基于模型的方法。框架被用于对网络(属性和设备)建模,并动态地在服务应用之间通过北向API和协议插件提供的南向API 进行映射。下图展示了南向插件如何提供网络模型树的部分。
1.4.3 MD-SAL
SAL 的设计已经从原先的AD-SAL(API-Driven),逐渐演变到了MD-SAL(Model-Driven),这一决定是在2013.10的第14次TSC会议上讨论的。
采用MD-SAL 的好处是让北向和南向的API 和数据结构可以不管服务和组件的不同,保持独立。
数据和接口基于YANG标记语言进行描述,它描述XML数据结构、组件功能、定义语义元素和关系,作为一个独立系统来为所有组件建模。
新创建的模块可以采用YANG来进行定义,为希望实现的功能创建静态的API,而无需关心跟SAL进行的具体交互和数据结构实现。
2 源码部分
2.1服务抽象层
2.1.1sal-common组件
该组件定义了数据的基本读操作(没有写操作)接口以及全局变量的枚举类型接口。主要分为三个类:DataStoreIdentifer、GolobalDataStore、packegeinfo三个接口。
(1)DataStoreIdentifer接口
该类的定义了getIdentifier()和getName()两个方法接口。
作用:该类的主要作用就是定义一个获取数据存储的获取接口,要注意的是其中并没有定义set方法。(2)GolobalDataStore类
该类继承了DataStoreIdentifer接口并且是一个枚举的类型:
可以看出GolobalDataStore中存放的信息为RuntimeInfo和Configuration,即存储在运行时的基本信息和相关的组件配置信息。
作用:存放运行时的基本信息和相关的组件配置信息。
(3)Packegeinfo
其实一个预留类,暂时没有定义任何的方法。
2.1.2sal-core-api组件
org.opendaylight.controller.md.sal.dom.api包
该包中定义了一系列DOM(Document Object Model)即文件对象模型操作如只读操作、只写操作以及读写操作。只要包含以下几个类:
(1)DOMDataBroker接口
DOMDataBroker即文件对象模型数据代理,其继承了AsyncDataBroker()即异步数据代理和DOMDataChangeListener等。其中重载了文件对象模型数据代理对于DOMDataTransaction(文件对象模型数据事务)只读操作、只写操作以及读写操作的操作。createTransactionChain()暂时还没搞清楚其作用。
作用:定义了一个对DOMDataTransaction的统一接口,其返回的是操作方法而不是具体操作。(2)DOMDataChangeListener
该类继承了AsyncDataChangeListener,提供DOM数据变更监听。
作用:DOM数据变更监听器。
(3)DOMDataReadOnlyTransaction
作用:文件对象模型数据事务只读操作。
(4)DOMDataReadTransaction
作用:文件对象模型数据事务读操作。