#!/bin/bash # Provisioning API Client Example set -e # Configuration API_URL="${API_URL:-http://localhost:8083}" USERNAME="${USERNAME:-admin}" PASSWORD="${PASSWORD:-admin123}" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Functions log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARN]${NC} $1" } # Login and get token login() { log_info "Logging in as $USERNAME..." RESPONSE=$(curl -s -X POST "$API_URL/v1/auth/login" \ -H "Content-Type: application/json" \ -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}") TOKEN=$(echo "$RESPONSE" | jq -r '.token') if [ "$TOKEN" = "null" ] || [ -z "$TOKEN" ]; then log_error "Login failed" echo "$RESPONSE" | jq . exit 1 fi log_info "Login successful" export TOKEN } # Health check health_check() { log_info "Checking server health..." RESPONSE=$(curl -s "$API_URL/health") STATUS=$(echo "$RESPONSE" | jq -r '.status') VERSION=$(echo "$RESPONSE" | jq -r '.version') UPTIME=$(echo "$RESPONSE" | jq -r '.uptime_seconds') if [ "$STATUS" = "healthy" ]; then log_info "Server is healthy" echo " Version: $VERSION" echo " Uptime: $UPTIME seconds" else log_error "Server is unhealthy" exit 1 fi } # Create server create_server() { local workspace="${1:-default}" local hostname="${2:-test-server}" log_info "Creating server $hostname in workspace $workspace..." RESPONSE=$(curl -s -X POST "$API_URL/v1/servers/create" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"workspace\": \"$workspace\", \"provider\": \"upcloud\", \"plan\": \"1xCPU-2GB\", \"hostname\": \"$hostname\", \"zone\": \"de-fra1\", \"check_mode\": true }") OPERATION_ID=$(echo "$RESPONSE" | jq -r '.id') if [ "$OPERATION_ID" = "null" ]; then log_error "Server creation failed" echo "$RESPONSE" | jq . exit 1 fi log_info "Server creation started - Operation ID: $OPERATION_ID" echo "$OPERATION_ID" } # Check operation status check_operation() { local operation_id="$1" log_info "Checking operation $operation_id..." RESPONSE=$(curl -s "$API_URL/v1/operations/$operation_id" \ -H "Authorization: Bearer $TOKEN") STATUS=$(echo "$RESPONSE" | jq -r '.status') echo "Status: $STATUS" echo "$RESPONSE" | jq . } # Wait for operation to complete wait_for_operation() { local operation_id="$1" local max_wait="${2:-300}" local wait_time=0 log_info "Waiting for operation $operation_id to complete..." while [ $wait_time -lt $max_wait ]; do RESPONSE=$(curl -s "$API_URL/v1/operations/$operation_id" \ -H "Authorization: Bearer $TOKEN") STATUS=$(echo "$RESPONSE" | jq -r '.status') case "$STATUS" in "completed") log_info "Operation completed successfully" echo "$RESPONSE" | jq . return 0 ;; "failed") log_error "Operation failed" echo "$RESPONSE" | jq . return 1 ;; "cancelled") log_warning "Operation was cancelled" return 1 ;; *) echo -n "." sleep 5 wait_time=$((wait_time + 5)) ;; esac done log_error "Operation timed out after $max_wait seconds" return 1 } # List servers list_servers() { log_info "Listing servers..." RESPONSE=$(curl -s "$API_URL/v1/servers" \ -H "Authorization: Bearer $TOKEN") echo "$RESPONSE" | jq . } # Create taskserv create_taskserv() { local workspace="${1:-default}" local name="${2:-kubernetes}" local servers="${3:-test-server}" log_info "Creating taskserv $name in workspace $workspace..." SERVERS_JSON=$(echo "$servers" | jq -R 'split(",")' | jq -c .) RESPONSE=$(curl -s -X POST "$API_URL/v1/taskservs/create" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"workspace\": \"$workspace\", \"name\": \"$name\", \"servers\": $SERVERS_JSON, \"check_mode\": true }") OPERATION_ID=$(echo "$RESPONSE" | jq -r '.id') if [ "$OPERATION_ID" = "null" ]; then log_error "Taskserv creation failed" echo "$RESPONSE" | jq . exit 1 fi log_info "Taskserv creation started - Operation ID: $OPERATION_ID" echo "$OPERATION_ID" } # Submit workflow submit_workflow() { local workspace="${1:-default}" local workflow_type="${2:-cluster_create}" log_info "Submitting workflow $workflow_type in workspace $workspace..." RESPONSE=$(curl -s -X POST "$API_URL/v1/workflows/submit" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"workspace\": \"$workspace\", \"workflow_type\": \"$workflow_type\", \"parameters\": { \"cluster_name\": \"test-cluster\", \"node_count\": 3 } }") OPERATION_ID=$(echo "$RESPONSE" | jq -r '.id') if [ "$OPERATION_ID" = "null" ]; then log_error "Workflow submission failed" echo "$RESPONSE" | jq . exit 1 fi log_info "Workflow submitted - Operation ID: $OPERATION_ID" echo "$OPERATION_ID" } # Main menu show_menu() { echo "" echo "Provisioning API Client" echo "=======================" echo "1. Health check" echo "2. Login" echo "3. List servers" echo "4. Create server" echo "5. Create taskserv" echo "6. Submit workflow" echo "7. Check operation status" echo "8. Exit" echo "" } # Main execution main() { if [ $# -eq 0 ]; then # Interactive mode while true; do show_menu read -p "Select option: " choice case $choice in 1) health_check ;; 2) login ;; 3) list_servers ;; 4) read -p "Workspace [default]: " workspace read -p "Hostname [test-server]: " hostname create_server "${workspace:-default}" "${hostname:-test-server}" ;; 5) read -p "Workspace [default]: " workspace read -p "Taskserv name [kubernetes]: " name read -p "Servers (comma-separated) [test-server]: " servers create_taskserv "${workspace:-default}" "${name:-kubernetes}" "${servers:-test-server}" ;; 6) read -p "Workspace [default]: " workspace read -p "Workflow type [cluster_create]: " workflow_type submit_workflow "${workspace:-default}" "${workflow_type:-cluster_create}" ;; 7) read -p "Operation ID: " operation_id check_operation "$operation_id" ;; 8) exit 0 ;; *) log_error "Invalid option" ;; esac done else # Command-line mode case "$1" in health) health_check ;; login) login ;; list-servers) login && list_servers ;; create-server) login && create_server "$2" "$3" ;; create-taskserv) login && create_taskserv "$2" "$3" "$4" ;; submit-workflow) login && submit_workflow "$2" "$3" ;; check-operation) login && check_operation "$2" ;; wait-operation) login && wait_for_operation "$2" "$3" ;; *) echo "Usage: $0 {health|login|list-servers|create-server|create-taskserv|submit-workflow|check-operation|wait-operation}" exit 1 ;; esac fi } main "$@"