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 <[email protected]> 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 <[email protected]> > --- > 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 > -- _______________________________________________ Openembedded-core mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-core
