在odl中怎样实现rpc
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
- Status Code: 200 OK
- Content-Type: application/xml
- Date: Wed, 08 Oct 2014 12:43:29 GMT
- Server: Apache-Coyote/1.1
- 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相关推荐
- ODL中RPC接口的restconf化原理
在ODL的使用过程, 一直疑惑他是如何将YAGN文件定义的RPC映射成restconf接口.换句话说,即restconf接口是如何对应指定的RCP的. 原理介绍 下面针以RPC GetConfigLe ...
- php中流行的rpc框架有哪些?
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如 ...
- PHP 中流行的 rpc 框架有哪些
目录 PHP 中流行的 rpc 框架有哪些 第1章 什么是rpc框架 1.1 什么是 RPC 框架 1.2 那什么是远程调用? 第2章 RPC与Socket有什么区别 第3章 RPC与REST有什么区 ...
- rpc是什么?php中流行的rpc框架有哪些?
什么是rpc框架 先回答第一个问题:什么是RPC框架?如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这 ...
- [转]php中流行的rpc框架有哪些?
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如 ...
- RPC是什么?RPC与REST、Socket的区别?php中流行的rpc框架有哪些?
RPC是什么?RPC与REST.Socket的区别?php中流行的RPC框架有哪些? 什么是RPC框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote P ...
- IPC 中 LPC、RPC 的区别和联系
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间 ...
- Linux中配置Aria2 RPC Server
启动Aria2 RPC Server 直接在终端中执行aria2c --enable-rpc --rpc-allow-origin-all可直接开启RPC服务. 这种方法并不能进行个性化的参数设置,需 ...
- 区块链中“鸡肋”的RPC漏洞
一.前言--NEO RPC漏洞之争 12月1日下午16:34,腾讯湛卢实验室宣布发现NEO的RPC漏洞.官微发文如下: 而NEO官方微博,在四个小时之后迅速回应腾讯,回应如下. 谁对谁错?公链RPC模 ...
- 替代GDA中的获取rpc函数poDataset->GetMetadata(“RPC“)
使用gdal获取经纬度可以通过API this->poDataset->GetMetadata("RPC")来自动实现定位rpc文件,并且将内容读入到char** pa ...
最新文章
- wordpress评论插件:多说
- 超级直播sop直播源.zip_双11首场虚拟直播,天猫超级直播开创直播新玩法
- oracle删除表中数据_Excel工作表中,删除重复数据的2种方法解读,高效且实用!...
- Redis为什么是单线程还这么快?
- Javascript弹出对话框 确定取消转到不同页面
- 德芙网络营销策略ppt_德芙网络营销方案
- Egret 之 消除游戏 开发 PART 6 Egret elimination game development PART 6
- edittext禁止换行符但能自动换行简书_利用 subfinder 让群辉 NAS 实现自动下载字幕...
- PHP文件中定义加载资源文件
- 基于springboot的社团管理系统
- 数字信号处理实验二 IIR数字滤波器设计及软件实现
- 基于PaddleX实现电梯电瓶车检测
- 信链可信存证平台CCDP
- ISO8583包简介和源代码
- Spark中Map和Json字符串相互转换
- CPP2022-16-宏、函数重载与函数模板
- 三年是程序员的一个坎
- C语言的 字符串 和 字节串 互转
- [转]英文中的偏旁部首及其记忆
- vue手脚架配置请求头
热门文章
- 常用测速网站及工具(IPv4/IPv6)
- 规范的计算机网络规模分类,就计算机网络按规模分类而言,下列说法中规范的是( )。...
- 体育用品商城小程序开发功能
- discuz自定义模板制作
- 图解css3:核心技术与案例实战. 导读
- linux学习资料(转帖收藏)
- dw可以编辑java吗_用dreamweaver开发ASP图文教程。(修改资料篇)
- Window10笔记本电脑如何更改默认浏览器
- 基于安卓Android平台的数独游戏的开发
- html 图片垂直边距,HTML,CSS和垂直文本边距