Signed-off-by: Yu Mingfei <[email protected]>
---
libvirt/tests/virsh_console.py | 237 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 237 insertions(+)
create mode 100644 libvirt/tests/virsh_console.py
diff --git a/libvirt/tests/virsh_console.py b/libvirt/tests/virsh_console.py
new file mode 100644
index 0000000..bea8ffa
--- /dev/null
+++ b/libvirt/tests/virsh_console.py
@@ -0,0 +1,237 @@
+import re, logging
+from autotest.client.shared import error
+from virttest import aexpect
+from virttest.libvirt_xml import vm_xml, xcepts
+
+
+def xml_console_config(vm_name, serial_type='pty',
+ serial_port='0', serial_path=None):
+ """
+ Check the primary serial and set it to pty.
+ """
+ vm_xml.VMXML.set_primary_serial(vm_name, serial_type,
+ serial_port, serial_path)
+
+
+def xml_console_recover(vmxml):
+ """
+ Recover older xml config with backup vmxml.
+ """
+ try:
+ vmxml.undefine()
+ vmxml.define()
+ return True
+ except xcepts.LibvirtXMLError, detail:
+ logging.error("Recover older serial failed:%s.", detail)
+ return False
+
+
+def vm_console_config(vm, dev='ttyS0', speed='115200'):
+ """
+ Login to config vm for virsh console.
+ Three step:
+ 1)Add dev to /etc/securetty to support 'root' for virsh console
+ 2)Add kernel console option:
+ e.g. console=ttyS0,115200
+ 3)Config init process for RHEL5,4,3 and others.
+ (No need this on RHEL6)
+ e.g. S0:2345:respawn:/sbin/mingetty ttyS0
+ """
+ if not vm.is_alive():
+ vm.start()
+ session = vm.wait_for_login()
+
+ # Step 1
+ try:
+ status, output = session.cmd_status_output(
+ "cat /etc/securetty | grep %s" % dev)
+ if status:
+ session.cmd("echo %s>> /etc/securetty" % dev)
+ except Exception, detail:
+ session.close()
+ logging.error("Config /etc/securetty failed:%s", detail)
+ return False
+
+ # Step 2
+ # TODO: Support grub2
+ try:
+ status, output = session.cmd_status_output("cat /etc/grub.conf |"
+ " grep console=%s" % dev)
+ if status:
+ session.cmd("rm -f /etc/grub.conf.bak")
+ session.cmd("cp -f /etc/grub.conf /etc/grub.conf.bak")
+ version = session.cmd("uname -r").strip()
+ kernel_console = " console=%s,%s" % (dev, speed)
+ session.cmd("sed -e \'s/vmlinuz-%s.*/&%s/g\' /etc/grub.conf.bak"
+ "> /etc/grub.conf" % (version, kernel_console))
+ except Exception, detail:
+ session.close()
+ logging.error("Config /etc/grub.conf failed:%s", detail)
+ return False
+
+ # Step 3
+ try:
+ status, output = session.cmd_status_output("cat /etc/inittab | "
+ "grep \'2345:respawn:.*\s%s\'" % dev)
+ if status:
+ status, output = session.cmd_status_output(
+ "grep \'6:2345:respawn:/sbin/mingetty\' /etc/inittab")
+ if not status:
+ session.cmd("rm -f /etc/inittab.bak")
+ session.cmd("cp -f /etc/inittab /etc/inittab.bak")
+ init_console_str = "co:2345:respawn:/sbin/mingetty ttyS0"
+ session.cmd("sed -e \'/6:2345:respawn:/a\\%s\' /etc/init"
+ "tab.bak> /etc/inittab" % init_console_str)
+ except Exception, detail:
+ session.close()
+ logging.error("Config /etc/inittab failed:%s", detail)
+ return False
+
+ return True
+
+
+def vm_console_cleanup(vm):
+ """
+ Cleanup console config.
+ """
+ if not vm.is_alive():
+ vm.start()
+ session = vm.wait_for_login()
+
+ try:
+ # recover&delete /etc/grub.conf.bak
+ status, output = session.cmd("ls /etc/grub.conf.bak")
+ if not status:
+ session.cmd("mv -f /etc/grub.conf.bak /etc/conf.cfg")
+
+ # recover&delete /etc/inittab.bak
+ status, output = session.cmd("ls /etc/inittab.bak")
+ if not status:
+ session.cmd("mv -f /etc/inittab.bak /etc/inittab")
+ except Exception, detail:
+ # Just for warning
+ logging.error("Cleanup kernel or init failed:%s.", detail)
+ return False
+
+ session.close()
+ return True
+
+
+def verify_virsh_console(session, user, passwd, debug=False):
+ """
+ Run commands in console session.
+ """
+ log = ""
+ console_cmd = "cat /proc/cpuinfo"
+ try:
+ while True:
+ match, text = session.read_until_last_line_matches(
+ [r"[E|e]scape character is", r"login:",
+ r"[P|p]assword:", session.prompt],
+ timeout=10, internal_timeout=0.5)
+
+ if match == 0:
+ if debug:
+ logging.debug("Got '^]', sending '\\n'")
+ session.sendline()
+ elif match == 1:
+ if debug:
+ logging.debug("Got 'login:', sending '%s'", user)
+ session.sendline("%s" % user)
+ elif match == 2:
+ if debug:
+ logging.debug("Got 'Password:', sending '%s'", passwd)
+ session.sendline("%s" % passwd)
+ elif match == 3:
+ if debug:
+ logging.debug("Got Shell prompt -- logged in")
+ break
+
+ status, output = session.cmd_status_output(console_cmd)
+ logging.info("output of command:\n%s", output)
+ session.close()
+ except Exception, detail: # Just need to know command executed failed.;)
+ log = session.get_output()
+ logging.error("Verify virsh console failed:\n%s\n%s", detail, log)
+ session.close()
+ return False
+
+ if not re.search("processor", output):
+ logging.error("Verify virsh console failed: Result does not match.")
+ return False
+
+ return True
+
+
+def run_virsh_console(test, params, env):
+ """
+ Test command: virsh console.
+ """
+ os_type = params.get("os_type")
+ if os_type == "windows":
+ raise error.TestNAError("SKIP:Do not support Windows.")
+
+ # Get parameters for test
+ vm_name = params.get("main_vm")
+ vm = env.get_vm(vm_name)
+
+ vm_ref = params.get("virsh_console_vm_ref", "domname")
+ vm_state = params.get("virsh_console_vm_state", "running")
+ login_user = params.get("console_login_user", "root")
+ if login_user == "root":
+ login_passwd = params.get("password")
+ else:
+ login_passwd = params.get("console_password_not_root")
+ status_error = params.get("status_error", "yes")
+ domuuid = vm.get_uuid()
+ domid = ""
+
+ # A backup of original vm
+ vmxml_backup = vm_xml.VMXML.new_from_dumpxml(vm_name)
+ if vm.is_alive():
+ vm.destroy()
+ xml_console_config(vm_name)
+ vm_console_config(vm)
+ vm.destroy()
+
+ # Prepare vm state for test
+ if vm_state != "shutoff":
+ vm.start()
+ vm.wait_for_login()
+ domid = vm.get_id()
+ if vm_state == "paused":
+ vm.pause()
+
+ if vm_ref == "domname":
+ vm_ref = vm_name
+ elif vm_ref == "domid":
+ vm_ref = domid
+ elif vm_ref == "domuuid":
+ vm_ref = domuuid
+ elif domid and vm_ref == "hex_id":
+ vm_ref = hex(int(domid))
+
+ # Run command
+ command = "virsh console %s" % vm_ref
+ session = aexpect.ShellSession(command)
+
+ status = verify_virsh_console(session, login_user,
+ login_passwd, debug=True) == False
+
+ # Recover state of vm.
+ if vm_state == "paused":
+ vm.resume()
+
+ # Recover vm
+ vm_console_cleanup(vm)
+ if vm.is_alive():
+ vm.destroy()
+ xml_console_recover(vmxml_backup)
+
+ # Check result
+ if status_error == "yes":
+ if not status:
+ raise error.TestFail("Run successful with wrong command!")
+ elif status_error == "no":
+ if status:
+ raise error.TestFail("Run failed with right command!")
--
1.7.11.7
_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel