opendaylight作为sdn主要开源项目,採用osgi框架。已经得到非常多厂商的支持。氦版本号也公布在即。

以下介绍一下在odl中怎样实现rpc. odl使用yang作为model模型定义文件。yang规范最先被用于netconf,后来restconf在http协议上实现restful。而採用yang定义模型。

实现分2步:1.採用yang定义模型,实现api jar包。2 实现rpc service的实现类,注冊到session中。

2个java的project文件夹结构。

第一步:定义yang文件及其pom.xml

在文件夹xptest\src\main\yang下定义xptest.yang

  module xptest {yang-version 1;namespace"http://startsky.com/ns/xptest";prefix xps;organization "xpstudio Netconf Central";contact"xinping <xpzh@sohu.com>";description"YANG version of the xptest-MIB.";revision "2014-10-3" {description"xptest module in progress.";}typedef DispString {type string {length "0 .. 255";}description"YANG version of the SMIv2 DisplayString TEXTUAL-CONVENTION.";reference"RFC 2579, section 2.";}container xptester {leaf name {type string;}leaf age {type uint32;default 99;}leaf homeaddress {type string;}}  // container toasterrpc make-order {input {leaf name {type string;}leaf days {type uint32;default 1;}}output {leaf name {type string;}leaf orderno {type uint32;}}}  // make-orderrpc cancel-order {input {leaf orderno {type uint32;}}output {leaf name {type string;}leaf order-status {type enumeration {enum "success" {value 1;}enum "fail" {value 2;}}}}}  // cancel-order}  // module xptest

定义yang的pom.xml,在xptest下定义pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.opendaylight.controller.samples</groupId><artifactId>sal-samples</artifactId><version>1.2.0-SNAPSHOT</version></parent><artifactId>sample-xptest</artifactId><packaging>bundle</packaging><dependencies><dependency><groupId>org.opendaylight.yangtools</groupId><artifactId>yang-binding</artifactId></dependency><dependency><groupId>org.opendaylight.yangtools</groupId><artifactId>yang-common</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.opendaylight.yangtools</groupId><artifactId>yang-maven-plugin</artifactId><dependencies><dependency><groupId>org.opendaylight.yangtools</groupId><artifactId>maven-sal-api-gen-plugin</artifactId><version>${yangtools.version}</version><type>jar</type></dependency></dependencies><executions><execution><goals><goal>generate-sources</goal></goals><configuration><yangFilesRootDir>src/main/yang</yangFilesRootDir><codeGenerators><generator><codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass><outputBaseDir>${salGeneratorPath}</outputBaseDir></generator></codeGenerators><inspectDependencies>true</inspectDependencies></configuration></execution></executions></plugin></plugins></build><scm><connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection><developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection><tag>HEAD</tag><url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL</url></scm>
</project>

上面yang文件定义了两个rpc。

执行mvn install编译xptest.yang. 会产生一个rpc服务XptestService 接口。当中两个方法相应两个rpc 函数。

第二步:定义rpc的实现文件XpTestProvider及其Activator

该project定义为xpprovider。

rpc实现类XpTestProvider

package org.opendaylight.controller.xptest.impl;import java.io.File;
import java.util.concurrent.Future;//import org.opendaylight.controller.xptest.Activator;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.CancelOrderInput;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.CancelOrderOutput;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.CancelOrderOutput.OrderStatus;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.CancelOrderOutputBuilder;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.MakeOrderInput;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.MakeOrderOutput;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.MakeOrderOutputBuilder;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.XptestService;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.google.common.util.concurrent.Futures;public class XpTestProvider implements XptestService {private final static Logger LOG = LoggerFactory.getLogger(XpTestProvider.class);@Overridepublic Future<RpcResult<CancelOrderOutput>> cancelOrder(CancelOrderInput input) {// TODO Auto-generated method stubRpcResult<CancelOrderOutput> ret=null;if(input.getOrderno() >10){ret=RpcResultBuilder.<CancelOrderOutput>failed().withError( ErrorType.APPLICATION, "resource-denied","days > 10,failed!!" ).build();}else {CancelOrderOutputBuilder builder=new CancelOrderOutputBuilder();builder.setName("name"+input.getOrderno());builder.setOrderStatus(OrderStatus.Success);ret=RpcResultBuilder.<CancelOrderOutput>success(builder.build()).build();}return Futures.immediateFuture(ret);}@Overridepublic Future<RpcResult<MakeOrderOutput>> makeOrder(MakeOrderInput input) {// TODO Auto-generated method stubRpcResult<MakeOrderOutput> ret=null;LOG.info( "user.dir "+System.getProperty("user.dir"));File directory = new File("");//设定为当前目录try{LOG.info("std: "+directory.getCanonicalPath());//获取标准的路径LOG.info("abs: "+directory.getAbsolutePath());//获取绝对路径}catch(Exception e){}if(input.getDays()>10){ret=RpcResultBuilder.<MakeOrderOutput>failed().withError( ErrorType.APPLICATION, "resource-denied","days > 10,failed!!" ).build();}else {MakeOrderOutputBuilder builder=new MakeOrderOutputBuilder();builder.setName(input.getName());builder.setOrderno((long) 112233);ret=RpcResultBuilder.<MakeOrderOutput>success(builder.build()).build();}return Futures.immediateFuture(ret);}}

实现插件入口类Activator,顺便实现命令行接口,能够自己定义命令行測试命令。

/*** Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.** This program and the accompanying materials are made available under the* terms of the Eclipse Public License v1.0 which accompanies this distribution,* and is available at http://www.eclipse.org/legal/epl-v10.html*/
package org.opendaylight.controller.xptest;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.xptest.impl.XpTestProvider;
import org.opendaylight.yang.gen.v1.http.startsky.com.ns.xptest.rev141003.XptestService;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Forwarding Rules Manager Activator** Activator {@link ForwardingRulesManager}.* It registers all listeners (DataChangeEvent, ReconcilNotification)* in the Session Initialization phase.** @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>* **/
public class Activator extends AbstractBindingAwareProviderimplements CommandProvider {private final static Logger LOG = LoggerFactory.getLogger(Activator.class);@Overridepublic void onSessionInitiated(ProviderContext session) {LOG.info("FRMActivator initialization.");try {//           final DataBroker dataBroker = session.getSALService(DataBroker.class);
//            this.manager = new ForwardingRulesManagerImpl(dataBroker, session);
//            this.manager.start();XpTestProvider rpcins=new XpTestProvider();session.addRpcImplementation(XptestService.class,rpcins);LOG.info("FRMActivator initialization successfull.");}catch (Exception e) {LOG.error("Unexpected error by FRM initialization!", e);this.stopImpl(null);}}@Overrideprotected void startImpl(BundleContext context) {// TODO Auto-generated method stubsuper.startImpl(context);context.registerService(CommandProvider.class.getName(),this, null);}@Overrideprotected void stopImpl(final BundleContext context) {/*    if (manager != null) {try {manager.close();} catch (Exception e) {LOG.error("Unexpected error by stopping FRMActivator", e);}manager = null;}*/LOG.info("FRMActivator stopped.");}public void _gettpsbyne(CommandInterpreter ci) {ci.println("gettpsbyne:" + ci.nextArgument());}@Overridepublic String getHelp() {return "\tgettpsbyne neid– say what you input\n";}}

xpprovider的pom.xml文件。

<?xml version="1.0" encoding="UTF-8"?

> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>   <parent>     <groupId>org.opendaylight.controller.samples</groupId>     <artifactId>sal-samples</artifactId>     <version>1.2.0-SNAPSHOT</version>   </parent> <artifactId>sample-xptest-provider</artifactId> <packaging>bundle</packaging> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>sample-xptest</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>equinoxSDK381</groupId> <artifactId>org.eclipse.osgi</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>config-api</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-api</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-config</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-common-util</artifactId> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </dependency> <!-- dependencies to use AbstractDataBrokerTest --> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-broker-impl</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-broker-impl</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <artifactId>junit</artifactId> <groupId>junit</groupId> <scope>test</scope> </dependency> <!-- used to mock up classes --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-api</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller.model</groupId> <artifactId>model-flow-service</artifactId> </dependency> <dependency> <groupId>org.opendaylight.yangtools</groupId> <artifactId>yang-common</artifactId> </dependency> <dependency> <groupId>org.opendaylight.controller</groupId> <artifactId>sal-binding-broker-impl</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Bundle-Activator>org.opendaylight.controller.xptest.Activator</Bundle-Activator> </instructions> </configuration> </plugin> </plugins> </build> <scm> <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection> <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection> <tag>HEAD</tag> <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL</url> </scm> </project>

执行mvn install 编译,之后把这两个jar包复制到odl的plugins文件夹下,最好执行odl准备。

第三步:进行測试。

执行run.bat,启动odl,在restclient中执行以下測试用例。

能够做restclient的工具有chrome插件postman,firefox的restclient,网上还有个单独jar包restclient.

HTTP Method => POST
URL => http://localhost:8080/restconf/operations/xptest:make-order
Header => Content-Type: application/yang.data+json  
Body =>  
{
  "input" :
  {
     "xptest:name" : "3","xptest:days":3
  }
}

能够看到返回xml数据, response header

  1. Status Code: 200 OK
  2. Content-Type: application/xml
  3. Date: Wed, 08 Oct 2014 12:43:29 GMT
  4. Server: Apache-Coyote/1.1
  5. Transfer-Encoding: chunked

response body

<?

xml version="1.0" encoding="UTF-8" standalone="no"?> <output xmlns="http://startsky.com/ns/xptest"> <name>3</name> <orderno>112233</orderno> </output>

假设header中加accept:application/yang.data+json,将返回json数据。

按上面代码中意图能够构造失败測试用例。

希望本文对odl有兴趣的人,可以给予帮助。

在odl中怎样实现rpc相关推荐

  1. ODL中RPC接口的restconf化原理

    在ODL的使用过程, 一直疑惑他是如何将YAGN文件定义的RPC映射成restconf接口.换句话说,即restconf接口是如何对应指定的RCP的. 原理介绍 下面针以RPC GetConfigLe ...

  2. php中流行的rpc框架有哪些?

    什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如 ...

  3. PHP 中流行的 rpc 框架有哪些

    目录 PHP 中流行的 rpc 框架有哪些 第1章 什么是rpc框架 1.1 什么是 RPC 框架 1.2 那什么是远程调用? 第2章 RPC与Socket有什么区别 第3章 RPC与REST有什么区 ...

  4. rpc是什么?php中流行的rpc框架有哪些?

    什么是rpc框架 先回答第一个问题:什么是RPC框架?如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这 ...

  5. [转]php中流行的rpc框架有哪些?

    什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如 ...

  6. RPC是什么?RPC与REST、Socket的区别?php中流行的rpc框架有哪些?

    RPC是什么?RPC与REST.Socket的区别?php中流行的RPC框架有哪些? 什么是RPC框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote P ...

  7. IPC 中 LPC、RPC 的区别和联系

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间 ...

  8. Linux中配置Aria2 RPC Server

    启动Aria2 RPC Server 直接在终端中执行aria2c --enable-rpc --rpc-allow-origin-all可直接开启RPC服务. 这种方法并不能进行个性化的参数设置,需 ...

  9. 区块链中“鸡肋”的RPC漏洞

    一.前言--NEO RPC漏洞之争 12月1日下午16:34,腾讯湛卢实验室宣布发现NEO的RPC漏洞.官微发文如下: 而NEO官方微博,在四个小时之后迅速回应腾讯,回应如下. 谁对谁错?公链RPC模 ...

  10. 替代GDA中的获取rpc函数poDataset->GetMetadata(“RPC“)

    使用gdal获取经纬度可以通过API this->poDataset->GetMetadata("RPC")来自动实现定位rpc文件,并且将内容读入到char** pa ...

最新文章

  1. wordpress评论插件:多说
  2. 超级直播sop直播源.zip_双11首场虚拟直播,天猫超级直播开创直播新玩法
  3. oracle删除表中数据_Excel工作表中,删除重复数据的2种方法解读,高效且实用!...
  4. Redis为什么是单线程还这么快?
  5. Javascript弹出对话框 确定取消转到不同页面
  6. 德芙网络营销策略ppt_德芙网络营销方案
  7. Egret 之 消除游戏 开发 PART 6 Egret elimination game development PART 6
  8. edittext禁止换行符但能自动换行简书_利用 subfinder 让群辉 NAS 实现自动下载字幕...
  9. PHP文件中定义加载资源文件
  10. 基于springboot的社团管理系统
  11. 数字信号处理实验二 IIR数字滤波器设计及软件实现
  12. 基于PaddleX实现电梯电瓶车检测
  13. 信链可信存证平台CCDP
  14. ISO8583包简介和源代码
  15. Spark中Map和Json字符串相互转换
  16. CPP2022-16-宏、函数重载与函数模板
  17. 三年是程序员的一个坎
  18. C语言的 字符串 和 字节串 互转
  19. [转]英文中的偏旁部首及其记忆
  20. vue手脚架配置请求头

热门文章

  1. 常用测速网站及工具(IPv4/IPv6)
  2. 规范的计算机网络规模分类,就计算机网络按规模分类而言,下列说法中规范的是( )。...
  3. 体育用品商城小程序开发功能
  4. discuz自定义模板制作
  5. 图解css3:核心技术与案例实战. 导读
  6. linux学习资料(转帖收藏)
  7. dw可以编辑java吗_用dreamweaver开发ASP图文教程。(修改资料篇)
  8. Window10笔记本电脑如何更改默认浏览器
  9. 基于安卓Android平台的数独游戏的开发
  10. html 图片垂直边距,HTML,CSS和垂直文本边距