integrate avocado with lava

目的

本文主要记录下集成lava和avocado的思路,趟过的坑和后续的TODO。

前言

虚拟化测试或者说qemu/kvm的测试,涉及到太多的变量,比如qemu设备类型、core的个数、
内存大小和kernel版本等等,组合条件实在是太多。
想追求一个覆盖全集的基线测试集合,短时间内搞定实在不现实,只能看看业界标杆是怎么做的了。

从几家主流OS发型商和社区来看,avocado/avocado-vt绝对是主流:

而且Redhat还把它开源了,有:

再看看它的宣讲,有水分但也实在。
why-avocado

于是赶紧抓代码下来,在我们的单板开始实验了。

avocado和avocado-vt是什么和能做什么?

官方的文档实在是TL;DR。
简单来讲,avocado是基于autotest优化的一个测试框架,它可以当做一个app在本地执行,也可以搭成服务器和客户端的模式运行;
avocado-vt是avocado的一个专门针对虚拟化的插件,它可以控制qemu/libvirt/spice的输入和输出,
还可以根据配置条件组合成不同配置的虚拟机,从虚拟化测试用例仓库按照配置提取并执行相应的测试用例。

看看下面这个图,能这么组合参数的话,就知道用处有多大了:)
笛卡尔范例

如何集成到LAVA?

既然avocado/avocado-vt可以单独作为一个应用执行的话,集成到LAVA就和集成普通的shell没什么区别了,
只需要安装依赖的库,把代码下载下来编译执行就可以了,
另外还要注意下如果要写成自动化部署的话,github或者某些代码仓库下载速度慢的话,可以放到本地文件服务器上。

都趟过哪些坑

添加ubuntu的arm64支持

avocado是Redhat主导的,目前网上有Redhat的支持,
但是我们平时测试的host和比较容易下载到的rootfs主要还是ubuntu,只能自己撸起袖子加了,
这里可以参考下我的commit

另外记得下载带有grub的ubuntu cloud镜像,具体原因可以看戳这个链接

qemu-kvm无法找到grub和ubuntu的rootfs

这个真的很坑了,avocado启动arm的virt虚拟机需要使用AAVMF_CODE.fdAAVMF_VARS.fd,而使用virtio-blk-pci的话,就是不自动启动
镜像硬盘下的grub.efi,没办法只能把virtio-blk-pci先禁用了。
另外使用virtio-scsi-pci的时候,能找到grub和内核,可是又挂不上ubuntu的rootfs,看了下代码,需要加上”disable-modern=off,disable-legacy=on”。

使能ubuntu cloud镜像的root账号和运行远程ssh用户登录

网上有很多种使能ubuntu cloud镜像root用户的方法,但是这个是最简单有效的
有了root账号之后,修改sshdconfig就好了。

换内核

ubuntu cloud镜像中已经有了内核,但是我们希望使用我们自己的内核怎么办呢?可以参考这个脚本
在host内核中使能nbd模块后,使用qmeu-nbd挂载ubuntu镜像,把自己的内核替换掉就好了。

ToDo

  • 使能其它配置选项,比如vhost、tap、macvlan、macvtap、virtio-blk-pci和virtio-mmio等等。
  • 分析当前失败的测试用例,自动测试结果在这里
  • 使能libvirt的自动测试

参考文档

1 Avocado Auto Testing for AArch64 Virtualization
2 AVOCADO AND JENKINS

知道是不会有人点的,但万一有人呢:)