1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# Helper functions related to storage backends.
# Whether a storage backend is available
storage_backend_available() {
# shellcheck disable=2039,3043
local backends
backends="$(available_storage_backends)"
if [ "${backends#*"$1"}" != "$backends" ]; then
true
return
elif [ "${1}" = "cephfs" ] && [ "${backends#*"ceph"}" != "$backends" ] && [ -n "${INCUS_CEPH_CEPHFS:-}" ]; then
true
return
fi
false
}
# Choose a random available backend, excluding INCUS_BACKEND
random_storage_backend() {
# shellcheck disable=2046
shuf -e $(available_storage_backends) | head -n 1
}
# Return the storage backend being used by an incus instance
storage_backend() {
cat "$1/incus.backend"
}
# Return a list of available storage backends
available_storage_backends() {
# shellcheck disable=2039,3043
local backend backends storage_backends
backends="dir" # always available
storage_backends="btrfs lvm zfs"
if [ -n "${INCUS_CEPH_CLUSTER:-}" ]; then
storage_backends="${storage_backends} ceph"
fi
for backend in $storage_backends; do
if command -v "$backend" > /dev/null 2>&1; then
backends="$backends $backend"
fi
done
echo "$backends"
}
import_storage_backends() {
# shellcheck disable=SC2039,3043
local backend
for backend in $(available_storage_backends); do
# shellcheck disable=SC1090
. "backends/${backend}.sh"
done
}
configure_loop_device() {
# shellcheck disable=SC2039,3043
local lv_loop_file pvloopdev
# shellcheck disable=SC2153
lv_loop_file=$(mktemp -p "${TEST_DIR}" XXXX.img)
truncate -s 10G "${lv_loop_file}"
pvloopdev=$(losetup --show -f "${lv_loop_file}")
if [ ! -e "${pvloopdev}" ]; then
echo "failed to setup loop"
false
fi
# shellcheck disable=SC2153
echo "${pvloopdev}" >> "${TEST_DIR}/loops"
# The following code enables to return a value from a shell function by
# calling the function as: fun VAR1
# shellcheck disable=2039,3043
local __tmp1="${1}"
# shellcheck disable=2039,3043
local res1="${lv_loop_file}"
if [ "${__tmp1}" ]; then
eval "${__tmp1}='${res1}'"
fi
# shellcheck disable=2039,3043
local __tmp2="${2}"
# shellcheck disable=2039,3043
local res2="${pvloopdev}"
if [ "${__tmp2}" ]; then
eval "${__tmp2}='${res2}'"
fi
}
deconfigure_loop_device() {
# shellcheck disable=SC2039,3043
local lv_loop_file loopdev success
lv_loop_file="${1}"
loopdev="${2}"
success=0
for _ in $(seq 20); do
if ! losetup "${loopdev}"; then
success=1
break
fi
if losetup -d "${loopdev}"; then
success=1
break
fi
sleep 0.1
done
if [ "${success}" = "0" ]; then
echo "Failed to tear down loop device"
return 1
fi
rm -f "${lv_loop_file}"
sed -i "\\|^${loopdev}|d" "${TEST_DIR}/loops"
}
umount_loops() {
# shellcheck disable=SC2039,3043
local line test_dir
test_dir="$1"
if [ -f "${test_dir}/loops" ]; then
while read -r line; do
losetup -d "${line}" || true
done < "${test_dir}/loops"
fi
}
|