windows环境创建一个ODL app demo

一 使用mvn archetype:generate生成代码架构

生成架构的版本一定要与最终启动的odl版本相同

在代码目标目录:D://下运行

D:\>mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeRepository=http://nexus.opendaylight.org/conten
t/repositories/opendaylight.release/ -DarchetypeCatalog=remote -DarchetypeVersion=1.5.1
D:\
[INFO] Scanning for projects...
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom
……

[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.2.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.2.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.2.1:generate (default-cli) @ standalone-pom ---
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetype/archetype-catalog/3.2.1/archetype-catalog-3.2.1.pom
……
[INFO] Generating project in Interactive mode
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
[WARNING] Archetype not found in any catalog. Falling back to central repository.
[WARNING] Add a repository with id 'archetype' in your settings.xml if archetype's repository is elsewhere.
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/opendaylight/controller/opendaylight-startup-archetype/1.5.1/opendaylight-startup-archetype-1.5.1.pom
……
Define value for property 'copyright': aaa
[INFO] Using property: copyrightYear = 2017
[INFO] Using property: version = 0.1.0
Define value for property 'groupId': com.wl.odl
Define value for property 'artifactId': appdemo
// package这里应该写groupId+artifactId,影响最后代码在impl/src/main/java后的路径
Define value for property 'package' com.wl.odl: : demo
Define value for property 'classPrefix' Appdemo: :
Confirm properties configuration:
copyright: aaa
copyrightYear: 2017
version: 0.1.0
groupId: com.wl.odl
artifactId: appdemo
package: demo
classPrefix: Appdemo
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: opendaylight-startup-archetype:1.5.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.wl.odl
[INFO] Parameter: artifactId, Value: appdemo
[INFO] Parameter: version, Value: 0.1.0
[INFO] Parameter: package, Value: demo
[INFO] Parameter: packageInPathFormat, Value: demo
[INFO] Parameter: classPrefix, Value: Appdemo
[INFO] Parameter: package, Value: demo
[INFO] Parameter: version, Value: 0.1.0
[INFO] Parameter: groupId, Value: com.wl.odl
[INFO] Parameter: copyright, Value: aaa
[INFO] Parameter: artifactId, Value: appdemo
[INFO] Parameter: copyrightYear, Value: 2017
[WARNING] Don't override file D:\appdemo\pom.xml
[INFO] Project created from Archetype in dir: D:\appdemo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  05:18 min
[INFO] Finished at: 2022-05-16T15:43:57+08:00
[INFO] ------------------------------------------------------------------------

业务代码在api和impl。
其中api中存放我们项目要对外提供的webapi,impl中是项目的具体实现。
打开impl,可以看到里边已经生成了AppdemoProvider.java文件,该文件是整个项目的入口。
在代码的impl/src/main/resources文件夹下生成了impl-blueprint.xml文件,用于为项目提供依赖注入。
(具体内容可参考https://wiki.opendaylight.org/view/Using_Blueprint)

public class AppdemoProvider {

    private static final Logger LOG = LoggerFactory.getLogger(AppdemoProvider.class);

    private final DataBroker dataBroker;

    public AppdemoProvider(final DataBroker dataBroker) {
        this.dataBroker = dataBroker;
    }

    /**
     * Method called when the blueprint container is created.
     */
    public void init() {
        LOG.info("AppdemoProvider Session Initiated");
    }

    /**
     * Method called when the blueprint container is destroyed.
     */
    public void close() {
        LOG.info("AppdemoProvider Closed");
    }
}

我们可以结合AppdemoProvider.java文件的代码大致的分析一下该文件的具体含义,其中标签后边的内容正好与上边的Provider代码相互对应,指明了函数的入口。其中init对应初始化方法,也就是插件install之后会首先运行这个方法。而close方法是项目卸载时运行的方法,可以把一些资源的清理放在该方法中。

二、编译

mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true

得到jar包

在项目代码路径下启动karaf,即可运行这个app

./karaf/target/assembly/bin/karaf

进入启动界面后,展示所有日志log:displaylog:tail

三、将插件集成到odl中

  1. /karaf/target/assembly/system目录下找对应的jar包,直接拷贝到对应版本的odl发行版的对应目录下

https://www.sdnlab.com/19857.html
https://blog.csdn.net/u_hcy2000/article/details/120826523

  1. 运行feature repo-add:mvn:com.wl.odl/features-appdemo/0.1.0/xml/features,后面的部分可以在 /karaf/target/assembly/etc目录下的xml文件中找到。意思是告诉odl我要把自己的插件添加进odl,karaf会读取到插件的信息。
  2. 在karaf控制台安装 feature:install features-appdemo,feature名应该是在/feature目录下找到的features-artifactId形式,与目录的pom.xml中一致(不确定,实在不行可以用feature:list列出所有的features再查找)

四、一个实际的例子-包含yang模型和RPC

参考https://blog.csdn.net/u_hcy2000/article/details/120826523

1 yang中定义模型

在开发过程中,一般先根据需求先设计YANG模型来确定准备提供哪些数据和服务,然后使用Maven进行编译时,通过YANG Tools插件将YANG文件的转译为相应的java类、接口

rpc:消费端 生产端

// module 这里生成的是service,一会实现rpc的类需要实现这个service接口
module appdemo {
	// rpc 这里是要实现的方法
	rpc one-ping{ 
	input {
		// 这里是方法入参,rpc的name+Input
	}
    output {
    	// 这里是方法出参,rpc的name+Output,Future<RpcResult<ListLinksInfoOutput>>
        list links-info{ 
            uses output-link; 
            description "link info";
        }
    }
}

}

编译后生成了一系列的class文件:rpc的input、output,和对应的builder,和module生成的Service

2 rpc实现

2.1 代码实现 Provider.java文件

impl/src/main/java/org/opendaylight/topology/impl/TopologyProvider.java
在这个文件里实现service接口,实现rpc方法

2.2 完善相关依赖

  1. 在代码中使用的,要在impl目录的pom.xml文件中添加依赖<dependency>
  2. 也需要在features目录下的src/main/features/features.xml文件添加引用仓库<repository>
  3. 同时也需要在features.xml文件(可能是总的也可能是api或其他项目的)中的name为odl-topology-api的feature标签中添加如下feature:odl-openflowplugin-flow-services
    其中${openflowplugin.version}在features目录下pom.xml文件中定义,需要在其中的properties标签内添加

3 Blueprint方式注册rpc

原本需要写代码去实现的内容用xml文件的方式简化
xml文件固定放在bundle(按生产的框架,应是impl和cli有)的src\main\resources\org\opendaylight\blueprint目录下,否则获取不到文件内容,至于文件名可以随意。
添加:<odl:rpc-implementation ref=“provider”/>,其中provider是实例化类的id,id名称可以改变但必须两者保持一致

4 rpc测试

配置
需要用到OpenDaylight WEB控制台和l2switch相关组件,编译项目之前,需要在features目录下的src/main/features/features.xml文件添加引用仓库

<repository>
	mvn:org.opendaylight.l2switch/features-l2switch/${l2switch.version}/xml/features
</repository>

编译

mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true

启动karaf

./karaf/target/assembly/bin/karaf

安装bundle
调用rpc
使用OpenDaylight WEB控制台的Yangman进行调用RPC,登录到WEB控制台后,点击Yangman。输入url,并send获得json格式的结果

五、另一个例子-yang模型定义config,测算链路延时

参考https://www.sdnlab.com/19857.html
它的源码https://github.com/xujunnnn/DelayCollector

1 yang中定义模型-配置文件

因为需要用户配置,创建一个配置文件,定义所需参数
编译后在target/classes/生成class文件

2 开发实现

发包器
多线程任务,继承Runnable接口,之后再run函数中写我们的具体执行逻辑
PacketProcessingService类就是我们要用的发包服务
构建数据包
两个ODL-l2-switch中arphandler中的两个类。PacketDispatcher,InventoryReader。其中PacketDispathcer用于处理数据包,提供了例如广播,单播数据包等操作,InventoryReader用于获取网络的拓扑信息,例如获取所有交换机,获取某个交换机的所有端口等等
收包器
在ODL中如果想接收特定类型的数据包只需要使用相应的Listener接口,在插件中implements相关接口并使用NotificationProviderService对其进行注册(在init()中)

这一块没看懂。收包器需要notification应该包括两部分吧,supplier使用NotificationPublishService来发送我们的notification(blueprint.xml发布notificationSupplier的bean,ref配置NotificationPublishService),receiver处理收到的notification(blueprint.xml发布notificationReceiver的bean,ref配置需要注入的服务NotificationService)

rpc调用测算链路延时
与四中流程相似

整合
在插件init()中对rpc服务和ipv4包监听器进行注册

3 blueprint配置

发包器

添加service依赖

  1. 实现在impl,就在src\main\resources\org\opendaylight\blueprint路径下的blueprint.xml文件添加<odl:rpc-service id=“xxxService” interface="org.opendaylight.xxxxx"/>
  2. 在实现的<bean>中添加<argument ref="xxxService">

添加配置yang文件

  1. 添加<odl:clustered-app-config id=”(module的name)“ binding-class="(应该是刚才生成class的路径,org开始)">
  2. 在实现的<bean>中添加<argument ref="xxxService">

4 测试

与四一致,通过yang UI
想修改配置文件?
方法一:建立xml文件

方法二:调用rpc
使用postman,输入链接和配置参数(参数的名称参考自己定义的Yang文件)
成功更改配置后,插件会重新进行初始化过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值