On 10/12/2011 05:07 AM, Lucas Meneghel Rodrigues wrote:
> This is an initial implementation for a libvirt monitor.
> With it, we plan on making the libvirt test use all the
> monitor features, making most of the tests available for
> kvm available for libvirt.
>
> As of implementation details, it uses aexpect to get a
> virsh shell, and then the monitor methods are implemented
> by executing commands on that virsh shell.
>
> As of now, the libvirt vm class is still not using the
> monitor code, but we plan on making the move soon enough.
>
> Signed-off-by: Lucas Meneghel Rodrigues<[email protected]>
> ---
>   client/virt/libvirt_monitor.py |  322 
> ++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 322 insertions(+), 0 deletions(-)
>   create mode 100644 client/virt/libvirt_monitor.py
>
> diff --git a/client/virt/libvirt_monitor.py b/client/virt/libvirt_monitor.py
> new file mode 100644
> index 0000000..05b838c
> --- /dev/null
> +++ b/client/virt/libvirt_monitor.py
> @@ -0,0 +1,322 @@
> +import re, tempfile, xml.dom.minidom, logging
> +import virt_utils, aexpect
> +from autotest_lib.client.bin import utils
> +
> +
> +class VirshMonitor:
> +    """
> +    Wraps "Virsh monitor" commands.
> +    """
> +
> +    def __init__(self, virsh_exec='virsh', name, vmname, password=None,
> +                 prompt=None, hostname='localhost', driver=None, 
> username=None,
> +                 linesep="\\n"):
> +        """
> +        Connect to the hypervisor and get virsh prompt.
> +
> +        @param virsh_exec: Virsh executable
> +        @param name: Monitor identifier (a string)
> +        @param vmname: VM name
> +        @param password: Hypervisor user password
> +        @param prompt: Virsh prompt
> +        @param hostname: Hypervisor IP
> +        @param driver: Hypervisor driver type
> +        @param username: Hypervisor  username
> +        @param linesep: The line separator to use when sending lines
> +                (e.g. '\\n' or '\\r\\n')
> +        """
> +        self.virsh_exec = virsh_exec
> +        self.name = name
> +        self.vmname = vmname
> +        self.password = password
> +        self.prompt = prompt
> +        self.hostname = hostname
> +        self.driver = driver
> +        self.username = username
> +        self.session = self.login()
> +        self.virsh_cmd = {"help":"help", "quit":"destroy " + self.vmname,
> +                           "stop":"suspend", "cont":"resume"}
> +        self.drive_map = {}
> +        self.network_info = []
> +        self.disk_info = []
> +        self._parse_domxml()
> +
> +
> +    def __del__(self):
> +        self.session.sendline("quit")
> +

....
> +        if "balloon" in command:
> +            new_mem = re.findall("balloon\s+(\d+)", command)[0]
> +            new_mem = str(int(new_mem) * 1024)
> +            output = self.session.cmd_output("setmem  %s %s" %
> +                                                      (self.vmname, new_mem))
> +            return
> +
> +        if "system_reset" in command:
> +            self.session.cmd_output("destroy %s" % self.vmname)
> +            self.session.cmd_output("start %s" % self.vmname)
> +            return

This would make qemu process exit, this is not same as qemu monitor 
cmd(system_reset). We may migrate guest which is repeatedly rebooting, 
then migration will be failed.

# grep system_reset virt/tests/*
virt/tests/boot.py:    2) Send a reboot command or a system_reset 
monitor command (optional)
virt/tests/boot.py:        if params["reboot_method"] == "system_reset":
Binary file virt/tests/boot.pyc matches
virt/tests/iofuzz.py:                        session = 
vm.reboot(method="system_reset")


'system_reset' of qemu monitor is only called for fakereboot in Libvirt.
but Libvirt developer told me they may add new API for it.


> +        data = self.session.cmd_output(" %s \n" % self.virsh_cmd.get(
> +                                                            command, 
> command))
> +        return data
> +
> +
> +    def is_responsive(self):
> +        """
> +        Return True if the monitor is responsive.
> +        """
> +        return True
> +
> +
> +    def quit(self):
> +        """
> +        Send "quit" without waiting for output.
> +        """
> +        self.cmd("quit")
> +
> +
> +    def screendump(self, filename, debug=True):
> +        """
> +        Request a screendump.
> +
> +        @param filename: Location for the screendump
> +        @return: The command's output
                     ^^^^^^^^^^^^

> +        """
> +        if debug:
> +            logging.debug("Requesting screendump %s" % filename)
> +        self.cmd("screenshot %s" % filename)

            cmd output is not returned.


> +    def info(self, what):
> +        """
> +        Request info about something and return the output.
> +        """
> +        if "network" in what:
> +            return self.network_info
> +
> +        if "pci" in what:
> +            domxml = self.session.cmd_output("dumpxml %s \n" %
> +                                                       self.vmname)
> +            self._parse_dev(domxml)
> +            return str(self.network_info) + str(self.drive_map)
> +
> +        if "balloon" in what:
> +            self.session.cmd_output("\n")
> +            netpool_lst = self.session.cmd_output("dominfo %s" %
> +                                                            self.vmname)
> +            return str(int(re.findall("Used memory:\s+(\d+)", netpool_lst)
> +                                       [0]) / 1024)
> +
> +        return self.cmd("info %s" % what)

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to