1
0
mirror of https://github.com/lxc/incus.git synced 2026-02-05 09:46:19 +01:00
Files
incus/test/suites/incremental_copy.sh
Stéphane Graber 2fdbdd7a72 tests: Update tests for Linstor limitation
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2025-12-19 08:56:24 -05:00

106 lines
3.4 KiB
Bash

test_incremental_copy() {
# shellcheck disable=2153
[ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return
ensure_import_testimage
ensure_has_localhost_remote "${INCUS_ADDR}"
do_copy "" ""
# cross-pool copy
# shellcheck disable=2039,3043
local source_pool
source_pool="incustest-$(basename "${INCUS_DIR}")-dir-pool"
incus storage create "${source_pool}" dir
do_copy "${source_pool}" "incustest-$(basename "${INCUS_DIR}")"
incus storage rm "${source_pool}"
}
do_copy() {
# shellcheck disable=2039,3043
local source_pool="${1}"
# shellcheck disable=2039,3043
local target_pool="${2}"
# Make sure the containers don't exist
incus rm -f c1 c2 || true
if [ -z "${source_pool}" ]; then
source_pool=$(incus profile device get default root pool)
fi
incus init testimage c1 -s "${source_pool}"
incus storage volume set "${source_pool}" container/c1 user.foo=main
# Set size to check this is supported during copy.
incus config device set c1 root size=200MiB
targetPoolFlag=
if [ -n "${target_pool}" ]; then
targetPoolFlag="-s ${target_pool}"
else
target_pool="${source_pool}"
fi
# Initial copy
# shellcheck disable=2086
incus copy c1 c2 ${targetPoolFlag}
incus storage volume get "${target_pool}" container/c2 user.foo | grep -Fx "main"
incus start c1 c2
# Target container may not be running when refreshing
# shellcheck disable=2086
! incus copy c1 c2 --refresh ${targetPoolFlag} || false
# Create test file in c1
incus exec c1 -- touch /root/testfile1
incus stop -f c2
# Refresh the container and validate the contents
# shellcheck disable=2086
incus copy c1 c2 --refresh ${targetPoolFlag}
incus start c2
incus exec c2 -- test -f /root/testfile1
incus stop -f c2
# This will create snapshot c1/snap0
incus storage volume set "${source_pool}" container/c1 user.foo=snap0
incus snapshot create c1
incus storage volume set "${source_pool}" container/c1 user.foo=snap1
incus snapshot create c1
incus storage volume set "${source_pool}" container/c1 user.foo=main
# Remove the testfile from c1 and refresh again
incus exec c1 -- rm /root/testfile1
# shellcheck disable=2086
incus copy c1 c2 --refresh --instance-only ${targetPoolFlag}
incus start c2
! incus exec c2 -- test -f /root/testfile1 || false
incus stop -f c2
# Check whether snapshot c2/snap0 has been created
! incus config show c2/snap0 || false
# shellcheck disable=2086
incus copy c1 c2 --refresh ${targetPoolFlag}
incus config show c2/snap0
incus config show c2/snap1
incus storage volume get "${target_pool}" container/c2 user.foo | grep -Fx "main"
incus storage volume get "${target_pool}" container/c2/snap0 user.foo | grep -Fx "snap0"
incus storage volume get "${target_pool}" container/c2/snap1 user.foo | grep -Fx "snap1"
# This will create snapshot c2/snap2
incus snapshot create c2
incus config show c2/snap2
incus storage volume snapshot show "${target_pool}" container/c2/snap2
# This should remove c2/snap2
# shellcheck disable=2086
incus copy c1 c2 --refresh ${targetPoolFlag}
! incus config show c2/snap2 || false
! incus storage volume snapshot show "${target_pool}" container/c2/snap2 || false
incus rm -f c1 c2
}