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

此文章承接ONOS编程系列(一) Application Tutorial ,如果尚未看过上一篇,请先看完上一篇,再回过头来看此篇。
本文章的目的在于让读者明白:

  • 如何将新建的application扩展为新的服务,以便其他服务或者应用可以调用它
  • 如何将该application的功能扩展为Karaf命令行界面下的一个新命令

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

项目架构

ONOS编程系列(二)图1

一、扩展为服务

1.1 定义服务接口

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

ONOS编程系列(二)图2
ONOS编程系列(二)图3

1.2 导入服务接口

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

ONOS编程系列(二)图4

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

ONOS编程系列(二)图5

1.3 实现该服务接口

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

ONOS编程系列(二)图6
ONOS编程系列(二)图7

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

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

二、创建karaf的一个新命令

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

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

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

2.1 新建一个command类

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

  • @Command 该注解用来设置命令的名字,作用范围以及功能描述
  • @Argument 该注解用来指定命令的参数

该文件内容如下:

ONOS编程系列(二)图8

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

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

ONOS编程系列(二)图9

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

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

ONOS编程系列(二)图10

三、验证

3.1 重编译,重启动ONOS

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

ONOS编程系列(二)图11

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

ONOS编程系列(二)图12

3.2 启动Mininet,构建测试网络

新开一个命令行界面,在此界面下开启mininet(默认是本地启动,所以ip是127.0.0.1):
sudomn --topo=tree,2,2 --controller=remote,ip=127.0.0.1 --mac
此时,在ONOS界面下可以看到四个终端,三个交换机:

ONOS编程系列(二)图13

3.3 测试命令行

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

ONOS编程系列(二)图14

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

ONOS编程系列(二)图15

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

ONOS编程系列(二)图16

问题一

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

ONOS编程系列(二)图17

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

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

问题二

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

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

ONOS编程系列(二)图18

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

注:此文章由OpenDaylight[194240432]@北京-石头提供,感谢他的投稿,有任何疑问或建议可以与他共同探讨!


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/10712.html
分享到:
相关文章
条评论

登录后才可以评论

北京石头 发表于15-04-21
1