95e9aa4284
There are a few different use cases here. First, for layering new packages, there's no good reason for us to force a reboot. Second, we want some support for cherry-picking security updates and allowing admins to restart services. Finally, at some point we should offer support for entirely replacing the running tree if that's what the user wants. Until now we've been very conservative, but there's a spectrum here. In particular, this patch changes things so we push a rollback before we start doing anything live. I think in practice, many use cases would be totally fine with doing most changes live, and falling back to the rollback if something went wrong. This initial code drop *only* supports live layering of new packages. However, a lot of the base infrastructure is laid for future work. For now, this will be classified as an experimental feature, hence `ex livefs`. Part of: https://github.com/projectatomic/rpm-ostree/issues/639 Closes: #652 Approved by: jlebon
127 lines
4.3 KiB
Bash
Executable File
127 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2017 Red Hat Inc.
|
|
#
|
|
# 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 -e
|
|
|
|
. ${commondir}/libtest.sh
|
|
. ${commondir}/libvm.sh
|
|
|
|
set -x
|
|
|
|
vm_send_test_repo
|
|
|
|
vm_assert_layered_pkg foo absent
|
|
|
|
vm_rpmostree install /tmp/vmcheck/repo/packages/x86_64/foo-1.0-1.x86_64.rpm
|
|
vm_assert_status_jq '.deployments|length == 2'
|
|
echo "ok install foo locally"
|
|
|
|
if vm_cmd rpm -q foo; then
|
|
assert_not_reached "have foo?"
|
|
fi
|
|
assert_livefs_ok() {
|
|
vm_rpmostree ex livefs -n > livefs-analysis.txt
|
|
assert_file_has_content livefs-analysis.txt 'livefs OK (dry run)'
|
|
}
|
|
assert_livefs_ok
|
|
|
|
vm_assert_status_jq '.deployments|length == 2' '.deployments[0]["live-replaced"]|not' \
|
|
'.deployments[1]["live-replaced"]|not'
|
|
vm_rpmostree ex livefs
|
|
vm_cmd rpm -q foo > rpmq.txt
|
|
assert_file_has_content rpmq.txt foo-1.0-1
|
|
vm_assert_status_jq '.deployments|length == 3' '.deployments[0]["live-replaced"]|not' \
|
|
'.deployments[1]["live-replaced"]'
|
|
|
|
echo "ok livefs stage1"
|
|
|
|
vm_rpmostree install /tmp/vmcheck/repo/packages/x86_64/test-livefs-with-etc-1.0-1.x86_64.rpm
|
|
assert_livefs_ok
|
|
vm_rpmostree ex livefs
|
|
vm_cmd rpm -q foo test-livefs-with-etc > rpmq.txt
|
|
assert_file_has_content rpmq.txt foo-1.0-1 test-livefs-with-etc-1.0-1
|
|
vm_cmd cat /etc/test-livefs-with-etc.conf > test-livefs-with-etc.conf
|
|
assert_file_has_content test-livefs-with-etc.conf "A config file for test-livefs-with-etc"
|
|
|
|
echo "ok livefs stage2"
|
|
|
|
# Now, perform a further change in the pending
|
|
vm_rpmostree uninstall test-livefs-with-etc-1.0-1.x86_64
|
|
vm_assert_status_jq '.deployments|length == 3'
|
|
echo "ok livefs preserved rollback"
|
|
|
|
# Reset to rollback, undeploy pending
|
|
reset() {
|
|
vm_rpmostree rollback
|
|
vm_reboot
|
|
vm_rpmostree cleanup -r
|
|
vm_assert_status_jq '.deployments|length == 1' '.deployments[0]["live-replaced"]|not'
|
|
}
|
|
reset
|
|
|
|
# If the admin created a config file before, we need to keep it
|
|
vm_rpmostree install /tmp/vmcheck/repo/packages/x86_64/test-livefs-with-etc-1.0-1.x86_64.rpm
|
|
vm_cmd cat /etc/test-livefs-with-etc.conf || true
|
|
vm_cmd echo custom \> /etc/test-livefs-with-etc.conf
|
|
vm_cmd cat /etc/test-livefs-with-etc.conf
|
|
vm_rpmostree ex livefs
|
|
vm_cmd cat /etc/test-livefs-with-etc.conf > test-livefs-with-etc.conf
|
|
assert_file_has_content test-livefs-with-etc.conf "custom"
|
|
echo "ok livefs preserved modified config"
|
|
|
|
reset
|
|
vm_rpmostree install /tmp/vmcheck/repo/packages/x86_64/foo-1.0-1.x86_64.rpm
|
|
vm_rpmostree ex livefs
|
|
generate_upgrade() {
|
|
# Create a modified vmcheck commit
|
|
cat >t.sh<<EOF
|
|
#!/bin/bash
|
|
set -xeuo pipefail
|
|
cd /ostree/repo/tmp
|
|
rm vmcheck -rf
|
|
ostree checkout vmcheck vmcheck --fsync=0
|
|
(cat vmcheck/usr/bin/ls; echo more stuff) > vmcheck/usr/bin/ls.new
|
|
mv vmcheck/usr/bin/ls{.new,}
|
|
ostree commit -b vmcheck --tree=dir=vmcheck --link-checkout-speedup
|
|
rm vmcheck -rf
|
|
EOF
|
|
vm_cmdfile t.sh
|
|
}
|
|
generate_upgrade
|
|
# And remove the pending deployment so that our origin is now the booted
|
|
vm_rpmostree cleanup -p
|
|
vm_rpmostree upgrade
|
|
vm_assert_status_jq '.deployments|length == 3' '.deployments[0]["live-replaced"]|not' \
|
|
'.deployments[1]["live-replaced"]'
|
|
|
|
echo "ok livefs not carried over across upgrades"
|
|
|
|
reset
|
|
generate_upgrade
|
|
vm_rpmostree upgrade
|
|
vm_assert_status_jq '.deployments|length == 2' '.deployments[0]["live-replaced"]|not' \
|
|
'.deployments[1]["live-replaced"]|not'
|
|
if vm_rpmostree ex livefs -n &> livefs-analysis.txt; then
|
|
assert_not_reached "livefs succeeded?"
|
|
fi
|
|
vm_assert_status_jq '.deployments|length == 2' '.deployments[0]["live-replaced"]|not' \
|
|
'.deployments[1]["live-replaced"]|not'
|
|
assert_file_has_content livefs-analysis.txt 'live updates not currently supported for modifications'
|
|
echo "ok no modifications"
|