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中有个重要文件叫POMproject 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

 

posted @ 2018-07-24 23:54  An2i  阅读(42)  评论(0编辑  收藏  举报