Message ID | PA4PR01MB93565CBE2F447A255D0E0D7FD5DB2@PA4PR01MB9356.eurprd01.prod.exchangelabs.com |
---|---|
State | New |
Headers | show |
Series | execute pkg_postinst_ontarget task for read only rootfs when read-only-rootfs-delayed-postinsts is set | expand |
This patch needs to be sent with 'git send-email'. I think this was requested before already? Alex On Wed, 10 Jul 2024 at 21:47, Gassner, Tobias.ext via lists.openembedded.org <Tobias.Gassner.ext=karlstorz.com@lists.openembedded.org> wrote: > > Hi, > > this patch will ensure that pkg_postinst_ontarget task is executed for read only rootfs when read-only-rootfs-delayed-postinsts is set as IMAGE_FEATURES. In addition to the fix, a test in meta/lib/oeqa/selftest/cases/overlayfs.py testing the fix has been implemented. > > See https://lists.yoctoproject.org/g/poky/topic/106869018#msg13391 for the discussion of this patch; this patch consits of patches 608050984c5be67f506a0877fadbbe0b61575e54 and da51462765e24b186c55431b53856eebd5f6e8da in that discussion. > > Greetings > -Tobias > > > From ecf1d8c47ecb72c2f27464f01e932091374f4e6c Mon Sep 17 00:00:00 2001 > From: "Gassner, Tobias.ext" <tobias.gassner.ext@karlstorz.com> > Date: Tue, 9 Jul 2024 08:34:30 +0200 > Subject: [PATCH] execute pkg_postinst_ontarget task for read only rootfs when > read-only-rootfs-delayed-postinsts is set > > Signed-off-by: Gassner, Tobias.ext <tobias.gassner.ext@karlstorz.com> > --- > meta/lib/oe/rootfs.py | 4 +++ > meta/lib/oeqa/selftest/cases/overlayfs.py | 41 ++++++++++++++++++++++- > 2 files changed, 44 insertions(+), 1 deletion(-) > > diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py > index 8cd48f9450..5abce4ad7d 100644 > --- a/meta/lib/oe/rootfs.py > +++ b/meta/lib/oe/rootfs.py > @@ -269,7 +269,11 @@ class Rootfs(object, metaclass=ABCMeta): > self.pm.remove(["run-postinsts"]) > > image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", > + True, False, self.d) and \ > + not bb.utils.contains("IMAGE_FEATURES", > + "read-only-rootfs-delayed-postinsts", > True, False, self.d) > + > image_rorfs_force = self.d.getVar('FORCE_RO_REMOVE') > > if image_rorfs or image_rorfs_force == "1": > diff --git a/meta/lib/oeqa/selftest/cases/overlayfs.py b/meta/lib/oeqa/selftest/cases/overlayfs.py > index e31063567b..580fbdcb9c 100644 > --- a/meta/lib/oeqa/selftest/cases/overlayfs.py > +++ b/meta/lib/oeqa/selftest/cases/overlayfs.py > @@ -5,7 +5,7 @@ > # > > from oeqa.selftest.case import OESelftestTestCase > -from oeqa.utils.commands import bitbake, runqemu > +from oeqa.utils.commands import bitbake, runqemu, get_bb_vars > from oeqa.core.decorator import OETestTag > from oeqa.core.decorator.data import skipIfNotMachine > > @@ -466,6 +466,45 @@ IMAGE_INSTALL:append = " overlayfs-user" > line = getline_qemu(output, "Read-only file system") > self.assertTrue(line, msg=output) > > + @skipIfNotMachine("qemux86-64", "tests are qemux86-64 specific currently") > + def test_postinst_on_target_for_read_only_rootfs(self): > + """ > + Summary: The purpose of this test case is to verify that post-installation > + on target scripts are executed even if using read-only rootfs when > + read-only-rootfs-delayed-postinsts is set > + Expected: The test files are created on first boot > + """ > + > + import oe.path > + > + vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal") > + sysconfdir = vars["sysconfdir"] > + self.assertIsNotNone(sysconfdir) > + # Need to use oe.path here as sysconfdir starts with / > + targettestdir = os.path.join(sysconfdir, "postinst-test") > + > + config = self.get_working_config() > + > + args = { > + 'OVERLAYFS_INIT_OPTION': "", > + 'OVERLAYFS_ETC_USE_ORIG_INIT_NAME': 1, > + 'OVERLAYFS_ROOTFS_TYPE': "ext4", > + 'OVERLAYFS_ETC_CREATE_MOUNT_DIRS': 1 > + } > + > + # read-only-rootfs is already set in get_working_config() > + config += 'EXTRA_IMAGE_FEATURES += "read-only-rootfs-delayed-postinsts"\n' > + config += 'CORE_IMAGE_EXTRA_INSTALL = "postinst-delayed-b"\n' > + > + self.write_config(config.format(**args)) > + > + res = bitbake('core-image-minimal') > + > + with runqemu('core-image-minimal', image_fstype='wic') as qemu: > + for filename in ("rootfs", "delayed-a", "delayed-b"): > + status, output = qemu.run_serial("test -f %s && echo found" % os.path.join(targettestdir, filename)) > + self.assertIn("found", output, "%s was not present on boot" % filename) > + > def get_working_config(self): > return """ > # Use systemd as init manager > -- > 2.45.2 > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#201739): https://lists.openembedded.org/g/openembedded-core/message/201739 > Mute This Topic: https://lists.openembedded.org/mt/107118664/1686489 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py index 8cd48f9450..5abce4ad7d 100644 --- a/meta/lib/oe/rootfs.py +++ b/meta/lib/oe/rootfs.py @@ -269,7 +269,11 @@ class Rootfs(object, metaclass=ABCMeta): self.pm.remove(["run-postinsts"]) image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", + True, False, self.d) and \ + not bb.utils.contains("IMAGE_FEATURES", + "read-only-rootfs-delayed-postinsts", True, False, self.d) + image_rorfs_force = self.d.getVar('FORCE_RO_REMOVE') if image_rorfs or image_rorfs_force == "1": diff --git a/meta/lib/oeqa/selftest/cases/overlayfs.py b/meta/lib/oeqa/selftest/cases/overlayfs.py index e31063567b..580fbdcb9c 100644 --- a/meta/lib/oeqa/selftest/cases/overlayfs.py +++ b/meta/lib/oeqa/selftest/cases/overlayfs.py @@ -5,7 +5,7 @@ # from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake, runqemu +from oeqa.utils.commands import bitbake, runqemu, get_bb_vars from oeqa.core.decorator import OETestTag from oeqa.core.decorator.data import skipIfNotMachine @@ -466,6 +466,45 @@ IMAGE_INSTALL:append = " overlayfs-user" line = getline_qemu(output, "Read-only file system") self.assertTrue(line, msg=output) + @skipIfNotMachine("qemux86-64", "tests are qemux86-64 specific currently") + def test_postinst_on_target_for_read_only_rootfs(self): + """ + Summary: The purpose of this test case is to verify that post-installation + on target scripts are executed even if using read-only rootfs when + read-only-rootfs-delayed-postinsts is set + Expected: The test files are created on first boot + """ + + import oe.path + + vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal") + sysconfdir = vars["sysconfdir"] + self.assertIsNotNone(sysconfdir) + # Need to use oe.path here as sysconfdir starts with / + targettestdir = os.path.join(sysconfdir, "postinst-test") + + config = self.get_working_config() + + args = { + 'OVERLAYFS_INIT_OPTION': "", + 'OVERLAYFS_ETC_USE_ORIG_INIT_NAME': 1, + 'OVERLAYFS_ROOTFS_TYPE': "ext4", + 'OVERLAYFS_ETC_CREATE_MOUNT_DIRS': 1 + } + + # read-only-rootfs is already set in get_working_config() + config += 'EXTRA_IMAGE_FEATURES += "read-only-rootfs-delayed-postinsts"\n' + config += 'CORE_IMAGE_EXTRA_INSTALL = "postinst-delayed-b"\n' + + self.write_config(config.format(**args)) + + res = bitbake('core-image-minimal') + + with runqemu('core-image-minimal', image_fstype='wic') as qemu: + for filename in ("rootfs", "delayed-a", "delayed-b"): + status, output = qemu.run_serial("test -f %s && echo found" % os.path.join(targettestdir, filename)) + self.assertIn("found", output, "%s was not present on boot" % filename) + def get_working_config(self): return """ # Use systemd as init manager