- 环境说明
- 开发环境配置
- 生成./m2文件夹(可选)
- 修改settings.xml
- 创建项目
- 安装项目
- 运行项目
- 实现RPC API:"Hello World"
- 定义YANG文件
- 实现RPC API
- 运行karaf并测试接口
*** 作系统:Windows 11
虚拟机:VirtualBox 5.2.44
镜像版本:Mininet 2.3.0 & Ubuntu 20.04
SSH工具:PuTTY 0.76
X11转发工具:Xming 6.9.0.31
OpenDaylight版本:Phosphorus-SR2(发布时间2021年10月15日)
JDK版本:OpenJDK 11
Maven版本:Maven 3.6.3
如果之前未使用Maven命令的话,ls -a
查看~
目录下没有.m2
文件夹,用以下命令做一些maven *** 作来生成.m2文件夹:
mvn help:system # 显示平台的详细信息
构建完成会显示BUILD SUCCESS
从github上获取OpenDaylight的默认setting.xml
cp -n ~/.m2/settings.xml{,.orig} # (可选)备份原settings.xml
wget -q -O - https://raw.githubusercontent.com/opendaylight/odlparent/master/settings.xml > ~/.m2/settings.xml # 下载默认settings.xml到./m2文件夹下
因为raw.githubusercontent.com
在国内访问有点麻烦,所以这里直接把settings.xml的GitHub链接放到到下面,通过vim新建一个粘贴进去(PuTTY默认开启剪贴板共享功能):
vim ~/.m2/settings.xml # 新建并编辑settings.xml文件
写入GitHub中的settings.xml内容:odlparent/settings.xml(按"i"进入编辑模式,按"ESC" 再输入":wq",即可写入文件并退出)
创建项目使用maven来创建项目
mvn archetype:generate -DarchetypeGroupId=org.opendaylight.archetypes -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeCatalog=remote
填写项目信息后继续,构建完成后显示BUILD SUCCESS
进入example文件夹后进行安装:
cd example # 进入刚才创建的项目(我创建的项目名为example,按照自己创建的名称进入对应文件夹即可)
mvn clean install # maven清除后再安装
如果报错有you have X checkstyle ...
之类的报错,试试用下面的方式来安装:
mvn clean install -Dcheckstyle.skip # 跳过风格检查
最后出现BUILD SUCCESS
就是安装成功了
进入karaf/target/assembly/bin
下运行karaf文件
cd karaf/target/assembly/bin
./karaf
运行成功的截图如下
运行后可输入logout
退出karaf界面,回到Ubuntu CLI。
进入到~/<项目名>/api/src/main/yang
下,编辑yang文件,以我的项目example
为例子
cd ~/example/api/src/main/yang/
vim
在module <项目名>{}内添加以下代码:
rpc hello-world {
input {
leaf name {
type string;
}
}
output {
leaf greeting {
type string;
}
}
}
完整代码如下:
module example {
yang-version 1.1;
namespace "urn:opendaylight:params:xml:ns:yang:example";
prefix "example";
revision "2018-05-17" { // TODO change revision to date of model creation
description "Initial revision of example model";
}
rpc hello-world {
input {
leaf name {
type string;
}
}
output {
leaf greeting {
type string;
}
}
}
}
再退回到~/example/api/文件夹中
cd ../../../
或者
cd ~/example/api
在此运行安装程序:
mvn clean install
安装 *** 作不能省略,之后要利用安装生成的~/example/api/target/generated-sources/mdsal-binding/org.opendaylight.yang.gen.v1.utn.opendaylight.params.xml.ns.yang.<项目名>.rev<数字>/
下的文件继续实现RPC功能。
cd ../impl/src/main/java/<包名,例如org/abc/example>/impl/ # 切换至impl文件夹
vim ExampleProvider.java # 我的项目名为example,可按自己的项目名来改
引入上述YANG生成的文件,继承ExampleService并重写(@override)ListenableFuture方法:
// 添加引入
import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.<项目名>.rev<数字>.ExampleService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.<项目名>.rev<数字>.HelloWorldInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.<项目名>.rev<数字>.HelloWorldOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.<项目名>.rev<数字>.HelloWorldOutputBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
// 继承ExampleService
public class ExampleProvider implements ExampleService
// 重写方法
@Override
public ListenableFuture<RpcResult<HelloWorldOutput>> helloWorld(HelloWorldInput input) {
HelloWorldOutputBuilder helloBuilder = new HelloWorldOutputBuilder();
helloBuilder.setGreeting("Hello " + input.getName());
return RpcResultBuilder.success(helloBuilder.build()).buildFuture();
}
完整参考代码如下
import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.example.rev180517.ExampleService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.example.rev180517.HelloWorldInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.example.rev180517.HelloWorldOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.example.rev180517.HelloWorldOutputBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExampleProvider implements ExampleService {
private static final Logger LOG = LoggerFactory.getLogger(ExampleProvider.class);
private final DataBroker dataBroker;
public ExampleProvider(final DataBroker dataBroker) {
this.dataBroker = dataBroker;
}
/**
* Method called when the blueprint container is created.
*/
public void init() {
LOG.info("ExampleProvider Session Initiated");
}
/**
* Method called when the blueprint container is destroyed.
*/
public void close() {
LOG.info("ExampleProvider Closed");
}
@Override
public ListenableFuture<RpcResult<HelloWorldOutput>> helloWorld(HelloWorldInput input) {
HelloWorldOutputBuilder helloBuilder = new HelloWorldOutputBuilder();
helloBuilder.setGreeting("Hello " + input.getName());
return RpcResultBuilder.success(helloBuilder.build()).buildFuture();
}
}
最后编辑~/example/impl/src/main/resources/OSGI-INF/blueprint/
进入对应区域:
cd ../../../../../resources/OSGI-INF/blueprint/
或者
cd ~/example/impl/src/main/resources/OSGI-INF/blueprint/
在impl-blueprint.xml
文件的
内的最下方添加
完整impl-blueprint.xml
文件如下:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
odl:use-default-for-reference-types="true">
<reference id="dataBroker"
interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
odl:type="default" />
<bean id="provider"
class="<包名>.impl.ExampleProvider"
init-method="init" destroy-method="close">
<argument ref="dataBroker" />
bean>
<odl:rpc-implementation ref="provider"/>
blueprint>
返回到项目根目录下,及~/example
目录下进行Maven安装:
cd ../../../../../
mvn clean install
或者
cd ~/example
mvn clean install
如果还是遇到类似于you have X checkstyle ...
的问题,用:
mvn clean install -Dcheckstyle.skip # 跳过风格检查
运行karaf并测试接口
最后跳转到自己项目的karaf
文件~/example/karaf/target/assembly/bin/karaf
cd ~/example/karaf/target/assembly/bin/
./karaf
找一个API测试网站(Postwoman),或者API测试软件(Postman或者Insomnia)发起Post请求,请求参数如下:
POST: http://localhost:8181/rests/operations/example:hello-world
(如果是VirtualBox虚拟机部署OpenDaylight的话,可以将localhost
改为192.168.56.xx
)
头部:
Accept: application/json
Content-Type: application/json
请求体:
{
"input": {
"name": "World"
}
}
Basic认证(Auth)
- 账户:admin
- 密码:admin
如果回复状态为200,且出现了经典的"Hello World",表明API请求成功了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)