#!/usr/bin/env bash set -ex . $(dirname $0)/../../standalone/ceph-helpers.sh TEMPDIR= IMAGE1=image1 IMAGE2=image2 IMAGE3=image3 IMAGES="${IMAGE1} ${IMAGE2} ${IMAGE3}" cleanup() { cleanup_tempdir remove_images } setup_tempdir() { TEMPDIR=`mktemp -d` } cleanup_tempdir() { rm -rf ${TEMPDIR} } create_base_image() { local image=$1 rbd create --size 1G ${image} rbd bench --io-type write --io-pattern rand --io-size=4K --io-total 256M ${image} rbd snap create ${image}@1 rbd bench --io-type write --io-pattern rand --io-size=4K --io-total 64M ${image} rbd snap create ${image}@2 rbd bench --io-type write --io-pattern rand --io-size=4K --io-total 128M ${image} } export_raw_image() { local image=$1 rm -rf "${TEMPDIR}/${image}" rbd export ${image} "${TEMPDIR}/${image}" } export_base_image() { local image=$1 export_raw_image "${image}" export_raw_image "${image}@1" export_raw_image "${image}@2" } remove_image() { local image=$1 (rbd migration abort $image || true) >/dev/null 2>&1 (rbd snap purge $image || true) >/dev/null 2>&1 (rbd rm $image || true) >/dev/null 2>&1 } remove_images() { for image in ${IMAGES} do remove_image ${image} done } show_diff() { local file1=$1 local file2=$2 xxd "${file1}" > "${file1}.xxd" xxd "${file2}" > "${file2}.xxd" sdiff -s "${file1}.xxd" "${file2}.xxd" | head -n 64 rm -f "${file1}.xxd" "${file2}.xxd" } compare_images() { local src_image=$1 local dst_image=$2 local ret=0 export_raw_image ${dst_image} if ! cmp "${TEMPDIR}/${src_image}" "${TEMPDIR}/${dst_image}" then show_diff "${TEMPDIR}/${src_image}" "${TEMPDIR}/${dst_image}" ret=1 fi return ${ret} } test_import_native_format() { local base_image=$1 local dest_image=$2 rbd migration prepare --import-only "rbd/${base_image}@2" ${dest_image} rbd migration abort ${dest_image} local pool_id=$(ceph osd pool ls detail --format xml | xmlstarlet sel -t -v "//pools/pool[pool_name='rbd']/pool_id") cat > ${TEMPDIR}/spec.json < ${TEMPDIR}/spec.json < ${TEMPDIR}/spec.json < ${TEMPDIR}/spec.json < ${TEMPDIR}/spec.json <&1 | wc -l | grep -v '^0$' && echo "nonempty rbd pool, aborting! run this script on an empty test cluster only." && exit 1 setup_tempdir trap 'cleanup $?' INT TERM EXIT create_base_image ${IMAGE1} export_base_image ${IMAGE1} test_import_native_format ${IMAGE1} ${IMAGE2} test_import_qcow_format ${IMAGE1} ${IMAGE2} test_import_qcow2_format ${IMAGE2} ${IMAGE3} test_import_raw_format ${IMAGE1} ${IMAGE2} echo OK