Hi Yu, thanks for the test! I have some problems with it, mainly the fact
that it won't work on the JeOS. Some suggestions:

1) See if our JeOS really needs this configuration, I'd think it doesn't
2) Skip attempts to configure grub or inittab if it's not applicable.

So, from your 6 patch series, I'm taking the first 4, then I'm marking
these 2 last ones as superseded. Thanks!

On Fri, Mar 8, 2013 at 3:56 AM, Yu Mingfei <[email protected]> wrote:

> 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
>
>
Obviously this doesn't support grub2, and it should be skipped in case
there's no /etc/grub.conf.



> +    # 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
>
>
Inittab doesn't exist on systemd systems, so this check should be skipped
in case there inittab file contains "systemd" inside of it.


> +
> +def vm_console_cleanup(vm):
> +    """
> +    Cleanup console config.
> +    """
>

For this function, same comments about the setup stage apply.


> +    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
>



-- 
Lucas
_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to