ONOS编程系列(一)之简单应用开发

一个ONOS application是使用maven做管理的OSGi bundle。 因此,ONOS application 可以归结为Java类和POM文件的集合。本教程以基于intent的交互式转发application为例,讨论了如何从零开始建立一个新应用。
本教程假设读者已经具备ONOS的运行经验,能够熟练启动ONOS实例。有关ONOS的启动不做过多描述。如果出现启动上的问题,请移步官方wiki文档自行寻找答案。
本文章结束后,你应该学会:

  • 应用的组织与结构;
  • 如何在多个服务中注册你的应用;
  • 北向API的基本应用;
  • 如何运行一个应用。

一、在Eclipse中导入工程

直接按照maven项目导入就可以,详情请见ONOS环境部署

1.1 注意

在ONOS项目中,对代码有着格式上的一些要求,不管是正式代码,还是测试用例。请根据要求修改增加代码的格式。
如果想要跳过代码checkstyle,可以在onos项目根目录下的pom。xml文件中,注释掉关于checkstyle的plugin:

关于checkstyle的plugin

不过非常不建议这样做。最好的方法还是按照官方的要求,进行编程。关于代码格式检查,如果使用的是Eclipse,可以配置checkstyle进行检查:
一路点击eclipse-->help-->Eclipse Marketplace,进入界面:

Eclipse Marketplace,进入界面

在输入框里输入“checkstyle”,然后选择框住的那个插件进行傻瓜式安装,就是一路next。这个过程很有可能会报错,Eclipse提示找不到下载网址。如果这种情况,可在http://eclipse-cs.sourceforge.net/update/这个地方下载,在本地安装就可以了。
安装好以后,在window-->preference弹出的界面里就能看到checkstyle的选项了。单击该选项,右面出现相关界面:

单击该选项,右面出现相关界面

然后点击NEW按钮,增加一个checkstyle文件,在本地ONOS工程里找到onos自己的checkstyle文件,别忘记起个名字。

本地ONOS工程里找到onos自己的checkstyle文件,别忘记起个名字

然后就能在checkstyle文件列表里看到刚刚新添加的文件了。我给它的命名是ONOS。接下来选中该项,点击右边的“Set as Default”,再点击OK,就大功告成了。

点击右边的“Set as Default”

后面再新加的文件任意处右键,就能在菜单列表里看到checkstyle的选项了。只需要点击“Check Code with Checkstyle”,就能检查本文件的代码格式是否符合onos的要求了。

二、项目骨架

项目骨架

2.1 设置项目的目录结构

应用的根目录设置在apps/之下:

应用的源文件定义在src/main/java/之下:

类似的,测试文件定义在src/test/java/之下:

2.2 添加并编辑pom文件

在应用的根目录/apps/ifwd/下编辑pom文件:

在应用的根目录apps ifwd下编辑pom文件

在本例中,应用的名字是onos-app-ifwd。在启动karaf/ONOS命令行界面以后,直接用feature:install加上名字,即可安装此应用。
然后,编辑apps/pom.xml,在文件中以形式包含该项目:

编辑apps pom.xml,在文件中以 module 形式包含该项目

2.3 在karaf中注册该应用

Karaf在运行时若要部署该应用module,需要名为feature.xml的描述性文件,编辑 ${ONOS_ROOT}/features/features.xml:

需要名为feature.xml的描述性文件

三、完成项目代码

该应用的核心是名为 IntentReactiveForwarding.java的文件,被定义在${ONOS_ROOT}/apps/ src/main/java/org/onosproject/ifwd/ 里。
为了便于对文档进行注释,在main/java/下需要添加一个package-info.java文件,其包含一下内容:

为了便于对文档进行注释,在main java 下需要添加一个package info

一般IDE会提供生成这个文件的选项。Eclipse在新建包的时候会提供该选项:

eclipse在新建包的时候会提供该选项

剩下的部分将会描述如何编辑IntentReactiveForwarding类。

3.1 注册Karaf,使其自动加载

karaf的模块加载机制需要几个annotations,即注解,去注册。可用的注解尤其是以下四个尤为重要:

  • @Component(immediate = true) - declares a class as a component to activate, and forces immediate activation;
  • @Activate - marks a method as the method to call during the component startup routine;
  • @Deactivate - marks a method as the method to call during component shutdown;
  • @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - Marks a service as an application's dependency,and requires one instance of such a service to be loaded before this application's activation.
可用的注解可见

3.2 注册服务

接下来,我们的应用必须使用CoreService注册一个独一无二的application ID,这样才能够使该应用正常使用ONOS的其他服务。我们的应用接下来还要使用PacketService监听PacketIn和PacketOut事件。而PacketService需要一个事件处理器的类,该类用途单一,通常写在其所属类的内部,成为其私有内部类:

通常写在其所属类的内部,成为其私有内部类

3.3 增加包处理代码

在上一步的私有内部类ReactivePacketProcessor里,要覆写扩展自接口PacketProcessor的方法process()。每当有网络包进来的时候,PacketService都会调用一下process()函数。这意味着我们可以在这个方法里定义我们自己的包转发行为:

在这个方法里定义我们自己的包转发行为

接下来我们要实现上图中用到的三个方法,注意,这些方法定义在私有内部类的外面,是IntentReactiveForwarding的成员:

IntentReactiveForwarding的成员

3.4 编译该应用

进入ONOS根目录,键入“mvn clean install”,等待编译结果。
这个时候通常的结果就是BUILD SUCCESS。

结果就是BUILD SUCCESS

当前最有可能遇到的问题,就是checkstyle的时候出现了错误,实在不想改代码了,可以直接注释掉checkstyle的plugin。

3.5 启动该应用

启动分为动态启动与静态启动:
动态启动就是用karaf clean命令启动onos之后,在onos命令行下键入feature:installonos-app-ifwd命令安装该应用。
静态启动就是修改karaf的启动配置文件。该文件路径为${KARAF_ROOT}/etc/org.apache.karaf.features.cfg,直接将onos-app-ifwd字样缀到featuresBoot变量的尾部即可。
启动并加载该应用以后,可已键入:

命令查看是否已安装该应用。
该应用安装以后,并不能对其做什么操作,也无法看到它的运行情况,这时我们就需要将该应用扩展为一种服务,以便于其它服务或者应用与其交互,并且需要新建一条karaf的命令,用于展示当前应用的相关信息与状态。

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


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

登录后才可以评论

北京石头 发表于15-04-17
2