Autoserv 是“自动化机器控制“的框架 Autoserv 目的是控制机器,它可以:

  • 电源管理
  • 安装内核
  • 修改bootloader * 运行任意命令
  • 运行Autotest Local(客户端)测试
  • 传输文件

被控制的机器可以是:

  • 本机
  • 远程机器(通过ssh 和 conmux)
  • 虚拟机(通过KVM)

控制文件

类似于autotest,Autoserv同样使用控制文件。这些控制文件和autotest使用不同的命令,但是像autotest一样包含一些内部的可以调研python解释器的功能。

这里有一个控制文件的例子,用来控制远程host安装.dep内核。若文件存在server/目录并且命名为example.control,可以在server/目录通过./autotest-remote example.control调用:

remote_host = host.SSHHost("192.168.1.1")
print remote_host.run("uname -a").stdout

kernel = deb_kernel.DEBKernel()
kernel.get("/var/local/linux-2.6.22.deb")

print kernel.get_version()
print kernel.get_image_name()
print kernel.get_initrd_name()

kerne.install(remote_host)

remote_host.reboot()

print remote_host.run("uname -a").stdout

Hosts

"Host"类是Autoserv控制文件的操作对象。这些Host类通过ssh/conmux或virtual机控制机器。这些代码结构支持添加其他类型的hosts.如果想添加 其他类型的host,需要确保添加到server/hosts/init.py文件。

Host的主要方法

以下是最常用的host的方法。每个类型的host都需要包含这些方法,起码支持列表选项中的方法。特定的host需要支持更多的命令和选项。关于这些信息,可以查看  autotest子目录server/client中源码文件。下面的列表只是一个基本的汇总,不是那些源码文件的功能的头文件。特别是,需要查看一下server/hosts/ssh_host.py文件。

  • run(command)
  • reboot()
  • get_file(source, dest)
  • send_file(source, dest)
  • get_tmp_dir
  • is_up()
  • wait_up(timeout)
  • wait_down(timeout)
  • get_num_cpu()

CmdResult 类

run()调用的返回值是一个CmdResult类。该类包含了有关命令和其执行信息。这个类的定义和文档信息可以在server/hosts/base_classes.py文件中查看。 CmdResult类可以打印并且输出其所有的信息。它的每个字段都可以单独访问。这个字段的列表是:

  • command: 包含命令行本身的字符
  • exit_status: 进程整数退出代码
  • stdout:包含程序标准输出的字符串
  • stderr: 包含程序错误输出的字符串
  • duration: 程序运行的持续时间
  • aborted: 导致终端命令中止的信号(0)

Host的主要类型

SSHHost

SSHHost是非常重要和实用的host类型。它可以通过ssh会话控制远程机器。它支持所有的hosts的基本方法和run()功能,支持超时。SSHHost通过 ssh运行命令,通过scp进行文件传输。

如果想采用SSHHost,必须设置远程机器无密码登陆,如通过公共秘钥。一个SSHHost对象建立在指定的host name,任意的用户名称和端口号。

ConmuxSSHHost

ConmuxSSHHost是SSHHost的扩展。它通过Conmux来控制远程机器。可以通过hardreset()方法进行硬复位。

SiteHost

Site host 是一个空类,可以添加特殊的方法或支持所以类型hostts的属性。它定义在server/hosts/site_host_py文件中,不过可能是空的。 创建这样的一个类的灵感来自于如更新bios,侦测硬件版本或一些对普通用户不常用的操作。

KVMGuest

KVMGuest 表示可以运行程序的KVM 虚拟机。 它必须绑定到其他host, 这些机器实际上运行于虚拟层。KVMGuest和SSHHost非常类似,但它可以通过hardreset方法(Guest中)调用hypervisor的命令去实现”硬复位“.可以通过查看KVM section查看更多的KVM和KVMguest信息。

Bootloader

Boottool 是一个查询和修改bootloader文件的perl脚本。Autoserv提供Bootloader类,是围绕boottool的包装。Autoserv 在需要时会第一时间将boottool脚本自动复制到一个临时目录。可以通过查看server/hosts/bootloader.py查看支持方法的信息。其中最重要的一个方法是add_kernel()

当添加了一个新内核是,boottool会复用上一个内核的命令行及配置,来实现一个新的启动项菜单。

InstallableObject

InstallableObject 表示一个可以再host上安装软件包。通过下面两个方法实现: get(location) install(host)

get()表示获取安装包,它可以获取多种类型保存位置的包: 本地目录 URL地址 python文件对象 如果参数不是上述类型,get()会默认将获取的内容当为包内容

get()获取的软件包,通常会放到一个临时目录。这种方式可以一次获取,安装到多台hosts上面。install()会安装包,当通常会装到一个临时目录。

Autotest Support

Autoserv包含autotest的一些具体支持。它可以安装autotest到一个客户端,可以运行客户端的测试并且取回测试结果。这是通过autotest和运行server/autotest.py中的 类实现的。Auotest对象是一个installableObject.要想使用它,必须: 指定来源后通过get()获取,autotest对象有点特别。如果没有指定任何来源,将会自动从autotest SVN库自动获取。而且会在目标主机中完成。 当通过install()安装时,autotest会查找一个/etc/autotest.conf的文件:

autodir=/usr/local/autotest/
  • run()运行一个控制文件的语法如下:run(control_file, results_dir, host).control_file 参数支持get()和intallableObject相同类型的值。

下面是一个Autoserv控制文件和运行Autotest job的例子。测试结果会传输到server的“job_results"目录下。 remote_host = hosts.SSHHost("192.168.1.1")

at = autotest.Autotest()
at.get("/var/local/autotest/client")
at.install(remote_host)

control_file = """
job.profilers.add("oprofile", events= ["CPU_CLK_UNHALED:8000"])
job.run_test("linux_stress")
"""

results_dir = "job_results"

at.run(control_file, results_dir, remote_host)

Kernel Objects

Kernel Objects 是另一个类型的InstallableObjects.计划支持内核源码编译及.rpm和.deb包安装。最初,只支持.deb格式内核。现在已经支持源码格式的内核。 kernels支持依赖以下方法:

  • get(location) 用户installableObject方法
  • install(host, extra arguments to boottool).当一个内核安装在host后,会使用bootbool使它自己编程默认的启动内核。如果需要指定特别的内核参数, 需要可以添加,并传递给add_kernel()方法用来启动内核。
  • get_version()
  • get_image_name()
  • get_image_name()

同样,可以通过查看源码了解更多详细信息,如server/deb_kernel.py

DEBKernels 有一个额外的方法,host直接提取内核。这个方法可以直接将包解压到指定的host.这样可以不经过安装,可以直接访问包的内容。这个功能比较常用的地方就是 kvm和qumu的 -kernel选项。

下面给出一个Autoserv安装内核的控制文件的例子:

rh = hosts.SSHHost("192.168.1.1")

print rh.run("uname -a").stdout

kernel = deb_kernel.DEBKernel()
kernel.get("/var/local/linux-2.6.22.deb")

kernel.install(rh)

rh.reboot()

print rh.run("uname -a").stdout

一个类似的例子使用RPM形式的kernel,并让指定启动参数(autoserv -m host1, host2 install-rpm):

if not machines:
    raise "Specify the machines to run on via the -m flag"
hosts = [hosts.SSHHost(h) for h in machines]

kernel = rpm_kernel.RPMKernel()
kernel.get('/stuff/kernels/kernel-smp-2.6.18.x86_64.rpm')

for host in hosts:
    print host.run("uame -a").stdout
    kernel.install(host, default=True)
    host.reboot()
    print host.run("uname -a").stdout

print "Done"

未完待续

Top^

上一篇Autotest:Autotest-others>> 下一篇Autotest:Autotest-Autotest Remote (Autoserv)(二)>>>

by 李鹏