http://www.frank-durr.de/?p=84
学弟推荐的一个非常详细的opendaylight开发入门教程,这里尽力翻译一下,为了自己更好的理解。
在这个教程里,我会详细解释如何为opendaylight开发一个OSGI组件来实现常规的网络控制逻辑。与REST 接口不同,当一个packet到达并在交换设备流表中失配的时候,将会触发一个packet-in事件,OSGI组件接收packet-in事件。因此,为了实现流响应式变成,OSGI组件是研究OpenDaylight一个很好的切入口。
即使是对于有经验的java程序员,开发OSGI组件的学习曲线也是相当陡峭的,OpenDaylight使用十分强大的开发工具,例如Maven和OSGI、这些程序架构都十分的复杂,众多的java类也是一个巨大的挑战。然而,正如你将在本教程里看到的这样,由于maven提供的帮助,开发过程是很简单明了的。
我将会一步一步展示一个简单的OSGI组件的开发过程。这个组件并不做什么贡献,只是简单的呈现一个收到的ipv4数据包的目的地址。数据路径id(data path id),以及ingress port。然而,你可以学习到许多能够帮助你今后开发自己的控制组件的知识,例如
- 如何搭建一个opendaylight maven 工程?
- 如何 在opendaylight运行时刻安装(install),卸载(uninstall),开启(start),结束(stop)一个OSGI bundle?
- 如何管理OSGI组件依赖和生命周期?
- 如何通过data packet listenners接收packet-in事件?
- 如何使用Opendaylight Data Packet Service解析数据包?
这里应该提一下,我使用opendaylight的API驱动的服务抽象层(API-Driven Service Abstraction Layer SAL),OpenDaylight 还实现了一个模型驱动的SAL。在后面的教程中将会涉及。
the big picture
下图展示了我们的系统架构。它由一系列将java类,资源,配置文件捆绑在一起的bundles组成。其中,MyControlApp是我们在这个教程中将要开发的。其他的bundles来自OpenDaylight工程,例如SAL bundles。
bundles在OSGI框架中运行(Opendaylight中的Equinox)。OSGI最有趣的地方在于bundles可以在运行时安装和卸载,因而我们无需停下SDN控制器来增加或修改控制逻辑
。
我们可以看到,OSGI bundles可以提供可供其他OSGI组件调用的服务。其中我们要使用的是Data Packet Service(interface IDataPacketService)来解析数据包。
尽管我们的简单控制组件并没有给其他bundle提供任何功能,但是我们必须知道,假如想要收到packet-in事件,我们必须实现IListenDataPacket接口。到一个OpenFlow packet-in消息到达控制器的时候,SAL将会激活实现了IListenDataPacket接口的组件。当然,其中就有我们的bundle。
Prerequisites
在我们开始开发我们的组件之前,我们应该拿到opendaylight可运行版本。http://www.opendaylight.org/software/downloads可以从以下地址中获得,或者你也可以从opendaylight GIT仓库中获得,并自己编译
user@host:$ git clone https://git.opendaylight.org/gerrit/p/controller.git
user@host:$ cd ./controller/opendaylight/distribution/opendaylight/
user@host:$ mvn clean install
其实要开发一个opendaylight OSGI组件,你并不需要拿到opendaylight源码。我们下面将会介绍,我们只需要将要用到的组件从opendaylight仓库中以Jar包的形式导入就可以了。
在编译的过程中,你将会看到Maven下载很多java packages。如果你从来没有用过Maven,可能会对此感到困惑,我们刚才难道没有用Git下载整个工程吗?实际上,Maven可以从远程仓库自动的下载工程依赖项(库,plugins)并且将它们放进你的本地仓库,通常会位于~/.m2。如果你在编译完opendaylight之后查看这个仓库,你将会看到所有Maven下载下来的库文件。
例如,你可能会看到Maven下载了Apache Xerces XML解析器,我们将会在讨论工程依赖的时候解释这些依赖项。
Creating the Maven Project
现在,我们开始开发我们的OSGI 组件。因为Opendaylight 是基于Maven的。因此我们最好也使用Maven 来开发自己的工程。所以我们首先为我们的OSGI组件创建一个Maven工程。首先我们创建如下目录结构,我们用~/myctrlapp来代表该组件的根目录。
myctrlapp
|--src
|--main
|--java
|--de
|--frank_durr
|--myctrlapp
显然,Java实现在src/main/java中,我们使用de.frank_durr.myctrlapp来实现我们的控制组件。
Maven中有个重要文件叫POM(project object model)我们在~/myctrlapp文件夹中创建pom.xml文件。内容如下:这里建议参考源教程,拷贝过来之后缩进有些问题。
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://mav