def check_linux_ogac(vmcheck): """ Check qemu-guest-agent service in VM :param vmcheck: VMCheck object for vm checking """ def get_pkgs(pkg_path): """ Get all qemu-guest-agent pkgs """ pkgs = [] for _, _, files in os.walk(pkg_path): for file_name in files: pkgs.append(file_name) return pkgs def get_pkg_version_vm(): """ Get qemu-guest-agent version in VM """ vendor = vmcheck.get_vm_os_vendor() if vendor in ['Ubuntu', 'Debian']: cmd = 'dpkg -l qemu-guest-agent' else: cmd = 'rpm -q qemu-guest-agent' _, output = vmcheck.run_cmd(cmd) pkg_ver_ptn = [ r'qemu-guest-agent +[0-9]+:(.*?dfsg.*?) +', r'qemu-guest-agent-(.*?)\.x86_64' ] for ptn in pkg_ver_ptn: if re.search(ptn, output): return re.search(ptn, output).group(1) return '' if os.path.isfile(os.getenv('VIRTIO_WIN')): mount_point = utils_v2v.v2v_mount(os.getenv('VIRTIO_WIN'), 'rhv_tools_setup_iso', fstype='iso9660') export_path = params['tmp_mount_point'] = mount_point else: export_path = os.getenv('VIRTIO_WIN') qemu_guest_agent_dir = os.path.join(export_path, qa_path) all_pkgs = get_pkgs(qemu_guest_agent_dir) logging.debug('The installing qemu-guest-agent is: %s' % all_pkgs) vm_pkg_ver = get_pkg_version_vm() logging.debug('qemu-guest-agent version in vm: %s' % vm_pkg_ver) # Check the service status of qemu-guest-agent in VM status_ptn = r'Active: active \(running\)|qemu-ga \(pid +[0-9]+\) is running' cmd = 'service qemu-ga status;systemctl status qemu-guest-agent;systemctl status qemu-ga*' _, output = vmcheck.run_cmd(cmd) if not re.search(status_ptn, output): log_fail('qemu-guest-agent service exception')
def check_linux_ogac(vmcheck): """ Check qemu-guest-agent service in VM :param vmcheck: VMCheck object for vm checking """ def get_pkgs(pkg_path): """ Get all qemu-guest-agent pkgs """ pkgs = [] for _, _, files in os.walk(pkg_path): for file_name in files: pkgs.append(file_name) return pkgs def get_pkg_version_vm(): """ Get qemu-guest-agent version in VM """ vender = vmcheck.get_vm_os_vendor() if vender in ['Ubuntu', 'Debian']: cmd = 'dpkg -l qemu-guest-agent' else: cmd = 'rpm -q qemu-guest-agent' _, output = vmcheck.run_cmd(cmd) pkg_ver_ptn = [ r'qemu-guest-agent +[0-9]+:(.*?dfsg.*?) +', r'qemu-guest-agent-(.*?)\.x86_64' ] for ptn in pkg_ver_ptn: if re.search(ptn, output): return re.search(ptn, output).group(1) return '' if os.path.isfile(os.getenv('VIRTIO_WIN')): mount_point = utils_v2v.v2v_mount(os.getenv('VIRTIO_WIN'), 'rhv_tools_setup_iso', fstype='iso9660') export_path = params['tmp_mount_point'] = mount_point else: export_path = os.getenv('VIRTIO_WIN') qemu_guest_agent_dir = os.path.join(export_path, qa_path) all_pkgs = get_pkgs(qemu_guest_agent_dir) logging.debug('The installing qemu-guest-agent is: %s' % all_pkgs) vm_pkg_ver = get_pkg_version_vm() logging.debug('qemu-guest-agent verion in vm: %s' % vm_pkg_ver) # If qemu-guest-agent version in VM is higher than the pkg in qemu-guest-agent-iso, # v2v will not update the qemu-guest-agent version and report a warning. # # e.g. # virt-v2v: warning: failed to install QEMU Guest Agent: command: package # qemu-guest-agent-10:2.12.0-3.el7.x86_64 (which is newer than # qemu-guest-agent-10:2.12.0-2.el7.x86_64) is already installed if not any([vm_pkg_ver in pkg for pkg in all_pkgs]): logging.debug( 'Wrong qemu-guest-agent version, maybe it is higher than package version in ISO' ) logging.info( 'Unexpected qemu-guest-agent version, set v2v log checking') expect_msg_ptn = r'virt-v2v: warning: failed to install QEMU Guest Agent.*?is newer than.*? is already installed' params.update({'msg_content': expect_msg_ptn, 'expect_msg': 'yes'}) # Check the service status of qemu-guest-agent in VM status_ptn = r'Active: active \(running\)|qemu-ga \(pid +[0-9]+\) is running' cmd = 'service qemu-ga status;systemctl status qemu-guest-agent' _, output = vmcheck.run_cmd(cmd) if not re.search(status_ptn, output): log_fail('qemu-guest-agent service exception')
def check_genid(self): """ Check genid value in vm xml match with given param. """ def _compose_genid(vm_genid, vm_genidX): for index, val in enumerate( map(lambda x: hex(int(x) & ((1 << 64) - 1)), [vm_genid, vm_genidX])): # Remove 'L' suffix for python2 val = val.rstrip('L') # if length of val is not equal 18, we must fill the length # to 18 with 0. if len(val) < 18: zero_pad = 18 - len(val) val = '0x' + '0' * zero_pad + val[2:] if index == 0: gen_id = '-'.join([val[n:] if n == -8 else val[n:n + 4] for n in range(-8, -17, -4)]) elif index == 1: temp_str = ''.join([val[i:i + 2] for i in range(0, len(val), 2)][:0:-1]) gen_idX = temp_str[:4] + '-' + temp_str[4:] return gen_id + '-' + gen_idX has_genid = self.params.get('has_genid') # Return if not set has_genid if not has_genid: return # Checking if the feature is supported if not compare_version(FEATURE_SUPPORT['genid']): reason = "Unsupported if v2v < %s" % FEATURE_SUPPORT['genid'] logging.info('Skip Checking genid: %s' % reason) return supported_output = ['libvirt', 'local', 'qemu'] # Skip checking if any of them is not in supported list if self.params.get('output_mode') not in supported_output: reason = 'output_mode is not in %s' % supported_output logging.info('Skip Checking genid: %s' % reason) return logging.info('Checking genid info in xml') logging.debug('vmxml is:\n%s' % self.vmxml) if has_genid == 'yes': mount_point = utils_v2v.v2v_mount(self.vmx_nfs_src, 'vmx_nfs_src') # For clean up self.mount_records[len(self.mount_records)] = ( self.vmx_nfs_src, mount_point, None) cmd = "cat {}/{name}/{name}.vmx".format( mount_point, name=self.original_vm_name) cmd_result = process.run(cmd, timeout=20, ignore_status=True) cmd_result.stdout = cmd_result.stdout_text genid_pattern = r'vm.genid = "(-?\d+)"' genidX_pattern = r'vm.genidX = "(-?\d+)"' genid_list = [ re.search( i, cmd_result.stdout).group(1) if re.search( i, cmd_result.stdout) else None for i in [ genid_pattern, genidX_pattern]] if not all(genid_list): logging.info( 'vm.genid or vm.genidX is missing:%s' % genid_list) # genid will not be in vmxml if re.search(r'genid', self.vmxml): self.log_err('Unexpected genid in xml') return genid_str = _compose_genid(*genid_list) logging.debug('genid string is %s' % genid_str) if not re.search(genid_str, self.vmxml): self.log_err('Not find genid or genid is incorrect') elif has_genid == 'no': if re.search(r'genid', self.vmxml): self.log_err('Unexpected genid in xml')