diff options
author | Alexander Kanavin <alexander.kanavin@linux.intel.com> | 2018-08-28 16:43:59 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-09-04 11:03:55 +0100 |
commit | 5e3a07180b7357c780b76a1feec1785b33603aeb (patch) | |
tree | 57233895df7e11f199326727503ae7d6a939b48a /meta | |
parent | 4434777705cf49300a7d2c9ca8fa3080d551d795 (diff) | |
download | poky-5e3a07180b7357c780b76a1feec1785b33603aeb.tar.gz |
lib/oe/package_manager: turn postinst failure warnings into bitbake failures
Sumo release provides a transition period so that deferrals to first boot
via 'exit 1' can be converted to pkg_postinst_ontarget(). For the next release
however, postinst script failures should be treated as such.
[YOCTO #12607]
(From OE-Core rev: 42acb0ebde4e88bcdf34a541b700f19d8607abb0)
Signed-off-by: Alexander Kanavin <alexander.kanavin@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/lib/oe/package_manager.py | 22 | ||||
-rw-r--r-- | meta/lib/oeqa/selftest/cases/runtime_test.py | 4 |
2 files changed, 9 insertions, 17 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 398838835e..a17de5de73 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -84,10 +84,10 @@ def opkg_query(cmd_output): | |||
84 | 84 | ||
85 | return output | 85 | return output |
86 | 86 | ||
87 | # Note: this should be bb.fatal in the future. | 87 | def failed_postinsts_abort(pkgs, log_path): |
88 | def failed_postinsts_warn(pkgs, log_path): | 88 | bb.fatal("""Postinstall scriptlets of %s have failed. If the intention is to defer them to first boot, |
89 | bb.warn("""Intentionally failing postinstall scriptlets of %s to defer them to first boot is deprecated. Please place them into pkg_postinst_ontarget_${PN} (). | 89 | then please place them into pkg_postinst_ontarget_${PN} (). |
90 | If deferring to first boot wasn't the intent, then scriptlet failure may mean an issue in the recipe, or a regression elsewhere. | 90 | Deferring to first boot via 'exit 1' is no longer supported. |
91 | Details of the failure are in %s.""" %(pkgs, log_path)) | 91 | Details of the failure are in %s.""" %(pkgs, log_path)) |
92 | 92 | ||
93 | def generate_locale_archive(d, rootfs, target_arch, localedir): | 93 | def generate_locale_archive(d, rootfs, target_arch, localedir): |
@@ -858,9 +858,7 @@ class RpmPM(PackageManager): | |||
858 | failed_scriptlets_pkgnames[line.split()[-1]] = True | 858 | failed_scriptlets_pkgnames[line.split()[-1]] = True |
859 | 859 | ||
860 | if len(failed_scriptlets_pkgnames) > 0: | 860 | if len(failed_scriptlets_pkgnames) > 0: |
861 | failed_postinsts_warn(list(failed_scriptlets_pkgnames.keys()), self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) | 861 | failed_postinsts_abort(list(failed_scriptlets_pkgnames.keys()), self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) |
862 | for pkg in failed_scriptlets_pkgnames.keys(): | ||
863 | self.save_rpmpostinst(pkg) | ||
864 | 862 | ||
865 | def remove(self, pkgs, with_dependencies = True): | 863 | def remove(self, pkgs, with_dependencies = True): |
866 | if len(pkgs) == 0: | 864 | if len(pkgs) == 0: |
@@ -1341,7 +1339,7 @@ class OpkgPM(OpkgDpkgPM): | |||
1341 | bb.warn(line) | 1339 | bb.warn(line) |
1342 | failed_pkgs.append(line.split(".")[0]) | 1340 | failed_pkgs.append(line.split(".")[0]) |
1343 | if failed_pkgs: | 1341 | if failed_pkgs: |
1344 | failed_postinsts_warn(failed_pkgs, self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) | 1342 | failed_postinsts_abort(failed_pkgs, self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) |
1345 | except subprocess.CalledProcessError as e: | 1343 | except subprocess.CalledProcessError as e: |
1346 | (bb.fatal, bb.warn)[attempt_only]("Unable to install packages. " | 1344 | (bb.fatal, bb.warn)[attempt_only]("Unable to install packages. " |
1347 | "Command '%s' returned %d:\n%s" % | 1345 | "Command '%s' returned %d:\n%s" % |
@@ -1594,7 +1592,6 @@ class DpkgPM(OpkgDpkgPM): | |||
1594 | os.environ['INTERCEPT_DIR'] = self.intercepts_dir | 1592 | os.environ['INTERCEPT_DIR'] = self.intercepts_dir |
1595 | os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE') | 1593 | os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE') |
1596 | 1594 | ||
1597 | failed_pkgs = [] | ||
1598 | for pkg_name in installed_pkgs: | 1595 | for pkg_name in installed_pkgs: |
1599 | for control_script in control_scripts: | 1596 | for control_script in control_scripts: |
1600 | p_full = os.path.join(info_dir, pkg_name + control_script.suffix) | 1597 | p_full = os.path.join(info_dir, pkg_name + control_script.suffix) |
@@ -1609,12 +1606,7 @@ class DpkgPM(OpkgDpkgPM): | |||
1609 | bb.warn("%s for package %s failed with %d:\n%s" % | 1606 | bb.warn("%s for package %s failed with %d:\n%s" % |
1610 | (control_script.name, pkg_name, e.returncode, | 1607 | (control_script.name, pkg_name, e.returncode, |
1611 | e.output.decode("utf-8"))) | 1608 | e.output.decode("utf-8"))) |
1612 | failed_postinsts_warn([pkg_name], self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) | 1609 | failed_postinsts_abort([pkg_name], self.d.expand("${T}/log.do_${BB_CURRENTTASK}")) |
1613 | failed_pkgs.append(pkg_name) | ||
1614 | break | ||
1615 | |||
1616 | if len(failed_pkgs): | ||
1617 | self.mark_packages("unpacked", failed_pkgs) | ||
1618 | 1610 | ||
1619 | def update(self): | 1611 | def update(self): |
1620 | os.environ['APT_CONFIG'] = self.apt_conf_file | 1612 | os.environ['APT_CONFIG'] = self.apt_conf_file |
diff --git a/meta/lib/oeqa/selftest/cases/runtime_test.py b/meta/lib/oeqa/selftest/cases/runtime_test.py index 30fd9b2a50..376c3c5146 100644 --- a/meta/lib/oeqa/selftest/cases/runtime_test.py +++ b/meta/lib/oeqa/selftest/cases/runtime_test.py | |||
@@ -249,8 +249,8 @@ class Postinst(OESelftestTestCase): | |||
249 | features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-rootfs-failing"\n' | 249 | features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-rootfs-failing"\n' |
250 | features += 'PACKAGE_CLASSES = "%s"\n' % classes | 250 | features += 'PACKAGE_CLASSES = "%s"\n' % classes |
251 | self.write_config(features) | 251 | self.write_config(features) |
252 | bb_result = bitbake('core-image-minimal') | 252 | bb_result = bitbake('core-image-minimal', ignore_status=True) |
253 | self.assertGreaterEqual(bb_result.output.find("Intentionally failing postinstall scriptlets of ['postinst-rootfs-failing'] to defer them to first boot is deprecated."), 0, | 253 | self.assertGreaterEqual(bb_result.output.find("Postinstall scriptlets of ['postinst-rootfs-failing'] have failed."), 0, |
254 | "Warning about a failed scriptlet not found in bitbake output: %s" %(bb_result.output)) | 254 | "Warning about a failed scriptlet not found in bitbake output: %s" %(bb_result.output)) |
255 | 255 | ||
256 | self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs-before-failure")), | 256 | self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs-before-failure")), |