ONOS编程系列(二)命令行命令与服务开发

此文章承接ONOS编程系列(一) Application Tutorial ,如果尚未看过上一篇,请先看完上一篇,再回过头来看此篇。

本文章的目的在于让读者明白:

1)如何将新建的application扩展为新的服务,以便其他服务或者应用可以调用它

2)如何将该application的功能扩展为Karaf命令行界面下的一个新命令

我们假设你已经安装并且能初步掌握Mininet,因为后面的测试工作需要用到它。

项目架构

一、扩展为服务

1.1 定义服务接口

首先,在onos-api包下定义一个新的服务的接口,该包目录是${ONOS_ROOT}/core/api/src/main/java/org/onosproject/net/。在此目录下,创建一个新文件夹apps/,作为新接口的位置。接口文件放在此处的意义在于只有这样cli的包才能访问到它,而cli包正是实现命令行命令的包。

1.2 导入服务接口

接下来,我们会在IntentReactiveForwarding文件中实现该服务接口。

在本教程中我们用不到该应用生成的服务,不过如果要调用该服务,只需要这样既可:

1.3 实现该服务接口

要实现该服务接口,我们向类IntentReactiveForwarding增加了新的Map,endPoints成员变量。Map成员在process()方法中用来存储HostService提供的终端信息。

现在,一个引用了ForwardingMapService的模块就可以通过调用getEndPoints()方法获取能够双向通信的终端列表了,这些终端上都安装了本模块的intents。

接下来,创建一个新的Karaf CLI命令来使用这个新的服务。该命令的动能是列出map的内容,并且可选地提供一个过滤参数,来过滤主机源的地址。

二、创建karaf的一个新命令

Karaf CLI命令定义在项目目录${ONOS_ROOT}/cli/之下。有两种类型的命令,分别在不同的目录下:

1)${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli 系统配置与监视相关的命令所在目录

2)${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli/net 网络配置与监视相关的命令所在目录

我们要建立的命令要显示网络相关的信息,所以我们要在第二个目录下增加我们的command类。

2.1 新建一个command类

在第二个目录下,创建一个名为ForwardingMapCommand的类文件。该类是AbstractShellCommand的子类,在类中要使用命令相关的一些注解:

1)@Command 该注解用来设置命令的名字,作用范围以及功能描述

2)@Argument 该注解用来指定命令的参数

该文件内容如下:

2.2 建立command类与新服务的关系

接下来,要实现该类继承自接口的方法execute(),以实现相关功能。本例功能比较简单,就是向之前生成的新服务请求终端map的信息,如果命令带参数,则做一层过滤。代码实现如下:

2.3 注册这个command,使其能在karaf CLI下使用

接下来,我们需要编辑shell-config.xml文件,该文件位于${ONOS_ROOT}/cli/src/main/resources/OSGI-INF/blueprint/,其作用是告诉karaf有新的命令加入了。编辑格式是在里面填上我们的命令的相关信息:

三、验证

3.1 重编译,重启动ONOS

一切修改完毕之后,进入onos根目录重新编译,编译成功之后运行onos:

进入欢迎界面之后,可以键入“fwdmap --help”查看我们新建命令的描述:

3.2 启动Mininet,构建测试网络

新开一个命令行界面,在此界面下开启mininet(默认是本地启动,所以ip是127.0.0.1):

sudomn --topo=tree,2,2 --controller=remote,ip=127.0.0.1 --mac

此时,在ONOS界面下可以看到四个终端,三个交换机:

3.3 测试命令行

键入fwdmap,可以看到没有什么结果返回,因为这个时候网络中的主机之间还没有进行通信呢。

切换到mininet控制界面,键入pingall,执行一次主机间的通信。

然后再切换回onos命令行,再次键入fwdmap命令:

问题一

在onos命令行下键入fwdmap,如果出现以下结果:

就要回头看看IntentReactiveForwarding类前面有没有加@Service注解了。

如果注解没问题,那么就有可能是当前并没有安装ifwd模块。用命令“feature:list -i | grepifwd”查看当前是否安装了ifwd模块,如果返回结果为空,则要手动安装一下:feature:installonos-app-ifwd 。

问题二

在用mininet命令行下pingall以后,再次在onos下键入fwdma,如果还没有任何输出,可能就是源代码哪里又出了问题。

我下载到源代码以后,切换版本到了onos-1.1,该版本下,本来就是有一个ifwd的项目的,不过比教程里的东西要少一些。在手动敲入代码的时候,我大致略过了已有的代码,但是注意,教程里的代码并非完全在原有代码基础上进行的增加,在IntentReactiveForwarding文件中,函数setUpConnectivity中,红框框住的部分是原有的部分,蓝框框住的部分是教程中的部分,可以看到,两者还是有一点区别的:

解决这个问题以后,再次走一遍流程,应该就能看到结果了吧。

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2016-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Redis Cluster流程原理

Redis 3.0之后,节点之间通过去中心化的方式,提供了完整的sharding、replication(复制机制仍使用原有机制,并且具备感知主备的能力)、fa...

1702
来自专栏linux运维学习

linux学习第六篇:相对,绝对路径、cd命令、创建删除目录以及rm命令

绝对路径和相对路径 绝对路径:从根开始的 相对路径:相对当前你所在位置的路径,不是以根开头的。 pwd:查看当然所在的路径 cd 命令 cd - :回到上一次的...

1938
来自专栏崔庆才的专栏

内网主机从外面连接不了?SSH反向隧道来帮你!

3765
来自专栏菩提树下的杨过

VMware Fusion 中如何复制centos/linux虚拟机

今天想在mac本上,弄几个centos的虚拟机,尝试搭建hadoop的全分布环境。一台台虚拟机安装过去太麻烦了,想直接将现有的centos虚拟机复制几份完事,但...

2777
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和配置Naxsi

Naxsi是第三方Nginx模块,提供Web应用程序防火墙功能。它为您的Web服务器带来了额外的安全性,并保护您的服务器免受各种Web攻击,如XSS和SQL的注...

2000
来自专栏Fish

使用cuda-gdb调试cu程序

简要教程 仿佛对于.cu程序的调试是需要关闭x的,所以学习了一下如何用cuda-gdb在tty下调试.cu程序. 1. 对于.cu文件是需要编译好才能调试...

3536
来自专栏JavaEdge

./configure、make、make install 命令详解一、基本信息二、详细解释

3948
来自专栏张戈的专栏

Llinux文件目录权限及chmod命令简析

这些天,在互推联盟群(344134224 )遇到几例关于 WP 升级失败以及 FTP 账号登陆的问题。最终发现都是主机的目录权限设置存在问题。比如,博友【PPT...

4566
来自专栏漏斗社区

仰望PHPSHE1.5漏洞

背景 最近拿到PHPSHE 1.5的源码进行了审计,于是撰写了本篇,把一些问题发出来,多处SQL注入,任意文件删除,host头部攻击进行讨论,如 host位置的...

3889
来自专栏我的技术笔记

在Ubuntu 14.04上安装GitLab(Trusty Tahr)

GitLab是一个基于Ruby on Rails的免费git存储库管理应用程序。假如您想托管自己的git存储库,这是一个很好的替代方案,因为在编写私有代码或则闭...

2081

扫码关注云+社区

领取腾讯云代金券