[OE-core] [meta-oe][PATCH 1/3] testimage: Refactoring and fixing.
Paulo Neves
ptsneves at gmail.com
Sat Aug 18 16:40:49 UTC 2018
Ping.
Does anybody have any comments? Also I noticed that my commit once was
in the master-next but it was removed. Without it being in master I
cannot submit my changes to poky mailing list with the fixes for the
remaining targets.
Paulo Neves
On Sun, Aug 12, 2018 at 9:49 PM Paulo Neves <ptsneves at gmail.com> wrote:
>
> I found a bug in my code where changing a variable, for example in
> layer.conf does not re-trigger the generation of the json file
> containing the data store at the time of image creation. The json file
> is generated in
> ROOTFS_POSTPROCESS_COMMAND += "write_image_test_data ; " @
> meta/classes/rootfs-postcommands.bbclass.
>
> Can anybody tell me if changing a variable in the datastore and
> accessing it in the postprocess_command will never trigger the
> postprocess_command? It happens that in this case this variable is not
> important for the rootfs task itself but only for the post-process.
>
> Paulo Neves
> On Fri, Aug 10, 2018 at 9:38 PM Paulo Neves <ptsneves at gmail.com> wrote:
> >
> > The testimage.bbclass invocation of controllers besides
> > simpletarget and qemutarget was broken. Setting TEST_TARGET
> > to class names did not work, only hardcoded values set in
> > context.py were allowed. On the other hand the other
> > TEST_TARGETs available were supposedly available through the
> > class name convetion but none of them were working. See:
> > https://bugzilla.yoctoproject.org/show_bug.cgi?id=12842
> >
> > In this commit qemuwrapper and simpletarget TEST_TARGETS are
> > now not available through these names, but through the
> > common convention of class names.
> >
> > The code for layer defined controllers was outdated and
> > broken because the example controllers in meta-yocto-bsp as
> > well as the controllers available in masterimage were
> > dependent only on the datastore d being available for
> > __init__ contruction, when the testimage.bbclass and
> > context.py, which initialize test controllers never passed
> > the datastore. This commit fixes all the openembedded
> > controllers to not use the datastore, but the testdata json
> > file that is loaded by the testimage.bbclass. This way the
> > tests can still be exported to be ran outside bitbake. The
> > kwargs and logger is still passed in the constructor and
> > there maybe some redundancies between the kwargs and the td
> > test datstore, but this is not addressed in this commit.
> >
> > In masterimage.py there was a duplicate SystemdbootTarget
> > which was removed. It is my opinion that all targets should
> > go to meta-yocto-bsp or meta/ and should not get special
> > treatment whether they come from poky or other layer.
> >
> > In this commit functionality that was lost in masterimage
> > about retrieving a fresh BB_ORIGENV. The test data json file
> > does not store this variable, so the build-time enviromental
> > variables cannot be retrieved later on, when running the
> > tests.
> >
> > The deploy() method invocation of the test cases was removed
> > in the refactoring and this commit re-adds it in the same
> > logical place. The deploy method was added as an abstract
> > method so that all Test controller classes have this method.
> > This method had been lost and was not used in the
> > simpleremote and qemuwrapper, because these controllers do
> > not need the functionality, but almost any real board
> > requires certain steps to deploy the new images, before the
> > tests can be ran. An example of this need was visible in the
> > master image and subclasses in meta-yocto-bsp.
> >
> > A dependency on images fstypes of qemu was removed from
> > testimage. The allowed file system types were not relevant
> > for other controllers, and made it so that there was an
> > import of the OEQemuTarget python class applicable to all
> > possible controllers, including non qemu.
> >
> > The SimpleRemoteTarget, OEQemuTarget and a custom
> > controller, developed according to the manual were
> > successfully tested.
> >
> > Signed-off-by: Paulo Neves <ptsneves at gmail.com>
> > ---
> > meta/classes/testimage.bbclass | 18 +---
> > meta/lib/oeqa/controllers/masterimage.py | 107 ++++++---------------
> > .../target/qemu.py => controllers/qemutarget.py} | 30 ++++--
> > meta/lib/oeqa/controllers/simpleremote.py | 33 +++++++
> > .../target/ssh.py => controllers/sshtarget.py} | 9 +-
> > meta/lib/oeqa/core/target/__init__.py | 4 +
> > meta/lib/oeqa/runtime/context.py | 32 +-----
> > meta/lib/oeqa/targetcontrol.py | 97 ++++++-------------
> > 8 files changed, 137 insertions(+), 193 deletions(-)
> > rename meta/lib/oeqa/{core/target/qemu.py => controllers/qemutarget.py} (58%)
> > create mode 100644 meta/lib/oeqa/controllers/simpleremote.py
> > rename meta/lib/oeqa/{core/target/ssh.py => controllers/sshtarget.py} (98%)
> >
> > diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass
> > index 6fa901b..2aa59b0 100644
> > --- a/meta/classes/testimage.bbclass
> > +++ b/meta/classes/testimage.bbclass
> > @@ -75,7 +75,7 @@ DEFAULT_TEST_SUITES_remove_qemumips64 = "${MIPSREMOVE}"
> > TEST_SUITES ?= "${DEFAULT_TEST_SUITES}"
> >
> > TEST_QEMUBOOT_TIMEOUT ?= "1000"
> > -TEST_TARGET ?= "qemu"
> > +TEST_TARGET ?= "OEQemuTarget"
> >
> > TESTIMAGEDEPENDS = ""
> > TESTIMAGEDEPENDS_qemuall = "qemu-native:do_populate_sysroot qemu-helper-native:do_populate_sysroot qemu-helper-native:do_addto_recipe_sysroot"
> > @@ -147,7 +147,6 @@ def testimage_main(d):
> > from oeqa.core.utils.misc import updateTestData
> > from oeqa.runtime.context import OERuntimeTestContext
> > from oeqa.runtime.context import OERuntimeTestContextExecutor
> > - from oeqa.core.target.qemu import supported_fstypes
> > from oeqa.core.utils.test import getSuiteCases
> > from oeqa.utils import make_logger_bitbake_compatible
> >
> > @@ -189,15 +188,6 @@ def testimage_main(d):
> > # Get machine
> > machine = d.getVar("MACHINE")
> >
> > - # Get rootfs
> > - fstypes = [fs for fs in d.getVar('IMAGE_FSTYPES').split(' ')
> > - if fs in supported_fstypes]
> > - if not fstypes:
> > - bb.fatal('Unsupported image type built. Add a comptible image to '
> > - 'IMAGE_FSTYPES. Supported types: %s' %
> > - ', '.join(supported_fstypes))
> > - rootfs = '%s.%s' % (image_name, fstypes[0])
> > -
> > # Get tmpdir (not really used, just for compatibility)
> > tmpdir = d.getVar("TMPDIR")
> >
> > @@ -230,7 +220,6 @@ def testimage_main(d):
> > # TODO: We use the current implementatin of qemu runner because of
> > # time constrains, qemu runner really needs a refactor too.
> > target_kwargs = { 'machine' : machine,
> > - 'rootfs' : rootfs,
> > 'tmpdir' : tmpdir,
> > 'dir_image' : dir_image,
> > 'display' : display,
> > @@ -253,9 +242,7 @@ def testimage_main(d):
> > d.getVar("TESTIMAGE_DUMP_DIR"))
> >
> > # the robot dance
> > - target = OERuntimeTestContextExecutor.getTarget(
> > - d.getVar("TEST_TARGET"), logger, d.getVar("TEST_TARGET_IP"),
> > - d.getVar("TEST_SERVER_IP"), **target_kwargs)
> > + target = OERuntimeTestContextExecutor.getTarget(d.getVar("TEST_TARGET"), td, logger, **target_kwargs)
> >
> > # test context
> > tc = OERuntimeTestContext(td, logger, target, host_dumper,
> > @@ -282,6 +269,7 @@ def testimage_main(d):
> > # Add systemd.log_level=debug to enable systemd debug logging
> > bootparams = 'systemd.log_target=console'
> >
> > + tc.target.deploy()
> > results = None
> > orig_sigterm_handler = signal.signal(signal.SIGTERM, sigterm_exception)
> > try:
> > diff --git a/meta/lib/oeqa/controllers/masterimage.py b/meta/lib/oeqa/controllers/masterimage.py
> > index a2912fc..26e3870 100644
> > --- a/meta/lib/oeqa/controllers/masterimage.py
> > +++ b/meta/lib/oeqa/controllers/masterimage.py
> > @@ -28,18 +28,18 @@ class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget, metaclass=ABCMeta
> >
> > supported_image_fstypes = ['tar.gz', 'tar.bz2']
> >
> > - def __init__(self, d):
> > - super(MasterImageHardwareTarget, self).__init__(d)
> > + def __init__(self, td, logger, **kwargs):
> > + super(MasterImageHardwareTarget, self).__init__(td, logger, **kwargs)
> >
> > # target ip
> > - addr = d.getVar("TEST_TARGET_IP") or bb.fatal('Please set TEST_TARGET_IP with the IP address of the machine you want to run the tests on.')
> > + addr = td['TEST_TARGET_IP'] or bb.fatal('Please set TEST_TARGET_IP with the IP address of the machine you want to run the tests on.')
> > self.ip = addr.split(":")[0]
> > try:
> > self.port = addr.split(":")[1]
> > except IndexError:
> > self.port = None
> > bb.note("Target IP: %s" % self.ip)
> > - self.server_ip = d.getVar("TEST_SERVER_IP")
> > + self.server_ip = td['TEST_SERVER_IP']
> > if not self.server_ip:
> > try:
> > self.server_ip = subprocess.check_output(['ip', 'route', 'get', self.ip ]).split("\n")[0].split()[-1]
> > @@ -48,50 +48,47 @@ class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget, metaclass=ABCMeta
> > bb.note("Server IP: %s" % self.server_ip)
> >
> > # test rootfs + kernel
> > - self.image_fstype = self.get_image_fstype(d)
> > - self.rootfs = os.path.join(d.getVar("DEPLOY_DIR_IMAGE"), d.getVar("IMAGE_LINK_NAME") + '.' + self.image_fstype)
> > - self.kernel = os.path.join(d.getVar("DEPLOY_DIR_IMAGE"), d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + '.bin')
> > + self.image_fstype = self.get_image_fstype(td)
> > + self.rootfs = os.path.join(td['DEPLOY_DIR_IMAGE'], td['IMAGE_LINK_NAME'] + '.' + self.image_fstype)
> > + self.kernel = os.path.join(td['DEPLOY_DIR_IMAGE'], td["KERNEL_IMAGETYPE"] + '-' + td['MACHINE'] + '.bin')
> > if not os.path.isfile(self.rootfs):
> > # we could've checked that IMAGE_FSTYPES contains tar.gz but the config for running testimage might not be
> > # the same as the config with which the image was build, ie
> > # you bitbake core-image-sato with IMAGE_FSTYPES += "tar.gz"
> > # and your autobuilder overwrites the config, adds the test bits and runs bitbake core-image-sato -c testimage
> > - bb.fatal("No rootfs found. Did you build the image ?\nIf yes, did you build it with IMAGE_FSTYPES += \"tar.gz\" ? \
> > - \nExpected path: %s" % self.rootfs)
> > + bb.fatal("No rootfs found. Did you build the image ?\n" \
> > + "If yes, did you build it with IMAGE_FSTYPES += \"{}\" ?" \
> > + "\nExpected path: {}".format(" ".join(self.supported_image_fstypes), self.rootfs))
> > if not os.path.isfile(self.kernel):
> > bb.fatal("No kernel found. Expected path: %s" % self.kernel)
> >
> > # master ssh connection
> > self.master = None
> > +
> > # if the user knows what they are doing, then by all means...
> > - self.user_cmds = d.getVar("TEST_DEPLOY_CMDS")
> > + self.user_cmds = td['TEST_DEPLOY_CMDS'] if 'TEST_DEPLOY_CMDS' in td else None
> > self.deploy_cmds = None
> >
> > - # this is the name of the command that controls the power for a board
> > - # e.g: TEST_POWERCONTROL_CMD = "/home/user/myscripts/powercontrol.py ${MACHINE} what-ever-other-args-the-script-wants"
> > - # the command should take as the last argument "off" and "on" and "cycle" (off, on)
> > - self.powercontrol_cmd = d.getVar("TEST_POWERCONTROL_CMD") or None
> > - self.powercontrol_args = d.getVar("TEST_POWERCONTROL_EXTRA_ARGS", False) or ""
> > -
> > - self.serialcontrol_cmd = d.getVar("TEST_SERIALCONTROL_CMD") or None
> > - self.serialcontrol_args = d.getVar("TEST_SERIALCONTROL_EXTRA_ARGS", False) or ""
> > -
> > self.origenv = os.environ
> > - if self.powercontrol_cmd or self.serialcontrol_cmd:
> > - # the external script for controlling power might use ssh
> > - # ssh + keys means we need the original user env
> > - bborigenv = d.getVar("BB_ORIGENV", False) or {}
> > - for key in bborigenv:
> > - val = bborigenv.getVar(key)
> > - if val is not None:
> > - self.origenv[key] = str(val)
> >
> > - if self.powercontrol_cmd:
> > - if self.powercontrol_args:
> > - self.powercontrol_cmd = "%s %s" % (self.powercontrol_cmd, self.powercontrol_args)
> > - if self.serialcontrol_cmd:
> > - if self.serialcontrol_args:
> > - self.serialcontrol_cmd = "%s %s" % (self.serialcontrol_cmd, self.serialcontrol_args)
> > + # TEST_POWERCONTROL_CMD is the name of the command that controls the power for a board.
> > + # the command should take as the last argument "off" and "on" and "cycle" (off, on)
> > + self.powercontrol_cmd = None
> > + self.powercontrol_args = None
> > + self.serialcontrol_cmd = None
> > + self.serialcontrol_args = None
> > +
> > + if 'TEST_POWERCONTROL_CMD' in td:
> > + self.powercontrol_cmd = td['TEST_POWERCONTROL_CMD']
> > + if 'TEST_POWERCONTROL_EXTRA_ARGS' in td:
> > + powercontrol_args = td['TEST_POWERCONTROL_EXTRA_ARGS']
> > + self.powercontrol_cmd = "%s %s" % (self.powercontrol_cmd, powercontrol_args)
> > +
> > + if 'TEST_SERIALCONTROL_CMD' in td:
> > + self.serialcontrol_cmd = td['TEST_SERIALCONTROL_CMD']
> > + if 'TEST_SERIALCONTROL_EXTRA_ARGS' in td:
> > + serialcontrol_args = td['TEST_SERIALCONTROL_EXTRA_ARGS']
> > + self.serialcontrol_cmd = "%s %s" % (self.serialcontrol_cmd, serialcontrol_args)
> >
> > def power_ctl(self, msg):
> > if self.powercontrol_cmd:
> > @@ -161,48 +158,8 @@ class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget, metaclass=ABCMeta
> >
> > class SystemdbootTarget(MasterImageHardwareTarget):
> >
> > - def __init__(self, d):
> > - super(SystemdbootTarget, self).__init__(d)
> > - # this the value we need to set in the LoaderEntryOneShot EFI variable
> > - # so the system boots the 'test' bootloader label and not the default
> > - # The first four bytes are EFI bits, and the rest is an utf-16le string
> > - # (EFI vars values need to be utf-16)
> > - # $ echo -en "test\0" | iconv -f ascii -t utf-16le | hexdump -C
> > - # 00000000 74 00 65 00 73 00 74 00 00 00 |t.e.s.t...|
> > - self.efivarvalue = r'\x07\x00\x00\x00\x74\x00\x65\x00\x73\x00\x74\x00\x00\x00'
> > - self.deploy_cmds = [
> > - 'mount -L boot /boot',
> > - 'mkdir -p /mnt/testrootfs',
> > - 'mount -L testrootfs /mnt/testrootfs',
> > - 'modprobe efivarfs',
> > - 'mount -t efivarfs efivarfs /sys/firmware/efi/efivars',
> > - 'cp ~/test-kernel /boot',
> > - 'rm -rf /mnt/testrootfs/*',
> > - 'tar xvf ~/test-rootfs.%s -C /mnt/testrootfs' % self.image_fstype,
> > - 'printf "%s" > /sys/firmware/efi/efivars/LoaderEntryOneShot-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f' % self.efivarvalue
> > - ]
> > -
> > - def _deploy(self):
> > - # make sure these aren't mounted
> > - self.master.run("umount /boot; umount /mnt/testrootfs; umount /sys/firmware/efi/efivars;")
> > - # from now on, every deploy cmd should return 0
> > - # else an exception will be thrown by sshcontrol
> > - self.master.ignore_status = False
> > - self.master.copy_to(self.rootfs, "~/test-rootfs." + self.image_fstype)
> > - self.master.copy_to(self.kernel, "~/test-kernel")
> > - for cmd in self.deploy_cmds:
> > - self.master.run(cmd)
> > -
> > - def _start(self, params=None):
> > - self.power_cycle(self.master)
> > - # there are better ways than a timeout but this should work for now
> > - time.sleep(120)
> > -
> > -
> > -class SystemdbootTarget(MasterImageHardwareTarget):
> > -
> > - def __init__(self, d):
> > - super(SystemdbootTarget, self).__init__(d)
> > + def __init__(self, td, logger, **kwargs):
> > + super(SystemdbootTarget, self).__init__(td, logger, **kwargs)
> > # this the value we need to set in the LoaderEntryOneShot EFI variable
> > # so the system boots the 'test' bootloader label and not the default
> > # The first four bytes are EFI bits, and the rest is an utf-16le string
> > diff --git a/meta/lib/oeqa/core/target/qemu.py b/meta/lib/oeqa/controllers/qemutarget.py
> > similarity index 58%
> > rename from meta/lib/oeqa/core/target/qemu.py
> > rename to meta/lib/oeqa/controllers/qemutarget.py
> > index bf3b633..a867dfb 100644
> > --- a/meta/lib/oeqa/core/target/qemu.py
> > +++ b/meta/lib/oeqa/controllers/qemutarget.py
> > @@ -6,24 +6,37 @@ import sys
> > import signal
> > import time
> >
> > -from .ssh import OESSHTarget
> > +from oeqa.controllers.sshtarget import OESSHTarget
> > from oeqa.utils.qemurunner import QemuRunner
> >
> > -supported_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
> >
> > class OEQemuTarget(OESSHTarget):
> > - def __init__(self, logger, ip, server_ip, timeout=300, user='root',
> > + supported_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
> > + def __init__(self, td, logger, timeout=300, user='root',
> > port=None, machine='', rootfs='', kernel='', kvm=False,
> > dump_dir='', dump_host_cmds='', display='', bootlog='',
> > tmpdir='', dir_image='', boottime=60, **kwargs):
> >
> > - super(OEQemuTarget, self).__init__(logger, ip, server_ip, timeout,
> > - user, port)
> > + super(OEQemuTarget, self).__init__(td, logger, timeout, user, port)
> >
> > - self.ip = ip
> > - self.server_ip = server_ip
> > + self.ip = td['TEST_TARGET_IP']
> > + self.server_ip = td['TEST_SERVER_IP']
> > self.machine = machine
> > +
> > +
> > + image_name = ("%s/%s" % (td['DEPLOY_DIR_IMAGE'], td['IMAGE_LINK_NAME']))
> > +
> > + # Get rootfs
> > + if not rootfs:
> > + fstypes = [fs for fs in td['IMAGE_FSTYPES'].split(' ')
> > + if fs in self.supported_fstypes]
> > + if not fstypes:
> > + bb.fatal('Unsupported image type built. Add a comptible image to '
> > + 'IMAGE_FSTYPES. Supported types: %s' %
> > + ', '.join(self.supported_fstypes))
> > + rootfs = '%s.%s' % (image_name, fstypes[0])
> > self.rootfs = rootfs
> > +
> > self.kernel = kernel
> > self.kvm = kvm
> >
> > @@ -41,5 +54,8 @@ class OEQemuTarget(OESSHTarget):
> > self.stop()
> > raise RuntimeError("FAILED to start qemu - check the task log and the boot log")
> >
> > + def deploy(self):
> > + pass
> > +
> > def stop(self):
> > self.runner.stop()
> > diff --git a/meta/lib/oeqa/controllers/simpleremote.py b/meta/lib/oeqa/controllers/simpleremote.py
> > new file mode 100644
> > index 0000000..5f945d0
> > --- /dev/null
> > +++ b/meta/lib/oeqa/controllers/simpleremote.py
> > @@ -0,0 +1,33 @@
> > +from oeqa.targetcontrol import BaseTarget
> > +from oeqa.utils.sshcontrol import SSHControl
> > +
> > +class SimpleRemoteTarget(BaseTarget):
> > +
> > + def __init__(self, td, logger, **kwargs):
> > + super(SimpleRemoteTarget, self).__init__(td, logger, **kwargs)
> > + addr = td['TEST_TARGET_IP'] or bb.fatal('Please set TEST_TARGET_IP with the IP address of the machine you want to run the tests on.')
> > + self.ip = addr.split(":")[0]
> > + try:
> > + self.port = addr.split(":")[1]
> > + except IndexError:
> > + self.port = None
> > + self.logger.info("Target IP: %s" % self.ip)
> > + self.server_ip = td['TEST_SERVER_IP']
> > + if not self.server_ip:
> > + try:
> > + self.server_ip = subprocess.check_output(['ip', 'route', 'get', self.ip ]).split("\n")[0].split()[-1]
> > + except Exception as e:
> > + bb.fatal("Failed to determine the host IP address (alternatively you can set TEST_SERVER_IP with the IP address of this machine): %s" % e)
> > + self.logger.info("Server IP: %s" % self.server_ip)
> > +
> > + def deploy(self):
> > + super(SimpleRemoteTarget, self).deploy()
> > +
> > + def start(self, params=None, ssh=True, extra_bootparams=None):
> > + if ssh:
> > + self.connection = SSHControl(self.ip, logfile=self.sshlog, port=self.port)
> > +
> > + def stop(self):
> > + self.connection = None
> > + self.ip = None
> > + self.server_ip = None
> > diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/controllers/sshtarget.py
> > similarity index 98%
> > rename from meta/lib/oeqa/core/target/ssh.py
> > rename to meta/lib/oeqa/controllers/sshtarget.py
> > index 8ff1f6c..fd1c0b2 100644
> > --- a/meta/lib/oeqa/core/target/ssh.py
> > +++ b/meta/lib/oeqa/controllers/sshtarget.py
> > @@ -8,10 +8,10 @@ import logging
> > import subprocess
> > import codecs
> >
> > -from . import OETarget
> > +from oeqa.core.target import OETarget
> >
> > class OESSHTarget(OETarget):
> > - def __init__(self, logger, ip, server_ip, timeout=300, user='root',
> > + def __init__(self, td, logger, timeout=300, user='root',
> > port=None, **kwargs):
> > if not logger:
> > logger = logging.getLogger('target')
> > @@ -25,8 +25,9 @@ class OESSHTarget(OETarget):
> > logger.addHandler(fileHandler)
> >
> > super(OESSHTarget, self).__init__(logger)
> > - self.ip = ip
> > - self.server_ip = server_ip
> > + self.ip = td['TEST_TARGET_IP']
> > + self.server_ip = td['TEST_SERVER_IP']
> > +
> > self.timeout = timeout
> > self.user = user
> > ssh_options = [
> > diff --git a/meta/lib/oeqa/core/target/__init__.py b/meta/lib/oeqa/core/target/__init__.py
> > index d2468bc..081a30e 100644
> > --- a/meta/lib/oeqa/core/target/__init__.py
> > +++ b/meta/lib/oeqa/core/target/__init__.py
> > @@ -21,6 +21,10 @@ class OETarget(object):
> > pass
> >
> > @abstractmethod
> > + def deploy(self):
> > + pass
> > +
> > + @abstractmethod
> > def copyTo(self, localSrc, remoteDst):
> > pass
> >
> > diff --git a/meta/lib/oeqa/runtime/context.py b/meta/lib/oeqa/runtime/context.py
> > index a7f3823..b886435 100644
> > --- a/meta/lib/oeqa/runtime/context.py
> > +++ b/meta/lib/oeqa/runtime/context.py
> > @@ -4,8 +4,6 @@
> > import os
> >
> > from oeqa.core.context import OETestContext, OETestContextExecutor
> > -from oeqa.core.target.ssh import OESSHTarget
> > -from oeqa.core.target.qemu import OEQemuTarget
> > from oeqa.utils.dump import HostDumper
> >
> > from oeqa.runtime.loader import OERuntimeTestLoader
> > @@ -89,32 +87,12 @@ class OERuntimeTestContextExecutor(OETestContextExecutor):
> > help="Qemu boot configuration, only needed when target_type is QEMU.")
> >
> > @staticmethod
> > - def getTarget(target_type, logger, target_ip, server_ip, **kwargs):
> > + def getTarget(target_type, td, logger, **kwargs):
> > target = None
> >
> > - if target_ip:
> > - target_ip_port = target_ip.split(':')
> > - if len(target_ip_port) == 2:
> > - target_ip = target_ip_port[0]
> > - kwargs['port'] = target_ip_port[1]
> > -
> > - if target_type == 'simpleremote':
> > - target = OESSHTarget(logger, target_ip, server_ip, **kwargs)
> > - elif target_type == 'qemu':
> > - target = OEQemuTarget(logger, target_ip, server_ip, **kwargs)
> > - else:
> > - # XXX: This code uses the old naming convention for controllers and
> > - # targets, the idea it is to leave just targets as the controller
> > - # most of the time was just a wrapper.
> > - # XXX: This code tries to import modules from lib/oeqa/controllers
> > - # directory and treat them as controllers, it will less error prone
> > - # to use introspection to load such modules.
> > - # XXX: Don't base your targets on this code it will be refactored
> > - # in the near future.
> > - # Custom target module loading
> > - target_modules_path = kwargs.get('target_modules_path', '')
> > - controller = OERuntimeTestContextExecutor.getControllerModule(target_type, target_modules_path)
> > - target = controller(logger, target_ip, server_ip, **kwargs)
> > + target_modules_path = kwargs.get('target_modules_path', '')
> > + controller = OERuntimeTestContextExecutor.getControllerModule(target_type, target_modules_path)
> > + target = controller(td, logger, **kwargs)
> >
> > return target
> >
> > @@ -176,7 +154,7 @@ class OERuntimeTestContextExecutor(OETestContextExecutor):
> > try:
> > obj = getattr(module, target)
> > except:
> > - obj = None
> > + pass
> > return obj
> >
> > @staticmethod
> > diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py
> > index 59a9c35..109d90b 100644
> > --- a/meta/lib/oeqa/targetcontrol.py
> > +++ b/meta/lib/oeqa/targetcontrol.py
> > @@ -22,18 +22,17 @@ class BaseTarget(object, metaclass=ABCMeta):
> >
> > supported_image_fstypes = []
> >
> > - def __init__(self, d, logger):
> > + def __init__(self, td, logger, **kwargs):
> > self.connection = None
> > self.ip = None
> > self.server_ip = None
> > - self.datetime = d.getVar('DATETIME')
> > - self.testdir = d.getVar("TEST_LOG_DIR")
> > - self.pn = d.getVar("PN")
> > + self.datetime = td['DATETIME']
> > + self.testdir = td['TEST_LOG_DIR']
> > + self.pn = td['PN']
> > self.logger = logger
> >
> > @abstractmethod
> > def deploy(self):
> > -
> > self.sshlog = os.path.join(self.testdir, "ssh_target_log.%s" % self.datetime)
> > sshloglink = os.path.join(self.testdir, "ssh_target_log")
> > if os.path.islink(sshloglink):
> > @@ -54,17 +53,17 @@ class BaseTarget(object, metaclass=ABCMeta):
> > return None
> >
> > @classmethod
> > - def match_image_fstype(self, d, image_fstypes=None):
> > + def match_image_fstype(self, td, image_fstypes=None):
> > if not image_fstypes:
> > - image_fstypes = d.getVar('IMAGE_FSTYPES').split(' ')
> > + image_fstypes = td['IMAGE_FSTYPES'].split(' ')
> > possible_image_fstypes = [fstype for fstype in self.supported_image_fstypes if fstype in image_fstypes]
> > if possible_image_fstypes:
> > return possible_image_fstypes[0]
> > else:
> > return None
> >
> > - def get_image_fstype(self, d):
> > - image_fstype = self.match_image_fstype(d)
> > + def get_image_fstype(self, td):
> > + image_fstype = self.match_image_fstype(td)
> > if image_fstype:
> > return image_fstype
> > else:
> > @@ -89,28 +88,28 @@ class QemuTarget(BaseTarget):
> >
> > supported_image_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic']
> >
> > - def __init__(self, d, logger, image_fstype=None):
> > + def __init__(self, td, logger, image_fstype=None, **kwargs):
> >
> > import oe.types
> >
> > - super(QemuTarget, self).__init__(d, logger)
> > + super(QemuTarget, self).__init__(td, logger, **kwargs)
> >
> > self.rootfs = ''
> > self.kernel = ''
> > self.image_fstype = ''
> >
> > - if d.getVar('FIND_ROOTFS') == '1':
> > - self.image_fstype = image_fstype or self.get_image_fstype(d)
> > - self.rootfs = os.path.join(d.getVar("DEPLOY_DIR_IMAGE"), d.getVar("IMAGE_LINK_NAME") + '.' + self.image_fstype)
> > - self.kernel = os.path.join(d.getVar("DEPLOY_DIR_IMAGE"), d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + '.bin')
> > + if td['FIND_ROOTFS'] == '1':
> > + self.image_fstype = image_fstype or self.get_image_fstype(td)
> > + self.rootfs = os.path.join(td['DEPLOY_DIR_IMAGE'], td['IMAGE_LINK_NAME'] + '.' + self.image_fstype)
> > + self.kernel = os.path.join(td['DEPLOY_DIR_IMAGE'], td["KERNEL_IMAGETYPE"] + '-' + td['MACHINE'] + '.bin')
> > self.qemulog = os.path.join(self.testdir, "qemu_boot_log.%s" % self.datetime)
> > - dump_target_cmds = d.getVar("testimage_dump_target")
> > - dump_host_cmds = d.getVar("testimage_dump_host")
> > - dump_dir = d.getVar("TESTIMAGE_DUMP_DIR")
> > - qemu_use_kvm = d.getVar("QEMU_USE_KVM")
> > + dump_target_cmds = td['testimage_dump_target']
> > + dump_host_cmds = td['testimage_dump_host']
> > + dump_dir = td['TESTIMAGE_DUMP_DIR']
> > + qemu_use_kvm = td['QEMU_USE_KVM']
> > if qemu_use_kvm and \
> > - (oe.types.boolean(qemu_use_kvm) and "x86" in d.getVar("MACHINE") or \
> > - d.getVar("MACHINE") in qemu_use_kvm.split()):
> > + (oe.types.boolean(qemu_use_kvm) and "x86" in td['MACHINE'] or \
> > + td['MACHINE'] in qemu_use_kvm.split()):
> > use_kvm = True
> > else:
> > use_kvm = False
> > @@ -124,27 +123,27 @@ class QemuTarget(BaseTarget):
> > self.logger.addHandler(loggerhandler)
> > oe.path.symlink(os.path.basename(self.qemurunnerlog), os.path.join(self.testdir, 'qemurunner_log'), force=True)
> >
> > - if d.getVar("DISTRO") == "poky-tiny":
> > - self.runner = QemuTinyRunner(machine=d.getVar("MACHINE"),
> > + if td['DISTRO'] == "poky-tiny":
> > + self.runner = QemuTinyRunner(machine=td['MACHINE'],
> > rootfs=self.rootfs,
> > - tmpdir = d.getVar("TMPDIR"),
> > - deploy_dir_image = d.getVar("DEPLOY_DIR_IMAGE"),
> > - display = d.getVar("BB_ORIGENV", False).getVar("DISPLAY"),
> > + tmpdir = td['TMPDIR'],
> > + deploy_dir_image = td['DEPLOY_DIR_IMAGE'],
> > + display = td['DISPLAY'],
> > logfile = self.qemulog,
> > kernel = self.kernel,
> > - boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")),
> > + boottime = int(td['TEST_QEMUBOOT_TIMEOUT']),
> > logger = logger)
> > else:
> > - self.runner = QemuRunner(machine=d.getVar("MACHINE"),
> > + self.runner = QemuRunner(machine=td['MACHINE'],
> > rootfs=self.rootfs,
> > - tmpdir = d.getVar("TMPDIR"),
> > - deploy_dir_image = d.getVar("DEPLOY_DIR_IMAGE"),
> > - display = d.getVar("BB_ORIGENV", False).getVar("DISPLAY"),
> > + tmpdir = td['TMPDIR'],
> > + deploy_dir_image = td['DEPLOY_DIR_IMAGE'],
> > + display = td['DISPLAY'],
> > logfile = self.qemulog,
> > - boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")),
> > + boottime = int(td['TEST_QEMUBOOT_TIMEOUT']),
> > use_kvm = use_kvm,
> > dump_dir = dump_dir,
> > - dump_host_cmds = d.getVar("testimage_dump_host"),
> > + dump_host_cmds = td['testimage_dump_host'],
> > logger = logger)
> >
> > self.target_dumper = TargetDumper(dump_target_cmds, dump_dir, self.runner)
> > @@ -198,35 +197,3 @@ class QemuTarget(BaseTarget):
> >
> > def run_serial(self, command, timeout=5):
> > return self.runner.run_serial(command, timeout=timeout)
> > -
> > -
> > -class SimpleRemoteTarget(BaseTarget):
> > -
> > - def __init__(self, d):
> > - super(SimpleRemoteTarget, self).__init__(d)
> > - addr = d.getVar("TEST_TARGET_IP") or bb.fatal('Please set TEST_TARGET_IP with the IP address of the machine you want to run the tests on.')
> > - self.ip = addr.split(":")[0]
> > - try:
> > - self.port = addr.split(":")[1]
> > - except IndexError:
> > - self.port = None
> > - self.logger.info("Target IP: %s" % self.ip)
> > - self.server_ip = d.getVar("TEST_SERVER_IP")
> > - if not self.server_ip:
> > - try:
> > - self.server_ip = subprocess.check_output(['ip', 'route', 'get', self.ip ]).split("\n")[0].split()[-1]
> > - except Exception as e:
> > - bb.fatal("Failed to determine the host IP address (alternatively you can set TEST_SERVER_IP with the IP address of this machine): %s" % e)
> > - self.logger.info("Server IP: %s" % self.server_ip)
> > -
> > - def deploy(self):
> > - super(SimpleRemoteTarget, self).deploy()
> > -
> > - def start(self, params=None, ssh=True, extra_bootparams=None):
> > - if ssh:
> > - self.connection = SSHControl(self.ip, logfile=self.sshlog, port=self.port)
> > -
> > - def stop(self):
> > - self.connection = None
> > - self.ip = None
> > - self.server_ip = None
> > --
> > 2.7.4
> >
More information about the Openembedded-core
mailing list