Opendaylight之MD-SAL中级教程(一)
Origin article on: http://www.wyqbupt.com/2015/06/15/opendaylight%e4%b9%8bmd-sal%e4%b8%ad%e7%ba%a7%e6%95%99%e7%a8%8b/
这里我们需要一个ODL应用的开发,首先提供一个骨架代码,放在我的github上,下面是地址:
请自行下载,地址如下:
https://github.com/wyqbupt/ODL-skeleton/
下载命令:
git clone git@github.com:wyqbupt/ODL-skeleton.git
├── artifacts
├── distribution-karaf
├── features
│ └── src
│ └── main
│ └── resources
│ └── features.xml
├── parent
├── ODL-skeleton-api
├── ODL-skeleton-consumer
├── ODL-skeleton-impl
└── ODL-skeleton-it
首先打开应用根路径下的pom.xml
relativePath这个很重要,这是我们能够找到根模块的地方,我们打开parent目录可以看见,maven 解析这些子模块的时候会先去读取根模块的内容。
这里我们需要一个ODL应用的开发,首先提供一个骨架代码,放在我的github上,下面是地址:
请自行下载,地址如下:
https://github.com/wyqbupt/ODL-skeleton/
下载命令:
git clone git@github.com:wyqbupt/ODL-skeleton.git
├── artifacts
├── distribution-karaf
├── features
│ └── src
│ └── main
│ └── resources
│ └── features.xml
├── parent
├── ODL-skeleton-api
├── ODL-skeleton-consumer
├── ODL-skeleton-impl
└── ODL-skeleton-it
首先打开应用根路径下的pom.xml
<parent> |
<groupId>org.opendaylight.ODL-skeleton</groupId> |
<artifactId>ODL-skeleton-parent</artifactId> |
<version>0.0.1-SNAPSHOT</version> |
<relativePath>parent</relativePath> |
</parent> |
relativePath这个很重要,这是我们能够找到根模块的地方,我们打开parent目录可以看见,maven 解析这些子模块的时候会先去读取根模块的内容。
下面是本模块的描述
<modelVersion>4.0.0</modelVersion> |
<artifactId>ODL-skeleton-aggregator</artifactId> |
<description>ODL-skeleton Project Archetype Top Level POM</description> |
<packaging>pom</packaging> |
<name>${project.artifactId}</name> |
下面是模块的定义,这些模块名发现都是那些目录名,所有需要最终组合到一起的模块都要写进去,最终组合安装的过程会把下面这些模块都扔进OSGi容器内。
<modules> |
<!-- the ODL convention is to have parent and artifacts subdirectories --> |
<module>parent</module> |
<module>artifacts</module> |
<!-- TODO: add new features here --> |
<module>ODL-skeleton-impl</module> |
<module>ODL-skeleton-api</module> |
<module>ODL-skeleton-consumer</module> |
<module>features</module> |
<module>distribution-karaf</module> |
</modules> |
ODL-skeleton-api
这里定义了基本的api,还有yang文件的定义,后面我们写完yang文件后用yangtools去生成相应的java API和REST API。
先看pom.xml文件
ODL-skeleton-impl
它主要包括相应的实现代码和应用的配置型代码,这部分唯一注意的是它是对api模块的依赖
打开所对应的pom.xml
因为在一个应用中,服务提供方是provider,接收方是comsumer。一个应用可以有provider或者consumer,或者两个都有。这个在应用中是可选的,暂时不做。
ODL-skeleton-it
这里面是最后应用整合安装的时候跑的测试性代码
features:
这是一个比较重要的module:
对于Karaf容器来说,每一个应用都是是一系列的feature,他们可以被安装进容器内。这个文件夹内定义了我们写的应用的feature和依赖关系。比如我们的应用都是链接在MD—SAL上,所以必须依赖MD-SAL。
先看pom.xml,这里我是参考了一下SDNhub上放的那个例子的feature的依赖关系,将那些org.apache.jasper之类的都放进去了。重点是前几个自己加的。
这是yangtools,这是利用yang来生成java代码的工具
这是md-sal,基本所有的模块都接在上面,它充当链接各个应用的一个桥梁
这里定义了基本的api,还有yang文件的定义,后面我们写完yang文件后用yangtools去生成相应的java API和REST API。
先看pom.xml文件
<parent> |
<groupId>org.opendaylight.ODL-skeleton</groupId> |
<artifactId>ODL-skeleton-parent</artifactId> |
<version>0.0.1-SNAPSHOT</version> |
<relativePath>../parent</relativePath> |
</parent> |
ODL-skeleton-impl
它主要包括相应的实现代码和应用的配置型代码,这部分唯一注意的是它是对api模块的依赖
打开所对应的pom.xml
<dependencies> |
<dependency> |
<groupId>${project.groupId}</groupId> |
<artifactId>ODL-skeleton-api</artifactId> |
</dependency> |
<dependency> |
<groupId>org.osgi</groupId> |
<artifactId>org.osgi.core</artifactId> |
</dependency> |
</dependencies> |
ODL-skeleton-consumer
因为在一个应用中,服务提供方是provider,接收方是comsumer。一个应用可以有provider或者consumer,或者两个都有。这个在应用中是可选的,暂时不做。
ODL-skeleton-it
这里面是最后应用整合安装的时候跑的测试性代码
features:
这是一个比较重要的module:
对于Karaf容器来说,每一个应用都是是一系列的feature,他们可以被安装进容器内。这个文件夹内定义了我们写的应用的feature和依赖关系。比如我们的应用都是链接在MD—SAL上,所以必须依赖MD-SAL。
先看pom.xml,这里我是参考了一下SDNhub上放的那个例子的feature的依赖关系,将那些org.apache.jasper之类的都放进去了。重点是前几个自己加的。
这是yangtools,这是利用yang来生成java代码的工具
<dependency> |
<groupId>org.opendaylight.yangtools</groupId> |
<artifactId>features-yangtools</artifactId> |
<classifier>features</classifier> |
<type>xml</type> |
</dependency> |
<dependency> |
<groupId>org.opendaylight.controller</groupId> |
<artifactId>features-mdsal</artifactId> |
<classifier>features</classifier> |
<type>xml</type> |
</dependency> |
这是restapi配置时会用的
<dependency> |
<groupId>org.opendaylight.controller</groupId> |
<artifactId>features-restconf</artifactId> |
<classifier>features</classifier> |
<type>xml</type> |
</dependency> |
我们再来看feature内的src/main/resources/features.xml
下面这些内容是我们依赖的feature,以<repository>标示, 这些就是我前面说的parent根模块的作用,在parent根模块的pom.xml文件中定义这些变量,maven会自动去解析替换,至于这些版本应该定义成多少,或者说ODL提供了那些版本,我们可以在http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/自行查找相应的项目存在的版本号。
这里需要注意的是,所有定义在这里的依赖feature,必须在feature的pom.xml文件中加入依赖!不然编译的时候过不去
<repository>mvn:org.opendaylight.yangtools/features-yangtools/${yangtools.version}/xml/features</repository> |
<repository>mvn:org.opendaylight.controller/features-mdsal/${controller.mdsal.version}/xml/features</repository> |
<repository>mvn:org.opendaylight.controller/features-nsf/${nsf.version}/xml/features</repository> |
<repository>mvn:org.opendaylight.controller/features-restconf/${controller.restconf.version}/xml/features</repository> |
<repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin/${openflowplugin.version}/xml/features</repository> |
评论
发表评论