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
 
修改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请求成功了。
 
                  
                  
                  
                  
                            
本文档详细介绍了在Windows11环境下配置OpenDaylight开发环境,包括使用Maven生成项目、修改settings.xml、创建并安装项目、运行Karaf以及实现“HelloWorld”RPCAPI。主要涉及的操作包括:安装Mininet和Ubuntu虚拟机、配置SSH和X11转发工具、安装OpenDaylight Phosphorus-SR2、JDK11和Maven3.6.3,以及使用YANG文件定义和实现RPCAPI。最后,通过Post请求测试了接口的成功响应。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
                    
              
            
                  
					12
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
					
					
					


            