Re: [Autotest] [PATCH 06/11] virt: Introducing libvirt monitor

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 12, 2011 at 4:48 AM, Amos Kong <akong@xxxxxxxxxx> wrote:
> 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<lmr@xxxxxxxxxx>
>> ---
>>   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.

Ok, noted, but since there's no such an API written for it yet, and
since we are still not supporting migration tests, I believe it's OK
to leave it like that for now.

> # 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.

Ok, that was easy enough to fix, thanks! I've updated my branch with
all the fixes pointed out so far.

>
>> +    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
> Autotest@xxxxxxxxxxxxxxx
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>



-- 
Lucas
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux