[OE-core] [meta-oe][PATCH 1/3] testimage: Refactoring and fixing.

Paulo Neves ptsneves at gmail.com
Sun Aug 12 19:49:26 UTC 2018


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