smol-machines--smolvm
306 行
11 KiB
Bash
可执行文件
306 行
11 KiB
Bash
可执行文件
#!/usr/bin/env bash
|
|
#
|
|
# Resize feature tests for smolvm.
|
|
# Runs only the resize-related integration tests.
|
|
#
|
|
# Usage:
|
|
# ./tests/test_resize.sh
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(dirname "$0")/common.sh"
|
|
init_smolvm
|
|
|
|
# Pre-flight: Kill any existing smolvm processes and clean up ALL test VMs
|
|
log_info "Pre-flight cleanup: killing orphan processes and removing test VMs..."
|
|
kill_orphan_smolvm_processes
|
|
|
|
# Clean up any leftover test VM directories
|
|
for vm_name in test-vm-resize-happy test-vm-resize-running test-vm-resize-shrink \
|
|
nonexistent-vm-resize-test test-vm-resize-noparams test-vm-resize-storage-only \
|
|
test-vm-resize-overlay-only; do
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
done
|
|
|
|
# Cleanup on exit - stop default VM only (don't delete test VMs, they should be cleaned by each test)
|
|
trap 'cleanup_machine' EXIT
|
|
|
|
# Run only resize tests
|
|
echo ""
|
|
echo "=========================================="
|
|
echo " smolvm Resize Feature Tests"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# =============================================================================
|
|
# Resize Tests
|
|
# =============================================================================
|
|
|
|
test_machine_resize_happy_path() {
|
|
# Integration test: Happy path resize workflow (4.4)
|
|
local vm_name="test-vm-resize-happy"
|
|
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
|
|
# Create VM with small resources
|
|
$SMOLVM machine create --name "$vm_name" --storage 5 --overlay 2 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
$SMOLVM machine stop --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
|
|
# Resize
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --storage 10 --overlay 5 2>&1)
|
|
|
|
# Verify resize output contains expected messages
|
|
if [[ "$resize_output" != *"Resizing machine"* ]]; then
|
|
echo "Resize output should contain 'Resizing machine'"
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
fi
|
|
|
|
# Clean up
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Verify output mentions success
|
|
[[ "$resize_output" == *"resized successfully"* ]]
|
|
}
|
|
|
|
test_machine_resize_running_vm_rejected() {
|
|
# Integration test: Resize rejection - running VM (4.5)
|
|
local vm_name="test-vm-resize-running"
|
|
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
|
|
# Create and start VM
|
|
$SMOLVM machine create --name "$vm_name" --storage 5 --overlay 2 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
return 1
|
|
}
|
|
|
|
# Attempt resize on running VM - should fail
|
|
local exit_code=0
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --storage 10 2>&1) || exit_code=$?
|
|
|
|
# Clean up
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Should fail with non-zero exit code
|
|
[[ $exit_code -ne 0 ]]
|
|
}
|
|
|
|
test_machine_resize_shrink_rejected() {
|
|
# Integration test: Resize rejection - shrink disk (4.5)
|
|
local vm_name="test-vm-resize-shrink"
|
|
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
|
|
# Create VM with 10 GiB storage
|
|
$SMOLVM machine create --name "$vm_name" --storage 10 --overlay 5 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
return 1
|
|
}
|
|
$SMOLVM machine stop --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
return 1
|
|
}
|
|
|
|
# Attempt to shrink to 5 GiB - should fail
|
|
local exit_code=0
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --storage 5 2>&1) || exit_code=$?
|
|
|
|
# Clean up
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Should fail with non-zero exit code and error message about shrinking
|
|
[[ $exit_code -ne 0 ]] && [[ "$resize_output" == *"shrunk"* || "$resize_output" == *"larger"* ]]
|
|
}
|
|
|
|
test_machine_resize_nonexistent_vm_rejected() {
|
|
# Integration test: Resize rejection - non-existent VM (4.5)
|
|
local vm_name="nonexistent-vm-resize-test"
|
|
|
|
# Attempt resize on non-existent VM
|
|
local exit_code=0
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --storage 10 2>&1) || exit_code=$?
|
|
|
|
# Should fail with non-zero exit code and "not found" message
|
|
[[ $exit_code -ne 0 ]] && [[ "$resize_output" == *"not found"* ]]
|
|
}
|
|
|
|
test_machine_resize_default_vm() {
|
|
# Integration test: Default VM resize (4.6)
|
|
cleanup_machine
|
|
|
|
# Start and stop default VM (created with defaults: 20 GiB storage, 10 GiB overlay)
|
|
$SMOLVM machine start 2>&1 || return 1
|
|
$SMOLVM machine stop 2>&1 || return 1
|
|
|
|
# Resize default VM (no name argument) - must expand, not shrink
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --storage 30 --overlay 15 2>&1)
|
|
|
|
# Verify resize output contains expected messages
|
|
if [[ "$resize_output" != *"Resizing machine"* ]]; then
|
|
echo "Resize output should contain 'Resizing machine'"
|
|
echo "Got: $resize_output"
|
|
$SMOLVM machine stop 2>/dev/null || true
|
|
return 1
|
|
fi
|
|
|
|
# Clean up
|
|
$SMOLVM machine stop 2>/dev/null || true
|
|
|
|
# Verify output mentions success
|
|
[[ "$resize_output" == *"resized successfully"* ]]
|
|
}
|
|
|
|
test_machine_resize_no_params_rejected() {
|
|
# Integration test: Resize with no parameters should fail
|
|
local vm_name="test-vm-resize-noparams"
|
|
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
|
|
# Create VM
|
|
$SMOLVM machine create --name "$vm_name" --storage 5 --overlay 2 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
return 1
|
|
}
|
|
$SMOLVM machine stop --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
return 1
|
|
}
|
|
|
|
# Attempt resize with no parameters - should fail
|
|
local exit_code=0
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" 2>&1) || exit_code=$?
|
|
|
|
# Clean up
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Should fail with non-zero exit code
|
|
[[ $exit_code -ne 0 ]]
|
|
}
|
|
|
|
test_machine_resize_storage_only() {
|
|
# Integration test: Resize storage only (partial update)
|
|
local vm_name="test-vm-resize-storage-only"
|
|
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
|
|
# Create VM with small resources
|
|
$SMOLVM machine create --name "$vm_name" --storage 5 --overlay 2 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
$SMOLVM machine stop --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
|
|
# Resize storage only
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --storage 15 2>&1)
|
|
|
|
# Clean up
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Should succeed and mention storage expansion
|
|
[[ "$resize_output" == *"Storage"* ]] && [[ "$resize_output" == *"resized successfully"* ]]
|
|
}
|
|
|
|
test_machine_resize_overlay_only() {
|
|
# Integration test: Resize overlay only (partial update)
|
|
local vm_name="test-vm-resize-overlay-only"
|
|
|
|
# Aggressive cleanup - stop, delete, and remove directory
|
|
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
sleep 0.5
|
|
|
|
# Create VM with small resources
|
|
$SMOLVM machine create --name "$vm_name" --storage 5 --overlay 2 2>&1 || return 1
|
|
$SMOLVM machine start --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
$SMOLVM machine stop --name "$vm_name" 2>&1 || {
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
}
|
|
|
|
# Verify disk sizes before resize (debug)
|
|
local overlay_size
|
|
overlay_size=$(ls -lh "$(vm_data_dir "$vm_name")/overlay.raw" 2>/dev/null | awk '{print $5}')
|
|
if [[ "$overlay_size" != "2.0G" ]]; then
|
|
echo "DEBUG: overlay disk is $overlay_size, expected 2.0G"
|
|
echo "DEBUG: listing directory:"
|
|
ls -lh "$(vm_data_dir "$vm_name")/" 2>/dev/null || true
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
return 1
|
|
fi
|
|
|
|
# Resize overlay only
|
|
local resize_output
|
|
resize_output=$($SMOLVM machine resize --name "$vm_name" --overlay 8 2>&1)
|
|
echo "RESIZE OUTPUT: '$resize_output'"
|
|
|
|
# Clean up
|
|
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
|
|
rm -rf "$(vm_data_dir "$vm_name")"
|
|
ensure_data_dir_deleted "$vm_name"
|
|
|
|
# Should succeed and mention overlay expansion
|
|
[[ "$resize_output" == *"Overlay"* ]] && [[ "$resize_output" == *"resized successfully"* ]]
|
|
}
|
|
|
|
run_test "Resize: happy path" test_machine_resize_happy_path || true
|
|
run_test "Resize: running VM rejected" test_machine_resize_running_vm_rejected || true
|
|
run_test "Resize: shrink rejected" test_machine_resize_shrink_rejected || true
|
|
run_test "Resize: non-existent VM rejected" test_machine_resize_nonexistent_vm_rejected || true
|
|
run_test "Resize: default VM" test_machine_resize_default_vm || true
|
|
run_test "Resize: no params rejected" test_machine_resize_no_params_rejected || true
|
|
run_test "Resize: storage only" test_machine_resize_storage_only || true
|
|
run_test "Resize: overlay only" test_machine_resize_overlay_only || true
|
|
|
|
print_summary "Resize Tests"
|