from __future__ import print_function
from optparse import OptionParser
import atexit
import getopt
import json
import os
import os.path
import pexpect
import sys
import subprocess
import fabric.api
test_config = None
test_config_file = None
sentinel_file = None
def usage(argv):
print("Usage:")
print(" %s -f [JSON config file]" % argv[0])
def main(argv):
try:
opts, args = getopt.getopt(sys.argv[1:], "f:")
except getopt.GetoptError as err:
sys.exit(2)
global test_config
global test_config_file
for o, a in opts:
if o == "-f":
test_config_file = a
else:
assert False, "unhandled option"
if test_config_file is None:
usage(argv)
sys.exit(1)
config_file = open(test_config_file, "r")
test_config = json.load(config_file)
config_file.close()
checkpreReqBhyve()
runTest()
def runTest():
global test_config
global test_config_file
home = os.path.expanduser("~")
known_hosts = "%s/.ssh/known_hosts" % (home)
print(["ifconfig", test_config['bridge']])
ret = subprocess.call(["ifconfig", test_config['bridge']])
if ret != 0:
ret = subprocess.call(["ifconfig", test_config['bridge'], "create"])
if ret != 0:
sys.exit(ret)
ret = subprocess.call(["ifconfig", test_config['bridge'], "inet", "%s/24" % test_config['bridge_ip']])
if ret != 0:
sys.exit(ret)
ret = subprocess.call(["ifconfig", test_config['tap']])
if ret != 0:
ret = subprocess.call(["ifconfig", test_config['tap'], "create"])
if ret != 0:
sys.exit(ret)
ret = subprocess.call(["ifconfig", test_config['bridge'], "addm", test_config['tap']])
if ret != 0:
sys.exit(ret)
cmd = "bhyvectl --destroy --vm=%s" % test_config['vm_name']
print("")
ret = os.system(cmd)
cmd = "bhyveload -m %s -d %s %s" % \
(test_config['ram'], test_config['disks'][0], test_config['vm_name'])
print(cmd)
child = pexpect.spawn(cmd)
child.logfile = sys.stdout
child.expect(pexpect.EOF, timeout=120)
macaddress = ""
if "mac" in test_config:
macaddress = ",mac=%s" % test_config['mac']
cmd = "bhyve -c 2 -m %s -AI -H -P -s 0:0,hostbridge " \
"-s 1:0,lpc -s 2:0,virtio-net,%s%s -s 3:0,ahci-hd,%s " \
"-l com1,stdio %s" % \
(test_config['ram'], test_config['tap'], macaddress, \
test_config['disks'][0], test_config['vm_name'])
print(cmd)
child2 = pexpect.spawn(cmd)
child2.logfile = sys.stdout
child2.expect(['login:'], timeout=1200)
child2.sendline("root")
child2.expect(['Password:'], timeout=1200)
child2.sendline("test")
child2.expect("# ")
prompt = "kyuatestprompt # "
child2.sendline("set prompt=\"%s\"" % (prompt))
child2.expect(prompt)
child2.expect(prompt)
child2.sendline("ifconfig %s | grep 'inet '" % (test_config['interface']))
child2.before = None
child2.after = None
i = child2.expect([' inet ', prompt, pexpect.EOF])
ip_address = None
if i == 0:
i1 = child2.expect(['netmask ', prompt, pexpect.EOF])
if i1 == 0:
ip_address = child2.before.strip()
print("\nFound IP address: %s" % (ip_address))
subprocess.call(["sed", "-i", "", "-e", "/%s/d" % (ip_address), known_hosts])
if ip_address is None:
print("\nDid not find IP address for %s" % (test_config['interface']))
child2.sendline("shutdown -p now")
child2.expect(pexpect.EOF, timeout=1000)
else:
fabric.api.env.host_string = ip_address
fabric.api.env.user = "root"
fabric.api.env.password = "test"
fabric.api.env.shell = "/bin/sh -c"
fabric.api.env.warn_only = True
with fabric.api.cd("/usr/tests"):
fabric.api.run("kyua test")
fabric.api.run("kyua report --verbose --results-filter passed,skipped,xfail,broken,failed --output test-report.txt")
fabric.api.run("kyua report-junit --output=test-report.xml")
fabric.api.run("shutdown -p now")
child2.expect(pexpect.EOF, timeout=1000)
def checkpreReqBhyve():
euid = os.geteuid()
if euid != 0:
raise EnvironmentError("this script need to be run as root")
ret = os.system("kldload -n vmm")
if ret != 0:
raise EnvironmentError("missing vmm.ko")
ret = os.system("kldload -n if_tap")
if ret != 0:
raise EnvironmentError("missing if_tap.ko")
def cleanup():
os.system("rm -f %s" % (sentinel_file))
if __name__ == "__main__":
atexit.register(cleanup)
main(sys.argv)