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)(二)>>>