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 > |
评论
发表评论