Skip to contentSkip to conversation

wic: bugfixes & --fixed-size support, tests, oe-selftest: minor fixes

PATCH Superseded Maciej Borzecki 2 participants 20 messages Nov 24, 2016 – Dec 21, 2016

lore
Share & tools
lore
#0 lore raw

v5 cover wic: bugfixes & --fixed-size support, tests, oe-selftest: minor fixes

v5 of a patch series previously posted here [1].

Changes since v4:

* dropped wic: selftest: do not repeat core-image-minimal & rebased dependant patches

* minor formatting fix in wic: selftest: add tests for --fixed-size partition flags

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129103.html

Maciej Borzecki (6):
oe-selftest: enforce en_US.UTF-8 locale oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

 meta/lib/oeqa/selftest/wic.py          | 123 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 +++++++++--
 scripts/lib/wic/partition.py           |  88 ++++++++++++++---------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 scripts/oe-selftest                    |   3 +
 8 files changed, 234 insertions(+), 48 deletions(-)
Signature · 1 line
2.5.0
#1 lore raw

PATCH v5 1/6 oe-selftest: enforce en_US.UTF-8 locale

Replicate bitbake and eforce en_US.UTF-8 locale so that ouptut of locale-aware tools remains stable.

---
 scripts/oe-selftest | 3 +++
 1 file changed, 3 insertions(+)
scripts/oe-selftest +3 -0
index c3215ea6592e128d17da550d778272985f5bd1a6..deaa4324cc888ea261687f90f83e8759c4436a15 100755
@@ -468,6 +468,9 @@ def main():
     sys.path.extend(layer_libdirs)
     imp.reload(oeqa.selftest)
 
+    # act like bitbake and enforce en_US.UTF-8 locale
+    os.environ["LC_ALL"] = "en_US.UTF-8"
+
     if args.run_tests_by and len(args.run_tests_by) >= 2:
         valid_options = ['name', 'class', 'module', 'id', 'tag']
         if args.run_tests_by[0] not in valid_options:
Signature · 1 line
2.5.0
#2 lore raw

PATCH v5 2/6 oeqa/utils/commands.py: allow use of binaries from native sysroot

In reply to Maciej Borzecki

Tests may need to run a native tool that is not available on the host filesystem, but can be built using one of the *-native recipes. In such case, the tool will be available in native sysroot, and running in from that location will require adjustments to PATH.

runCmd() can now take a path to native sysroot as one of its arguments and setup PATH accordingly.

---
 meta/lib/oeqa/utils/commands.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
meta/lib/oeqa/utils/commands.py +8 -1
index 5cd0f7477baa5bb45f2b2b5b93fb1ff0efd02923..657c9dba34ea9d42aa416f3b889f4b04129e8da9 100644
@@ -97,9 +97,16 @@ class Result(object):
     pass
 
 
-def runCmd(command, ignore_status=False, timeout=None, assert_error=True, **options):
+def runCmd(command, ignore_status=False, timeout=None, assert_error=True, native_sysroot=None, **options):
     result = Result()
 
+    if native_sysroot:
+        extra_paths = "%s/sbin:%s/usr/sbin:%s/usr/bin" % \
+                      (native_sysroot, native_sysroot, native_sysroot)
+        nenv = dict(options.get('env', os.environ))
+        nenv['PATH'] = extra_paths + ':' + nenv.get('PATH', '')
+        options['env'] = nenv
+
     cmd = Command(command, timeout=timeout, **options)
     cmd.run()
 
Signature · 1 line
2.5.0
#3 lore raw

PATCH v5 3/6 wic: add --fixed-size wks option

In reply to Maciej Borzecki

Added new option --fixed-size to wks. The option can be used to indicate the exact size of a partition. The option cannot be added together with --size, in which case an error will be raised. Other options that influence automatic partition size (--extra-space, --overhead-factor), if specifiec along with --fixed-size, will raise an error.

If it partition data is larger than the amount of space specified with --fixed-size option wic will raise an error.

---
 scripts/lib/wic/help.py                | 14 ++++--
 scripts/lib/wic/imager/direct.py       |  2 +-
 scripts/lib/wic/ksparser.py            | 41 ++++++++++++++--
 scripts/lib/wic/partition.py           | 88 +++++++++++++++++++++-------------
 scripts/lib/wic/utils/partitionedfs.py |  2 +-
 5 files changed, 105 insertions(+), 42 deletions(-)
scripts/lib/wic/help.py +11 -3
index e5347ec4b7c900c68fc64351a5293e75de0672b3..daa11bf489c135627ddfe4cef968e48f8e3ad1d8 100644
@@ -646,6 +646,12 @@ DESCRIPTION
                  not specified, the size is in MB.
                  You do not need this option if you use --source.
 
+         --fixed-size: Exact partition size. Value format is the same
+                       as for --size option. This option cannot be
+                       specified along with --size. If partition data
+                       is larger than --fixed-size and error will be
+                       raised when assembling disk image.
+
          --source: This option is a wic-specific option that names the
                    source of the data that will populate the
                    partition.  The most common value for this option
@@ -719,13 +725,15 @@ DESCRIPTION
                         space after the space filled by the content
                         of the partition. The final size can go
                         beyond the size specified by --size.
-                        By default, 10MB.
+                        By default, 10MB. This option cannot be used
+                        with --fixed-size option.
 
          --overhead-factor: This option is specific to wic. The
                             size of the partition is multiplied by
                             this factor. It has to be greater than or
-                            equal to 1.
-                            The default value is 1.3.
+                            equal to 1. The default value is 1.3.
+                            This option cannot be used with --fixed-size
+                            option.
 
          --part-type: This option is specific to wic. It specifies partition
                       type GUID for GPT partitions.
scripts/lib/wic/imager/direct.py +1 -1
index 2bedef08d6450096c786def6f75a9ee53fcd4b3b..11ec15e33f65885618c7adc83e55c6a39fedbe99 100644
@@ -290,7 +290,7 @@ class DirectImageCreator(BaseImageCreator):
                          self.bootimg_dir, self.kernel_dir, self.native_sysroot)
 
 
-            self.__image.add_partition(int(part.size),
+            self.__image.add_partition(part.disk_size,
                                        part.disk,
                                        part.mountpoint,
                                        part.source_file,
scripts/lib/wic/ksparser.py +37 -4

70 lines not on this page · raw message

scripts/lib/wic/partition.py +55 -33

161 lines not on this page · raw message

scripts/lib/wic/utils/partitionedfs.py +1 -1
index 9e76487844eebfffc7227d053a65dc9fdab3678b..cfa5f5ce09b764c1c2a9b7a3f7bf7d677a6811c4 100644
@@ -209,7 +209,7 @@ class Image():
             msger.debug("Assigned %s to %s%d, sectors range %d-%d size %d "
                         "sectors (%d bytes)." \
                             % (part['mountpoint'], part['disk_name'], part['num'],
-                               part['start'], part['start'] + part['size'] - 1,
+                               part['start'], disk['offset'] - 1,
                                part['size'], part['size'] * self.sector_size))
 
         # Once all the partitions have been layed out, we can calculate the
Signature · 1 line
2.5.0
#4 lore raw

PATCH v5 4/6 wic: selftest: avoid COMPATIBLE_HOST issues

In reply to Maciej Borzecki

wic tests will unconditionally attempt to build syslinux and add configuration options that may not be compatible with current machine.

Resolve this by consulting HOST_ARCH (which defaults to TARGET_ARCH) and build recipes, add configuration options or skip tests conditionally.

A convenience decorator onlyForArch() can be used to skip test cases for specific architectures.

---
 meta/lib/oeqa/selftest/wic.py | 51 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 47 insertions(+), 4 deletions(-)
meta/lib/oeqa/selftest/wic.py +47 -4
index faac11e21643e4c32a83b649b6ae986fead498f1..2db14445956bc5adcf1e755844bbdb69edcb468f 100644
@@ -24,15 +24,33 @@
 """Test cases for wic."""
 
 import os
+import unittest
 
 from glob import glob
 from shutil import rmtree
+from functools import wraps
 
 from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
 from oeqa.utils.decorators import testcase
 
 
+class onlyForArch(object):
+
+    def __init__(self, *args):
+        self.archs = args
+
+    def __call__(self,f):
+        @wraps(f)
+        def wrapped_f(*args, **kwargs):
+            arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
+            if self.archs and arch not in self.archs :
+                raise unittest.SkipTest("Testcase arch dependency not met: %s" % arch)
+            return f(*args, **kwargs)
+        wrapped_f.__name__ = f.__name__
+        return wrapped_f
+
+
 class Wic(oeSelfTest):
     """Wic test class."""
 
@@ -41,15 +59,22 @@ class Wic(oeSelfTest):
 
     def setUpLocal(self):
         """This code is executed before each test method."""
-        self.write_config('IMAGE_FSTYPES += " hddimg"\n'
-                          'MACHINE_FEATURES_append = " efi"\n')
+        arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
+        is_x86 = arch in ['i586', 'i686', 'x86_64']
+        if is_x86:
+            self.write_config('IMAGE_FSTYPES += " hddimg"\n' \
+                              'MACHINE_FEATURES_append = " efi"\n')
 
         # Do this here instead of in setUpClass as the base setUp does some
         # clean up which can result in the native tools built earlier in
         # setUpClass being unavailable.
         if not Wic.image_is_ready:
-            bitbake('syslinux syslinux-native parted-native gptfdisk-native '
-                    'dosfstools-native mtools-native bmap-tools-native')
+            tools = 'parted-native gptfdisk-native ' \
+                    'dosfstools-native mtools-native bmap-tools-native'
+            if is_x86:
+                tools += ' syslinux syslinux-native'
+            bitbake(tools)
+
             bitbake('core-image-minimal')
             Wic.image_is_ready = True
 
@@ -71,6 +96,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd('wic list --help').status)
 
     @testcase(1211)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_build_image_name(self):
         """Test wic create directdisk --image-name core-image-minimal"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -78,6 +104,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
     @testcase(1212)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_build_artifacts(self):
         """Test wic create directdisk providing all artifacts."""
         bbvars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
@@ -92,6 +119,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
     @testcase(1157)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_gpt_image(self):
         """Test creation of core-image-minimal with gpt table and UUID boot"""
         self.assertEqual(0, runCmd("wic create directdisk-gpt "
@@ -125,6 +153,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd('wic help kickstart').status)
 
     @testcase(1264)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_gzip(self):
         """Test compressing an image with gzip"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -134,6 +163,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.gz")))
 
     @testcase(1265)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_bzip2(self):
         """Test compressing an image with bzip2"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -143,6 +173,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.bz2")))
 
     @testcase(1266)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_xz(self):
         """Test compressing an image with xz"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -152,6 +183,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.xz")))
 
     @testcase(1267)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_wrong_compressor(self):
         """Test how wic breaks if wrong compressor is provided"""
         self.assertEqual(2, runCmd("wic create directdisk "
@@ -159,6 +191,7 @@ class Wic(oeSelfTest):
                                    "-c wrong", ignore_status=True).status)
 
     @testcase(1268)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_rootfs_indirect_recipes(self):
         """Test usage of rootfs plugin with rootfs recipes"""
         wks = "directdisk-multi-rootfs"
@@ -170,6 +203,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s*.direct" % wks)))
 
     @testcase(1269)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_rootfs_artifacts(self):
         """Test usage of rootfs plugin with rootfs paths"""
         bbvars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
@@ -188,6 +222,7 @@ class Wic(oeSelfTest):
                                      "%(wks)s-*.direct" % bbvars)))
 
     @testcase(1346)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_iso_image(self):
         """Test creation of hybrid iso image with legacy and EFI boot"""
         self.assertEqual(0, runCmd("wic create mkhybridiso "
@@ -220,6 +255,7 @@ class Wic(oeSelfTest):
                 self.assertTrue(content[var])
 
     @testcase(1351)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_wic_image_type(self):
         """Test building wic images by bitbake"""
         self.assertEqual(0, bitbake('wic-image-minimal').status)
@@ -235,6 +271,7 @@ class Wic(oeSelfTest):
             self.assertTrue(os.path.isfile(os.path.realpath(path)))
 
     @testcase(1348)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_qemux86_directdisk(self):
         """Test creation of qemux-86-directdisk image"""
         image = "qemux86-directdisk"
@@ -243,6 +280,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1349)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_mkgummidisk(self):
         """Test creation of mkgummidisk image"""
         image = "mkgummidisk"
@@ -251,6 +289,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1350)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_mkefidisk(self):
         """Test creation of mkefidisk image"""
         image = "mkefidisk"
@@ -259,6 +298,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1385)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_directdisk_bootloader_config(self):
         """Test creation of directdisk-bootloader-config image"""
         image = "directdisk-bootloader-config"
@@ -267,6 +307,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1422)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_qemu(self):
         """Test wic-image-minimal under qemu"""
         self.assertEqual(0, bitbake('wic-image-minimal').status)
@@ -277,6 +318,7 @@ class Wic(oeSelfTest):
             self.assertEqual(1, status, 'Failed to run command "%s": %s' % (command, output))
             self.assertEqual(output, '/dev/root /\r\n/dev/vda3 /mnt')
 
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_bmap(self):
         """Test generation of .bmap file"""
         image = "directdisk"
@@ -285,6 +327,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct.bmap" % image)))
 
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_systemd_bootdisk(self):
         """Test creation of systemd-bootdisk image"""
         image = "systemd-bootdisk"
Signature · 1 line
2.5.0
#5 lore raw

PATCH v5 5/6 wic: selftest: do not assume bzImage kernel image

In reply to Maciej Borzecki

Instead of assuming that bzImage is available, query bitbake enviroment for KERNEL_IMAGETYPE.

---
 meta/lib/oeqa/selftest/wic.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
meta/lib/oeqa/selftest/wic.py +2 -1
index 2db14445956bc5adcf1e755844bbdb69edcb468f..84ba08675b2995812a858e78b3678b2ab325b15b 100644
@@ -338,7 +338,8 @@ class Wic(oeSelfTest):
     def test_sdimage_bootpart(self):
         """Test creation of sdimage-bootpart image"""
         image = "sdimage-bootpart"
-        self.write_config('IMAGE_BOOT_FILES = "bzImage"\n')
+        kimgtype = get_bb_var('KERNEL_IMAGETYPE', 'core-image-minimal')
+        self.write_config('IMAGE_BOOT_FILES = "%s"\n' % kimgtype)
         self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
                                    % image).status)
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
Signature · 1 line
2.5.0
#6 lore raw

PATCH v5 6/6 wic: selftest: add tests for --fixed-size partition flags

In reply to Maciej Borzecki

wic has a new flag for setting a fixed parition size --fixed-size. Add tests that verify if partition is indeed sized properly and that errors are signaled when there is not enough space to fit partition data.

---
 meta/lib/oeqa/selftest/wic.py | 61 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
meta/lib/oeqa/selftest/wic.py +61 -0
index 84ba08675b2995812a858e78b3678b2ab325b15b..4cba61060cbd081b2288c970877d863ef42d9b7f 100644
@@ -29,6 +29,7 @@ import unittest
 from glob import glob
 from shutil import rmtree
 from functools import wraps
+from tempfile import NamedTemporaryFile
 
 from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
@@ -59,6 +60,8 @@ class Wic(oeSelfTest):
 
     def setUpLocal(self):
         """This code is executed before each test method."""
+        self.native_sysroot = get_bb_var('STAGING_DIR_NATIVE', 'core-image-minimal')
+
         arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
         is_x86 = arch in ['i586', 'i686', 'x86_64']
         if is_x86:
@@ -343,3 +346,61 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
                                    % image).status)
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
+
+    def _make_fixed_size_wks(self, size):
+        """
+        Create a wks of an image with a single partition. Size of the partition is set
+        using --fixed-size flag. Returns a tuple: (path to wks file, wks image name)
+        """
+        with NamedTemporaryFile("w", suffix=".wks", delete=False) as tf:
+            wkspath = tf.name
+            tf.write("part " \
+                     "--source rootfs --ondisk hda --align 4 --fixed-size %d "
+                     "--fstype=ext4\n" % size)
+        wksname = os.path.splitext(os.path.basename(wkspath))[0]
+
+        return wkspath, wksname
+
+    def test_fixed_size(self):
+        """
+        Test creation of a simple image with partition size controlled through
+        --fixed-size flag
+        """
+        wkspath, wksname = self._make_fixed_size_wks(200)
+
+        self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
+                                   % wkspath).status)
+        os.remove(wkspath)
+        wicout = glob(self.resultdir + "%s-*direct" % wksname)
+        self.assertEqual(1, len(wicout))
+
+        wicimg = wicout[0]
+
+        # verify partition size with wic
+        res = runCmd("parted -m %s unit mib p 2>/dev/null" % wicimg,
+                     ignore_status=True,
+                     native_sysroot=self.native_sysroot)
+        self.assertEqual(0, res.status)
+
+        # parse parted output which looks like this:
+        # BYT;\n
+        # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
+        # 1:0.00MiB:200MiB:200MiB:ext4::;\n
+        partlns = res.output.splitlines()[2:]
+
+        self.assertEqual(1, len(partlns))
+        self.assertEqual("1:0.00MiB:200MiB:200MiB:ext4::;", partlns[0])
+
+    def test_fixed_size_error(self):
+        """
+        Test creation of a simple image with partition size controlled through
+        --fixed-size flag. The size of partition is intentionally set to 1MiB
+        in order to trigger an error in wic.
+        """
+        wkspath, wksname = self._make_fixed_size_wks(1)
+
+        self.assertEqual(1, runCmd("wic create %s -e core-image-minimal" \
+                                   % wkspath, ignore_status=True).status)
+        os.remove(wkspath)
+        wicout = glob(self.resultdir + "%s-*direct" % wksname)
+        self.assertEqual(0, len(wicout))
Signature · 1 line
2.5.0
#7 lore raw
In reply to Maciej Borzecki
Quoted 20 lines · Maciej Borzecki

v5 of a patch series previously posted here [1].

Changes since v4:

* dropped wic: selftest: do not repeat core-image-minimal & rebased dependant patches

* minor formatting fix in wic: selftest: add tests for --fixed-size partition flags

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129103.html

Maciej Borzecki (6):
oe-selftest: enforce en_US.UTF-8 locale oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

Quoted 9 lines
 meta/lib/oeqa/selftest/wic.py          | 123 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 +++++++++--
 scripts/lib/wic/partition.py           |  88 ++++++++++++++---------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 scripts/oe-selftest                    |   3 +
 8 files changed, 234 insertions(+), 48 deletions(-)

Is there any additional action needed from me at this point? A rebase or a resend perhaps?

Cheers,

Signature · 2 lines
Maciej Borzecki
RnDity
#8 lore raw
Quoted 32 lines · Maciej Borzęcki
Quoted 20 lines · Maciej Borzecki

v5 of a patch series previously posted here [1].

Changes since v4:

* dropped wic: selftest: do not repeat core-image-minimal & rebased dependant patches

* minor formatting fix in wic: selftest: add tests for --fixed-size partition flags

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129103.html

Maciej Borzecki (6):
oe-selftest: enforce en_US.UTF-8 locale oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

Quoted 9 lines
 meta/lib/oeqa/selftest/wic.py          | 123 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 +++++++++--
 scripts/lib/wic/partition.py           |  88 ++++++++++++++---------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 scripts/oe-selftest                    |   3 +
 8 files changed, 234 insertions(+), 48 deletions(-)
Quoted 3 lines

Is there any additional action needed from me at this point? A rebase or a resend perhaps?

Rebase&resend would be nice as at lest one patch from this patchset is already accepted.

--
Regards,
Ed

#9 lore raw
Quoted 33 lines · Ed Bartosh
Quoted 32 lines · Maciej Borzęcki
Quoted 29 lines · Maciej Borzecki

v5 of a patch series previously posted here [1].

Changes since v4:

* dropped wic: selftest: do not repeat core-image-minimal & rebased dependant patches

* minor formatting fix in wic: selftest: add tests for --fixed-size partition flags

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129103.html

Maciej Borzecki (6):
oe-selftest: enforce en_US.UTF-8 locale oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

 meta/lib/oeqa/selftest/wic.py          | 123 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 +++++++++--
 scripts/lib/wic/partition.py           |  88 ++++++++++++++---------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 scripts/oe-selftest                    |   3 +
 8 files changed, 234 insertions(+), 48 deletions(-)
Quoted 6 lines
Quoted 3 lines

Is there any additional action needed from me at this point? A rebase or a resend perhaps?

Rebase&resend would be nice as at lest one patch from this patchset is already accepted.

I will be posting a v6 later today or tomorrow.

Signature · 2 lines
Maciej Borzecki
RnDity
#10 lore raw

v6 cover wic: bugfixes & --fixed-size support, tests, oeqa: enhancements

In reply to Ed Bartosh

v6 of a patch series previously posted here [1].

Changes since v5:

* oe-selftest: enforce en_US.UTF-8 locale was merged to master, hence it's no longer part of this series

* rebased on top of master (d0d260b0b85790ceb136dd6b0445e8e33d038f5e)

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129187.html

Maciej Borzecki (5):
oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

 meta/lib/oeqa/selftest/wic.py          | 117 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 ++++++++++--
 scripts/lib/wic/partition.py           |  88 +++++++++++++++----------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 7 files changed, 224 insertions(+), 49 deletions(-)
Signature · 1 line
2.5.5
#11 lore raw

PATCH v6 1/5 oeqa/utils/commands.py: allow use of binaries from native sysroot

Tests may need to run a native tool that is not available on the host filesystem, but can be built using one of the *-native recipes. In such case, the tool will be available in native sysroot, and running in from that location will require adjustments to PATH.

runCmd() can now take a path to native sysroot as one of its arguments and setup PATH accordingly.

---
 meta/lib/oeqa/utils/commands.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
meta/lib/oeqa/utils/commands.py +8 -1
index 3a68b001b76ca89df17545912e2f75ca2cca6a38..0425c9fd98c7e8074ced6222156f5a1c2a393f50 100644
@@ -97,9 +97,16 @@ class Result(object):
     pass
 
 
-def runCmd(command, ignore_status=False, timeout=None, assert_error=True, **options):
+def runCmd(command, ignore_status=False, timeout=None, assert_error=True, native_sysroot=None, **options):
     result = Result()
 
+    if native_sysroot:
+        extra_paths = "%s/sbin:%s/usr/sbin:%s/usr/bin" % \
+                      (native_sysroot, native_sysroot, native_sysroot)
+        nenv = dict(options.get('env', os.environ))
+        nenv['PATH'] = extra_paths + ':' + nenv.get('PATH', '')
+        options['env'] = nenv
+
     cmd = Command(command, timeout=timeout, **options)
     cmd.run()
 
Signature · 1 line
2.5.5
#12 lore raw

PATCH v6 2/5 wic: add --fixed-size wks option

In reply to Maciej Borzecki

Added new option --fixed-size to wks. The option can be used to indicate the exact size of a partition. The option cannot be added together with --size, in which case an error will be raised. Other options that influence automatic partition size (--extra-space, --overhead-factor), if specifiec along with --fixed-size, will raise an error.

If it partition data is larger than the amount of space specified with --fixed-size option wic will raise an error.

---
 scripts/lib/wic/help.py                | 14 ++++--
 scripts/lib/wic/imager/direct.py       |  2 +-
 scripts/lib/wic/ksparser.py            | 41 ++++++++++++++--
 scripts/lib/wic/partition.py           | 88 +++++++++++++++++++++-------------
 scripts/lib/wic/utils/partitionedfs.py |  2 +-
 5 files changed, 105 insertions(+), 42 deletions(-)
scripts/lib/wic/help.py +11 -3
index e5347ec4b7c900c68fc64351a5293e75de0672b3..daa11bf489c135627ddfe4cef968e48f8e3ad1d8 100644
@@ -646,6 +646,12 @@ DESCRIPTION
                  not specified, the size is in MB.
                  You do not need this option if you use --source.
 
+         --fixed-size: Exact partition size. Value format is the same
+                       as for --size option. This option cannot be
+                       specified along with --size. If partition data
+                       is larger than --fixed-size and error will be
+                       raised when assembling disk image.
+
          --source: This option is a wic-specific option that names the
                    source of the data that will populate the
                    partition.  The most common value for this option
@@ -719,13 +725,15 @@ DESCRIPTION
                         space after the space filled by the content
                         of the partition. The final size can go
                         beyond the size specified by --size.
-                        By default, 10MB.
+                        By default, 10MB. This option cannot be used
+                        with --fixed-size option.
 
          --overhead-factor: This option is specific to wic. The
                             size of the partition is multiplied by
                             this factor. It has to be greater than or
-                            equal to 1.
-                            The default value is 1.3.
+                            equal to 1. The default value is 1.3.
+                            This option cannot be used with --fixed-size
+                            option.
 
          --part-type: This option is specific to wic. It specifies partition
                       type GUID for GPT partitions.
scripts/lib/wic/imager/direct.py +1 -1
index 2bedef08d6450096c786def6f75a9ee53fcd4b3b..11ec15e33f65885618c7adc83e55c6a39fedbe99 100644
@@ -290,7 +290,7 @@ class DirectImageCreator(BaseImageCreator):
                          self.bootimg_dir, self.kernel_dir, self.native_sysroot)
 
 
-            self.__image.add_partition(int(part.size),
+            self.__image.add_partition(part.disk_size,
                                        part.disk,
                                        part.mountpoint,
                                        part.source_file,
scripts/lib/wic/ksparser.py +37 -4

70 lines not on this page · raw message

scripts/lib/wic/partition.py +55 -33

161 lines not on this page · raw message

scripts/lib/wic/utils/partitionedfs.py +1 -1
index 9ea4a30cbb1cc66be66651653814c60b17bad2f9..68301f0b476ed48edfcb4dcad0df903474d13b50 100644
@@ -210,7 +210,7 @@ class Image():
             msger.debug("Assigned %s to %s%d, sectors range %d-%d size %d "
                         "sectors (%d bytes)." \
                             % (part['mountpoint'], part['disk_name'], part['num'],
-                               part['start'], part['start'] + part['size'] - 1,
+                               part['start'], disk['offset'] - 1,
                                part['size'], part['size'] * self.sector_size))
 
         # Once all the partitions have been layed out, we can calculate the
Signature · 1 line
2.5.5
#13 lore raw

PATCH v6 3/5 wic: selftest: avoid COMPATIBLE_HOST issues

In reply to Maciej Borzecki

wic tests will unconditionally attempt to build syslinux and add configuration options that may not be compatible with current machine.

Resolve this by consulting HOST_ARCH (which defaults to TARGET_ARCH) and build recipes, add configuration options or skip tests conditionally.

A convenience decorator onlyForArch() can be used to skip test cases for specific architectures.

---
 meta/lib/oeqa/selftest/wic.py | 53 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 48 insertions(+), 5 deletions(-)
meta/lib/oeqa/selftest/wic.py +48 -5
index e652fad24ab6dd7ab1b998b60a98a4052a2f1dd7..35cd14fb0c4a9b863a7a6324885f80da8e86d3eb 100644
@@ -24,15 +24,33 @@
 """Test cases for wic."""
 
 import os
+import unittest
 
 from glob import glob
 from shutil import rmtree
+from functools import wraps
 
 from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
 from oeqa.utils.decorators import testcase
 
 
+class onlyForArch(object):
+
+    def __init__(self, *args):
+        self.archs = args
+
+    def __call__(self,f):
+        @wraps(f)
+        def wrapped_f(*args, **kwargs):
+            arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
+            if self.archs and arch not in self.archs :
+                raise unittest.SkipTest("Testcase arch dependency not met: %s" % arch)
+            return f(*args, **kwargs)
+        wrapped_f.__name__ = f.__name__
+        return wrapped_f
+
+
 class Wic(oeSelfTest):
     """Wic test class."""
 
@@ -41,16 +59,23 @@ class Wic(oeSelfTest):
 
     def setUpLocal(self):
         """This code is executed before each test method."""
-        self.write_config('IMAGE_FSTYPES += " hddimg"\n'
-                          'MACHINE_FEATURES_append = " efi"\n'
-                          'WKS_FILE = "wic-image-minimal"\n')
+        arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
+        is_x86 = arch in ['i586', 'i686', 'x86_64']
+        if is_x86:
+            self.write_config('IMAGE_FSTYPES += " hddimg"\n' \
+                              'MACHINE_FEATURES_append = " efi"\n'
+                              'WKS_FILE = "wic-image-minimal"\n')
 
         # Do this here instead of in setUpClass as the base setUp does some
         # clean up which can result in the native tools built earlier in
         # setUpClass being unavailable.
         if not Wic.image_is_ready:
-            bitbake('syslinux syslinux-native parted-native gptfdisk-native '
-                    'dosfstools-native mtools-native bmap-tools-native')
+            tools = 'parted-native gptfdisk-native ' \
+                    'dosfstools-native mtools-native bmap-tools-native'
+            if is_x86:
+                tools += ' syslinux syslinux-native'
+            bitbake(tools)
+
             bitbake('core-image-minimal')
             Wic.image_is_ready = True
 
@@ -72,6 +97,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd('wic list --help').status)
 
     @testcase(1211)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_build_image_name(self):
         """Test wic create directdisk --image-name core-image-minimal"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -79,6 +105,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
     @testcase(1212)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_build_artifacts(self):
         """Test wic create directdisk providing all artifacts."""
         bbvars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
@@ -93,6 +120,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
     @testcase(1157)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_gpt_image(self):
         """Test creation of core-image-minimal with gpt table and UUID boot"""
         self.assertEqual(0, runCmd("wic create directdisk-gpt "
@@ -126,6 +154,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd('wic help kickstart').status)
 
     @testcase(1264)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_gzip(self):
         """Test compressing an image with gzip"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -135,6 +164,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.gz")))
 
     @testcase(1265)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_bzip2(self):
         """Test compressing an image with bzip2"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -144,6 +174,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.bz2")))
 
     @testcase(1266)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_compress_xz(self):
         """Test compressing an image with xz"""
         self.assertEqual(0, runCmd("wic create directdisk "
@@ -153,6 +184,7 @@ class Wic(oeSelfTest):
                                          "directdisk-*.direct.xz")))
 
     @testcase(1267)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_wrong_compressor(self):
         """Test how wic breaks if wrong compressor is provided"""
         self.assertEqual(2, runCmd("wic create directdisk "
@@ -160,6 +192,7 @@ class Wic(oeSelfTest):
                                    "-c wrong", ignore_status=True).status)
 
     @testcase(1268)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_rootfs_indirect_recipes(self):
         """Test usage of rootfs plugin with rootfs recipes"""
         wks = "directdisk-multi-rootfs"
@@ -171,6 +204,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s*.direct" % wks)))
 
     @testcase(1269)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_rootfs_artifacts(self):
         """Test usage of rootfs plugin with rootfs paths"""
         bbvars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
@@ -189,6 +223,7 @@ class Wic(oeSelfTest):
                                      "%(wks)s-*.direct" % bbvars)))
 
     @testcase(1346)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_iso_image(self):
         """Test creation of hybrid iso image with legacy and EFI boot"""
         self.assertEqual(0, runCmd("wic create mkhybridiso "
@@ -221,6 +256,7 @@ class Wic(oeSelfTest):
                 self.assertTrue(content[var])
 
     @testcase(1351)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_wic_image_type(self):
         """Test building wic images by bitbake"""
         self.assertEqual(0, bitbake('wic-image-minimal').status)
@@ -236,6 +272,7 @@ class Wic(oeSelfTest):
             self.assertTrue(os.path.isfile(os.path.realpath(path)))
 
     @testcase(1348)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_qemux86_directdisk(self):
         """Test creation of qemux-86-directdisk image"""
         image = "qemux86-directdisk"
@@ -244,6 +281,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1349)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_mkgummidisk(self):
         """Test creation of mkgummidisk image"""
         image = "mkgummidisk"
@@ -252,6 +290,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1350)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_mkefidisk(self):
         """Test creation of mkefidisk image"""
         image = "mkefidisk"
@@ -260,6 +299,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1385)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_directdisk_bootloader_config(self):
         """Test creation of directdisk-bootloader-config image"""
         image = "directdisk-bootloader-config"
@@ -268,6 +308,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
 
     @testcase(1422)
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_qemu(self):
         """Test wic-image-minimal under qemu"""
         self.assertEqual(0, bitbake('wic-image-minimal').status)
@@ -278,6 +319,7 @@ class Wic(oeSelfTest):
             self.assertEqual(1, status, 'Failed to run command "%s": %s' % (command, output))
             self.assertEqual(output, '/dev/root /\r\n/dev/vda3 /mnt')
 
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_bmap(self):
         """Test generation of .bmap file"""
         image = "directdisk"
@@ -286,6 +328,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct.bmap" % image)))
 
+    @onlyForArch('i586', 'i686', 'x86_64')
     def test_systemd_bootdisk(self):
         """Test creation of systemd-bootdisk image"""
         image = "systemd-bootdisk"
Signature · 1 line
2.5.5
#14 lore raw

PATCH v6 4/5 wic: selftest: do not assume bzImage kernel image

In reply to Maciej Borzecki

Instead of assuming that bzImage is available, query bitbake enviroment for KERNEL_IMAGETYPE.

---
 meta/lib/oeqa/selftest/wic.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
meta/lib/oeqa/selftest/wic.py +2 -1
index 35cd14fb0c4a9b863a7a6324885f80da8e86d3eb..8efece3171db47ee622f2c0f712fff2c2fcf645b 100644
@@ -339,7 +339,8 @@ class Wic(oeSelfTest):
     def test_sdimage_bootpart(self):
         """Test creation of sdimage-bootpart image"""
         image = "sdimage-bootpart"
-        self.write_config('IMAGE_BOOT_FILES = "bzImage"\n')
+        kimgtype = get_bb_var('KERNEL_IMAGETYPE', 'core-image-minimal')
+        self.write_config('IMAGE_BOOT_FILES = "%s"\n' % kimgtype)
         self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
                                    % image).status)
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
Signature · 1 line
2.5.5
#15 lore raw

PATCH v6 5/5 wic: selftest: add tests for --fixed-size partition flags

In reply to Maciej Borzecki

wic has a new flag for setting a fixed parition size --fixed-size. Add tests that verify if partition is indeed sized properly and that errors are signaled when there is not enough space to fit partition data.

---
 meta/lib/oeqa/selftest/wic.py | 61 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
meta/lib/oeqa/selftest/wic.py +61 -0
index 8efece3171db47ee622f2c0f712fff2c2fcf645b..9caf3b0b1e3d4b538fffd409b26f68f0101e78dc 100644
@@ -29,6 +29,7 @@ import unittest
 from glob import glob
 from shutil import rmtree
 from functools import wraps
+from tempfile import NamedTemporaryFile
 
 from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
@@ -59,6 +60,8 @@ class Wic(oeSelfTest):
 
     def setUpLocal(self):
         """This code is executed before each test method."""
+        self.native_sysroot = get_bb_var('STAGING_DIR_NATIVE', 'core-image-minimal')
+
         arch = get_bb_var('HOST_ARCH', 'core-image-minimal')
         is_x86 = arch in ['i586', 'i686', 'x86_64']
         if is_x86:
@@ -344,3 +347,61 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
                                    % image).status)
         self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
+
+    def _make_fixed_size_wks(self, size):
+        """
+        Create a wks of an image with a single partition. Size of the partition is set
+        using --fixed-size flag. Returns a tuple: (path to wks file, wks image name)
+        """
+        with NamedTemporaryFile("w", suffix=".wks", delete=False) as tf:
+            wkspath = tf.name
+            tf.write("part " \
+                     "--source rootfs --ondisk hda --align 4 --fixed-size %d "
+                     "--fstype=ext4\n" % size)
+        wksname = os.path.splitext(os.path.basename(wkspath))[0]
+
+        return wkspath, wksname
+
+    def test_fixed_size(self):
+        """
+        Test creation of a simple image with partition size controlled through
+        --fixed-size flag
+        """
+        wkspath, wksname = self._make_fixed_size_wks(200)
+
+        self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
+                                   % wkspath).status)
+        os.remove(wkspath)
+        wicout = glob(self.resultdir + "%s-*direct" % wksname)
+        self.assertEqual(1, len(wicout))
+
+        wicimg = wicout[0]
+
+        # verify partition size with wic
+        res = runCmd("parted -m %s unit mib p 2>/dev/null" % wicimg,
+                     ignore_status=True,
+                     native_sysroot=self.native_sysroot)
+        self.assertEqual(0, res.status)
+
+        # parse parted output which looks like this:
+        # BYT;\n
+        # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
+        # 1:0.00MiB:200MiB:200MiB:ext4::;\n
+        partlns = res.output.splitlines()[2:]
+
+        self.assertEqual(1, len(partlns))
+        self.assertEqual("1:0.00MiB:200MiB:200MiB:ext4::;", partlns[0])
+
+    def test_fixed_size_error(self):
+        """
+        Test creation of a simple image with partition size controlled through
+        --fixed-size flag. The size of partition is intentionally set to 1MiB
+        in order to trigger an error in wic.
+        """
+        wkspath, wksname = self._make_fixed_size_wks(1)
+
+        self.assertEqual(1, runCmd("wic create %s -e core-image-minimal" \
+                                   % wkspath, ignore_status=True).status)
+        os.remove(wkspath)
+        wicout = glob(self.resultdir + "%s-*direct" % wksname)
+        self.assertEqual(0, len(wicout))
Signature · 1 line
2.5.5
#16 lore raw

Re: [PATCH v6 0/5] wic: bugfixes & --fixed-size support, tests, oeqa: enhancements

In reply to Maciej Borzecki
Quoted 9 lines · Maciej Borzecki

v6 of a patch series previously posted here [1].

Changes since v5:

* oe-selftest: enforce en_US.UTF-8 locale was merged to master, hence it's no longer part of this series

* rebased on top of master (d0d260b0b85790ceb136dd6b0445e8e33d038f5e)

The patchset looks good to me. Thank you.

Couple of questions:
- did you test if Lars' change
https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb
works with your patchset?

- Regarding oe-selftest fixes, wich machine did you run oe-selftest on? It looks to me that a lot of test cases can be run on your machine if we use another wks.

Quoted 9 lines

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129187.html

Maciej Borzecki (5):
oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

Quoted 8 lines
 meta/lib/oeqa/selftest/wic.py          | 117 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 ++++++++++--
 scripts/lib/wic/partition.py           |  88 +++++++++++++++----------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 7 files changed, 224 insertions(+), 49 deletions(-)

--
Regards,
Ed

#17 lore raw

Re: [PATCH v6 0/5] wic: bugfixes & --fixed-size support, tests, oeqa: enhancements

Quoted 11 lines · Ed Bartosh
Quoted 9 lines · Maciej Borzecki

v6 of a patch series previously posted here [1].

Changes since v5:

* oe-selftest: enforce en_US.UTF-8 locale was merged to master, hence it's no longer part of this series

* rebased on top of master (d0d260b0b85790ceb136dd6b0445e8e33d038f5e)

Quoted 6 lines

The patchset looks good to me. Thank you.

Couple of questions:
- did you test if Lars' change
https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb
works with your patchset?

Yes. The series was rebased on top of d0d260b0b85790ceb136dd6b0445e8e33d038f5e, which includes Lars' patch. The tests passed on all MACHINES I've used (though I'm not sure if scenario addressed in that patch is covered by relevant test cases).

I believe I have also hit a weird bug in BitbakeVars._parse_line() while testing with this patch and meta-mender. I Hope you can confirm it.

From a quick investigation I have determined that _parse_line() may interpret arbitrary lines that are of 'key=value' format as legitimate bitbake variables. In my case, IMAGE_CMD_sdimg defined in mender-sdimg.bbclass includes the following piece:

    IMAGE_CMD_sdimg() {
        ...
        REMAINING_SIZE=$(expr ${MENDER_STORAGE_TOTAL_SIZE_MB} - \
        ${MENDER_BOOT_PART_SIZE_MB} - \
        ${MENDER_DATA_PART_SIZE_MB} - \
        ${MENDER_PARTITIONING_OVERHEAD_MB} - \
        $boot_env_size_mb)
        ROOTFS_SIZE=$(expr $REMAINING_SIZE / 2)
        ...
    }

This will obviously be seen in bitbake -e output. Looking at code here:
https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/scripts/lib/wic/utils/oe/misc.py?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb#n151
the line will be split at '=', then whitespace will be stripped from both key and value. So a line (taken from bitbake -e):

    ROOTFS_SIZE=\$(expr \$REMAINING_SIZE / 2)

Will define a variable ROOTFS_SIZE with value '\\$(expr \\$REMAINING_SIZE / 2)'.

It's a pure coincidence that Lars' patch queries ROOTFS_SIZE which also appears in bitbake -e output under exactly the same name.

IMO, when parsing env output, we should expect variable name to start right at the beginning of a line, IOW skip the line if key[0].isspace() == True

Quoted 4 lines

- Regarding oe-selftest fixes, wich machine did you run oe-selftest on? It looks to me that a lot of test cases can be run on your machine if we use another wks.

I've run it on beaglebone, vexpress-qemu, qemux86 and qemuarm. Agree with your observation though. I think that at least these TCs could be made machine agnostic:

- test_build_artifacts
- test_build_image_name
- test_compress_*
- test_gpt_image
- test_wic_image_type
- test_wrong_compressor
- test_rootfs_*

Quoted 10 lines
Quoted 10 lines

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129187.html

Maciej Borzecki (5):
oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

Quoted 9 lines
Quoted 8 lines
 meta/lib/oeqa/selftest/wic.py          | 117 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 ++++++++++--
 scripts/lib/wic/partition.py           |  88 +++++++++++++++----------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 7 files changed, 224 insertions(+), 49 deletions(-)

Regards,

Signature · 2 lines
Maciej Borzecki
RnDity
#18 lore raw

Re: [PATCH v6 0/5] wic: bugfixes & --fixed-size support, tests, oeqa: enhancements

Quoted 14 lines · Maciej Borzęcki
Quoted 13 lines · Ed Bartosh
Quoted 9 lines · Maciej Borzecki

v6 of a patch series previously posted here [1].

Changes since v5:

* oe-selftest: enforce en_US.UTF-8 locale was merged to master, hence it's no longer part of this series

* rebased on top of master (d0d260b0b85790ceb136dd6b0445e8e33d038f5e)

The patchset looks good to me. Thank you.

Quoted 7 lines
Quoted 4 lines

Couple of questions:
- did you test if Lars' change
https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb
works with your patchset?

Yes. The series was rebased on top of d0d260b0b85790ceb136dd6b0445e8e33d038f5e, which includes Lars' patch.

The series causes conflicts on the latest master. Can you check if it's really the case or it's just something wrong with my setup?

git-pw apply 3904
Applying series: wic: bugfixes & --fixed-size support, tests,
oe-selftest: minor fixes (rev 3)
Applying: oe-selftest: enforce en_US.UTF-8 locale
Using index info to reconstruct a base tree...
M scripts/oe-selftest
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: oeqa/utils/commands.py: allow use of binaries from native sysroot
Applying: wic: add --fixed-size wks option
Applying: wic: selftest: avoid COMPATIBLE_HOST issues
Using index info to reconstruct a base tree...
M meta/lib/oeqa/selftest/wic.py
Falling back to patching base and 3-way merge...
Auto-merging meta/lib/oeqa/selftest/wic.py
CONFLICT (content): Merge conflict in meta/lib/oeqa/selftest/wic.py Failed to merge in the changes.
Patch failed at 0004 wic: selftest: avoid COMPATIBLE_HOST issues The copy of the patch that failed is found in:
/home/ed/git/yocto/patchtest/openembedded-core/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort".

Quoted 3 lines

The tests passed on all MACHINES I've used (though I'm not sure if scenario addressed in that patch is covered by relevant test cases).

I've asked Lars to add test case for that functionality.

Quoted 3 lines

I believe I have also hit a weird bug in BitbakeVars._parse_line() while testing with this patch and meta-mender. I Hope you can confirm it.

Yes, I confirm this. Thanks for poining out to it. I'll fix it today.

Quoted 41 lines

From a quick investigation I have determined that _parse_line() may interpret arbitrary lines that are of 'key=value' format as legitimate bitbake variables. In my case, IMAGE_CMD_sdimg defined in mender-sdimg.bbclass includes the following piece:

    IMAGE_CMD_sdimg() {
        ...
        REMAINING_SIZE=$(expr ${MENDER_STORAGE_TOTAL_SIZE_MB} - \
        ${MENDER_BOOT_PART_SIZE_MB} - \
        ${MENDER_DATA_PART_SIZE_MB} - \
        ${MENDER_PARTITIONING_OVERHEAD_MB} - \
        $boot_env_size_mb)
        ROOTFS_SIZE=$(expr $REMAINING_SIZE / 2)
        ...
    }

This will obviously be seen in bitbake -e output. Looking at code here:
https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/scripts/lib/wic/utils/oe/misc.py?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb#n151
the line will be split at '=', then whitespace will be stripped from both key and value. So a line (taken from bitbake -e):

    ROOTFS_SIZE=\$(expr \$REMAINING_SIZE / 2)

Will define a variable ROOTFS_SIZE with value '\\$(expr \\$REMAINING_SIZE / 2)'.

It's a pure coincidence that Lars' patch queries ROOTFS_SIZE which also appears in bitbake -e output under exactly the same name.

IMO, when parsing env output, we should expect variable name to start right at the beginning of a line, IOW skip the line if key[0].isspace() == True

Quoted 4 lines

- Regarding oe-selftest fixes, wich machine did you run oe-selftest on? It looks to me that a lot of test cases can be run on your machine if we use another wks.

I've run it on beaglebone, vexpress-qemu, qemux86 and qemuarm. Agree with your observation though. I think that at least these TCs could be made machine agnostic:

Quoted 9 lines

- test_build_artifacts
- test_build_image_name
- test_compress_*
- test_gpt_image
- test_wic_image_type
- test_wrong_compressor
- test_rootfs_*

Yes, that's exactly my point. We should make generic tests work on any machine.

Would you be willing to do this in a separate patchset together with your oe-selftest core fixes?

I'd suggest to only include new testcase that works on qemu-x86* into this patchset. It will make it faster to get merged.

Quoted 11 lines
Quoted 11 lines
Quoted 11 lines

[1]. http://lists.openembedded.org/pipermail/openembedded-core/2016-November/129187.html

Maciej Borzecki (5):
oeqa/utils/commands.py: allow use of binaries from native sysroot
wic: add --fixed-size wks option
wic: selftest: avoid COMPATIBLE_HOST issues
wic: selftest: do not assume bzImage kernel image
wic: selftest: add tests for --fixed-size partition flags

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
 meta/lib/oeqa/selftest/wic.py          | 117 +++++++++++++++++++++++++++++++--
 meta/lib/oeqa/utils/commands.py        |   9 ++-
 scripts/lib/wic/help.py                |  14 +++-
 scripts/lib/wic/imager/direct.py       |   2 +-
 scripts/lib/wic/ksparser.py            |  41 ++++++++++--
 scripts/lib/wic/partition.py           |  88 +++++++++++++++----------
 scripts/lib/wic/utils/partitionedfs.py |   2 +-
 7 files changed, 224 insertions(+), 49 deletions(-)

--
Regards,
Ed

#19 lore raw

Re: [PATCH v6 0/5] wic: bugfixes & --fixed-size support, tests, oeqa: enhancements

Quoted 20 lines · Ed Bartosh
Quoted 19 lines · Maciej Borzęcki
Quoted 17 lines · Ed Bartosh
Quoted 9 lines · Maciej Borzecki

v6 of a patch series previously posted here [1].

Changes since v5:

* oe-selftest: enforce en_US.UTF-8 locale was merged to master, hence it's no longer part of this series

* rebased on top of master (d0d260b0b85790ceb136dd6b0445e8e33d038f5e)

The patchset looks good to me. Thank you.

Couple of questions:
- did you test if Lars' change
https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=db08ffee0ad1451f3bf710f4d1b623938ba9aefb
works with your patchset?

Quoted 5 lines
Quoted 2 lines

Yes. The series was rebased on top of d0d260b0b85790ceb136dd6b0445e8e33d038f5e, which includes Lars' patch.

The series causes conflicts on the latest master. Can you check if it's really the case or it's just something wrong with my setup?

Just rebased on top current master d41d2fd and pushed to
https://github.com/bboozzoo/poky branch bboozzoo/wic-fixed-size-v7 in case you want to test locally. I guess the conflict was with patch aa1c50a selftest/wic: extending test coverage for WIC script options, which has been reverted yesterday by RP.

Jair has posted a v2 yesterday and I expect it to be merged soon. So, I think I'll just wait a couple of days (actually more like until the beginning of January) before publishing a rebased version of my series.

<snip>

Quoted 16 lines
Quoted 6 lines

I've run it on beaglebone, vexpress-qemu, qemux86 and qemuarm. Agree with your observation though. I think that at least these TCs could be made machine agnostic:

Quoted 9 lines

- test_build_artifacts
- test_build_image_name
- test_compress_*
- test_gpt_image
- test_wic_image_type
- test_wrong_compressor
- test_rootfs_*

Quoted 9 lines

Yes, that's exactly my point. We should make generic tests work on any machine.

Would you be willing to do this in a separate patchset together with your oe-selftest core fixes?

I'd suggest to only include new testcase that works on qemu-x86* into this patchset. It will make it faster to get merged.

I would prefer to post these changes as a separate patchset. It looks like there's already a couple of potentially conflicting patches floating on the mailing list, so I would prefer to get --fixed-size merged before starting another one.

Regards,

Signature · 2 lines
Maciej Borzecki
RnDity