OpenDaylight入门--HelloWorld

环境说明

操作系统: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

开发环境配置

生成./m2文件夹(可选)

如果之前未使用Maven命令的话,ls -a查看~目录下没有.m2文件夹,用以下命令做一些maven操作来生成.m2文件夹:

mvn help:system  # 显示平台的详细信息

构建完成会显示BUILD SUCCESS
maven构建完成

修改settings.xml

从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。

实现RPC API:“Hello World”

定义YANG文件

进入到~/<项目名>/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功能。

实现RPC API

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文件的<blueprint></blueprint>内的最下方添加<odl:rpc-implementation ref="provider"/>
完整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请求成功了。
请求成功

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫零NET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值