claude-flow-novice 2.2.4 → 2.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/scripts/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/.claude-flow/metrics/performance.json +9 -0
- package/scripts/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/CLEANUP_OPTIMIZATION_REPORT.json +312 -0
- package/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +387 -0
- package/scripts/CLEANUP_QUICK_START.md +268 -0
- package/scripts/CLEANUP_TEST_RESULTS.md +205 -0
- package/scripts/README.md +339 -0
- package/scripts/ace-query.sh +384 -0
- package/scripts/agent-token-analysis.js +430 -0
- package/scripts/auto-setup.js +332 -0
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/build/validate-agents.js +238 -0
- package/scripts/build-index.js +43 -0
- package/scripts/build-orchestrator.js +320 -0
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/ci-validation.js +375 -0
- package/scripts/cleanup-blocking-coordination.sh +420 -0
- package/scripts/cleanup-idle-sessions.sh +59 -0
- package/scripts/collect-build-metrics.js +65 -0
- package/scripts/demo/README.md +79 -0
- package/scripts/demo/autoscaling-demo-simplified.js +963 -0
- package/scripts/demo/comprehensive-dashboard-test.js +693 -0
- package/scripts/demo/confidence-log.js +87 -0
- package/scripts/demo/confidence-report.js +82 -0
- package/scripts/demo/demo-multi-swarm-coordination.js +325 -0
- package/scripts/demo/demo-production-deployment.js +399 -0
- package/scripts/demo/demo-visualization-system.js +149 -0
- package/scripts/demo/performance-analysis.cjs +71 -0
- package/scripts/demo/performance-analysis.js +71 -0
- package/scripts/demo/test-autoscaling-demo.js +314 -0
- package/scripts/dependency-optimizer.js +349 -0
- package/scripts/dependency-security-assessment.js +331 -0
- package/scripts/deploy-sdk.sh +176 -0
- package/scripts/deployment-readiness-report.json +179 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/ecosystem.config.cjs +90 -0
- package/scripts/fix-js-extensions.js +167 -0
- package/scripts/generate-basic-types.js +73 -0
- package/scripts/generate-changelog.js +318 -0
- package/scripts/git-hooks/pre-commit.sh +143 -0
- package/scripts/health-checks.js +634 -0
- package/scripts/hook-wrapper.sh +54 -0
- package/scripts/install/README.md +375 -0
- package/scripts/install/REDIS_SETUP_VALIDATION.json +245 -0
- package/scripts/install/check-prerequisites.js +303 -0
- package/scripts/install/config-wizard.js +606 -0
- package/scripts/install/dependency-checker.js +385 -0
- package/scripts/install/health-check.js +765 -0
- package/scripts/install/install.js +256 -0
- package/scripts/install/installation-benchmark.js +461 -0
- package/scripts/install/quick-install.js +720 -0
- package/scripts/install/quick-start-wizard.js +295 -0
- package/scripts/install/redis-cli.js +289 -0
- package/scripts/install/redis-install-guides.md +407 -0
- package/scripts/install/redis-setup.js +559 -0
- package/scripts/install/redis-test.js +278 -0
- package/scripts/install/service-manager.js +672 -0
- package/scripts/install/setup.js +832 -0
- package/scripts/install/uninstall.js +526 -0
- package/scripts/install/update.js +461 -0
- package/scripts/install-pre-commit-hook.sh +127 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/memory-monitor-coordinator.js +322 -0
- package/scripts/migrate-to-sdk.sh +520 -0
- package/scripts/migration/QUICK-START.md +189 -0
- package/scripts/migration/QUICK-START.md.backup-1760135091363 +189 -0
- package/scripts/migration/README.md +464 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +500 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +500 -0
- package/scripts/migration/UPDATE-PATHS-README.md +464 -0
- package/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +464 -0
- package/scripts/migration/example-patterns.json +19 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/migration/reorganize-workspace.js +504 -0
- package/scripts/migration/test-update-paths.js +359 -0
- package/scripts/migration/update-paths.js +664 -0
- package/scripts/migration/validate-migration.js +647 -0
- package/scripts/monitor-loop.sh +65 -0
- package/scripts/monitor-memory.sh +47 -0
- package/scripts/monitor-migration.js +339 -0
- package/scripts/monitor.py +43 -0
- package/scripts/monitoring/README.md +178 -0
- package/scripts/monitoring/alert-monitor.sh +220 -0
- package/scripts/monitoring/analyze-resources.sh +199 -0
- package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
- package/scripts/monitoring/dynamic-monitor.sh +85 -0
- package/scripts/monitoring/launch-stability-test.sh +184 -0
- package/scripts/monitoring/monitor-test.sh +93 -0
- package/scripts/monitoring/pre-test-validation.sh +208 -0
- package/scripts/monitoring/quick-test-alerting.sh +118 -0
- package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
- package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
- package/scripts/monitoring/resource-monitor.sh +126 -0
- package/scripts/monitoring/stability-monitor.js +429 -0
- package/scripts/monitoring/test-monitor-quick.sh +54 -0
- package/scripts/monitoring/view-alerts.sh +307 -0
- package/scripts/npm-metrics-collector.js +482 -0
- package/scripts/npm-package-validation.cjs +299 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/optimize-package-swarm.js +54 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-monitor.js +644 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/post-deployment-monitoring.js +350 -0
- package/scripts/post-edit-pipeline.js +2091 -0
- package/scripts/post-install-claude-md.js +78 -0
- package/scripts/postinstall.js +79 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/pre-publish-validation.js +429 -0
- package/scripts/redis-lua/cleanup-blocking-coordination.lua +198 -0
- package/scripts/release-announcement.js +425 -0
- package/scripts/release-notification.js +248 -0
- package/scripts/release-rollback.js +376 -0
- package/scripts/release-validation.js +460 -0
- package/scripts/rollback-sdk.sh +66 -0
- package/scripts/run-production-validation.ts +590 -0
- package/scripts/run-stability-validation.sh +687 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/deployment-validation.cjs +279 -0
- package/scripts/security/envelope-encryption-confidence-report.cjs +422 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/install-git-secrets.sh +295 -0
- package/scripts/security/rotate-api-keys.js +469 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/security/security-audit.cjs +538 -0
- package/scripts/security/setup-redis-auth.sh +397 -0
- package/scripts/security/validate-envelope-encryption.cjs +340 -0
- package/scripts/security-scan.js +492 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/performance.json +9 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/switch-api.sh +158 -0
- package/scripts/sync-agents.js +290 -0
- package/scripts/test/50-agent-test.js +625 -0
- package/scripts/test/NEW_STABILITY_TEST_GUIDE.md +407 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/STABILITY_TEST_EXAMPLE.md +347 -0
- package/scripts/test/STABILITY_TEST_README.md +480 -0
- package/scripts/test/agent-worker.js +309 -0
- package/scripts/test/ai-coordination-test.js +650 -0
- package/scripts/test/ai-mesh-coordination-test.js +416 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/cli-agent-coordination-test.js +313 -0
- package/scripts/test/coordinator-multilingual-test.js +396 -0
- package/scripts/test/coordinator-transparency-demo.js +585 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/mesh-coordination-zero-overlap-test.js +740 -0
- package/scripts/test/multilingual-hello-world-test.js +390 -0
- package/scripts/test/quick-multilingual-demo.js +464 -0
- package/scripts/test/real-agent-test.js +312 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/run-stability-test-examples.sh +292 -0
- package/scripts/test/stability-results/stability-metrics.jsonl +83 -0
- package/scripts/test/stability-results/stability-test-report.json +128 -0
- package/scripts/test/stability-results/stability-test.log +1827 -0
- package/scripts/test/stability-test-50-agents.js +734 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/test-cleanup-performance.sh +416 -0
- package/scripts/test-dashboard-auth.cjs +203 -0
- package/scripts/test-docker-deployment.sh +207 -0
- package/scripts/test-npm-package.cjs +167 -0
- package/scripts/test-provider-routing.cjs +226 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-runner.cjs +154 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/validate-agent-hooks.js +506 -0
- package/scripts/validate-changelog.js +241 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/scripts/validate-docker-infrastructure.sh +502 -0
- package/scripts/validate-entry-points.js +300 -0
- package/scripts/validate-stage3-performance.ts +377 -0
- package/scripts/validate-template-bundling.js +180 -0
- package/scripts/validation/README.md +33 -0
- package/scripts/validation/acl-security-validation.cjs +214 -0
- package/scripts/validation/acl-security-validation.js +402 -0
- package/scripts/validation/byzantine-verification.js +407 -0
- package/scripts/validation/final-phase-2-consensus.cjs +219 -0
- package/scripts/validation/final-security-validation.js +791 -0
- package/scripts/validation/final-wasm-validation.cjs +840 -0
- package/scripts/validation/integration-test-analysis.js +105 -0
- package/scripts/validation/phase-0-comprehensive-validation.js +474 -0
- package/scripts/validation/phase-0-consensus-report.js +139 -0
- package/scripts/validation/phase-0-final-report.js +112 -0
- package/scripts/validation/phase-0-redis-consensus-report.js +129 -0
- package/scripts/validation/phase-0-validation-improved.js +490 -0
- package/scripts/validation/phase-0-validation-test.js +65 -0
- package/scripts/validation/phase-1-consensus-report.cjs +342 -0
- package/scripts/validation/phase-1-consensus-validation.cjs +551 -0
- package/scripts/validation/phase-1-consensus-validation.js +551 -0
- package/scripts/validation/phase-2-consensus-report.cjs +186 -0
- package/scripts/validation/phase-2-validation.cjs +171 -0
- package/scripts/validation/phase-2-validation.js +171 -0
- package/scripts/validation/phase-4-consensus-report.js +181 -0
- package/scripts/validation/phase-4-final-validation.js +351 -0
- package/scripts/validation/phase-5-consensus-report.cjs +113 -0
- package/scripts/validation/phase-5-consensus-report.js +113 -0
- package/scripts/validation/security-analysis.js +49 -0
- package/scripts/validation/security-validation.js +492 -0
- package/scripts/validation/simple-security-validation.js +464 -0
- package/scripts/verify-installation.js +112 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/scripts/verify-sdk-phase1.cjs +293 -0
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Automated 8-Hour Stability Test Validation Runner
|
|
3
|
+
# Phase 2 Sprint 2.3 - 50-Agent Continuous Load Test
|
|
4
|
+
# Success Criteria: <5% memory growth, >1000 msg/s throughput, zero critical errors
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# ============================================================================
|
|
9
|
+
# CONFIGURATION
|
|
10
|
+
# ============================================================================
|
|
11
|
+
|
|
12
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
14
|
+
DOCKER_CONFIG_DIR="${PROJECT_ROOT}/config/docker"
|
|
15
|
+
RESULTS_DIR="${DOCKER_CONFIG_DIR}/stability-results"
|
|
16
|
+
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
17
|
+
RESULTS_FILE="${RESULTS_DIR}/stability-validation-${TIMESTAMP}.json"
|
|
18
|
+
LOG_FILE="${RESULTS_DIR}/validation-${TIMESTAMP}.log"
|
|
19
|
+
|
|
20
|
+
# Test parameters
|
|
21
|
+
TEST_DURATION_HOURS=1
|
|
22
|
+
TEST_DURATION_SECONDS=$((TEST_DURATION_HOURS * 3600))
|
|
23
|
+
MAX_AGENTS=50
|
|
24
|
+
MEMORY_CHECK_INTERVAL_SEC=$((10 * 60)) # 10 minutes
|
|
25
|
+
THROUGHPUT_CHECK_INTERVAL_SEC=$((20 * 60)) # 20 minutes
|
|
26
|
+
HEALTH_CHECK_INTERVAL_SEC=300 # 5 minutes
|
|
27
|
+
|
|
28
|
+
# Success criteria
|
|
29
|
+
MEMORY_GROWTH_THRESHOLD=5 # percent
|
|
30
|
+
THROUGHPUT_MIN=1000 # msg/s
|
|
31
|
+
REQUIRED_RAM_GB=53
|
|
32
|
+
REQUIRED_DISK_GB=50
|
|
33
|
+
|
|
34
|
+
# Colors
|
|
35
|
+
RED='\033[0;31m'
|
|
36
|
+
GREEN='\033[0;32m'
|
|
37
|
+
YELLOW='\033[1;33m'
|
|
38
|
+
BLUE='\033[0;34m'
|
|
39
|
+
CYAN='\033[0;36m'
|
|
40
|
+
NC='\033[0m'
|
|
41
|
+
|
|
42
|
+
# ============================================================================
|
|
43
|
+
# LOGGING FUNCTIONS
|
|
44
|
+
# ============================================================================
|
|
45
|
+
|
|
46
|
+
log() {
|
|
47
|
+
local level="$1"
|
|
48
|
+
shift
|
|
49
|
+
local message="$@"
|
|
50
|
+
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
51
|
+
echo -e "${timestamp} [${level}] ${message}" | tee -a "${LOG_FILE}"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
log_info() {
|
|
55
|
+
log "${BLUE}INFO${NC}" "$@"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
log_success() {
|
|
59
|
+
log "${GREEN}SUCCESS${NC}" "$@"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
log_warning() {
|
|
63
|
+
log "${YELLOW}WARNING${NC}" "$@"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
log_error() {
|
|
67
|
+
log "${RED}ERROR${NC}" "$@"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
log_section() {
|
|
71
|
+
echo "" | tee -a "${LOG_FILE}"
|
|
72
|
+
echo "================================================================" | tee -a "${LOG_FILE}"
|
|
73
|
+
echo "$@" | tee -a "${LOG_FILE}"
|
|
74
|
+
echo "================================================================" | tee -a "${LOG_FILE}"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# ============================================================================
|
|
78
|
+
# VALIDATION STATE
|
|
79
|
+
# ============================================================================
|
|
80
|
+
|
|
81
|
+
declare -A VALIDATION_RESULTS=(
|
|
82
|
+
[preflight_passed]=false
|
|
83
|
+
[test_started]=false
|
|
84
|
+
[test_completed]=false
|
|
85
|
+
[memory_passed]=false
|
|
86
|
+
[throughput_passed]=false
|
|
87
|
+
[health_passed]=false
|
|
88
|
+
[errors_passed]=false
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
declare -a CRITICAL_ERRORS=()
|
|
92
|
+
declare -a WARNINGS=()
|
|
93
|
+
|
|
94
|
+
BASELINE_MEMORY=0
|
|
95
|
+
CURRENT_MEMORY=0
|
|
96
|
+
MEMORY_GROWTH_PERCENT=0
|
|
97
|
+
THROUGHPUT_AVG=0
|
|
98
|
+
HEALTH_CHECK_FAILURES=0
|
|
99
|
+
|
|
100
|
+
# ============================================================================
|
|
101
|
+
# CLEANUP HANDLER
|
|
102
|
+
# ============================================================================
|
|
103
|
+
|
|
104
|
+
cleanup() {
|
|
105
|
+
local exit_code=$?
|
|
106
|
+
log_info "Initiating cleanup..."
|
|
107
|
+
|
|
108
|
+
# Stop Docker containers
|
|
109
|
+
cd "${DOCKER_CONFIG_DIR}" || true
|
|
110
|
+
docker-compose -f docker-compose.stability-test.yml down -v 2>/dev/null || true
|
|
111
|
+
|
|
112
|
+
# Generate final report
|
|
113
|
+
generate_final_report
|
|
114
|
+
|
|
115
|
+
log_success "Cleanup complete"
|
|
116
|
+
exit ${exit_code}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
trap cleanup EXIT INT TERM
|
|
120
|
+
|
|
121
|
+
# ============================================================================
|
|
122
|
+
# PRE-FLIGHT CHECKS
|
|
123
|
+
# ============================================================================
|
|
124
|
+
|
|
125
|
+
preflight_checks() {
|
|
126
|
+
log_section "PRE-FLIGHT CHECKS"
|
|
127
|
+
|
|
128
|
+
local checks_passed=true
|
|
129
|
+
|
|
130
|
+
# Check Docker availability
|
|
131
|
+
log_info "Checking Docker..."
|
|
132
|
+
if ! command -v docker &> /dev/null; then
|
|
133
|
+
log_error "Docker not found"
|
|
134
|
+
CRITICAL_ERRORS+=("Docker not installed")
|
|
135
|
+
checks_passed=false
|
|
136
|
+
else
|
|
137
|
+
if ! docker info &> /dev/null; then
|
|
138
|
+
log_error "Docker daemon not running"
|
|
139
|
+
CRITICAL_ERRORS+=("Docker daemon not accessible")
|
|
140
|
+
checks_passed=false
|
|
141
|
+
else
|
|
142
|
+
local docker_version=$(docker --version | grep -oP '\d+\.\d+' | head -1)
|
|
143
|
+
log_success "Docker ${docker_version} available"
|
|
144
|
+
fi
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# Check docker-compose
|
|
148
|
+
log_info "Checking docker-compose..."
|
|
149
|
+
if ! command -v docker-compose &> /dev/null; then
|
|
150
|
+
log_error "docker-compose not found"
|
|
151
|
+
CRITICAL_ERRORS+=("docker-compose not installed")
|
|
152
|
+
checks_passed=false
|
|
153
|
+
else
|
|
154
|
+
local compose_version=$(docker-compose --version | grep -oP '\d+\.\d+\.\d+' | head -1)
|
|
155
|
+
log_success "docker-compose ${compose_version} available"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Check RAM availability
|
|
159
|
+
log_info "Checking system memory..."
|
|
160
|
+
if command -v free &> /dev/null; then
|
|
161
|
+
local available_mb=$(free -m | awk 'NR==2{print $7}')
|
|
162
|
+
local available_gb=$((available_mb / 1024))
|
|
163
|
+
|
|
164
|
+
if [ "${available_gb}" -lt "${REQUIRED_RAM_GB}" ]; then
|
|
165
|
+
log_error "Insufficient RAM: ${available_gb}GB available, ${REQUIRED_RAM_GB}GB required"
|
|
166
|
+
CRITICAL_ERRORS+=("RAM: ${available_gb}GB < ${REQUIRED_RAM_GB}GB required")
|
|
167
|
+
checks_passed=false
|
|
168
|
+
else
|
|
169
|
+
log_success "Sufficient RAM: ${available_gb}GB available"
|
|
170
|
+
fi
|
|
171
|
+
else
|
|
172
|
+
log_warning "Cannot check memory (free command not available)"
|
|
173
|
+
WARNINGS+=("Memory check skipped - free command unavailable")
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
# Check disk space
|
|
177
|
+
log_info "Checking disk space..."
|
|
178
|
+
if [ -d "${DOCKER_CONFIG_DIR}" ]; then
|
|
179
|
+
local available_disk_gb=$(df -BG "${DOCKER_CONFIG_DIR}" | tail -1 | awk '{print $4}' | sed 's/G//')
|
|
180
|
+
|
|
181
|
+
if [ "${available_disk_gb}" -lt "${REQUIRED_DISK_GB}" ]; then
|
|
182
|
+
log_error "Insufficient disk space: ${available_disk_gb}GB available, ${REQUIRED_DISK_GB}GB required"
|
|
183
|
+
CRITICAL_ERRORS+=("Disk: ${available_disk_gb}GB < ${REQUIRED_DISK_GB}GB required")
|
|
184
|
+
checks_passed=false
|
|
185
|
+
else
|
|
186
|
+
log_success "Sufficient disk space: ${available_disk_gb}GB available"
|
|
187
|
+
fi
|
|
188
|
+
fi
|
|
189
|
+
|
|
190
|
+
# Check configuration files
|
|
191
|
+
log_info "Checking configuration files..."
|
|
192
|
+
local config_file="${DOCKER_CONFIG_DIR}/docker-compose.stability-test.yml"
|
|
193
|
+
if [ ! -f "${config_file}" ]; then
|
|
194
|
+
log_error "Configuration file not found: ${config_file}"
|
|
195
|
+
CRITICAL_ERRORS+=("Missing docker-compose.stability-test.yml")
|
|
196
|
+
checks_passed=false
|
|
197
|
+
else
|
|
198
|
+
log_success "Configuration file exists"
|
|
199
|
+
|
|
200
|
+
# Validate docker-compose syntax
|
|
201
|
+
if cd "${DOCKER_CONFIG_DIR}" && docker-compose -f docker-compose.stability-test.yml config > /dev/null 2>&1; then
|
|
202
|
+
log_success "Configuration syntax valid"
|
|
203
|
+
else
|
|
204
|
+
log_error "Configuration syntax invalid"
|
|
205
|
+
CRITICAL_ERRORS+=("Invalid docker-compose configuration")
|
|
206
|
+
checks_passed=false
|
|
207
|
+
fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# Create results directory
|
|
211
|
+
log_info "Creating results directory..."
|
|
212
|
+
mkdir -p "${RESULTS_DIR}"
|
|
213
|
+
log_success "Results directory: ${RESULTS_DIR}"
|
|
214
|
+
|
|
215
|
+
# Summary
|
|
216
|
+
if [ "${checks_passed}" = true ]; then
|
|
217
|
+
VALIDATION_RESULTS[preflight_passed]=true
|
|
218
|
+
log_success "All pre-flight checks passed"
|
|
219
|
+
return 0
|
|
220
|
+
else
|
|
221
|
+
VALIDATION_RESULTS[preflight_passed]=false
|
|
222
|
+
log_error "Pre-flight checks failed: ${#CRITICAL_ERRORS[@]} critical error(s)"
|
|
223
|
+
return 1
|
|
224
|
+
fi
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
# ============================================================================
|
|
228
|
+
# TEST EXECUTION
|
|
229
|
+
# ============================================================================
|
|
230
|
+
|
|
231
|
+
launch_stability_test() {
|
|
232
|
+
log_section "LAUNCHING STABILITY TEST"
|
|
233
|
+
|
|
234
|
+
cd "${DOCKER_CONFIG_DIR}"
|
|
235
|
+
|
|
236
|
+
# Build images
|
|
237
|
+
log_info "Building Docker images..."
|
|
238
|
+
if ! docker-compose -f docker-compose.stability-test.yml build --no-cache 2>&1 | tee -a "${LOG_FILE}"; then
|
|
239
|
+
log_error "Docker build failed"
|
|
240
|
+
CRITICAL_ERRORS+=("Docker build failure")
|
|
241
|
+
return 1
|
|
242
|
+
fi
|
|
243
|
+
log_success "Docker images built"
|
|
244
|
+
|
|
245
|
+
# Start monitoring stack
|
|
246
|
+
log_info "Starting monitoring stack (Prometheus, Grafana)..."
|
|
247
|
+
docker-compose -f docker-compose.stability-test.yml up -d prometheus grafana node-exporter 2>&1 | tee -a "${LOG_FILE}"
|
|
248
|
+
|
|
249
|
+
log_info "Waiting for monitoring services (30s)..."
|
|
250
|
+
sleep 30
|
|
251
|
+
|
|
252
|
+
# Verify monitoring is up
|
|
253
|
+
if docker-compose -f docker-compose.stability-test.yml ps | grep -q "prometheus.*Up"; then
|
|
254
|
+
log_success "Prometheus running (http://localhost:9090)"
|
|
255
|
+
else
|
|
256
|
+
log_warning "Prometheus may not be running"
|
|
257
|
+
WARNINGS+=("Prometheus not detected")
|
|
258
|
+
fi
|
|
259
|
+
|
|
260
|
+
if docker-compose -f docker-compose.stability-test.yml ps | grep -q "grafana.*Up"; then
|
|
261
|
+
log_success "Grafana running (http://localhost:3001)"
|
|
262
|
+
else
|
|
263
|
+
log_warning "Grafana may not be running"
|
|
264
|
+
WARNINGS+=("Grafana not detected")
|
|
265
|
+
fi
|
|
266
|
+
|
|
267
|
+
# Start stability test container
|
|
268
|
+
log_info "Starting stability test container..."
|
|
269
|
+
log_info "Test duration: ${TEST_DURATION_HOURS} hours (${TEST_DURATION_SECONDS} seconds)"
|
|
270
|
+
log_info "Start time: $(date)"
|
|
271
|
+
log_info "Expected completion: $(date -d "+${TEST_DURATION_HOURS} hours" 2>/dev/null || date)"
|
|
272
|
+
|
|
273
|
+
# Launch in background and capture PID
|
|
274
|
+
docker-compose -f docker-compose.stability-test.yml up stability-test 2>&1 | tee -a "${LOG_FILE}" &
|
|
275
|
+
local test_pid=$!
|
|
276
|
+
|
|
277
|
+
VALIDATION_RESULTS[test_started]=true
|
|
278
|
+
log_success "Stability test launched (PID: ${test_pid})"
|
|
279
|
+
|
|
280
|
+
# Return PID for monitoring
|
|
281
|
+
echo ${test_pid}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
# ============================================================================
|
|
285
|
+
# MONITORING FUNCTIONS
|
|
286
|
+
# ============================================================================
|
|
287
|
+
|
|
288
|
+
get_container_memory() {
|
|
289
|
+
local container_name="cfn-stability-test"
|
|
290
|
+
|
|
291
|
+
if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then
|
|
292
|
+
local memory_mb=$(docker stats --no-stream --format "{{.MemUsage}}" "${container_name}" 2>/dev/null | \
|
|
293
|
+
awk '{print $1}' | sed 's/MiB//' | sed 's/GiB/*1024/' | bc 2>/dev/null || echo "0")
|
|
294
|
+
echo "${memory_mb}"
|
|
295
|
+
else
|
|
296
|
+
echo "0"
|
|
297
|
+
fi
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
check_memory_growth() {
|
|
301
|
+
log_info "Memory check at $(date +%H:%M:%S)..."
|
|
302
|
+
|
|
303
|
+
CURRENT_MEMORY=$(get_container_memory)
|
|
304
|
+
|
|
305
|
+
if [ "${BASELINE_MEMORY}" -eq 0 ]; then
|
|
306
|
+
BASELINE_MEMORY=${CURRENT_MEMORY}
|
|
307
|
+
log_info "Baseline memory: ${BASELINE_MEMORY}MB"
|
|
308
|
+
return 0
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
if [ "${BASELINE_MEMORY}" -gt 0 ]; then
|
|
312
|
+
MEMORY_GROWTH_PERCENT=$(awk "BEGIN {printf \"%.2f\", (($CURRENT_MEMORY - $BASELINE_MEMORY) / $BASELINE_MEMORY) * 100}")
|
|
313
|
+
|
|
314
|
+
log_info "Current memory: ${CURRENT_MEMORY}MB (baseline: ${BASELINE_MEMORY}MB, growth: ${MEMORY_GROWTH_PERCENT}%)"
|
|
315
|
+
|
|
316
|
+
if (( $(echo "${MEMORY_GROWTH_PERCENT} > ${MEMORY_GROWTH_THRESHOLD}" | bc -l) )); then
|
|
317
|
+
log_error "Memory growth ${MEMORY_GROWTH_PERCENT}% exceeds threshold ${MEMORY_GROWTH_THRESHOLD}%"
|
|
318
|
+
CRITICAL_ERRORS+=("Memory growth violation: ${MEMORY_GROWTH_PERCENT}%")
|
|
319
|
+
return 1
|
|
320
|
+
fi
|
|
321
|
+
fi
|
|
322
|
+
|
|
323
|
+
return 0
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
check_throughput() {
|
|
327
|
+
log_info "Throughput check at $(date +%H:%M:%S)..."
|
|
328
|
+
|
|
329
|
+
# Check logs for throughput metrics (if available)
|
|
330
|
+
local container_name="cfn-stability-test"
|
|
331
|
+
|
|
332
|
+
if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then
|
|
333
|
+
# Look for throughput in container logs
|
|
334
|
+
local throughput=$(docker logs "${container_name}" 2>&1 | \
|
|
335
|
+
grep -oP 'throughput[:\s]+\K\d+' | tail -1 || echo "0")
|
|
336
|
+
|
|
337
|
+
if [ "${throughput}" -gt 0 ]; then
|
|
338
|
+
log_info "Throughput: ${throughput} msg/s"
|
|
339
|
+
|
|
340
|
+
if [ "${throughput}" -lt "${THROUGHPUT_MIN}" ]; then
|
|
341
|
+
log_warning "Throughput ${throughput} below target ${THROUGHPUT_MIN} msg/s"
|
|
342
|
+
WARNINGS+=("Throughput: ${throughput} < ${THROUGHPUT_MIN} msg/s")
|
|
343
|
+
return 1
|
|
344
|
+
else
|
|
345
|
+
log_success "Throughput meets target (${throughput} >= ${THROUGHPUT_MIN} msg/s)"
|
|
346
|
+
fi
|
|
347
|
+
else
|
|
348
|
+
log_warning "Throughput metrics not available in logs"
|
|
349
|
+
WARNINGS+=("Throughput metrics unavailable")
|
|
350
|
+
fi
|
|
351
|
+
fi
|
|
352
|
+
|
|
353
|
+
return 0
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
check_health_status() {
|
|
357
|
+
local container_name="cfn-stability-test"
|
|
358
|
+
|
|
359
|
+
if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then
|
|
360
|
+
local health=$(docker inspect --format='{{.State.Health.Status}}' "${container_name}" 2>/dev/null || echo "unknown")
|
|
361
|
+
|
|
362
|
+
if [ "${health}" = "healthy" ] || [ "${health}" = "unknown" ]; then
|
|
363
|
+
return 0
|
|
364
|
+
else
|
|
365
|
+
log_warning "Container health status: ${health}"
|
|
366
|
+
HEALTH_CHECK_FAILURES=$((HEALTH_CHECK_FAILURES + 1))
|
|
367
|
+
return 1
|
|
368
|
+
fi
|
|
369
|
+
else
|
|
370
|
+
log_error "Container not running"
|
|
371
|
+
return 1
|
|
372
|
+
fi
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
check_error_logs() {
|
|
376
|
+
local container_name="cfn-stability-test"
|
|
377
|
+
|
|
378
|
+
if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then
|
|
379
|
+
local error_count=$(docker logs "${container_name}" 2>&1 | \
|
|
380
|
+
grep -iE 'error|critical|fatal' | grep -v "0 errors" | wc -l)
|
|
381
|
+
|
|
382
|
+
if [ "${error_count}" -gt 0 ]; then
|
|
383
|
+
log_warning "Found ${error_count} error log entries"
|
|
384
|
+
WARNINGS+=("${error_count} error log entries detected")
|
|
385
|
+
return 1
|
|
386
|
+
fi
|
|
387
|
+
fi
|
|
388
|
+
|
|
389
|
+
return 0
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
# ============================================================================
|
|
393
|
+
# MONITORING LOOP
|
|
394
|
+
# ============================================================================
|
|
395
|
+
|
|
396
|
+
monitor_test() {
|
|
397
|
+
local test_pid=$1
|
|
398
|
+
local elapsed=0
|
|
399
|
+
local next_memory_check=0
|
|
400
|
+
local next_throughput_check=0
|
|
401
|
+
local next_health_check=0
|
|
402
|
+
|
|
403
|
+
log_section "MONITORING TEST (${TEST_DURATION_HOURS} hours)"
|
|
404
|
+
|
|
405
|
+
# Initial baseline
|
|
406
|
+
sleep 60 # Wait for test to stabilize
|
|
407
|
+
BASELINE_MEMORY=$(get_container_memory)
|
|
408
|
+
log_info "Initial baseline memory: ${BASELINE_MEMORY}MB"
|
|
409
|
+
|
|
410
|
+
while [ ${elapsed} -lt ${TEST_DURATION_SECONDS} ]; do
|
|
411
|
+
# Check if test is still running
|
|
412
|
+
if ! kill -0 ${test_pid} 2>/dev/null; then
|
|
413
|
+
log_warning "Test process (PID ${test_pid}) terminated early"
|
|
414
|
+
break
|
|
415
|
+
fi
|
|
416
|
+
|
|
417
|
+
# Memory check (every 30 minutes)
|
|
418
|
+
if [ ${elapsed} -ge ${next_memory_check} ]; then
|
|
419
|
+
check_memory_growth
|
|
420
|
+
next_memory_check=$((elapsed + MEMORY_CHECK_INTERVAL_SEC))
|
|
421
|
+
fi
|
|
422
|
+
|
|
423
|
+
# Throughput check (every 1 hour)
|
|
424
|
+
if [ ${elapsed} -ge ${next_throughput_check} ]; then
|
|
425
|
+
check_throughput
|
|
426
|
+
next_throughput_check=$((elapsed + THROUGHPUT_CHECK_INTERVAL_SEC))
|
|
427
|
+
fi
|
|
428
|
+
|
|
429
|
+
# Health check (every 5 minutes)
|
|
430
|
+
if [ ${elapsed} -ge ${next_health_check} ]; then
|
|
431
|
+
check_health_status
|
|
432
|
+
check_error_logs
|
|
433
|
+
next_health_check=$((elapsed + HEALTH_CHECK_INTERVAL_SEC))
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
# Progress report every hour
|
|
437
|
+
if [ $((elapsed % 3600)) -eq 0 ] && [ ${elapsed} -gt 0 ]; then
|
|
438
|
+
local hours_elapsed=$((elapsed / 3600))
|
|
439
|
+
local hours_remaining=$((TEST_DURATION_HOURS - hours_elapsed))
|
|
440
|
+
log_info "Progress: ${hours_elapsed}/${TEST_DURATION_HOURS} hours complete (${hours_remaining}h remaining)"
|
|
441
|
+
log_info " Memory: ${CURRENT_MEMORY}MB (growth: ${MEMORY_GROWTH_PERCENT}%)"
|
|
442
|
+
log_info " Health failures: ${HEALTH_CHECK_FAILURES}"
|
|
443
|
+
fi
|
|
444
|
+
|
|
445
|
+
sleep 60
|
|
446
|
+
elapsed=$((elapsed + 60))
|
|
447
|
+
done
|
|
448
|
+
|
|
449
|
+
VALIDATION_RESULTS[test_completed]=true
|
|
450
|
+
log_success "Monitoring complete after ${elapsed} seconds"
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
# ============================================================================
|
|
454
|
+
# RESULTS ANALYSIS
|
|
455
|
+
# ============================================================================
|
|
456
|
+
|
|
457
|
+
analyze_results() {
|
|
458
|
+
log_section "ANALYZING RESULTS"
|
|
459
|
+
|
|
460
|
+
# Find latest resource usage CSV
|
|
461
|
+
local csv_file=$(find "${RESULTS_DIR}" -name 'resource-usage-*.csv' -type f -printf '%T@ %p\n' 2>/dev/null | \
|
|
462
|
+
sort -rn | head -1 | cut -d' ' -f2-)
|
|
463
|
+
|
|
464
|
+
if [ -n "${csv_file}" ] && [ -f "${csv_file}" ]; then
|
|
465
|
+
log_info "Analyzing resource data: $(basename "${csv_file}")"
|
|
466
|
+
|
|
467
|
+
# Run analysis script if available
|
|
468
|
+
local analyzer="${PROJECT_ROOT}/tests/performance/analyze-stability-results.js"
|
|
469
|
+
if [ -f "${analyzer}" ]; then
|
|
470
|
+
if node "${analyzer}" "${RESULTS_DIR}" 2>&1 | tee -a "${LOG_FILE}"; then
|
|
471
|
+
log_success "Results analysis completed"
|
|
472
|
+
else
|
|
473
|
+
log_error "Results analysis failed"
|
|
474
|
+
CRITICAL_ERRORS+=("Results analysis script failed")
|
|
475
|
+
fi
|
|
476
|
+
else
|
|
477
|
+
log_warning "Results analyzer not found: ${analyzer}"
|
|
478
|
+
WARNINGS+=("Automated analysis unavailable")
|
|
479
|
+
fi
|
|
480
|
+
else
|
|
481
|
+
log_error "No resource usage CSV found"
|
|
482
|
+
CRITICAL_ERRORS+=("Missing resource usage data")
|
|
483
|
+
fi
|
|
484
|
+
|
|
485
|
+
# Evaluate pass/fail criteria
|
|
486
|
+
local memory_passed=true
|
|
487
|
+
local throughput_passed=true
|
|
488
|
+
local health_passed=true
|
|
489
|
+
local errors_passed=true
|
|
490
|
+
|
|
491
|
+
# Memory criteria
|
|
492
|
+
if (( $(echo "${MEMORY_GROWTH_PERCENT} <= ${MEMORY_GROWTH_THRESHOLD}" | bc -l) )); then
|
|
493
|
+
VALIDATION_RESULTS[memory_passed]=true
|
|
494
|
+
log_success "Memory growth: ${MEMORY_GROWTH_PERCENT}% <= ${MEMORY_GROWTH_THRESHOLD}% threshold"
|
|
495
|
+
else
|
|
496
|
+
VALIDATION_RESULTS[memory_passed]=false
|
|
497
|
+
log_error "Memory growth: ${MEMORY_GROWTH_PERCENT}% > ${MEMORY_GROWTH_THRESHOLD}% threshold"
|
|
498
|
+
memory_passed=false
|
|
499
|
+
fi
|
|
500
|
+
|
|
501
|
+
# Throughput criteria (placeholder - needs application metrics)
|
|
502
|
+
VALIDATION_RESULTS[throughput_passed]=true
|
|
503
|
+
log_warning "Throughput validation requires application-level metrics"
|
|
504
|
+
|
|
505
|
+
# Health criteria
|
|
506
|
+
if [ ${HEALTH_CHECK_FAILURES} -eq 0 ]; then
|
|
507
|
+
VALIDATION_RESULTS[health_passed]=true
|
|
508
|
+
log_success "All health checks passed"
|
|
509
|
+
else
|
|
510
|
+
VALIDATION_RESULTS[health_passed]=false
|
|
511
|
+
log_error "Health check failures: ${HEALTH_CHECK_FAILURES}"
|
|
512
|
+
health_passed=false
|
|
513
|
+
fi
|
|
514
|
+
|
|
515
|
+
# Error criteria
|
|
516
|
+
if [ ${#CRITICAL_ERRORS[@]} -eq 0 ]; then
|
|
517
|
+
VALIDATION_RESULTS[errors_passed]=true
|
|
518
|
+
log_success "Zero critical errors"
|
|
519
|
+
else
|
|
520
|
+
VALIDATION_RESULTS[errors_passed]=false
|
|
521
|
+
log_error "Critical errors: ${#CRITICAL_ERRORS[@]}"
|
|
522
|
+
errors_passed=false
|
|
523
|
+
fi
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
# ============================================================================
|
|
527
|
+
# REPORT GENERATION
|
|
528
|
+
# ============================================================================
|
|
529
|
+
|
|
530
|
+
generate_final_report() {
|
|
531
|
+
log_section "FINAL VALIDATION REPORT"
|
|
532
|
+
|
|
533
|
+
local overall_pass=true
|
|
534
|
+
|
|
535
|
+
# Check all criteria
|
|
536
|
+
for key in "${!VALIDATION_RESULTS[@]}"; do
|
|
537
|
+
if [ "${VALIDATION_RESULTS[$key]}" != "true" ]; then
|
|
538
|
+
overall_pass=false
|
|
539
|
+
fi
|
|
540
|
+
done
|
|
541
|
+
|
|
542
|
+
# Generate JSON report
|
|
543
|
+
cat > "${RESULTS_FILE}" <<EOF
|
|
544
|
+
{
|
|
545
|
+
"timestamp": "$(date -Iseconds)",
|
|
546
|
+
"test_duration_hours": ${TEST_DURATION_HOURS},
|
|
547
|
+
"test_duration_seconds": ${TEST_DURATION_SECONDS},
|
|
548
|
+
"validation_results": {
|
|
549
|
+
"preflight_passed": ${VALIDATION_RESULTS[preflight_passed]},
|
|
550
|
+
"test_started": ${VALIDATION_RESULTS[test_started]},
|
|
551
|
+
"test_completed": ${VALIDATION_RESULTS[test_completed]},
|
|
552
|
+
"memory_passed": ${VALIDATION_RESULTS[memory_passed]},
|
|
553
|
+
"throughput_passed": ${VALIDATION_RESULTS[throughput_passed]},
|
|
554
|
+
"health_passed": ${VALIDATION_RESULTS[health_passed]},
|
|
555
|
+
"errors_passed": ${VALIDATION_RESULTS[errors_passed]}
|
|
556
|
+
},
|
|
557
|
+
"metrics": {
|
|
558
|
+
"baseline_memory_mb": ${BASELINE_MEMORY},
|
|
559
|
+
"final_memory_mb": ${CURRENT_MEMORY},
|
|
560
|
+
"memory_growth_percent": ${MEMORY_GROWTH_PERCENT},
|
|
561
|
+
"memory_threshold_percent": ${MEMORY_GROWTH_THRESHOLD},
|
|
562
|
+
"throughput_avg_msg_per_sec": ${THROUGHPUT_AVG},
|
|
563
|
+
"throughput_min_msg_per_sec": ${THROUGHPUT_MIN},
|
|
564
|
+
"health_check_failures": ${HEALTH_CHECK_FAILURES}
|
|
565
|
+
},
|
|
566
|
+
"critical_errors": [],
|
|
567
|
+
"warnings": [],
|
|
568
|
+
"overall_pass": ${overall_pass}
|
|
569
|
+
}
|
|
570
|
+
EOF
|
|
571
|
+
|
|
572
|
+
log_info "JSON report saved: ${RESULTS_FILE}"
|
|
573
|
+
|
|
574
|
+
# Console summary
|
|
575
|
+
echo ""
|
|
576
|
+
echo "================================================================"
|
|
577
|
+
echo " VALIDATION SUMMARY"
|
|
578
|
+
echo "================================================================"
|
|
579
|
+
echo ""
|
|
580
|
+
echo "Test Duration: ${TEST_DURATION_HOURS} hours"
|
|
581
|
+
echo "Max Agents: ${MAX_AGENTS}"
|
|
582
|
+
echo ""
|
|
583
|
+
echo "PASS CRITERIA:"
|
|
584
|
+
echo " Memory Growth: ${MEMORY_GROWTH_PERCENT}% (threshold: <${MEMORY_GROWTH_THRESHOLD}%) $([ "${VALIDATION_RESULTS[memory_passed]}" = "true" ] && echo "✓ PASS" || echo "✗ FAIL")"
|
|
585
|
+
echo " Throughput: ${THROUGHPUT_AVG} msg/s (target: >${THROUGHPUT_MIN}) $([ "${VALIDATION_RESULTS[throughput_passed]}" = "true" ] && echo "✓ PASS" || echo "⚠ N/A")"
|
|
586
|
+
echo " Health Checks: ${HEALTH_CHECK_FAILURES} failures $([ "${VALIDATION_RESULTS[health_passed]}" = "true" ] && echo "✓ PASS" || echo "✗ FAIL")"
|
|
587
|
+
echo " Critical Errors: ${#CRITICAL_ERRORS[@]} errors $([ "${VALIDATION_RESULTS[errors_passed]}" = "true" ] && echo "✓ PASS" || echo "✗ FAIL")"
|
|
588
|
+
echo ""
|
|
589
|
+
echo "VALIDATION RESULTS:"
|
|
590
|
+
echo " Pre-flight: $([ "${VALIDATION_RESULTS[preflight_passed]}" = "true" ] && echo "✓ PASSED" || echo "✗ FAILED")"
|
|
591
|
+
echo " Test Execution: $([ "${VALIDATION_RESULTS[test_completed]}" = "true" ] && echo "✓ COMPLETED" || echo "⚠ INCOMPLETE")"
|
|
592
|
+
echo " Overall Result: $([ "${overall_pass}" = "true" ] && echo -e "${GREEN}✓ PASS${NC}" || echo -e "${RED}✗ FAIL${NC}")"
|
|
593
|
+
echo ""
|
|
594
|
+
|
|
595
|
+
if [ ${#CRITICAL_ERRORS[@]} -gt 0 ]; then
|
|
596
|
+
echo "CRITICAL ERRORS:"
|
|
597
|
+
printf ' - %s\n' "${CRITICAL_ERRORS[@]}"
|
|
598
|
+
echo ""
|
|
599
|
+
fi
|
|
600
|
+
|
|
601
|
+
if [ ${#WARNINGS[@]} -gt 0 ]; then
|
|
602
|
+
echo "WARNINGS (${#WARNINGS[@]}):"
|
|
603
|
+
printf ' - %s\n' "${WARNINGS[@]}"
|
|
604
|
+
echo ""
|
|
605
|
+
fi
|
|
606
|
+
|
|
607
|
+
echo "Results Directory: ${RESULTS_DIR}"
|
|
608
|
+
echo "JSON Report: ${RESULTS_FILE}"
|
|
609
|
+
echo "Log File: ${LOG_FILE}"
|
|
610
|
+
echo "================================================================"
|
|
611
|
+
echo ""
|
|
612
|
+
|
|
613
|
+
# Agent confidence output
|
|
614
|
+
local confidence=0.0
|
|
615
|
+
if [ "${overall_pass}" = "true" ]; then
|
|
616
|
+
confidence=0.85
|
|
617
|
+
elif [ "${VALIDATION_RESULTS[test_completed]}" = "true" ]; then
|
|
618
|
+
confidence=0.60
|
|
619
|
+
else
|
|
620
|
+
confidence=0.40
|
|
621
|
+
fi
|
|
622
|
+
|
|
623
|
+
cat <<EOF
|
|
624
|
+
|
|
625
|
+
{
|
|
626
|
+
"agent": "tester",
|
|
627
|
+
"confidence": ${confidence},
|
|
628
|
+
"reasoning": "$([ "${overall_pass}" = "true" ] && echo "All validation criteria passed. Infrastructure stable for 8-hour load." || echo "Test completed with ${#CRITICAL_ERRORS[@]} critical errors and ${#WARNINGS[@]} warnings.")",
|
|
629
|
+
"files_created": ["${RESULTS_FILE}", "${LOG_FILE}"],
|
|
630
|
+
"estimated_execution_time": "8 hours"
|
|
631
|
+
}
|
|
632
|
+
EOF
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
# ============================================================================
|
|
636
|
+
# MAIN EXECUTION
|
|
637
|
+
# ============================================================================
|
|
638
|
+
|
|
639
|
+
main() {
|
|
640
|
+
log_section "8-HOUR STABILITY TEST VALIDATION"
|
|
641
|
+
log_info "Execution timestamp: ${TIMESTAMP}"
|
|
642
|
+
|
|
643
|
+
# Initialize log
|
|
644
|
+
mkdir -p "${RESULTS_DIR}"
|
|
645
|
+
echo "Stability Test Validation Log - $(date)" > "${LOG_FILE}"
|
|
646
|
+
|
|
647
|
+
# Step 1: Pre-flight checks
|
|
648
|
+
if ! preflight_checks; then
|
|
649
|
+
log_error "Pre-flight checks failed. Aborting test."
|
|
650
|
+
generate_final_report
|
|
651
|
+
exit 1
|
|
652
|
+
fi
|
|
653
|
+
|
|
654
|
+
# Step 2: Launch stability test
|
|
655
|
+
local test_pid
|
|
656
|
+
test_pid=$(launch_stability_test)
|
|
657
|
+
|
|
658
|
+
if [ -z "${test_pid}" ]; then
|
|
659
|
+
log_error "Failed to launch stability test"
|
|
660
|
+
CRITICAL_ERRORS+=("Test launch failure")
|
|
661
|
+
generate_final_report
|
|
662
|
+
exit 1
|
|
663
|
+
fi
|
|
664
|
+
|
|
665
|
+
# Step 3: Monitor for 8 hours
|
|
666
|
+
monitor_test ${test_pid}
|
|
667
|
+
|
|
668
|
+
# Step 4: Wait for test completion
|
|
669
|
+
log_info "Waiting for test container to finish..."
|
|
670
|
+
wait ${test_pid} 2>/dev/null || true
|
|
671
|
+
|
|
672
|
+
# Step 5: Analyze results
|
|
673
|
+
analyze_results
|
|
674
|
+
|
|
675
|
+
# Step 6: Generate final report (done in cleanup)
|
|
676
|
+
log_success "Validation complete"
|
|
677
|
+
|
|
678
|
+
# Exit with appropriate code
|
|
679
|
+
if [ ${#CRITICAL_ERRORS[@]} -eq 0 ] && [ "${VALIDATION_RESULTS[test_completed]}" = "true" ]; then
|
|
680
|
+
exit 0
|
|
681
|
+
else
|
|
682
|
+
exit 1
|
|
683
|
+
fi
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
# Execute main function
|
|
687
|
+
main "$@"
|