- Installed and configured SCST with 7 handlers - Installed and configured mhVTL with 2 Quantum libraries and 8 LTO-8 drives - Implemented all VTL API endpoints (8/9 working) - Fixed NULL device_path handling in drives endpoint - Added comprehensive error handling and validation - Implemented async tape load/unload operations - Created SCST installation guide for Ubuntu 24.04 - Created mhVTL installation and configuration guide - Added VTL testing guide and automated test scripts - All core API tests passing (89% success rate) Infrastructure status: - PostgreSQL: Configured with proper permissions - SCST: Active with kernel module loaded - mhVTL: 2 libraries (Quantum Scalar i500, Scalar i40) - mhVTL: 8 drives (all Quantum ULTRIUM-HH8 LTO-8) - Calypso API: 8/9 VTL endpoints functional Documentation added: - src/srs-technical-spec-documents/scst-installation.md - src/srs-technical-spec-documents/mhvtl-installation.md - VTL-TESTING-GUIDE.md - scripts/test-vtl.sh Co-Authored-By: Warp <agent@warp.dev>
211 lines
6.6 KiB
Bash
Executable File
211 lines
6.6 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# AtlasOS - Calypso VTL Testing Script
|
|
# Tests Virtual Tape Library endpoints
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
API_URL="${API_URL:-http://localhost:8080}"
|
|
TOKEN_FILE="/tmp/calypso-test-token"
|
|
|
|
# Helper functions
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_step() {
|
|
echo -e "${BLUE}[STEP]${NC} $1"
|
|
}
|
|
|
|
# Check if token exists
|
|
if [ ! -f "$TOKEN_FILE" ]; then
|
|
log_error "No authentication token found."
|
|
log_info "Please login first:"
|
|
log_info " curl -X POST $API_URL/api/v1/auth/login \\"
|
|
log_info " -H 'Content-Type: application/json' \\"
|
|
log_info " -d '{\"username\":\"admin\",\"password\":\"admin123\"}' | jq -r '.token' > $TOKEN_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
TOKEN=$(cat "$TOKEN_FILE")
|
|
|
|
# Test function
|
|
test_endpoint() {
|
|
local method=$1
|
|
local endpoint=$2
|
|
local data=$3
|
|
local description=$4
|
|
|
|
log_step "Testing: $description"
|
|
|
|
local cmd="curl -s -w '\nHTTP_CODE:%{http_code}' -H 'Authorization: Bearer $TOKEN'"
|
|
|
|
if [ "$method" = "POST" ] || [ "$method" = "PUT" ] || [ "$method" = "DELETE" ]; then
|
|
cmd="$cmd -X $method -H 'Content-Type: application/json'"
|
|
if [ -n "$data" ]; then
|
|
cmd="$cmd -d '$data'"
|
|
fi
|
|
else
|
|
cmd="$cmd -X $method"
|
|
fi
|
|
|
|
cmd="$cmd '$API_URL$endpoint'"
|
|
|
|
local response=$(eval $cmd)
|
|
local http_code=$(echo "$response" | grep -oP 'HTTP_CODE:\K\d+')
|
|
local body=$(echo "$response" | sed 's/HTTP_CODE:[0-9]*$//')
|
|
|
|
if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
|
|
log_info "✓ Success (HTTP $http_code)"
|
|
echo "$body" | jq . 2>/dev/null || echo "$body"
|
|
echo "$body"
|
|
return 0
|
|
else
|
|
log_error "✗ Failed (HTTP $http_code)"
|
|
echo "$body" | jq . 2>/dev/null || echo "$body"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Main test flow
|
|
main() {
|
|
log_info "=========================================="
|
|
log_info "AtlasOS - Calypso VTL Testing"
|
|
log_info "=========================================="
|
|
log_info ""
|
|
|
|
# Test 1: List Libraries (should be empty initially)
|
|
log_info "Test 1: List VTL Libraries"
|
|
LIBRARIES_RESPONSE=$(test_endpoint "GET" "/api/v1/tape/vtl/libraries" "" "List VTL libraries")
|
|
echo ""
|
|
|
|
# Test 2: Create Library
|
|
log_info "Test 2: Create VTL Library"
|
|
CREATE_DATA='{
|
|
"name": "vtl-test-01",
|
|
"description": "Test Virtual Tape Library",
|
|
"backing_store_path": "/var/lib/calypso/vtl",
|
|
"slot_count": 10,
|
|
"drive_count": 2
|
|
}'
|
|
|
|
CREATE_RESPONSE=$(test_endpoint "POST" "/api/v1/tape/vtl/libraries" "$CREATE_DATA" "Create VTL library")
|
|
LIBRARY_ID=$(echo "$CREATE_RESPONSE" | jq -r '.id' 2>/dev/null)
|
|
|
|
if [ -z "$LIBRARY_ID" ] || [ "$LIBRARY_ID" = "null" ]; then
|
|
log_error "Failed to get library ID from create response"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "Created library with ID: $LIBRARY_ID"
|
|
echo ""
|
|
|
|
# Test 3: Get Library Details
|
|
log_info "Test 3: Get Library Details"
|
|
test_endpoint "GET" "/api/v1/tape/vtl/libraries/$LIBRARY_ID" "" "Get library details"
|
|
echo ""
|
|
|
|
# Test 4: List Drives
|
|
log_info "Test 4: List Library Drives"
|
|
test_endpoint "GET" "/api/v1/tape/vtl/libraries/$LIBRARY_ID/drives" "" "List drives"
|
|
echo ""
|
|
|
|
# Test 5: List Tapes
|
|
log_info "Test 5: List Library Tapes"
|
|
TAPES_RESPONSE=$(test_endpoint "GET" "/api/v1/tape/vtl/libraries/$LIBRARY_ID/tapes" "" "List tapes")
|
|
FIRST_TAPE_ID=$(echo "$TAPES_RESPONSE" | jq -r '.tapes[0].id' 2>/dev/null)
|
|
FIRST_SLOT=$(echo "$TAPES_RESPONSE" | jq -r '.tapes[0].slot_number' 2>/dev/null)
|
|
echo ""
|
|
|
|
# Test 6: Load Tape
|
|
if [ -n "$FIRST_TAPE_ID" ] && [ "$FIRST_TAPE_ID" != "null" ] && [ -n "$FIRST_SLOT" ]; then
|
|
log_info "Test 6: Load Tape to Drive"
|
|
LOAD_DATA="{\"slot_number\": $FIRST_SLOT, \"drive_number\": 1}"
|
|
LOAD_RESPONSE=$(test_endpoint "POST" "/api/v1/tape/vtl/libraries/$LIBRARY_ID/load" "$LOAD_DATA" "Load tape")
|
|
TASK_ID=$(echo "$LOAD_RESPONSE" | jq -r '.task_id' 2>/dev/null)
|
|
|
|
if [ -n "$TASK_ID" ] && [ "$TASK_ID" != "null" ]; then
|
|
log_info "Load task created: $TASK_ID"
|
|
log_info "Waiting 2 seconds for task to complete..."
|
|
sleep 2
|
|
|
|
log_info "Checking task status..."
|
|
test_endpoint "GET" "/api/v1/tasks/$TASK_ID" "" "Get task status"
|
|
fi
|
|
echo ""
|
|
else
|
|
log_warn "Skipping load test - no tapes found"
|
|
fi
|
|
|
|
# Test 7: Get Library Again (to see updated state)
|
|
log_info "Test 7: Get Library (After Load)"
|
|
test_endpoint "GET" "/api/v1/tape/vtl/libraries/$LIBRARY_ID" "" "Get library after load"
|
|
echo ""
|
|
|
|
# Test 8: Unload Tape
|
|
if [ -n "$FIRST_SLOT" ]; then
|
|
log_info "Test 8: Unload Tape from Drive"
|
|
UNLOAD_DATA="{\"drive_number\": 1, \"slot_number\": $FIRST_SLOT}"
|
|
UNLOAD_RESPONSE=$(test_endpoint "POST" "/api/v1/tape/vtl/libraries/$LIBRARY_ID/unload" "$UNLOAD_DATA" "Unload tape")
|
|
TASK_ID=$(echo "$UNLOAD_RESPONSE" | jq -r '.task_id' 2>/dev/null)
|
|
|
|
if [ -n "$TASK_ID" ] && [ "$TASK_ID" != "null" ]; then
|
|
log_info "Unload task created: $TASK_ID"
|
|
log_info "Waiting 2 seconds for task to complete..."
|
|
sleep 2
|
|
|
|
log_info "Checking task status..."
|
|
test_endpoint "GET" "/api/v1/tasks/$TASK_ID" "" "Get task status"
|
|
fi
|
|
echo ""
|
|
fi
|
|
|
|
# Test 9: Create Additional Tape
|
|
log_info "Test 9: Create New Tape"
|
|
CREATE_TAPE_DATA='{
|
|
"barcode": "CUSTOM001",
|
|
"slot_number": 11,
|
|
"tape_type": "LTO-8",
|
|
"size_gb": 15000
|
|
}'
|
|
test_endpoint "POST" "/api/v1/tape/vtl/libraries/$LIBRARY_ID/tapes" "$CREATE_TAPE_DATA" "Create new tape"
|
|
echo ""
|
|
|
|
# Test 10: List Libraries Again
|
|
log_info "Test 10: List Libraries (Final)"
|
|
test_endpoint "GET" "/api/v1/tape/vtl/libraries" "" "List all libraries"
|
|
echo ""
|
|
|
|
log_info "=========================================="
|
|
log_info "VTL Testing Complete"
|
|
log_info "=========================================="
|
|
log_info ""
|
|
log_info "Library ID: $LIBRARY_ID"
|
|
log_info "You can continue testing with:"
|
|
log_info " export LIBRARY_ID=$LIBRARY_ID"
|
|
log_info ""
|
|
log_warn "Note: Library deletion test skipped (use DELETE endpoint manually if needed)"
|
|
log_info ""
|
|
}
|
|
|
|
# Run tests
|
|
main
|
|
|