* 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