OpenDaylight入门--HelloWorld

OpenDaylight入门--HelloWorld,第1张

OpenDaylight入门--HelloWorld
  • 环境说明
  • 开发环境配置
    • 生成./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

开发环境配置 生成./m2文件夹(可选)

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

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

构建完成会显示BUILD SUCCESS

修改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文件的内的最下方添加
完整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请求成功了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/871020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存