Opendaylight之MD-SAL中级教程(二)
Origin post:http://www.wyqbupt.com/2015/06/15/%e3%80%90%e5%8e%9f%e5%88%9b%e3%80%91opendaylight%e4%b9%8bmd-sal%e4%b8%ad%e7%ba%a7%e6%95%99%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89/
第一步,我们需要讲我们的provider接入到MD-SAL,接触过opendaylight都知道有config subsystem,它提供了服务的周期管理,同时能够提供对JMX 和 NETCONF的接入性配置。config subsystem在MD-SAL之外而且被用来提供把应用接入MD-SAL的功能。我们首先完成配置性关系的yang文件,后面会用yangtools来生成java代码,通过这部分可以在ODL启动的时候加载相应的服务。
module ODL-skeleton-impl-config { |
yang-version 1; |
namespace "urn:opendaylight:params:xml:ns:yang:ODL-skeleton:impl:config"; |
prefix "ODL-skeleton-impl-config"; |
import config { prefix config; revision-date 2013-04-05; } |
import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;} |
description |
"Service definition for ODL-skeleton project"; |
revision "2014-12-10" { |
description |
"Initial revision"; |
} |
identity ODL-skeleton-impl-config { |
base config:module-type; |
config:java-name-prefix ODL-skeletonImpl; |
} |
augment "/config:modules/config:module/config:configuration" { |
case ODL-skeleton-impl-config { |
when "/config:modules/config:module/config:type = 'ODL-skeleton-impl-config'"; |
container binding-aware-broker { |
uses config:service-ref { |
refine type { |
mandatory true; |
config:required-identity md-sal-binding:binding-broker-osgi-registry; |
} |
} |
} |
} |
} |
} |
这里面的identity在yang的模型定义语言中作为一个标示,用于作为我们应用的provider提供的服务的全局标识,唯一的标记我们连接config subsystem。
augment用来扩展一个现有的ODL配置,增加了一个节点来标识 ODL-skeleton-impl。我们其中依赖了一个MD-SAL的服务 binding-aware-broker,这个跟MD-SAL的数据存取的datastore有关,我后面会讲到如何去用。
通过上面的yang文件,我们可以引导控制器的config subsystem解释ODL-skeleton 的配置文件
通过上面的yang文件,我们可以引导控制器的config subsystem解释ODL-skeleton 的配置文件
下一步写响应的配置文件ODL-skeleton-impl-config.xml
由于MD-SAL提供多种服务(每个服务其实就是一个接口),每个服务可能有多种实现,我们这个配置文件里就是需要来指定要用哪种服务的哪种实现。
由于MD-SAL提供多种服务(每个服务其实就是一个接口),每个服务可能有多种实现,我们这个配置文件里就是需要来指定要用哪种服务的哪种实现。
<? xml version = "1.0" encoding = "UTF-8" ?> |
<!-- vi: set et smarttab sw=4 tabstop=4: --> |
< snapshot > |
< required-capabilities > |
< capability >urn:opendaylight:params:xml:ns:yang:ODL-skeleton:impl:config?module=ODL-skeleton-impl-config&revision=2014-12-10</ capability > |
< capability >urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28</ capability > |
</ required-capabilities > |
< configuration > |
< data xmlns = "urn:ietf:params:xml:ns:netconf:base:1.0" > |
< modules xmlns = "urn:opendaylight:params:xml:ns:yang:controller:config" > |
< module > |
< type xmlns:prefix = "urn:opendaylight:params:xml:ns:yang:ODL-skeleton:impl:config" >prefix:ODL-skeleton-impl-config</ type > |
< name >ODL-skeleton-impl</ name > |
< binding-aware-broker > |
< type xmlns:binding = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding" >binding:binding-broker-osgi-registry</ type > |
< name >binding-osgi-broker</ name > |
</ binding-aware-broker > |
</ module > |
</ modules > |
</ data > |
</ configuration > |
</ snapshot > |
这里我们指定使用了binding-aware-broker service的binding-osgi-broker实现来满足需求。
这里我只加入了这一个配置型服务,当然你可以加入其他的,方法就是在标签内加
然后我们在impl模块的pom.xml写入代码生成器
这里我只加入了这一个配置型服务,当然你可以加入其他的,方法就是在标签内加
然后我们在impl模块的pom.xml写入代码生成器
< plugin > |
< groupId >org.opendaylight.yangtools</ groupId > |
< artifactId >yang-maven-plugin</ artifactId > |
<!-- TODO: I grabbed this from Ed's sample proj --> |
< dependencies > |
< dependency > |
< groupId >org.opendaylight.controller</ groupId > |
< artifactId >yang-jmx-generator-plugin</ artifactId > |
< version >${controller.config.version}</ version > |
</ dependency > |
</ dependencies > |
< executions > |
< execution > |
< id >config</ id > |
< goals > |
< goal >generate-sources</ goal > |
</ goals > |
< configuration > |
< codeGenerators > |
< generator > |
< codeGeneratorClass >org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</ codeGeneratorClass > |
< outputBaseDir >${jmxGeneratorPath}</ outputBaseDir > |
< additionalConfiguration > |
< namespaceToPackage1 >urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang</ namespaceToPackage1 > |
</ additionalConfiguration > |
</ generator > |
< generator > |
< codeGeneratorClass >org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</ codeGeneratorClass > |
< outputBaseDir >${salGeneratorPath}</ outputBaseDir > |
</ generator > |
</ codeGenerators > |
< inspectDependencies >true</ inspectDependencies > |
</ configuration > |
</ execution > |
</ executions > |
</ plugin > |
Yantools提供了2个code生成器,一般的生成器CodeGeneratorImpl生成产生正常API和数据传输对象的(DTO),它主要的作用是将我们定义的非配置性yang,产生相应的java文件;另一个生成器JmxGenerator产生配置性的代码,也就是对我们上面写的那个配置性yang文件作用。
改完ODl-skeleton-impl的pom.xml(具体参考的代码请看分支branch1内的代码),现在我们在ODL-skeleton-impl运行:
mvn clean generate-sources |
这时我们会发现两个文件被建立了
ODLSkeletonImplModule.java这个java文件中的createInstance()创建一个ODl-skeleton-impl的实例,由这个实例来操作本应用的各个服务
ODLSkeletonImplModule.java这个java文件中的createInstance()创建一个ODl-skeleton-impl的实例,由这个实例来操作本应用的各个服务
ODLSkeletonImplModuleFactory.java它用来创建ODLSkeletonImplModule的实例,我们目前不用修改此文件。
下面我们修改一下ODLSkeletonImplModule的createInstance()方法
下面我们修改一下ODLSkeletonImplModule的createInstance()方法
ODLSkeletonImpl provider = new ODLSkeletonImpl(); |
getBindingAwareBrokerDependency().registerProvider(provider, null ); |
return provider; |
评论
发表评论