1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2019 Intel Corporation 4# All rights reserved. 5# 6testdir=$(readlink -f $(dirname $0)) 7rootdir=$(readlink -f $testdir/../..) 8source $rootdir/test/common/autotest_common.sh 9source $rootdir/test/lvol/common.sh 10 11# Positive test for lvol store and lvol bdev rename. 12function test_rename_positive() { 13 malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 14 lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) 15 bdev_name=("lvol_test"{0..3}) 16 bdev_aliases=("lvs_test/lvol_test"{0..3}) 17 18 # Calculate size and create two lvol bdevs on top 19 lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4))) 20 lvol_size=$((lvol_size_mb * 1024 * 1024)) 21 22 # Create 4 lvol bdevs on top of previously created lvol store 23 bdev_uuids=() 24 for i in "${!bdev_name[@]}"; do 25 lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" "${bdev_name[i]}" "$lvol_size_mb") 26 lvol=$(rpc_cmd bdev_get_bdevs -b $lvol_uuid) 27 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid" ] 28 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 29 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 30 [ "$(jq '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases[i]}'"]')" ] 31 bdev_uuids+=("$lvol_uuid") 32 done 33 34 # Rename lvol store and check if lvol store name and 35 # lvol bdev aliases were updated properly 36 new_lvs_name="lvs_new" 37 bdev_aliases=("$new_lvs_name/lvol_test"{0..3}) 38 39 rpc_cmd bdev_lvol_rename_lvstore lvs_test "$new_lvs_name" 40 41 lvs=$(rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid") 42 43 # verify it's there 44 [ "$(jq -r '.[0].uuid' <<< "$lvs")" = "$lvs_uuid" ] 45 [ "$(jq -r '.[0].name' <<< "$lvs")" = "$new_lvs_name" ] 46 [ "$(jq -r '.[0].base_bdev' <<< "$lvs")" = "$malloc_name" ] 47 48 # verify some of its parameters 49 cluster_size=$(jq -r '.[0].cluster_size' <<< "$lvs") 50 [ "$cluster_size" = "$LVS_DEFAULT_CLUSTER_SIZE" ] 51 total_clusters=$(jq -r '.[0].total_data_clusters' <<< "$lvs") 52 [ "$((total_clusters * cluster_size))" = "$LVS_DEFAULT_CAPACITY" ] 53 54 for i in "${!bdev_uuids[@]}"; do 55 lvol=$(rpc_cmd bdev_get_bdevs -b "${bdev_uuids[i]}") 56 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid" ] 57 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 58 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 59 [ "$(jq -r '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases[i]}'"]')" ] 60 done 61 62 # Now try to rename the bdevs using their uuid as "old_name" 63 # Verify that all bdev names were successfully updated 64 bdev_names=("lbd_new"{0..3}) 65 new_bdev_aliases=() 66 for bdev_name in "${bdev_names[@]}"; do 67 new_bdev_aliases+=("$new_lvs_name/$bdev_name") 68 done 69 for i in "${!bdev_names[@]}"; do 70 rpc_cmd bdev_lvol_rename "${bdev_aliases[i]}" "${bdev_names[i]}" 71 lvol=$(rpc_cmd bdev_get_bdevs -b "${bdev_uuids[i]}") 72 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid" ] 73 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 74 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 75 [ "$(jq -r '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${new_bdev_aliases[i]}'"]')" ] 76 done 77 78 # Clean up 79 for bdev in "${new_bdev_aliases[@]}"; do 80 rpc_cmd bdev_lvol_delete "$bdev" 81 done 82 rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 83 rpc_cmd bdev_malloc_delete "$malloc_name" 84 check_leftover_devices 85} 86 87# Negative test case for lvol store rename. 88# Check that error is returned when trying to rename not existing lvol store. 89# Check that error is returned when trying to rename to a name which is already 90# used by another lvol store. 91function test_rename_lvs_negative() { 92 # Call bdev_lvol_rename_lvstore with name pointing to not existing lvol store 93 rpc_cmd bdev_lvol_rename_lvstore NOTEXIST WHATEVER && false 94 95 # Construct two malloc bdevs 96 malloc_name1=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 97 malloc_name2=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 98 99 # Create lvol store on each malloc bdev 100 lvs_uuid1=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name1" lvs_test1) 101 lvs_uuid2=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name2" lvs_test2) 102 103 # Create lists with lvol bdev names and aliases for later use 104 bdev_names_1=("lvol_test_1_"{0..3}) 105 bdev_names_2=("lvol_test_2_"{0..3}) 106 bdev_aliases_1=("lvs_test1/lvol_test_1_"{0..3}) 107 bdev_aliases_2=("lvs_test2/lvol_test_2_"{0..3}) 108 109 # Calculate size and create two lvol bdevs on top 110 lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4))) 111 lvol_size=$((lvol_size_mb * 1024 * 1024)) 112 113 # # Create 4 lvol bdevs on top of each lvol store 114 bdev_uuids_1=() 115 bdev_uuids_2=() 116 for i in "${!bdev_names_1[@]}"; do 117 lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "${bdev_names_1[i]}" "$lvol_size_mb") 118 lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 119 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid1" ] 120 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 121 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 122 [ "$(jq '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases_1[i]}'"]')" ] 123 bdev_uuids_1+=("$lvol_uuid") 124 125 lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid2" "${bdev_names_2[i]}" "$lvol_size_mb") 126 lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") 127 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid2" ] 128 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 129 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 130 [ "$(jq '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases_2[i]}'"]')" ] 131 bdev_uuids_2+=("$lvol_uuid") 132 done 133 134 # Call bdev_lvol_rename_lvstore on first lvol store and try to change its name to 135 # the same name as used by second lvol store 136 rpc_cmd bdev_lvol_rename_lvstore lvs_test1 lvs_test2 && false 137 138 # Verify that names of lvol stores and lvol bdevs did not change 139 lvs=$(rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid1") 140 [ "$(jq -r '.[0].uuid' <<< "$lvs")" = "$lvs_uuid1" ] 141 [ "$(jq -r '.[0].name' <<< "$lvs")" = "lvs_test1" ] 142 [ "$(jq -r '.[0].base_bdev' <<< "$lvs")" = "$malloc_name1" ] 143 [ "$(jq -r '.[0].cluster_size' <<< "$lvs")" = "$LVS_DEFAULT_CLUSTER_SIZE" ] 144 lvs=$(rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid2") 145 [ "$(jq -r '.[0].uuid' <<< "$lvs")" = "$lvs_uuid2" ] 146 [ "$(jq -r '.[0].name' <<< "$lvs")" = "lvs_test2" ] 147 [ "$(jq -r '.[0].base_bdev' <<< "$lvs")" = "$malloc_name2" ] 148 [ "$(jq -r '.[0].cluster_size' <<< "$lvs")" = "$LVS_DEFAULT_CLUSTER_SIZE" ] 149 150 for i in "${!bdev_uuids_1[@]}"; do 151 lvol=$(rpc_cmd bdev_get_bdevs -b "${bdev_uuids_1[i]}") 152 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid1" ] 153 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 154 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 155 [ "$(jq '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases_1[i]}'"]')" ] 156 157 lvol=$(rpc_cmd bdev_get_bdevs -b "${bdev_uuids_2[i]}") 158 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid2" ] 159 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 160 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 161 [ "$(jq '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["'${bdev_aliases_2[i]}'"]')" ] 162 done 163 164 # Clean up 165 for bdev in "${bdev_aliases_1[@]}" "${bdev_aliases_2[@]}"; do 166 rpc_cmd bdev_lvol_delete "$bdev" 167 done 168 rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid1" 169 rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid2" 170 rpc_cmd bdev_malloc_delete "$malloc_name1" 171 rpc_cmd bdev_malloc_delete "$malloc_name2" 172 check_leftover_devices 173} 174 175# Negative test case for lvol bdev rename. 176# Check that error is returned when trying to rename not existing lvol bdev 177# Check that error is returned when trying to rename to a name which is already 178# used by another lvol bdev. 179function test_lvol_rename_negative() { 180 # Call bdev_lvol_rename with name pointing to not existing lvol bdev 181 rpc_cmd bdev_lvol_rename NOTEXIST WHATEVER && false 182 183 malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) 184 lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) 185 186 # Calculate lvol bdev size 187 lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 2))) 188 lvol_size=$((lvol_size_mb * 1024 * 1024)) 189 190 # Create two lvol bdevs on top of previously created lvol store 191 lvol_uuid1=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test1 "$lvol_size_mb") 192 lvol_uuid2=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test2 "$lvol_size_mb") 193 194 # Call bdev_lvol_rename on first lvol bdev and try to change its name to 195 # the same name as used by second lvol bdev 196 rpc_cmd bdev_lvol_rename lvol_test1 lvol_test2 && false 197 198 # Verify that lvol bdev still have the same names as before 199 lvol=$(rpc_cmd bdev_get_bdevs -b $lvol_uuid1) 200 [ "$(jq -r '.[0].driver_specific.lvol.lvol_store_uuid' <<< "$lvol")" = "$lvs_uuid" ] 201 [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] 202 [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ] 203 [ "$(jq -r '.[0].aliases|sort' <<< "$lvol")" = "$(jq '.|sort' <<< '["lvs_test/lvol_test1"]')" ] 204 205 rpc_cmd bdev_lvol_delete lvs_test/lvol_test1 206 rpc_cmd bdev_lvol_delete lvs_test/lvol_test2 207 rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" 208 rpc_cmd bdev_malloc_delete "$malloc_name" 209 check_leftover_devices 210} 211 212$SPDK_BIN_DIR/spdk_tgt & 213spdk_pid=$! 214trap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT 215waitforlisten $spdk_pid 216 217run_test "test_rename_positive" test_rename_positive 218run_test "test_rename_lvs_negative" test_rename_lvs_negative 219run_test "test_lvol_rename_negative" test_lvol_rename_negative 220 221trap - SIGINT SIGTERM EXIT 222killprocess $spdk_pid 223