前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ONOS编程系列(二)命令行命令与服务开发

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

作者头像
SDNLAB
发布2018-04-02 15:40:25
1.7K0
发布2018-04-02 15:40:25
举报
文章被收录于专栏:SDNLAB

此文章承接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中,红框框住的部分是原有的部分,蓝框框住的部分是教程中的部分,可以看到,两者还是有一点区别的:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SDNLAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档