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