Opendaylight开发篇(一)
https://blog.csdn.net/pantingting_zju/article/details/46835081
为opendaylight开发一个OSGI组件来实现常规的网络控制逻辑。
学习目标:
- 如何搭建一个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
下图展示了我们的系统架构。它由一系列将java类,资源,配置文件捆绑在一起的bundles组成。其中,MyControlApp是我们在这个教程中将要开发的。其他的bundles来自OpenDaylight工程,例如SAL bundles。
图1-1 系统架构
bundles在OSGI框架中运行(Opendaylight中的Equinox)。OSGI最有趣的地方在于bundles可以在运行时安装和卸载,因而我们无需停下SDN控制器来增加或修改控制逻辑,这点和Python类似。
开发一个opendaylight OSGI组件,并不需要拿到opendaylight源码。只需要将要用到的组件从opendaylight仓库中以Jar包的形式导入就可以了。
在编译的过程中,将会看到Maven下载很多java packages。
Maven可以从远程仓库自动的下载工程依赖项(库,plugins)并且将它们放进你的本地仓库,通常会位于~/.m2。
一、Creating the Maven Project
因为Opendaylight 是基于Maven的。因此我们最好也使用Maven 来开发自己的工程。所以我们首先为我们的OSGI组件创建一个Maven工程。首先我们创建如下目录结构,我们用~/myctrlapp来代表该组件的根目录。Java实现在src/main/java中,我们使用de.frank_durr.myctrlapp来实现我们的控制组件。
图1-2 目录结构
Maven中有个重要文件叫POM(project object model)我们在~/myctrlapp文件夹中创建pom.xml文件。内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.frank_durr</groupId> <artifactId>myctrlapp</artifactId> <version>0.1</version> <packaging>bundle</packaging> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.3.7</version> <extensions>true</extensions> <configuration> <instructions> <Import-Package> * </Import-Package> <Export-Package> de.frank_durr.myctrlapp </Export-Package> <Bundle-Activator> de.frank_durr.myctrlapp.Activator </Bundle-Activator> </instructions> <manifestLocation>${project.basedir}/META-INF</manifestLocation> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal</artifactId> <version>0.7.0</version> </dependency> </dependencies> <repositories> <!-- OpenDaylight releases --> <repository> <id>opendaylight-mirror</id> <name>opendaylight-mirror</name> <url>http://nexus.opendaylight.org/content/groups/public/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> </repository> <!-- OpenDaylight snapshots --> <repository> <id>opendaylight-snapshot</id> <name>opendaylight-snapshot</name> <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories> </project>
*首先,我们定义自己的group id(我们组织的唯一id),以及artifact id(我们工程的名字)以及一个 版本号version number。
*在Maven创建的过程中,plugins被激活。(其中一个Apache Felix 非常重要,它创建了我们的OSGI工程,它指明了每一个需要导入的包,通配符*导入了每一个在bundle中不存在,但是在bundle中有引用过的bundle。这比指定每一个imports更加合理,简便。)
另外,我们导出我们package中的所有实现。
*bundle activator在bundle生命周期中的每一次 start与stop时调用。
下面介绍如何使用activator来注册我们的服务,如何向外提供我们组件的接口:
*dependency元素指明了我们的组件的依赖项。(Maven会自动下载所有需要的库(jars)到你的本地仓库)
我们只需要opendaylight的SAL。opendaylight 工程给我们的仓库提供了一个已经编译好的组件,因此,Maven会从远程仓库下载JARs。所以,我们并不需要将所有的opendaylight工程源码导入到Eclipse!
*从POM文件中,我们可以创建一个Eclipse工程。
执行一下命令:
user@host:$ cd ~/myctrlapp
user@host:$ mvn eclipse:eclipse
改动了pom文件的时候,一定要重新执行以上指令。接下来,你可以将工程导入到Eclipse当中了。
Menu Import / General / Existing projects into workspace
Select root folder ~/myctrlapp
二、Implementation of OSGi Component: The Activator