]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
qa/suites/rbd: new basic migration CLI test case
authorJason Dillaman <dillaman@redhat.com>
Wed, 2 Dec 2020 03:35:51 +0000 (22:35 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 3 Dec 2020 13:30:52 +0000 (08:30 -0500)
Pending a larger suite of tests for instant-restore image migration,
this test provides a basic sanity check for both the native and
raw image formats -- including basic snapshot tests.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
qa/suites/rbd/cli/workloads/rbd_cli_migration.yaml [new file with mode: 0644]
qa/workunits/rbd/cli_migration.sh [new file with mode: 0755]

diff --git a/qa/suites/rbd/cli/workloads/rbd_cli_migration.yaml b/qa/suites/rbd/cli/workloads/rbd_cli_migration.yaml
new file mode 100644 (file)
index 0000000..b04ac08
--- /dev/null
@@ -0,0 +1,5 @@
+tasks:
+- workunit:
+    clients:
+      client.0:
+        - rbd/cli_migration.sh
diff --git a/qa/workunits/rbd/cli_migration.sh b/qa/workunits/rbd/cli_migration.sh
new file mode 100755 (executable)
index 0000000..e1a4d2d
--- /dev/null
@@ -0,0 +1,219 @@
+#!/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
+}
+
+compare_images() {
+    local src_image=$1
+    local dst_image=$2
+
+    export_raw_image ${dst_image}
+    cmp "${TEMPDIR}/${src_image}" "${TEMPDIR}/${dst_image}"
+}
+
+test_import_native_format() {
+    local base_image=$1
+    local dest_image=$2
+
+    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 <<EOF
+{
+  "type": "native",
+  "pool_id": ${pool_id},
+  "pool_namespace": "",
+  "image_name": "${base_image}"
+}
+EOF
+    cat ${TEMPDIR}/spec.json
+
+    rbd migration prepare --import-only \
+       --source-spec-path ${TEMPDIR}/spec.json ${dest_image}
+
+    compare_images "${base_image}@1" "${dest_image}@1"
+    compare_images "${base_image}@2" "${dest_image}@2"
+    compare_images "${base_image}" "${dest_image}"
+
+    rbd snap create ${dest_image}@head
+    rbd bench --io-type write --io-pattern rand --io-size=32K --io-total=32M ${dest_image}
+    compare_images "${base_image}" "${dest_image}@head"
+
+    rbd migration abort ${dest_image}
+
+    rbd migration prepare --import-only \
+        --source-spec-path ${TEMPDIR}/spec.json ${dest_image}
+    rbd migration execute ${dest_image}
+
+    compare_images "${base_image}@1" "${dest_image}@1"
+    compare_images "${base_image}@2" "${dest_image}@2"
+    compare_images "${base_image}" "${dest_image}"
+
+    rbd migration abort ${dest_image}
+
+    rbd migration prepare --import-only \
+        --source-spec "{\"type\": \"native\", \"pool_id\": "${pool_id}", \"image_name\": \"${base_image}\"}" \
+        ${dest_image}
+    rbd migration abort ${dest_image}
+
+    rbd migration prepare --import-only \
+        --source-spec "{\"type\": \"native\", \"pool_name\": \"rbd\", \"image_name\": \"${base_image}\"}" \
+        ${dest_image}
+    rbd migration execute ${dest_image}
+    rbd migration commit ${dest_image}
+
+    compare_images "${base_image}@1" "${dest_image}@1"
+    compare_images "${base_image}@2" "${dest_image}@2"
+    compare_images "${base_image}" "${dest_image}"
+
+    remove_image "${dest_image}"
+}
+
+test_import_raw_format() {
+    local base_image=$1
+    local dest_image=$2
+
+    cat > ${TEMPDIR}/spec.json <<EOF
+{
+  "type": "raw",
+  "stream": {
+    "type": "file",
+    "file_path": "${TEMPDIR}/${base_image}"
+  }
+}
+EOF
+    cat ${TEMPDIR}/spec.json
+
+    cat ${TEMPDIR}/spec.json | rbd migration prepare --import-only \
+       --source-spec-path - ${dest_image}
+    compare_images ${base_image} ${dest_image}
+    rbd migration abort ${dest_image}
+
+    rbd migration prepare --import-only \
+       --source-spec-path ${TEMPDIR}/spec.json ${dest_image}
+    rbd migration execute ${dest_image}
+    rbd migration commit ${dest_image}
+
+    compare_images ${base_image} ${dest_image}
+
+    remove_image "${dest_image}"
+
+    cat > ${TEMPDIR}/spec.json <<EOF
+{
+  "type": "raw",
+  "stream": {
+    "type": "file",
+    "file_path": "${TEMPDIR}/${base_image}"
+  },
+  "snapshots": [{
+    "type": "raw",
+    "name": "snap1",
+    "stream": {
+      "type": "file",
+      "file_path": "${TEMPDIR}/${base_image}@1"
+     }
+  }, {
+    "type": "raw",
+    "name": "snap2",
+    "stream": {
+      "type": "file",
+      "file_path": "${TEMPDIR}/${base_image}@2"
+     }
+  }]
+}
+EOF
+    cat ${TEMPDIR}/spec.json
+
+    rbd migration prepare --import-only \
+        --source-spec-path ${TEMPDIR}/spec.json ${dest_image}
+
+    rbd snap create ${dest_image}@head
+    rbd bench --io-type write --io-pattern rand --io-size=32K --io-total=32M ${dest_image}
+
+    compare_images "${base_image}" "${dest_image}@head"
+    compare_images "${base_image}@1" "${dest_image}@snap1"
+    compare_images "${base_image}@2" "${dest_image}@snap2"
+    compare_images "${base_image}" "${dest_image}@head"
+
+    rbd migration execute ${dest_image}
+
+    compare_images "${base_image}@1" "${dest_image}@snap1"
+    compare_images "${base_image}@2" "${dest_image}@snap2"
+    compare_images "${base_image}" "${dest_image}@head"
+
+    rbd migration commit ${dest_image}
+
+    remove_image "${dest_image}"
+}
+
+# make sure rbd pool is EMPTY.. this is a test script!!
+rbd ls 2>&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_raw_format ${IMAGE1} ${IMAGE2}
+
+echo OK