diff options
-rw-r--r-- | meta/lib/oeqa/selftest/imagefeatures.py | 96 | ||||
-rw-r--r-- | meta/lib/oeqa/utils/commands.py | 49 |
2 files changed, 67 insertions, 78 deletions
diff --git a/meta/lib/oeqa/selftest/imagefeatures.py b/meta/lib/oeqa/selftest/imagefeatures.py index 1795b7bcf3..d48435fedf 100644 --- a/meta/lib/oeqa/selftest/imagefeatures.py +++ b/meta/lib/oeqa/selftest/imagefeatures.py @@ -1,20 +1,18 @@ from oeqa.selftest.base import oeSelfTest -from oeqa.utils.commands import runCmd, bitbake, get_bb_var +from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu from oeqa.utils.decorators import testcase -import pexpect +from oeqa.utils.sshcontrol import SSHControl from os.path import isfile -from os import system, killpg +from os import system import glob -import signal - +import os +import sys +import logging class ImageFeatures(oeSelfTest): test_user = 'tester' root_user = 'root' - prompt = r'qemux86:\S+[$#]\s+' - ssh_cmd = "ssh {} -l {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" - get_ip_patt = r'\s+ip=(?P<qemu_ip>(\d+.){3}\d+)::' @testcase(1107) def test_non_root_user_can_connect_via_ssh_without_password(self): @@ -37,41 +35,12 @@ class ImageFeatures(oeSelfTest): # Build a core-image-minimal bitbake('core-image-minimal') - # Boot qemu image - proc_qemu = pexpect.spawn('runqemu qemux86 nographic') - try: - proc_qemu.expect(self.get_ip_patt, timeout=100) - qemu_ip = proc_qemu.match.group('qemu_ip') - proc_qemu.expect('qemux86 login:', timeout=100) - except Exception as e: - try: - killpg(proc_qemu.pid, signal.SIGTERM) - except: - pass - self.fail('Failed to start qemu: %s' % e) - - # Attempt to ssh with each user into qemu with empty password - for user in [self.root_user, self.test_user]: - proc_ssh = pexpect.spawn(self.ssh_cmd.format(qemu_ip, user)) - index = proc_ssh.expect([self.prompt, pexpect.TIMEOUT, pexpect.EOF]) - if index == 0: - # user successfully logged in with empty password - pass - elif index == 1: - killpg(proc_qemu.pid, signal.SIGTERM) - proc_ssh.terminate() - self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user)) - else: - killpg(proc_qemu.pid, signal.SIGTERM) - proc_ssh.terminate() - self.fail('Failed to ssh with {} user into qemu (eof).'.format(user)) - proc_ssh.terminate() - - # Cleanup - try: - killpg(proc_qemu.pid, signal.SIGTERM) - except: - pass + with runqemu("core-image-minimal", self) as qemu: + # Attempt to ssh with each user into qemu with empty password + for user in [self.root_user, self.test_user]: + ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user=user) + status, output = ssh.run("true") + self.assertEqual(status, 0, 'ssh to user %s failed with %s' % (user, output)) @testcase(1115) def test_all_users_can_connect_via_ssh_without_password(self): @@ -82,7 +51,6 @@ class ImageFeatures(oeSelfTest): Author: Ionut Chisanovici <ionutx.chisanovici@intel.com> AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com> """ - features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh allow-empty-password"\n' features += 'INHERIT += "extrausers"\n' features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user) @@ -93,41 +61,13 @@ class ImageFeatures(oeSelfTest): # Build a core-image-minimal bitbake('core-image-minimal') - # Boot qemu image - proc_qemu = pexpect.spawn('runqemu qemux86 nographic') - try: - proc_qemu.expect(self.get_ip_patt, timeout=100) - qemu_ip = proc_qemu.match.group('qemu_ip') - proc_qemu.expect('qemux86 login:', timeout=100) - except Exception as e: - try: - killpg(proc_qemu.pid, signal.SIGTERM) - except: - pass - self.fail('Failed to start qemu: %s' % e) - - # Attempt to ssh with each user into qemu with empty password - for user in [self.root_user, self.test_user]: - proc_ssh = pexpect.spawn(self.ssh_cmd.format(qemu_ip, user)) - index = proc_ssh.expect([self.prompt, pexpect.TIMEOUT, pexpect.EOF]) - if index == 0: - # user successfully logged in with empty password - pass - elif index == 1: - killpg(proc_qemu.pid, signal.SIGTERM) - proc_ssh.terminate() - self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user)) - else: - killpg(proc_qemu.pid, signal.SIGTERM) - proc_ssh.terminate() - self.fail('Failed to ssh with {} user into qemu (eof).'.format(user)) - proc_ssh.terminate() + with runqemu("core-image-minimal", self) as qemu: + # Attempt to ssh with each user into qemu with empty password + for user in [self.root_user, self.test_user]: + ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user=user) + status, output = ssh.run("true") + self.assertEqual(status, 0, 'ssh to user tester failed with %s' % output) - # Cleanup - try: - killpg(proc_qemu.pid, signal.SIGTERM) - except: - pass @testcase(1114) def test_rpm_version_4_support_on_image(self): diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py index 1be7bedd40..50a08dc1fa 100644 --- a/meta/lib/oeqa/utils/commands.py +++ b/meta/lib/oeqa/utils/commands.py @@ -17,6 +17,7 @@ import logging from oeqa.utils import CommandError from oeqa.utils import ftools import re +import contextlib class Command(object): def __init__(self, command, bg=False, timeout=None, data=None, **options): @@ -173,3 +174,51 @@ def create_temp_layer(templayerdir, templayername, priority=999, recipepathspec= f.write('BBFILE_PATTERN_%s = "^${LAYERDIR}/"\n' % templayername) f.write('BBFILE_PRIORITY_%s = "%d"\n' % (templayername, priority)) f.write('BBFILE_PATTERN_IGNORE_EMPTY_%s = "1"\n' % templayername) + + +@contextlib.contextmanager +def runqemu(pn, test): + + import bb.tinfoil + import bb.build + + tinfoil = bb.tinfoil.Tinfoil() + tinfoil.prepare(False) + try: + tinfoil.logger.setLevel(logging.WARNING) + import oeqa.targetcontrol + tinfoil.config_data.setVar("TEST_LOG_DIR", "${WORKDIR}/testimage") + tinfoil.config_data.setVar("TEST_QEMUBOOT_TIMEOUT", "90") + import oe.recipeutils + recipefile = oe.recipeutils.pn_to_recipe(tinfoil.cooker, pn) + recipedata = oe.recipeutils.parse_recipe(recipefile, [], tinfoil.config_data) + + # The QemuRunner log is saved out, but we need to ensure it is at the right + # log level (and then ensure that since it's a child of the BitBake logger, + # we disable propagation so we don't then see the log events on the console) + logger = logging.getLogger('BitBake.QemuRunner') + logger.setLevel(logging.DEBUG) + logger.propagate = False + logdir = recipedata.getVar("TEST_LOG_DIR", True) + + qemu = oeqa.targetcontrol.QemuTarget(recipedata) + finally: + # We need to shut down tinfoil early here in case we actually want + # to run tinfoil-using utilities with the running QEMU instance. + # Luckily QemuTarget doesn't need it after the constructor. + tinfoil.shutdown() + + try: + qemu.deploy() + try: + qemu.start() + except bb.build.FuncFailed: + raise Exception('Failed to start QEMU - see the logs in %s' % logdir) + + yield qemu + + finally: + try: + qemu.stop() + except: + pass |