* On 2012-07-03 13:34:06 +0800, Alex Jia (a...@redhat.com) wrote:
> On 07/02/2012 09:32 PM, Cleber Rosa wrote:
> > On 06/26/2012 02:28 PM, Alex Jia wrote:
> >> It's a common virt-v2v test assistant module, which provides some
> >> necessary class/functions with virt-v2v testing.
> >>
> >> Signed-off-by: Alex Jia <a...@redhat.com>
> >> Signed-off-by: Wayne Sun <g...@redhat.com>
> >> ---
> >>   client/virt/virt_v2v_utils.py |  278 
> >> +++++++++++++++++++++++++++++++++++++++++
> >>   1 file changed, 278 insertions(+)
> >>   create mode 100644 client/virt/virt_v2v_utils.py
> >>
> >> diff --git a/client/virt/virt_v2v_utils.py 
> >> b/client/virt/virt_v2v_utils.py
> >> new file mode 100644
> >> index 0000000..f93e417
> >> --- /dev/null
> >> +++ b/client/virt/virt_v2v_utils.py
> >> @@ -0,0 +1,278 @@
> >> +"""
> >> +Virt-v2v test utility functions.
> >> +
> >> +@copyright: 2008-2012 Red Hat Inc.
> >> +"""
> >> +
> >> +import os, re, logging
> >> +
> >> +import ovirt
> >> +import libvirt_vm as lvirt
> >> +
> >> +
> >> +def build_esx_no_verify(params):
> >> +    """
> >> +    Build esx no verify relationship.
> >> +    """
> >> +    netrc = params.get('netrc')
> >> +    path = os.path.join(os.getenv("HOME"), '.netrc')
> >> +    fp = open(path, "a")
> >> +    os.chmod(path, 0600)
> >> +    fp.write("%s\n" %netrc)
> >> +    fp.close()
> >> +
> >> +
> >> +class URI(object):
> >> +    """
> >> +    This class is used for generating uri.
> >> +    """
> >> +    def __init__(self, hypervisor):
> >> +        if hypervisor is None:
> >> +            # kvm is a default hypervisor
> >> +            hypervisor = "kvm"
> >> +        self.hyper = hypervisor
> >> +
> >
> > ^ A double line spacing between major blocks is desirable as it 
> > conforms to the style we used on the rest of the code.
> I understand code style and I'd like to follow it, but I don't know why 
> we must waste a line space between one function
> and another function :) if it's a class I will agree 2 lines space, in 
> addition, I saw our codes have different line space, it
> seems we need to uniform them together.
Though PEP8 requires us use a single blank line in methods of class [1],
but CODING_STYLE in autotest has it's own rule:
"""
Leave TWO blank lines between functions - this is Python, there are no clear
function end markers, and we need help.
"""

I think if you want to play with autotest, you'd better follow its rule.

And, for the existed coding style, I think it's better to fix them
when we need to update the actual code. But updating them in a single
patch probably also works.

[1] http://www.python.org/dev/peps/pep-0008/#id15
> >
> >> +    def get_uri(self, hostname):
> >> +        """
> >> +        This fucntion is a uri dispatcher.
> >> +        """
> >> +        uri_func =  getattr(self, "get_%s_uri" % self.hyper)
> >
> > ^ Maybe a more graceful failure and/or more meaningful exception and 
> > message should be raised instead of the default AttributeError.
> Absolutely agree.
> >
> >> +        self.host = hostname
> >> +        return uri_func()
> >> +
> >> +    def get_kvm_uri(self):
> >> +        """
> >> +        Return kvm uri.
> >> +        """
> >> +        uri = "qemu+ssh://"+ self.host + "/system"
> >> +        return uri
> >> +
> >> +    def get_xen_uri(self):
> >> +        """
> >> +        Return xen uri.
> >> +        """
> >> +        uri = "xen+ssh://"+ self.host + "/"
> >> +        return uri
> >> +
> >> +    def get_esx_uri(self):
> >> +        """
> >> +        Return esx uri.
> >> +        """
> >> +        uri = "esx://"+ self.host + "/?no_verify=1"
> >> +        return uri
> >> +
> >> +    # add new hypervisor in here.
> >> +
> >> +
> >> +class TARGERT(object):
> >
> > ^ Is this a typo? s/TARGERT/TARGET/ ?
> Yeah, s/TARGERT/Target/ and use CameCase styple.
> >
> >> +    """
> >> +    This class is used for generating command options.
> >> +    """
> >> +    def __init__(self, target, uri):
> >> +        if target is None:
> >> +            # libvirt is a default target
> >> +            target = "libvirt"
> >> +        self.tgt = target
> >> +        self.uri = uri
> >> +
> >> +    def get_cmd_options(self, params):
> >> +        """
> >> +        This fucntion is a target dispatcher.
> >> +        """
> >> +        opts_func = getattr(self, "get_%s_options" % self.tgt)
> >> +        self.params = params
> >> +        return opts_func()
> >
> > ^ Same here about exception and error message.
> >
> Yeah.
> >> +
> >> +    def get_libvirt_options(self):
> >> +        """
> >> +        Return command options.
> >> +        """
> >> +        options = " -ic %s -os %s -b %s %s " % (self.uri,
> >> +                  self.params.get('storage'), 
> >> self.params.get('network'),
> >> +                  self.params.get('vms'))
> >> +        return options
> >> +
> >> +    def get_ovirt_options(self):
> >> +        """
> >> +        Return command options.
> >> +        """
> >> +        options = " -ic %s -o %s -os %s -n %s %s " % (self.uri, 
> >> self.tgt,
> >> +                  self.params.get('storage'), 
> >> self.params.get('network'),
> >> +                  self.params.get('vms'))
> >> +
> >> +        return options
> >> +
> >> +    # add new target in here.
> >> +
> >> +
> >> +class LinuxVMCheck(object):
> >> +    """
> >> +    This class handles all basic linux VM check operations.
> >> +    """
> >> +    def __init__(self, test, params, env):
> >> +        self.vm = None
> >> +        self.test = test
> >> +        self.env = env
> >> +        self.params = params
> >> +        self.name = params.get('vms')
> >> +        self.target = params.get('target')
> >> +
> >> +        if self.name is None:
> >> +            logging.error("vm name not exist")
> >> +
> >> +        # libvirt is a default target
> >> +        if self.target == "libvirt" or self.target is None:
> >> +            self.vm = lvirt.VM(self.name, self.params, 
> >> self.test.bindir,
> >> +                              self.env.get("address_cache"))
> >> +        elif self.target == "ovirt":
> >> +            self.vm = ovirt.VM(self.name, self.params, 
> >> self.test.bindir,
> >> +                              self.env.get("address_cache"))
> >> +        else:
> >> +            logging.error("Doesn't support %s now" % self.target)
> >> +
> >> +        if self.vm.is_alive():
> >> +            self.vm.shutdown()
> >> +            self.vm.start()
> >> +        else:
> >> +            self.vm.start()
> >> +
> >> +    def get_vm_kernel(self, session=None, nic_index=0, timeout=480):
> >
> > ^ Out of curiosity, any special reason for the 480 seconds timeout?
> For converting an existing VM into libvirt target, usually, it will 
> consume about 7mins,
> 360s time out is not enough.
OK, I prefer a variant to a magic number, and you can write down your
explanation for this special timeout when you define this variant.
(Just like what Cleber did in BaseVM class)

> >
> >> +        """
> >> +        Get vm kernel info.
> >> +        """
> >> +        cmd = "uname -r"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        kernel_version = session.cmd_output(cmd)
> >> +        logging.debug("The kernel of VM '%s' is: %s" % \
> >> +                      (self.vm.name, kernel_version))
> >> +        session.close()
> >> +        return kernel_version
> >> +
> >> +    def get_vm_os_vendor(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm os vendor info.
> >> +        """
> >> +        cmd = "cat /etc/issue"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        output = session.cmd_output(cmd).split('\n', 1)[0]
> >> +        if re.search('Red Hat', output):
> >> +            vendor = 'Red Hat'
> >> +        elif re.search('Fedora', output):
> >> +            vendor = 'Fedora Core'
> >> +        elif re.search('SUSE', output):
> >> +            vendor = 'SUSE'
> >> +        elif re.search('Ubuntu', output):
> >> +            vendor = 'Ubuntu'
> >> +        elif re.search('Debian', output):
> >> +            vendor = 'Debian'
> >> +        else:
> >> +            vendor = 'Unknown'
> >> +        logging.debug("The os info is: %s" % output)
> >> +        logging.debug("The os vendor of VM '%s' is: %s" % \
> >> +                      (self.vm.name, vendor))
> >> +        session.close()
> >> +        return vendor, output
> >> +
> >> +    def get_vm_fdisk(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm fdisk info.
> >> +        """
> >> +        grep_cmd = "grep '(hd0)' /boot/grub/device.map | cut -d ' ' 
> >> -f 6"
> >
> > ^ What about systems with grub2 and /boot/grub2/device.map? Maybe this 
> > could come from a parameter, just like BaseVM.get_cpu_count().
> Agree, we might require a function to automatically check it.
> >
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        disk_path = session.cmd_output(grep_cmd)
> >> +        logging.debug("Disk path is %s" % disk_path)
> >> +
> >> +        fdisk_cmd = "fdisk -l %s" % disk_path
> >> +        fdisk_output = session.cmd_output(fdisk_cmd)
> >> +        fdisk_info = (fdisk_output.split('\n', 1)[1]).split('[', 1)[0]
> >> +        logging.debug("The fdisk output is:\n %s" % fdisk_info)
> >> +
> >> +        session.close()
> >> +        return fdisk_info
> >> +
> >> +    def get_vm_modprobe_conf(self, session=None, nic_index=0, 
> >> timeout=480):
> >> +        """
> >> +        Get /etc/modprobe.conf info.
> >> +        """
> >> +        cmd = "cat /etc/modprobe.conf"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        modprobe_output = session.cmd_output(cmd)
> >> +        logging.debug("modprobe conf is:\n %s" % modprobe_output)
> >> +        session.close()
> >> +        return modprobe_output
> >> +
> >> +    def get_vm_modules(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm modules list.
> >> +        """
> >> +        cmd = "lsmod"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        modules = session.cmd_output(cmd)
> >> +        logging.debug("VM modules list is:\n %s" % modules)
> >> +        session.close()
> >> +        return modules
> >> +
> >> +    def get_vm_pci_list(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm pci list.
> >> +        """
> >> +        cmd = "lspci"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        lspci_output = session.cmd_output(cmd)
> >> +        logging.debug("VM pci devices list is:\n %s" % lspci_output)
> >> +        session.close()
> >> +        return lspci_output
> >> +
> >> +    def get_vm_rc_local(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm /etc/rc.local output.
> >> +        """
> >> +        cmd = "cat /etc/rc.local"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        rc_output = session.cmd_output(cmd)
> >> +        session.close()
> >> +        return rc_output
> >> +
> >> +    def check_vmware_tools(self, session=None, nic_index=0, 
> >> timeout=480):
> >> +        """
> >> +        Check vmware tools.
> >> +        """
> >> +        rpm_cmd = "rpm -q VMwareTools"
> >> +        ls_cmd = "ls /usr/bin/vmware-uninstall-tools.pl"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        rpm_output = session.cmd_output(rpm_cmd)
> >> +        ls_output = session.cmd_output(ls_cmd)
> >> +        session.close()
> >> +
> >> +        if re.search("not installed", rpm_output) or \
> >> +           re.search("No such file", ls_output):
> >> +            return True
> >> +        else:
> >> +            return False
> >> +
> >> +    def get_vm_tty(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm tty config.
> >> +        """
> >> +        cmd = "cat /etc/securetty /etc/inittab /boot/grub/grub.conf"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        tty = session.cmd_output(cmd)
> >> +        session.close()
> >> +        return tty
> >> +
> >> +    def get_vm_video(self, session=None, nic_index=0, timeout=480):
> >> +        """
> >> +        Get vm video config.
> >> +        """
> >> +        cmd = "cat /etc/X11/xorg.conf /etc/X11/XF86Config"
> >> +        session = session or self.vm.wait_for_login(nic_index, timeout)
> >> +        xorg_output = session.cmd_output(cmd)
> >> +        session.close()
> >> +        return xorg_output
> >
> > ^ This makes me think that a LinuxVM mixin class could make a nice 
> > addition to the BaseVM code. Mixing a LibvirtVM+LinuxVM or 
> > KvmVM+WindowsVM would be really nice and powerfull. Thoughts?
> I tend to agree you, but it may be done in the future not now ;)
> 
> Cleber, thanks for your good suggestion and comments.
> 
> Alex
> >
> >> +
> >> +
> >> +class WindowsVMCheck(object):
> >> +    """
> >> +    This class handles all basic windows VM check operations.
> >> +    """
> >> +    pass
> >
> >
> 
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
_______________________________________________
Autotest mailing list
Autotest@test.kernel.org
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to