This test checks if the console input and output work as desired. The test takes as an argument a filename, whose contents are sent to the console. The optional parameter 'expect' can be set to a filename that should contain expected output from the guest and is compared with the actual output. The optional parameter 'output' can be set to a filename where the test script saves the output of the host (useful for initial test setup). This test requires that the guest machine runs code that handles input and output on the serial console (programs such as agetty or something like that). --- repos/domain/console_io.py | 123 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 123 insertions(+), 0 deletions(-) create mode 100644 repos/domain/console_io.py diff --git a/repos/domain/console_io.py b/repos/domain/console_io.py new file mode 100644 index 0000000..98fd5b6 --- /dev/null +++ b/repos/domain/console_io.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +# test console interactions +# This test sends contents of file 'input' to the guest's console +# and reads from the console the reply and compares it to 'expect' or +# writes the output to file 'output' + +import libvirt +import signal +import os + +from libvirt import libvirtError +from exception import TestError + +required_params = ('guestname',) +optional_params = ('device', 'timeout', 'input', 'output', 'expect',) + +def alarm_handler(signum, frame): + raise TestError("Timed out while waiting for console") + +def console_io(params): + """Attach to console""" + logger = params['logger'] + guest = params['guestname'] + device = params.get('device', 'serial0') + infile = params.get('input', None) + outfile = params.get('output', None) + expect = params.get('expect', None) + timeout = params.get('timeout', 5) + + uri = params['uri'] + + #store the old signal handler + oldhandler = signal.getsignal(signal.SIGALRM) + + try: + logger.info("Connecting to hypervisor: '%s'" % uri) + conn = libvirt.open(uri) + dom = conn.lookupByName(guest) + if not dom.isActive(): + raise TestError("Guest '%s' not active" % guest) + + logger.info("Creating stream object") + stream = conn.newStream(0) + + logger.info("Open a new console connection") + dom.openConsole(device, stream, libvirt.VIR_DOMAIN_CONSOLE_FORCE) + + if infile != None: + try: + f = open(infile, 'r') + instr = f.read() + f.close() + except e: + raise TestError("Can't read input file '%s': %s" % (infile, str(e))) + + logger.info("Sending %d bytes of contents of file '%s' to console '%s'" % (len(instr), infile, device)) + stream.send(instr) + + if expect != None or outfile != None: + logger.info("Recieving data from console device. Timeout %d seconds." % timeout) + + # register a new signal handler + logger.info("Registering custom SIGALRM handler") + signal.signal(signal.SIGALRM, alarm_handler) + signal.alarm(timeout) + + reply = "" + try: + while True: + recv = stream.recv(1024) + reply += recv + except TestError: + pass + + logger.info("Recieved %d bytes." % len(reply)) + + if outfile != None: + try: + f = open(outfile, 'w') + f.write(reply) + f.close() + except e: + raise TestError("Can't write output to file '%s': %s" % (outfile, str(e))) + + if expect != None: + try: + f = open(expect, 'r') + expectstr = f.read() + f.close() + except Exception, e: + raise TestError("Can't read expected output file '%s': '%s'" % (expect, str(e))) + + if reply.startswith(expectstr): + logger.info("Recieved expected output from the host") + else: + raise TestError("Reply from the guest doesn't match with expected reply") + + except libvirtError, e: + logger.error("Libvirt call failed: " + str(e)) + ret = 1 + + except TestError, e: + logger.error("Test failed: " + str(e)) + ret = 1 + + else: + logger.info("All tests succeeded") + ret = 0 + + finally: + logger.info("Restoring signal handler") + signal.signal(signal.SIGALRM, oldhandler) + logger.info("Closing hypervisor connection") + try: + stream.abort() + except: + pass + conn.close() + + logger.info("Done") + + return ret + -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list