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

Reply via email to