diff --git a/src/cmd/cli_modify.cpp b/src/cmd/cli_modify.cpp index 6de146ce..27cd8d43 100644 --- a/src/cmd/cli_modify.cpp +++ b/src/cmd/cli_modify.cpp @@ -287,7 +287,20 @@ std::function cli_tool_t::start_modify(json11::Json cfg) changer->parent = this; changer->image_name = cfg["image"].string_value(); changer->new_name = cfg["rename"].string_value(); - changer->new_size = parse_size(cfg["resize"].as_string()); + if (!cfg["resize"].is_null()) + { + bool ok = false; + changer->new_size = parse_size(cfg["resize"].as_string(), &ok); + if (!ok) + { + delete changer; + return [size = cfg["resize"].as_string()](cli_result_t & result) + { + result = (cli_result_t){ .err = EINVAL, .text = "Invalid syntax for size: "+size }; + return true; + }; + } + } changer->force_size = cfg["force_size"].bool_value(); changer->inc_size = cfg["inc_size"].bool_value(); changer->force = cfg["force"].bool_value(); diff --git a/tests/run_tests.sh b/tests/run_tests.sh index d72fcf78..c40e0d06 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -64,6 +64,8 @@ OLD=1 ./test_move_reappear.sh ./test_rm.sh +./test_modify_image_resize.sh + ./test_rm_degraded.sh ./test_snapshot_chain.sh diff --git a/tests/test_modify_image_resize.sh b/tests/test_modify_image_resize.sh new file mode 100755 index 00000000..10327813 --- /dev/null +++ b/tests/test_modify_image_resize.sh @@ -0,0 +1,28 @@ +#!/bin/bash -ex + +# Test that modify refuses an invalid --resize value instead of ignoring it + +. `dirname $0`/common.sh + +wait_etcd + +$ETCDCTL put /vitastor/config/pools '{"1":{"name":"testpool","scheme":"replicated","pg_size":2,"pg_minsize":1,"pg_count":1,"failure_domain":"osd"}}' + +$VITASTOR_CLI create -s 1G --pool testpool testimg + +for size in 1.5G 10X abc ''; do + r=0 + $VITASTOR_CLI modify testimg --resize "$size" || r=$? + if [[ $r != 22 ]]; then + format_error "modify --resize '$size' should fail with EINVAL (22), but exited with $r" + fi +done + +$ETCDCTL get --print-value-only /vitastor/config/inode/1/1 | jq -e '.size == 1073741824' || \ + format_error "Image size should stay 1G after refused resizes" + +$VITASTOR_CLI modify testimg --resize 2G +$ETCDCTL get --print-value-only /vitastor/config/inode/1/1 | jq -e '.size == 2147483648' || \ + format_error "Image size should be 2G after --resize 2G" + +format_green OK