def check_vmtools(vmcheck, check): """ Check whether vmware tools packages have been removed, or vmware-tools service has stopped :param vmcheck: VMCheck object for vm checking :param check: Checkpoint of different cases :return: None """ if check == 'vmtools': logging.info('Check if packages been removed') pkgs = vmcheck.session.cmd('rpm -qa').strip() removed_pkgs = params.get('removed_pkgs').strip().split(',') if not removed_pkgs: test.error('Missing param "removed_pkgs"') for pkg in removed_pkgs: if pkg in pkgs: log_fail('Package "%s" not removed' % pkg) elif check == 'vmtools_service': logging.info('Check if service stopped') vmtools_service = params.get('service_name') status = utils_misc.get_guest_service_status( vmcheck.session, vmtools_service) logging.info('Service %s status: %s', vmtools_service, status) if status != 'inactive': log_fail('Service "%s" is not stopped' % vmtools_service)
def control_service(session, service, init_service, action, timeout=60): """ Start service on guest. :param vm: Virtual machine for vm. :param service: service to stop. :param action: action with service (start|stop|restart) :param init_service: name of service for old service control. """ status = utils_misc.get_guest_service_status(session, service, service_former=init_service) if action == "start" and status == "active": logging.debug("%s already started, no need start it again.", service) return if action == "stop" and status == "inactive": logging.debug("%s already stopped, no need stop it again.", service) return try: session.cmd("systemctl --version", timeout=timeout) session.cmd("systemctl %s %s.service" % (action, service), timeout=timeout) except: session.cmd("service %s %s" % (init_service, action), timeout=timeout)
def control_service(session, service, init_service, action, timeout=60): """ Start service on guest. :param vm: Virtual machine for vm. :param service: service to stop. :param action: action with service (start|stop|restart) :param init_service: name of service for old service control. """ status = utils_misc.get_guest_service_status( session, service, service_former=init_service) if action == "start" and status == "active": logging.debug("%s already started, no need start it again.", service) return if action == "stop" and status == "inactive": logging.debug("%s already stopped, no need stop it again.", service) return try: session.cmd("systemctl --version", timeout=timeout) session.cmd("systemctl %s %s.service" % (action, service), timeout=timeout) except: session.cmd("service %s %s" % (init_service, action), timeout=timeout)
def _verify_multipathd_alive(): """ Verify whether multipathd statue is active, return bool value """ host_session = aexpect.ShellSession("sh") return utils_misc.get_guest_service_status( host_session, 'multipathd') == 'active'
def check_ubuntools(vmcheck): """ Check open-vm-tools, ubuntu-server in VM :param vmcheck: VMCheck object for vm checking """ logging.info('Check if open-vm-tools service stopped') status = utils_misc.get_guest_service_status(vmcheck.session, 'open-vm-tools') logging.info('Service open-vm-tools status: %s', status) if status != 'inactive': log_fail('Service open-vm-tools is not stopped') else: logging.info('Check if the ubuntu-server exist') content = vmcheck.session.cmd('dpkg -s ubuntu-server') if 'install ok installed' in content: logging.info('ubuntu-server has not been removed.') else: log_fail('ubuntu-server has been removed')
def verify_alive(): return utils_misc.get_guest_service_status( session, 'qemu-guest-agent') == 'active'
def run(test, params, env): """ Qemu guest irqbalance inactive/active test: 1) Setup host for sr-iov test. 2) Boot VM with sr-iov vf/pf assigned and multi vcpu. 3) Update irqbalance service status in guest. stop/start this server according to request. 4) Get available network interface name in guest. 5) Start background network stress in guest. 6) Get irq number assigned to attached vfs/pfs. 7) Get the cpu number the irq running. 8) Check specified IRQ count grow on specified cpu. 9) Repeat step 7 for every 10s. 10) Balance IRQs generated by vfs/pfs to different vcpus (optional) e.g. echo 4 > /proc/irq/num/smp_affinity 11) Repeat step 6, 7 12) Check that specified IRQ count grow on every cpu. (optional) :param test: QEMU test object :param params: Dictionary with the test parameters :param env: Dictionary with test environment. """ vm = env.get_vm(params["main_vm"]) vm.verify_alive() timeout = int(params.get("login_timeout", 360)) session = vm.wait_for_login(timeout=timeout) irqbalance_check_count = int(params.get("irqbalance_check_count", 36)) nic_interface_filter = params["nic_interface_filter"] error_context.context("Make sure that guest have at least 2 vCPUs.", logging.info) cpu_count = vm.get_cpu_count() if cpu_count < 2: test.cancel("Test requires at least 2 vCPUs.") msg = "Update irqbalance service status in guest if not match request." error_context.context(msg, logging.info) irqbalance_status = params.get("irqbalance_status", "active") status = utils_misc.get_guest_service_status(session=session, service="irqbalance") service_cmd = "" if status == "active" and irqbalance_status == "inactive": service_cmd = "service irqbalance stop" elif status == "inactive" and irqbalance_status == "active": service_cmd = "service irqbalance start" if service_cmd: status, output = session.cmd_status_output(service_cmd) if status: msg = "Fail to update irqbalance service status in guest." msg += " Command output in guest: %s" % output test.error(msg) error_context.context("Get first network interface name in guest.", logging.info) devname = get_first_network_devname(test, session, nic_interface_filter) error_context.context("Start background network stress in guest.", logging.info) host_ip = utils_net.get_ip_address_by_interface(params.get('netdst')) ping_cmd = "ping %s -f -q" % host_ip ping_timeout = irqbalance_check_count * 10 + 100 ping_session = vm.wait_for_login(timeout=timeout) bg_stress = utils_misc.InterruptedThread(utils_test.raw_ping, kwargs={'command': ping_cmd, 'timeout': ping_timeout, 'session': ping_session, 'output_func': None}) bg_stress.start() try: error_context.context("Get irq number assigned to attached " "VF/PF in guest", logging.info) irq_nums_dict = get_guest_irq_info(test, session, devname, cpu_count) if irq_nums_dict: irqs = irq_nums_dict.keys() msg = "Check specified IRQ count grow on specified cpu." error_context.context(msg, logging.info) check_irqbalance(test, session, devname, cpu_count, irqs) irq_cpus_dict = {} for irq in irqs: cpus = get_irq_smp_affinity(test, session, irq) irq_cpus_dict[irq] = cpus if irqbalance_status == "inactive": msg = "balance IRQs generated by vfs/pfs to different vcpus." error_context.context(msg, logging.info) post_irq_cpus_dict = {} for irq in irq_cpus_dict: balance_cpu_count = 1 cpus = [] for cpu in range(cpu_count): if cpu not in irq_cpus_dict[irq]: cpus.append(cpu) if len(cpus) == balance_cpu_count: break set_irq_smp_affinity(test, session, irq, cpus) post_irq_cpus_dict[irq] = cpus for irq in irqs: cpus = get_irq_smp_affinity(test, session, irq) msg = "Fail to balance IRQs generated by vf/pf to different cpu" if cpus != post_irq_cpus_dict[irq]: test.fail(msg) msg = "Check specified IRQ count grow on specified cpu." error_context.context(msg, logging.info) check_irqbalance(test, session, devname, cpu_count, irqs, count=irqbalance_check_count) if irqbalance_status == "active": msg = "Check that specified IRQ count grow on every cpu." error_context.context(msg, logging.info) post_irq_nums_dict = get_guest_irq_info(test, session, devname, cpu_count) for irq in irqs: if irq not in post_irq_nums_dict.keys(): post_irqs = post_irq_nums_dict.keys() msg = "Different irq detected: '%s' and '%s'." % (irqs, post_irqs) test.error(msg) for cpu in range(cpu_count): if (int(irq_nums_dict[irq][cpu]) >= int(post_irq_nums_dict[irq][cpu])): msg = "'Cpu%s' did not handle more interrupt" % cpu msg += "for irq '%s'." % irq msg += "IRQ balance information for IRQ '%s'\n" % irq msg += "First time: %s\n" % irq_nums_dict msg += "Just now: %s" % post_irq_nums_dict test.fail(msg) finally: if bg_stress.isAlive(): bg_stress.join(suppress_exception=True) else: logging.warn("Background stress test already finished")
def run(test, params, env): """ Qemu guest irqbalance inactive/active test: 1) Setup host for sr-iov test. 2) Boot VM with sr-iov vf/pf assigned and multi vcpu. 3) Update irqbalance service status in guest. stop/start this server according to request. 4) Get available network interface name in guest. 5) Start background network stress in guest. 6) Get irq number assigned to attached vfs/pfs. 7) Get the cpu number the irq running. 8) Check specified IRQ count grow on specified cpu. 9) Repeat step 7 for every 10s. 10) Balance IRQs generated by vfs/pfs to different vcpus (optional) e.g. echo 4 > /proc/irq/num/smp_affinity 11) Repeat step 6, 7 12) Check that specified IRQ count grow on every cpu. (optional) :param test: QEMU test object :param params: Dictionary with the test parameters :param env: Dictionary with test environment. """ vm = env.get_vm(params["main_vm"]) vm.verify_alive() timeout = int(params.get("login_timeout", 360)) session = vm.wait_for_login(timeout=timeout) irqbalance_check_count = int(params.get("irqbalance_check_count", 36)) nic_interface_filter = params["nic_interface_filter"] error.context("Make sure that guest have at least 2 vCPUs.", logging.info) cpu_count = vm.get_cpu_count() if cpu_count < 2: raise error.TestNAError("Test requires at least 2 vCPUs.") msg = "Update irqbalance service status in guest if not match request." error.context(msg, logging.info) irqbalance_status = params.get("irqbalance_status", "active") status = utils_misc.get_guest_service_status(session=session, service="irqbalance") service_cmd = "" if status == "active" and irqbalance_status == "inactive": service_cmd = "service irqbalance stop" elif status == "inactive" and irqbalance_status == "active": service_cmd = "service irqbalance start" if service_cmd: status, output = session.cmd_status_output(service_cmd) if status: msg = "Fail to update irqbalance service status in guest." msg += " Command output in guest: %s" % output raise error.TestError(msg) error.context("Get first network interface name in guest.", logging.info) devname = get_first_network_devname(session, nic_interface_filter) error.context("Start background network stress in guest.", logging.info) host_ip = utils_net.get_ip_address_by_interface(params.get('netdst')) ping_cmd = "ping %s -f -q" % host_ip ping_timeout = irqbalance_check_count * 10 + 100 ping_session = vm.wait_for_login(timeout=timeout) bg_stress = utils.InterruptedThread(utils_test.raw_ping, kwargs={'command': ping_cmd, 'timeout': ping_timeout, 'session': ping_session, 'output_func': None}) bg_stress.start() try: error.context("Get irq number assigned to attached VF/PF in guest", logging.info) irq_nums_dict = get_guest_irq_info(session, devname, cpu_count) if irq_nums_dict: irqs = irq_nums_dict.keys() msg = "Check specified IRQ count grow on specified cpu." error.context(msg, logging.info) check_irqbalance(session, devname, cpu_count, irqs) irq_cpus_dict = {} for irq in irqs: cpus = get_irq_smp_affinity(session, irq) irq_cpus_dict[irq] = cpus if irqbalance_status == "inactive": msg = "balance IRQs generated by vfs/pfs to different vcpus." error.context(msg, logging.info) post_irq_cpus_dict = {} for irq in irq_cpus_dict: balance_cpu_count = 1 cpus = [] for cpu in xrange(cpu_count): if cpu not in irq_cpus_dict[irq]: cpus.append(cpu) if len(cpus) == balance_cpu_count: break set_irq_smp_affinity(session, irq, cpus) post_irq_cpus_dict[irq] = cpus for irq in irqs: cpus = get_irq_smp_affinity(session, irq) msg = "Fail to balance IRQs generated by vf/pf to different cpu" if cpus != post_irq_cpus_dict[irq]: raise error.TestFail(msg) msg = "Check specified IRQ count grow on specified cpu." error.context(msg, logging.info) check_irqbalance(session, devname, cpu_count, irqs, count=irqbalance_check_count) if irqbalance_status == "active": msg = "Check that specified IRQ count grow on every cpu." error.context(msg, logging.info) post_irq_nums_dict = get_guest_irq_info(session, devname, cpu_count) for irq in irqs: if irq not in post_irq_nums_dict.keys(): post_irqs = post_irq_nums_dict.keys() msg = "Different irq detected: '%s' and '%s'." % (irqs, post_irqs) raise error.TestError(msg) for cpu in xrange(cpu_count): if (int(irq_nums_dict[irq][cpu]) >= int(post_irq_nums_dict[irq][cpu])): msg = "'Cpu%s' did not handle more interrupt" % cpu msg += "for irq '%s'." % irq msg += "IRQ balance information for IRQ '%s'\n" % irq msg += "First time: %s\n" % irq_nums_dict msg += "Just now: %s" % post_irq_nums_dict raise error.TestFail(msg) finally: if bg_stress.isAlive(): bg_stress.join(suppress_exception=True) else: logging.warn("Background stress test already finished")