340 lines
9.6 KiB
Bash
340 lines
9.6 KiB
Bash
#!/bin/bash
|
|
# GitOps Status API - Test Script
|
|
# Tests all endpoints with realistic examples
|
|
|
|
set -e
|
|
|
|
API_URL="${API_URL:-http://localhost:5000}"
|
|
|
|
echo "=========================================="
|
|
echo "GitOps Status API Test Script"
|
|
echo "API URL: $API_URL"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Color codes
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
function print_test() {
|
|
echo -e "${BLUE}[TEST]${NC} $1"
|
|
}
|
|
|
|
function print_success() {
|
|
echo -e "${GREEN}[OK]${NC} $1"
|
|
}
|
|
|
|
function print_section() {
|
|
echo ""
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo -e "${YELLOW}$1${NC}"
|
|
echo -e "${YELLOW}========================================${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Test 1: Health checks
|
|
print_section "1. Health Checks"
|
|
|
|
print_test "GET /health"
|
|
curl -s "$API_URL/health" | jq .
|
|
print_success "Health check passed"
|
|
echo ""
|
|
|
|
print_test "GET /ready"
|
|
curl -s "$API_URL/ready" | jq .
|
|
print_success "Readiness check passed"
|
|
echo ""
|
|
|
|
print_test "GET / (API info)"
|
|
curl -s "$API_URL/" | jq .
|
|
print_success "API info retrieved"
|
|
echo ""
|
|
|
|
# Test 2: Pipeline updates (rsyslog servers)
|
|
print_section "2. Pipeline Updates - rsyslog Servers"
|
|
|
|
print_test "POST /status/pipeline - rsyslog-prod/rsyslog-01 (synced)"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "rsyslog",
|
|
"server_group": "rsyslog-prod",
|
|
"server_type": "rsyslog",
|
|
"environment": "prod",
|
|
"host": "rsyslog-01",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"validation_status": "passed",
|
|
"validation_message": "rsyslog syntax validation passed",
|
|
"commit_sha": "abc1234567890",
|
|
"branch": "master",
|
|
"updated_by": "woodpecker",
|
|
"last_pipeline_run": "2026-04-26T10:30:00Z"
|
|
}' | jq .
|
|
print_success "rsyslog-01 status updated"
|
|
echo ""
|
|
|
|
print_test "POST /status/pipeline - rsyslog-prod/rsyslog-02 (synced)"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "rsyslog",
|
|
"server_group": "rsyslog-prod",
|
|
"server_type": "rsyslog",
|
|
"environment": "prod",
|
|
"host": "rsyslog-02",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"validation_status": "passed",
|
|
"validation_message": "rsyslog syntax validation passed",
|
|
"commit_sha": "abc1234567890",
|
|
"branch": "master",
|
|
"updated_by": "woodpecker",
|
|
"last_pipeline_run": "2026-04-26T10:30:00Z"
|
|
}' | jq .
|
|
print_success "rsyslog-02 status updated"
|
|
echo ""
|
|
|
|
# Test 3: Pipeline updates (other server types)
|
|
print_section "3. Pipeline Updates - Other Server Types"
|
|
|
|
print_test "POST /status/pipeline - Splunk indexer"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "splunk",
|
|
"server_group": "splunk-prod",
|
|
"server_type": "splunk",
|
|
"environment": "prod",
|
|
"host": "splunk-indexer-01",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"validation_status": "passed",
|
|
"validation_message": "Splunk configuration validated",
|
|
"commit_sha": "def4567890123",
|
|
"branch": "main",
|
|
"updated_by": "jenkins",
|
|
"last_pipeline_run": "2026-04-26T10:35:00Z"
|
|
}' | jq .
|
|
print_success "Splunk indexer status updated"
|
|
echo ""
|
|
|
|
print_test "POST /status/pipeline - nginx web server"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "nginx",
|
|
"server_group": "nginx-prod",
|
|
"server_type": "nginx",
|
|
"environment": "prod",
|
|
"host": "nginx-web-01",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"validation_status": "passed",
|
|
"validation_message": "nginx -t passed",
|
|
"commit_sha": "ghi7890123456",
|
|
"branch": "master",
|
|
"updated_by": "gitlab-ci",
|
|
"last_pipeline_run": "2026-04-26T10:40:00Z"
|
|
}' | jq .
|
|
print_success "nginx web server status updated"
|
|
echo ""
|
|
|
|
print_test "POST /status/pipeline - IBM ITNM"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "ibm-itnm",
|
|
"server_group": "itnm-prod",
|
|
"server_type": "ibm-itnm",
|
|
"environment": "prod",
|
|
"host": "itnm-server-01",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"validation_status": "passed",
|
|
"validation_message": "ITNM config validation successful",
|
|
"commit_sha": "jkl0123456789",
|
|
"branch": "production",
|
|
"updated_by": "woodpecker",
|
|
"last_pipeline_run": "2026-04-26T10:45:00Z"
|
|
}' | jq .
|
|
print_success "IBM ITNM status updated"
|
|
echo ""
|
|
|
|
# Test 4: Pipeline update with failure
|
|
print_section "4. Pipeline Update - Failed Deployment"
|
|
|
|
print_test "POST /status/pipeline - rsyslog-staging/rsyslog-test-01 (failed)"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"project_name": "gitops-for-servers",
|
|
"repo_name": "rsyslog",
|
|
"server_group": "rsyslog-staging",
|
|
"server_type": "rsyslog",
|
|
"environment": "staging",
|
|
"host": "rsyslog-test-01",
|
|
"status": "failed",
|
|
"changed_files": ["/etc/rsyslog.conf"],
|
|
"validation_status": "failed",
|
|
"validation_message": "rsyslog: syntax error in /etc/rsyslog.conf line 42",
|
|
"commit_sha": "bad1234567890",
|
|
"branch": "feature/new-config",
|
|
"updated_by": "developer",
|
|
"last_pipeline_run": "2026-04-26T10:50:00Z"
|
|
}' | jq .
|
|
print_success "Failed deployment recorded"
|
|
echo ""
|
|
|
|
# Test 5: Cron updates (drift detection)
|
|
print_section "5. Cron Updates - Drift Detection"
|
|
|
|
print_test "POST /status/cron - rsyslog-01 (no drift)"
|
|
curl -s -X POST "$API_URL/status/cron" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"server_group": "rsyslog-prod",
|
|
"host": "rsyslog-01",
|
|
"status": "synced",
|
|
"changed_files": [],
|
|
"last_cron_check": "2026-04-26T11:00:00Z"
|
|
}' | jq .
|
|
print_success "Cron check - no drift"
|
|
echo ""
|
|
|
|
print_test "POST /status/cron - rsyslog-02 (drift detected)"
|
|
curl -s -X POST "$API_URL/status/cron" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"server_group": "rsyslog-prod",
|
|
"host": "rsyslog-02",
|
|
"status": "out_of_sync",
|
|
"changed_files": ["/etc/rsyslog.conf", "/etc/rsyslog.d/50-default.conf"],
|
|
"last_cron_check": "2026-04-26T11:00:00Z"
|
|
}' | jq .
|
|
print_success "Cron check - drift detected"
|
|
echo ""
|
|
|
|
# Test 6: Query endpoints
|
|
print_section "6. Query Endpoints - GET Status"
|
|
|
|
print_test "GET /status (all servers)"
|
|
curl -s "$API_URL/status" | jq .
|
|
print_success "All servers retrieved"
|
|
echo ""
|
|
|
|
print_test "GET /status/rsyslog-prod (server group)"
|
|
curl -s "$API_URL/status/rsyslog-prod" | jq .
|
|
print_success "rsyslog-prod group retrieved"
|
|
echo ""
|
|
|
|
print_test "GET /status/rsyslog-prod/rsyslog-01 (specific server)"
|
|
curl -s "$API_URL/status/rsyslog-prod/rsyslog-01" | jq .
|
|
print_success "Specific server retrieved"
|
|
echo ""
|
|
|
|
print_test "GET /status/splunk-prod (splunk group)"
|
|
curl -s "$API_URL/status/splunk-prod" | jq .
|
|
print_success "splunk-prod group retrieved"
|
|
echo ""
|
|
|
|
# Test 7: Legacy API (backward compatibility)
|
|
print_section "7. Legacy API - Backward Compatibility"
|
|
|
|
print_test "POST /api/status (old format)"
|
|
curl -s -X POST "$API_URL/api/status" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"repo": "rsyslog",
|
|
"server": "rsyslog-legacy",
|
|
"sync_status": "SYNCED",
|
|
"drift_count": 0,
|
|
"deployed_files": [{"name": "rsyslog.conf"}],
|
|
"drifted_files": [],
|
|
"last_check": "2026-04-26T11:15:00Z"
|
|
}' | jq .
|
|
print_success "Legacy format accepted"
|
|
echo ""
|
|
|
|
print_test "GET /api/status (old format response)"
|
|
curl -s "$API_URL/api/status" | jq .
|
|
print_success "Legacy format returned"
|
|
echo ""
|
|
|
|
# Test 8: Error cases
|
|
print_section "8. Error Handling"
|
|
|
|
print_test "POST /status/pipeline - missing required fields"
|
|
curl -s -X POST "$API_URL/status/pipeline" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"server_group": "test"
|
|
}' | jq .
|
|
print_success "Validation error handled"
|
|
echo ""
|
|
|
|
print_test "POST /status/cron - server not found"
|
|
curl -s -X POST "$API_URL/status/cron" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"server_group": "nonexistent",
|
|
"host": "ghost-server"
|
|
}' | jq .
|
|
print_success "Server not found error handled"
|
|
echo ""
|
|
|
|
print_test "GET /status/nonexistent-group"
|
|
curl -s "$API_URL/status/nonexistent-group" | jq .
|
|
print_success "Group not found error handled"
|
|
echo ""
|
|
|
|
# Test 9: Grafana-friendly output check
|
|
print_section "9. Grafana Infinity Output Validation"
|
|
|
|
print_test "GET /status - Check output is flat array"
|
|
RESPONSE=$(curl -s "$API_URL/status")
|
|
IS_ARRAY=$(echo "$RESPONSE" | jq -r 'if type == "array" then "true" else "false" end')
|
|
|
|
if [ "$IS_ARRAY" == "true" ]; then
|
|
print_success "Output is a flat array (Grafana compatible)"
|
|
|
|
# Check if each element has required fields
|
|
HAS_FIELDS=$(echo "$RESPONSE" | jq -r '.[0] | has("server_group") and has("host") and has("status")')
|
|
|
|
if [ "$HAS_FIELDS" == "true" ]; then
|
|
print_success "Array elements have required fields"
|
|
else
|
|
echo "Warning: Array elements missing required fields"
|
|
fi
|
|
else
|
|
echo "Error: Output is not an array"
|
|
fi
|
|
|
|
echo ""
|
|
echo "$RESPONSE" | jq '.'
|
|
echo ""
|
|
|
|
# Summary
|
|
print_section "Test Summary"
|
|
|
|
echo "All tests completed!"
|
|
echo ""
|
|
echo "Servers created:"
|
|
curl -s "$API_URL/status" | jq -r '.[] | "\(.server_group)/\(.host) - \(.status)"'
|
|
echo ""
|
|
|
|
print_success "API is working correctly with multi-server support"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Update your pipelines to use POST /status/pipeline"
|
|
echo " 2. Configure cron jobs to use POST /status/cron"
|
|
echo " 3. Set up Grafana Infinity datasource pointing to GET /status"
|
|
echo ""
|