ONOS 实战分享(一):项目建立、调试到热部署


以上是ONOS的架构图,相信大家已经熟记于心了

本文将在Distributed Core Tier,以开发一个控制器内的模块为例,带领大家从项目的建立,导入IDE,编译构建,热部署,在线调试,最后到热迭代,走过一个项目的开发流程。

对于实现模块具体功能的介绍内容,请阅读我的后续文章。本文尽量不介绍Maven及其pom、OSGI、Karaf的内容,这些不是ONOS特有的,但需要朋友们对它们是什么、有什么作用,有个大致的了解,所以请大家Google之。

文中将会随时插入一些我在实践中遇到的棘手问题,和实践中需要注意的points。

希望本文能够给ONOS的入门开发者朋友们一些启发。

(0)Hello, ONOS!

我参考官方Wiki搭建了ONOS环境,在此附几张图,让大家快速了解一下本文介绍的系统环境基础。

本文采用官方Git中的master分支,1.4.0-SNAPSHOT版本,2015.11.04下载,1.3.0以及更新的临近版本应该都不会有问题。

官方Wiki:Installing and Running ONOS

按照官方一步步做,我印象中就不会遇到什么卡壳的问题,除了Download一些Maven 库的时候,是比较拼网络的,如果出问题,也可以考虑改用一些国内的Maven镜像站,祝大家顺利。

Karaf、Maven:

ONOS:
为了Eclipse工程方便,目前放在workspace下,仅作为后文介绍的“路径”前提。

ONOS主目录:(target目录在编译后才有)

ONOS apps目录:运作在Distributed Core Tier的模块,多数都在这,我们将要一起开发的模块也在此。(target目录在编译后才有)

(1)项目建立

应该是从ONOS 1.3版本开始,官方提供了一个脚本,用于项目建立的便利,我先带大家一起来使用,文末再给大家看看内容。

就是这个脚本,让我们开始!

在某个不含pom.xml文件的目录下,执行onos-create-app,要等一段时间,才会出现命令行里的最后那一句:

这里我们输入试验使用的信息,依次如下:

这里有个我尚未理解的现象:
如果groupId不是以“org.onosproject”为前缀的;Version如果跟ONOS的版本1.4.0-SNAPSHOT不一样的。后续的编译完的部署会不太一样,后续“热部署”章节会告诉大家如何解决。

如果groupId不是以“org.onosproject”为前缀,解决后但仍不太理想,特别是当模块往复杂里做的时候。如果没有特殊需要的话,推荐大家按照这个前缀来。

That’s good!

我们刚刚构建了一个这样的目录结构:

生成了三个文件:
pom.xml – Maven项目文件
AppComponent.java – 模块文件
AppComponentTest.java – Maven构建模块时,用于测试模块的文件

自动生成的AppComponent.java可以删除,换成我们自己的文件就好,本文暂且使用它。AppComponentTest.java可以在构建模块时,通过参数 –DskipTests 跳过测试,我暂时还没有掌握怎么改写它,暂不改动,大家也可以予以删除。不过如果大家要开发作为正式使用的模块,还是要学习一下如何编写它比较好。

推荐大家此时,把整个SDNLAB-Demo移动到onos/apps/目录下,最外层的SDNLAB-Demo文件夹删除,最后如下:

接下来,我们需要修改pom.xml文件:
如图,解除注释,输入我们想要的信息,如下:

红箭头No.1,模块的基本信息
红箭头No.2,模块的描述信息
红箭头No.3,应用名和开发者组织名称

然后打开apps目录下其他任意一个模块的pom.xml文件,从中复制 段的信息,贴到我们的pom里面来:

最后,打开apps目录下的pom,加入我们模块的信息,这样前后的从属关系就建立好了:

项目建立到此完成,感兴趣的朋友可以去瞧一瞧实现功能的AppComponent.java哦!

(2)导入IDE

JAVA开发需要导入一大堆的包,虽说我们应该记住一些常用的包名,但实际工程中还是让IDE来帮我们做这些繁琐的工作吧,Let’s Go!(我们以Eclipse为例,IDEA请稍候)

注:需要首先把整个ONOS源代码导入进Eclipse中,在此也不赘述了,参照官网Wiki:Development Environment Setup 如果遇到问题,可以Google、Wiki或到ONOS群里交流哈,比如:454644351

好的,不急着做,我们先来看看成功导入ONOS之后,大致是个什么样:

感觉跟IDEA比起来,项目聚合得不是很好,让我们开始导入吧:


咱们的模块已经导入成功,右侧就是最简单的一个模块代码哦!如何开发模块的功能,可翻看我后续的文章,初步的了解可参考SDNLAB文章:ONOS编程系列(一)之简单应用开发

(3)编译构建项目

在这给大家介绍两种方式,Terminal方式、IDE方式,我推荐大家用Terminal方式,编译完直接就可以敲命令部署进ONOS。

1.Terminal方式:

在模块主目录下,执行:

Clean,清除旧的构建结果;
Install,构建新的模块;
-DskipTests,跳过构建完成后的测试步骤,debug阶段暂且跳过吧:

2.IDE方式:


构建完成!我们刚才构建完以后,发生了哪些变化呢:

1)模块目录下多了target文件夹,.oar文件就是我们的ONOS应用模块文件:

oar文件可单独、直接用于模块的远程热部署

2)项目被安装到本地Maven仓库,信息同时加入仓库的repository.xml文件:



(4)ONOS模块热部署

onos-karaf 启动ONOS,可以看到模块已经装载进ONOS了,但是没有启动。

By the way,我们模块名称是SDNLAB-Demo

这里有个疑问尚未解决,如果version设置得跟当前ONOS的不一样,即不是1.4.0-SNAPSHOT,那么这里将不会默认将模块从本地Maven库中装载进来,可能是因为在Karaf的配置文件中,onosproject只是写了1.4.0***的部分吧?

我跟踪了Karaf的启动过程,多次尝试改动,摸索了一段时间,还是没能弄清楚缘由,还请了解的朋友们指教,非常感谢!如下:

而且在项目构建的时候,如果使用的是其他version,会额外下载相应版本的依赖文件,虽然下载不成功只是warning,模块也能工作,但不知道会有什么副作用。

如果写好的模块要“热部署”到远端,或者是模块没有被默认装载,则命令没有任何回显,如下:

进入oar文件所在目录,一条命令onos-app,完成远程安装模块:

可以看到,我们应用的全名是“org.onosproject.Mao.SDNLAB-Demo”,我们后续更新迭代、启动/停止模块都需要用到它。

第二条命令,完成远程启动模块:

再次查看,可以发现我们的模块已经成功装载,并且启动!

(5)ONOS在线调试

这是让我觉得很有趣的地方,原以为这样的大框架系统只能通过日志或命令行print来调试呢,这真是太棒了!

用 onos-karaf debug 来启动ONOS,会开启5005远程调试端口:

启动 Eclipse或IDEA,看资料感觉IDEA在调ONOS上有更多便利,正考虑转移,现以Eclipse为例,IDEA类似但是会方便点。

配置远程调试,一张图搞定:

我们在模块加载入口函数中设定断点,开始调试,ONOS的线程池也是美美的

由于模块已经是active,为了触发这个断点,我们将它关了再开一次。看,ONOS已经卡住了:

看!Karaf console控制台线程正在执行我们的模块加载函数,我们唯一的内部变量已显示,断点卡在了即将写日志的地方。

小伙伴们,可以愉快地调试了哦!

(6)ONOS模块热迭代

假设我们已经修改了模块的代码,现在准备上线调试或运行,为了展示方便和标识版本,首先,修改pom文件中的、重新编译构建:

模块已经存在,这时候是不能install的:

这时候需要用上我们的应用名,用reinstall参数:

That’s Good!

(7)思考 & 展示

1)我的疑惑:
整个开发过程似乎都不需对onos/feature/feature.xml文件进行修改,反而onos/apps里面的模块构建以后是存档在本地Maven仓库里的(~/.m2/repository),而且他们的装载也不依赖于onos源代码文件夹了。

于是我想找到Karaf是如何找到我们的模块的,我从onos-karaf入口开始,到onos-setup-karaf,再到karaf/bin/karaf,有点眼晕,没有找到什么线索。

另外只知道karaf/etc/org.apache.karaf.features.cfg有大仓库的位置信息,可是里头跟onos/feature/feature.xml是一样的,里头没有任何onos/apps中模块的信息。而且我尝试着在Maven库的~/.m2/repository.xml中删去模块信息,也没有用,Karaf照样能载入那个模块。

同时,编译后onos/feature/feature.xml文件也都被放到Maven仓库中了,整个onos似乎都被搬到Maven库中了,运行似乎都跟源码文件夹没有什么关系?(除了入口脚本onos-karaf是被指定在源码文件夹中)

对于需要groupId以“org.onosproject”为前缀、Version如果跟ONOS的版本1.4.0-SNAPSHOT一样的情况,也是挺疑惑的,估计也跟Karaf寻找仓库、模块的方法有关。

但是如果version设置得不一样,会导致构建过程中下载其他版本的pom文件或库,可能存在问题的隐患,但如果不能灵活改变的话,版本号的意义何在呢,待探索

2)说好的各种脚本秀
脚本位置:

onos-create-app,本质是使用了mvn的项目原型框架:

onos-app,本质是使用了REST API北向接口,这接口是不是很强大

onos-karaf,ONOS启动脚本:先配置好karaf环境,再启动karaf本体:

onos-setup-karaf,配置环境,将默认装载的模块全部准备好,舞场后台Staging就位,只给大家展示熟悉的部分好啦:

Karaf,大家感兴趣就去瞄两眼吧

(8)结语 & 感悟

ONOS和ODL,两个BOSS级的控制器/系统。原本我是从ODL入手的,可是对于ODL控制器内部的开发教程实在太少,或者应该说是难以寻到。

原本以为官方的Wiki应该是一扇不错的大门,后面应该有一条路灯明亮的小径,哪怕它再曲折幽深,我也无惧。

可惜ODL的Wiki给我的感觉是一个知识的大仓库,仓库入口附近还没有仓储名录,面对着找不到目录的wiki主页,我茫然了。虽然看完了 地球-某某 老师的一百多页的开发案例讲解PDF,但还是觉得头脑中的实践路线不清晰。直到那天看 明明姐@陈明明-北邮,在群里说wiki上已经有一些tutorial,我就马上去搜,发现了两三条对于开发入门不错的文章标题,于是火速将所有tutorial放进我的收藏夹 ^_^ 谢谢明明姐,美美哒!

最近实验室项目的关系,我投入到ONOS的学习中。ONOS让我有点惊喜,wiki左侧目录右侧内容,关键区域还有YouTube视频指点迷津。

ONOS对于开发入门的朋友还有三四篇经典的tutorial wiki文章,源代码也是分块清晰,代码结构更是简洁明了,各层之间的关系,层之间、模块之间如何交换信息都能清楚地在代码层面轻松寻到。一切都看起来规规矩矩,有章可循,很赞!
在这里也要感谢一下 北京石头 这位朋友,您在SDNLAB中的四篇入门分享文,是我的引路之石。

希望大家看完我的这篇文章,能对大家入门ONOS有一些帮助,如果确实如此,那将是我莫大的快乐,希望能与大家共同进步!

作者简介:北邮,毛健炜


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

登录后才可以评论

毛健炜 发表于15-12-07
7