文章目录
1 开发环境介绍
1.系统环境:Ubuntu
2.软件环境:
jdk 1.8
maven 3.3.9
OpenDaylight
Mininet
Eclipse/IntelliJ IDEA
2 构建工程
2.1 生成项目骨架
根据OpenDaylight官方文档提供的Maven命令生成项目骨架
mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeRepository=http://nexus.opendaylight.org/content/repositories/opendaylight.release/ -DarchetypeCatalog=remote -DarchetypeVersion=1.5.1
构建成功后会在当前目录生成项目文件夹,进入到文件夹下即可看到工程目录结构
2.2 编译工程
对构建好的工程进行编译
mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
2.3 启动控制器
启动控制器,具体启动如下图
2.4 导入项目到开发IDE中
3 实例开发
3.1 RPC和YANG模型
3.1.1 什么是RPC
RPC 全称 Remote Procedure Call——远程过程调用。在学校学编程,我们写一个函数都是在本地调用就行了。但是在互联网公司,服务都是部署在不同服务器上的分布式系统,如何调用呢?
RPC技术简单说就是为了解决远程调用服务的一种技术,使得调用者像调用本地服务一样方便透明。
OpenDaylight采用RPC这种通信方式主要是基于以下几点:
- 可以实现跨语言跨平台调用,不同业务系统都可以进行调用OpenDaylight对外提供的服务,使得OpenDaylight服务更具通用性;
- 每个调用方只需要提出需求,不需要了解OpenDaylight具体的代码逻辑实现;
- RPC易于拓展,易于复用。
3.1.2 什么是YANG模型
早在2003年,IETF成立了一个NETCONF工作组,提出一种基于XML的网络配置管理协议,也就是NETCONF(Network Configuration Protocol),因为该协议的配置功能非常强大,所以广泛采用来配置网络。
NETCONF协议分为传输层、RPC层、操作层和内容层。其中,内容层是唯一没有标准化的层,于是一种新的建模语言YANG产生了,它的目标是对NETCONF数据模型、操作进行建模,覆盖NETCONF协议的操作层和内容层。
YANG模型的产生主要是对以下三类数据进行建模:
- 远程过程调用(rpc):对可在网元上触发的远程程序调用进行建模;
- 资源(data):对要操控的资源进行建模,也就是对网元设备的的configure或者operational数据进行建模;
- 通知(notification):对网元发出的事件通知消息进行建模。
OpenDaylight控制器目前主要采用MD-SAL架构,这里的M指的就是YANG 模型。在开发过程中,一般先根据需求先设计YANG模型来确定准备提供哪些数据和服务,然后使用Maven进行编译时,通过YANG Tools插件将YANG文件的转译为相应的java类、接口。开发者通过实现自动生成的Java代码来实现具体的API和服务内容。
由于YANG文件通俗易懂,我们完全可以仅仅通过YANG文件就可以大概了解到系统提供的数据和服务内容,十分的方便。同时,OpenDaylight访问Data Store的API完全基于Yang模型,这部分代码Yang Tools插件自动生成,这样开发人员只需关注如何进行提供服务,大大提高了开发效率和降低了OpenDaylight控制器的开发难度。
3.1 YANG模型中定义RPC
-
编辑api/src/main/yang目录下的topology.yang,进行yang文件编写,完整的topology.yang文件如下:
module topology { yang-version 1; namespace "urn:opendaylight:params:xml:ns:yang:topology"; prefix "topology"; import ietf-inet-types { prefix inet; revision-date 2013-07-15; } description "get links and ports information"; revision "2018-03-07" { description "Initial revision of topology model"; } grouping output-link{ leaf link-id{ type inet:uri; description "link id"; } leaf src-device{ type inet:uri; description "source device"; } leaf src-port{ type int32; description "source port"; } leaf dst-device{ type inet:uri; description "destination device"; } leaf dst-port{ type int32; description "destination port"; } } grouping output-port{ leaf device-id{ type inet:uri; description "link id"; } leaf port-number{ type string; description "port number"; } leaf port-name{ type string; description "port name"; } leaf hardware-address{ type string; description "hardware address"; } leaf current-speed{ type int64; description "current speed"; } leaf maximum-speed{ type int64; description "maximum speed"; } leaf link-down{ type boolean; description "link down"; } } rpc list-links-info{ output { list links-info{ uses output-link; description "link info"; } } } rpc list-ports-info{ output{ list ports-info{ uses output-port; description "port info"; } } } }
解析:
①module:在实际项目中,一个工程中YANG模型很多,所以可以通过module来划分不同模块的YANG。各个module描述各自的数据模型,不同module之间可以互相引用,十分灵活。②namespace和prefix :每个module有一个独立的namespace以避免命名冲突,同时还有一个简称prefix。
③import:通过import导入外部模块,可以在本模块中使用导入模块中定义的数据结构或数据类型。导入时会给外部模块起一个prefix,引用导入模块中的内容时以prefix开头即可。
④description:描述YANG文件的功能或者各个节点的功能。
⑤revision:版本信息。
⑥grouping:一种可重用的schema nodes的集合。该集合可能在定义处的module中被使用,也可能在包含它的modules中使用,还可能在导入它的modules中被使用。grouping不会生成任何节点,可以看成一种临时树干。
⑦leaf:一种数据节点,在data tree中最多只能有一个实例存在。一个leaf节点只能有一个值,并且不能有子节点。leaf主要用来定义属性值。
⑧type:指定leaf的数据类型,该类型可以是YANG RFC规定的基本类型,也可以是自定义的派生类型。在YANG文件中,int32为基本类型,inet:uri为派生类型,派生类型的定义由typedef定义。基本的原生数据类型有uint8、uint16、string、bits、binary、boolean等等。
⑨rpc:远程过程调用。它可能包含input和output子节点,分别是该rpc所需要的输入和输出数据结构。若没有则表明该操作不需要输入数据或者没有输出数据。
⑩uses:实例化在grouping声明中定义的schema nodes。
更为详细的YANG语法知识可以参考rfc 6020(https://tools.ietf.org/html/rfc6020)
需要注意的是,由于在YANG文件中引入了ietf-inet-types,需要在api目录下的pom.xml中添加相关依赖:
<dependencies> <dependency> <groupId>org.opendaylight.mdsal.model</groupId> <artifactId>ietf-inet-types-2013-07-15</artifactId> <version>1.2.2-Carbon</version> </dependency> </dependencies>
Tip:dependencies标签如果存在则直接添加dependency这一层标签即可。
-
定义好YANG文件,需要重新编译工程,编译时无需整体编译,只需进入到工程主目录下的api目录下进行编译即可,具体命令如下:
cd api/ mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
-
编译时,maven会通过Yang Tools插件生成基本的Java文件,生成的Java文件如下图所示: