4686e15b94
Not all files from an RPM are necessarily removed during pkg erasure. For example, files which are shared between pkgs shouldn't be deleted. Similarly, not all files in an RPM are necessarily copied during pkg installs. This is the case for multilib handling, which is a mess in its own right. But such is the cost of trying to replace major parts of a long-standing foundational project like RPM. This patch adds some smarts to the way we do overlays and overrides to handle these cases by calculating beforehand which files we *should't* checkout/delete. Closes: #1217 Closes: #1145 Closes: #1227 Approved by: cgwalters
168 lines
5.4 KiB
Bash
Executable File
168 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2016 Jonathan Lebon <jlebon@redhat.com>
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2 of the License, or (at your option) any later version.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
|
|
set -euo pipefail
|
|
|
|
. ${commondir}/libtest.sh
|
|
. ${commondir}/libvm.sh
|
|
|
|
set -x
|
|
|
|
# SUMMARY: check that package layering respects rpmdb
|
|
# METHOD:
|
|
# - test that during a relayer (e.g. upgrade), if a previously layered pkg
|
|
# is now part of the base layer, then we stop layering but still keep it
|
|
# in the origin
|
|
# - test that layering a pkg that's already in the base layer works
|
|
# - test that layering a pkg that's already layered fails (string match)
|
|
# - test that layering a different provides that's already layered works
|
|
# - test that layering a new pkg that conflicts with a layered pkg fails
|
|
# - test that layering a new pkg that conflicts with a base pkg fails
|
|
# - test that relayering on a base with a conflicting package fails
|
|
|
|
# make sure the package is not already layered
|
|
vm_assert_layered_pkg foo absent
|
|
|
|
# remember this current commit for later
|
|
vm_cmd ostree refs $(vm_get_booted_csum) --create vmcheck_tmp/without_foo
|
|
|
|
vm_build_rpm foo
|
|
vm_rpmostree install foo
|
|
echo "ok install foo"
|
|
|
|
vm_reboot
|
|
|
|
vm_assert_layered_pkg foo present
|
|
echo "ok pkg foo added"
|
|
|
|
# let's synthesize an upgrade in which the commit we're upgrading to has foo as
|
|
# part of its base, so we recommit our current (non-base) layer to the branch
|
|
|
|
# remember it for later
|
|
vm_cmd ostree refs $(vm_get_booted_csum) --create vmcheck_tmp/with_foo
|
|
csum_with_foo=$(vm_cmd ostree commit -b vmcheck --tree=ref=vmcheck_tmp/with_foo)
|
|
|
|
# check that upgrading to it will make the package dormant
|
|
|
|
vm_rpmostree upgrade
|
|
vm_reboot
|
|
if [[ $(vm_get_booted_csum) != $csum_with_foo ]]; then
|
|
assert_not_reached "new csum does not refer to expected csum $csum_with_foo"
|
|
fi
|
|
|
|
if ! vm_has_dormant_packages foo; then
|
|
assert_not_reached "pkg foo is not dormant"
|
|
fi
|
|
|
|
echo "ok layered to dormant"
|
|
|
|
vm_build_rpm bar conflicts foo
|
|
if vm_rpmostree pkg-add bar; then
|
|
assert_not_reached "pkg-add bar succeeded but it conflicts with foo in base"
|
|
fi
|
|
echo "ok can't layer conflicting pkg (dormant)"
|
|
|
|
# now check that upgrading to a new base layer that drops foo relayers it
|
|
|
|
vm_cmd ostree commit -b vmcheck --tree=ref=vmcheck_tmp/without_foo
|
|
vm_rpmostree upgrade
|
|
vm_reboot
|
|
|
|
vm_assert_layered_pkg foo present
|
|
echo "ok dormant to layered"
|
|
|
|
if vm_rpmostree pkg-add foo; then
|
|
assert_not_reached "pkg-add foo succeeded even though it's already layered"
|
|
fi
|
|
echo "ok can't layer pkg already layered"
|
|
|
|
if vm_rpmostree pkg-add bar; then
|
|
assert_not_reached "pkg-add bar succeeded but it conflicts with layered foo"
|
|
fi
|
|
echo "ok can't layer conflicting pkg (layered)"
|
|
|
|
# ok, now let's go back to the depl where foo is in the layer
|
|
vm_rpmostree rollback
|
|
vm_rpmostree pkg-remove foo
|
|
vm_reboot
|
|
|
|
if vm_has_requested_packages foo; then
|
|
assert_not_reached "foo is still in the origin"
|
|
fi
|
|
echo "ok pkg-remove foo"
|
|
|
|
if vm_rpmostree pkg-add bar; then
|
|
assert_not_reached "pkg-add bar succeeded but it conflicts with foo in base"
|
|
fi
|
|
echo "ok can't layer conflicting pkg (base)"
|
|
|
|
# ok, now go back to a base layer without foo and add bar
|
|
vm_cmd ostree commit -b vmcheck --tree=ref=vmcheck_tmp/without_foo
|
|
vm_rpmostree upgrade
|
|
vm_rpmostree pkg-add bar
|
|
vm_reboot
|
|
|
|
vm_assert_layered_pkg bar present
|
|
echo "ok pkg-add bar"
|
|
|
|
# now let's try to do an upgrade to a base layer which *has* foo
|
|
vm_cmd ostree commit -b vmcheck --tree=ref=vmcheck_tmp/with_foo
|
|
if vm_rpmostree upgrade; then
|
|
assert_not_reached "upgrade succeeded but new base has conflicting pkg foo"
|
|
fi
|
|
echo "ok can't upgrade with conflicting layered pkg"
|
|
|
|
vm_rpmostree cleanup -p
|
|
|
|
check_bloop_color() {
|
|
color=$1; shift
|
|
root=$(vm_get_deployment_root 0)
|
|
vm_cmd file $root/usr/bin/bloop > file.txt
|
|
assert_file_has_content file.txt $color
|
|
}
|
|
|
|
# now let's build two pkgs with different colors
|
|
# we use -nostdlib so we don't pull in glibc.i686
|
|
vm_build_rpm bloop arch i686 build 'echo "void main() {}" | gcc -m32 -nostdlib -o bloop -xc -'
|
|
vm_build_rpm bloop arch x86_64 build 'echo "void main() {}" | gcc -m64 -nostdlib -o bloop -xc -'
|
|
# now embed the x86_64 version into it
|
|
vm_rpmostree install bloop.x86_64
|
|
vm_cmd ostree commit -b vmcheck --tree=ref=$(vm_get_pending_csum) --fsync=no
|
|
vm_rpmostree cleanup -p
|
|
vm_rpmostree upgrade
|
|
check_bloop_color 64-bit
|
|
# now let's pkglayer the i686 version
|
|
vm_rpmostree install bloop.i686
|
|
# check that the x86_64 version won
|
|
check_bloop_color 64-bit
|
|
echo "ok coloring skip"
|
|
|
|
# now embed the 32-bit version instead
|
|
vm_rpmostree cleanup -p
|
|
vm_rpmostree install bloop.i686
|
|
vm_cmd ostree commit -b vmcheck --tree=ref=$(vm_get_pending_csum) --fsync=no
|
|
vm_rpmostree cleanup -p
|
|
vm_rpmostree upgrade
|
|
check_bloop_color 32-bit
|
|
# now let's pkglayer the x86_64 version
|
|
vm_rpmostree install bloop.x86_64
|
|
# and check that the x86_64 version won
|
|
check_bloop_color 64-bit
|
|
echo "ok coloring replace"
|