summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/selftest/cases/wic.py
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2020-06-02 08:42:05 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-06-04 13:27:32 +0100
commitba9be4bfa58efc73f1485eb5dc0dff0d23716821 (patch)
treeaf7a989c4e2caf3c08c2b7f77be5679c533966ca /meta/lib/oeqa/selftest/cases/wic.py
parent6b4299df5d86ba079e7525ad09def756359b9502 (diff)
downloadpoky-ba9be4bfa58efc73f1485eb5dc0dff0d23716821.tar.gz
wic: Add --offset argument for partitions
Add support for an --offset argument when defining a partition. Many SoCs require that boot partitions be located at specific offsets. Prior to this argument, most WKS files were using the --align attribute to specify the location of these fixed partitions but this is not ideal because in the event that the partition couldn't be placed in the specified location, wic would move it to the next sector with that alignment, often preventing the device from booting. Unlike the --align argument, wic will fail if a partition cannot be placed at the exact offset specified with --offset. Changes in V2: * Fixed a small typo that prevented test_fixed_size_error from passing (From OE-Core rev: 467f84e12b96bc977d57575023517dd6f8ef7f29) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa/selftest/cases/wic.py')
-rw-r--r--meta/lib/oeqa/selftest/cases/wic.py118
1 files changed, 93 insertions, 25 deletions
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index c8765e5330..9e7be6168e 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -790,41 +790,50 @@ class Wic2(WicTestCase):
790 tempf.write("part " \ 790 tempf.write("part " \
791 "--source rootfs --ondisk hda --align 4 --fixed-size %d " 791 "--source rootfs --ondisk hda --align 4 --fixed-size %d "
792 "--fstype=ext4\n" % size) 792 "--fstype=ext4\n" % size)
793 wksname = os.path.splitext(os.path.basename(wkspath))[0]
794 793
795 return wkspath, wksname 794 return wkspath
796 795
797 def test_fixed_size(self): 796 def _get_wic_partitions(self, wkspath, native_sysroot=None, ignore_status=False):
798 """ 797 p = runCmd("wic create %s -e core-image-minimal -o %s" % (wkspath, self.resultdir),
799 Test creation of a simple image with partition size controlled through 798 ignore_status=ignore_status)
800 --fixed-size flag 799
801 """ 800 if p.status:
802 wkspath, wksname = Wic2._make_fixed_size_wks(200) 801 return (p, None)
802
803 wksname = os.path.splitext(os.path.basename(wkspath))[0]
803 804
804 runCmd("wic create %s -e core-image-minimal -o %s" \
805 % (wkspath, self.resultdir))
806 os.remove(wkspath)
807 wicout = glob(self.resultdir + "%s-*direct" % wksname) 805 wicout = glob(self.resultdir + "%s-*direct" % wksname)
808 self.assertEqual(1, len(wicout)) 806
807 if not wicout:
808 return (p, None)
809 809
810 wicimg = wicout[0] 810 wicimg = wicout[0]
811 811
812 native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools") 812 if not native_sysroot:
813 native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
813 814
814 # verify partition size with wic 815 # verify partition size with wic
815 res = runCmd("parted -m %s unit mib p 2>/dev/null" % wicimg, 816 res = runCmd("parted -m %s unit kib p 2>/dev/null" % wicimg,
816 native_sysroot=native_sysroot) 817 native_sysroot=native_sysroot)
817 818
818 # parse parted output which looks like this: 819 # parse parted output which looks like this:
819 # BYT;\n 820 # BYT;\n
820 # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n 821 # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
821 # 1:0.00MiB:200MiB:200MiB:ext4::;\n 822 # 1:0.00MiB:200MiB:200MiB:ext4::;\n
822 partlns = res.output.splitlines()[2:] 823 return (p, res.output.splitlines()[2:])
823 824
824 self.assertEqual(1, len(partlns), 825 def test_fixed_size(self):
825 msg="Partition list '%s'" % res.output) 826 """
826 self.assertEqual("1:0.00MiB:200MiB:200MiB:ext4::;", partlns[0], 827 Test creation of a simple image with partition size controlled through
827 msg="Partition list '%s'" % res.output) 828 --fixed-size flag
829 """
830 wkspath = Wic2._make_fixed_size_wks(200)
831 _, partlns = self._get_wic_partitions(wkspath)
832 os.remove(wkspath)
833
834 self.assertEqual(partlns, [
835 "1:4.00kiB:204804kiB:204800kiB:ext4::;",
836 ])
828 837
829 def test_fixed_size_error(self): 838 def test_fixed_size_error(self):
830 """ 839 """
@@ -832,13 +841,72 @@ class Wic2(WicTestCase):
832 --fixed-size flag. The size of partition is intentionally set to 1MiB 841 --fixed-size flag. The size of partition is intentionally set to 1MiB
833 in order to trigger an error in wic. 842 in order to trigger an error in wic.
834 """ 843 """
835 wkspath, wksname = Wic2._make_fixed_size_wks(1) 844 wkspath = Wic2._make_fixed_size_wks(1)
836 845 p, _ = self._get_wic_partitions(wkspath, ignore_status=True)
837 self.assertEqual(1, runCmd("wic create %s -e core-image-minimal -o %s" \
838 % (wkspath, self.resultdir), ignore_status=True).status)
839 os.remove(wkspath) 846 os.remove(wkspath)
840 wicout = glob(self.resultdir + "%s-*direct" % wksname) 847
841 self.assertEqual(0, len(wicout)) 848 self.assertNotEqual(p.status, 0, "wic exited successfully when an error was expected:\n%s" % p.output)
849
850 def test_offset(self):
851 native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
852
853 with NamedTemporaryFile("w", suffix=".wks") as tempf:
854 # Test that partitions are placed at the correct offsets, default KB
855 tempf.write("bootloader --ptable gpt\n" \
856 "part / --source rootfs --ondisk hda --offset 32 --fixed-size 100M --fstype=ext4\n" \
857 "part /bar --ondisk hda --offset 102432 --fixed-size 100M --fstype=ext4\n")
858 tempf.flush()
859
860 _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
861 self.assertEqual(partlns, [
862 "1:32.0kiB:102432kiB:102400kiB:ext4:primary:;",
863 "2:102432kiB:204832kiB:102400kiB:ext4:primary:;",
864 ])
865
866 with NamedTemporaryFile("w", suffix=".wks") as tempf:
867 # Test that partitions are placed at the correct offsets, same with explicit KB
868 tempf.write("bootloader --ptable gpt\n" \
869 "part / --source rootfs --ondisk hda --offset 32K --fixed-size 100M --fstype=ext4\n" \
870 "part /bar --ondisk hda --offset 102432K --fixed-size 100M --fstype=ext4\n")
871 tempf.flush()
872
873 _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
874 self.assertEqual(partlns, [
875 "1:32.0kiB:102432kiB:102400kiB:ext4:primary:;",
876 "2:102432kiB:204832kiB:102400kiB:ext4:primary:;",
877 ])
878
879 with NamedTemporaryFile("w", suffix=".wks") as tempf:
880 # Test that partitions are placed at the correct offsets using MB
881 tempf.write("bootloader --ptable gpt\n" \
882 "part / --source rootfs --ondisk hda --offset 32K --fixed-size 100M --fstype=ext4\n" \
883 "part /bar --ondisk hda --offset 101M --fixed-size 100M --fstype=ext4\n")
884 tempf.flush()
885
886 _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
887 self.assertEqual(partlns, [
888 "1:32.0kiB:102432kiB:102400kiB:ext4:primary:;",
889 "2:103424kiB:205824kiB:102400kiB:ext4:primary:;",
890 ])
891
892 with NamedTemporaryFile("w", suffix=".wks") as tempf:
893 # Test that image creation fails if the partitions would overlap
894 tempf.write("bootloader --ptable gpt\n" \
895 "part / --source rootfs --ondisk hda --offset 32 --fixed-size 100M --fstype=ext4\n" \
896 "part /bar --ondisk hda --offset 102431 --fixed-size 100M --fstype=ext4\n")
897 tempf.flush()
898
899 p, _ = self._get_wic_partitions(tempf.name, ignore_status=True)
900 self.assertNotEqual(p.status, 0, "wic exited successfully when an error was expected:\n%s" % p.output)
901
902 with NamedTemporaryFile("w", suffix=".wks") as tempf:
903 # Test that partitions are not allowed to overlap with the booloader
904 tempf.write("bootloader --ptable gpt\n" \
905 "part / --source rootfs --ondisk hda --offset 8 --fixed-size 100M --fstype=ext4\n")
906 tempf.flush()
907
908 p, _ = self._get_wic_partitions(tempf.name, ignore_status=True)
909 self.assertNotEqual(p.status, 0, "wic exited successfully when an error was expected:\n%s" % p.output)
842 910
843 @only_for_arch(['i586', 'i686', 'x86_64']) 911 @only_for_arch(['i586', 'i686', 'x86_64'])
844 def test_rawcopy_plugin_qemu(self): 912 def test_rawcopy_plugin_qemu(self):