|
|
|
@@ -113,11 +113,14 @@ print_header "Section 2: INF-03 Compliance (Resource Limits)"
|
|
|
|
|
print_test "Verifying all services have resource limits"
|
|
|
|
|
NON_COMPLIANT=0
|
|
|
|
|
LIMITS_SUMMARY=""
|
|
|
|
|
COMPOSE_CONFIG=$(docker compose config 2>/dev/null)
|
|
|
|
|
|
|
|
|
|
for service in $SERVICES; do
|
|
|
|
|
service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:")
|
|
|
|
|
|
|
|
|
|
# Check for resource limits
|
|
|
|
|
has_cpu=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "cpus:" || echo "0")
|
|
|
|
|
has_memory=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "memory:" || echo "0")
|
|
|
|
|
has_cpu=$(printf '%s\n' "$service_block" | grep -c "cpus:" || true)
|
|
|
|
|
has_memory=$(printf '%s\n' "$service_block" | grep -c "memory:" || true)
|
|
|
|
|
|
|
|
|
|
if [[ $has_cpu -eq 0 ]]; then
|
|
|
|
|
print_fail " $service: Missing cpus limit"
|
|
|
|
@@ -126,8 +129,8 @@ for service in $SERVICES; do
|
|
|
|
|
print_fail " $service: Missing memory limit"
|
|
|
|
|
((NON_COMPLIANT++)) || true
|
|
|
|
|
else
|
|
|
|
|
cpu_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "cpus:" | sed 's/.*cpus: //' | tr -d ' "')
|
|
|
|
|
mem_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "memory:" | sed 's/.*memory: //' | tr -d " '"")
|
|
|
|
|
cpu_val=$(printf '%s\n' "$service_block" | grep -m1 "cpus:" | sed 's/.*cpus: //' | tr -d ' "')
|
|
|
|
|
mem_val=$(printf '%s\n' "$service_block" | grep -m1 "memory:" | sed 's/.*memory: //' | tr -d ' "')
|
|
|
|
|
|
|
|
|
|
# Map to EC2 instance type
|
|
|
|
|
case "$cpu_val:$mem_val" in
|
|
|
|
@@ -159,15 +162,20 @@ MISSING_HC=0
|
|
|
|
|
HC_SUMMARY=""
|
|
|
|
|
|
|
|
|
|
for service in $SERVICES; do
|
|
|
|
|
has_hc=$(docker compose config 2>/dev/null | grep -A 50 "^$service:" | grep -c "healthcheck:" || echo "0")
|
|
|
|
|
service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:")
|
|
|
|
|
has_hc=$(printf '%s\n' "$service_block" | grep -c "healthcheck:" || true)
|
|
|
|
|
|
|
|
|
|
if [[ $has_hc -eq 0 ]]; then
|
|
|
|
|
print_fail " $service: Missing healthcheck"
|
|
|
|
|
((MISSING_HC++)) || true
|
|
|
|
|
else
|
|
|
|
|
interval=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "interval:" | sed 's/.*interval: //' | tr -d " '"" || echo "N/A")
|
|
|
|
|
timeout=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "timeout:" | sed 's/.*timeout: //' | tr -d " '"" || echo "N/A")
|
|
|
|
|
retries=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "retries:" | sed 's/.*retries: //' | tr -d " '"" || echo "N/A")
|
|
|
|
|
interval=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "interval:" | sed 's/.*interval: //' | tr -d ' "' || true)
|
|
|
|
|
timeout=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "timeout:" | sed 's/.*timeout: //' | tr -d ' "' || true)
|
|
|
|
|
retries=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "retries:" | sed 's/.*retries: //' | tr -d ' "' || true)
|
|
|
|
|
|
|
|
|
|
interval=${interval:-N/A}
|
|
|
|
|
timeout=${timeout:-N/A}
|
|
|
|
|
retries=${retries:-N/A}
|
|
|
|
|
|
|
|
|
|
print_pass " $service: interval=$interval, timeout=$timeout, retries=$retries"
|
|
|
|
|
HC_SUMMARY="$HC_SUMMARY\n • $service: interval=$interval, timeout=$timeout, retries=$retries"
|
|
|
|
@@ -208,10 +216,12 @@ print_test "Checking resource limits are applied"
|
|
|
|
|
LIMITS_ENFORCED=0
|
|
|
|
|
|
|
|
|
|
for service in $SERVICES; do
|
|
|
|
|
container_name="lab03-$service"
|
|
|
|
|
if docker ps --format '{{.Names}}' | grep -q "$container_name"; then
|
|
|
|
|
nano_cpus=$(docker inspect "$container_name" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0")
|
|
|
|
|
mem_bytes=$(docker inspect "$container_name" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")
|
|
|
|
|
container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "")
|
|
|
|
|
if [[ -n "$container_id" ]]; then
|
|
|
|
|
container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service")
|
|
|
|
|
container_name=${container_name#/}
|
|
|
|
|
nano_cpus=$(docker inspect "$container_id" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0")
|
|
|
|
|
mem_bytes=$(docker inspect "$container_id" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")
|
|
|
|
|
|
|
|
|
|
if [[ $nano_cpus -gt 0 && $mem_bytes -gt 0 ]]; then
|
|
|
|
|
cpu_cores=$(echo "scale=2; $nano_cpus / 1000000000" | bc 2>/dev/null || echo "N/A")
|
|
|
|
@@ -237,7 +247,7 @@ fi
|
|
|
|
|
# Test docker stats
|
|
|
|
|
print_test "Monitoring resource usage"
|
|
|
|
|
echo -e "\n${BLUE}Live Resource Usage:${NC}"
|
|
|
|
|
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed"
|
|
|
|
|
docker ps --format '{{.Names}}' | grep '^lab03-' | xargs -r docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed"
|
|
|
|
|
|
|
|
|
|
# === SECTION 6: Health Status ===
|
|
|
|
|
print_header "Section 6: Health Status Verification"
|
|
|
|
@@ -246,9 +256,11 @@ print_test "Checking container health status"
|
|
|
|
|
HEALTHY=0
|
|
|
|
|
|
|
|
|
|
for service in $SERVICES; do
|
|
|
|
|
container_name="lab03-$service"
|
|
|
|
|
if docker ps --format '{{.Names}}' | grep -q "$container_name"; then
|
|
|
|
|
health=$(docker inspect "$container_name" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck")
|
|
|
|
|
container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "")
|
|
|
|
|
if [[ -n "$container_id" ]]; then
|
|
|
|
|
container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service")
|
|
|
|
|
container_name=${container_name#/}
|
|
|
|
|
health=$(docker inspect "$container_id" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck")
|
|
|
|
|
|
|
|
|
|
if [[ "$health" == "healthy" ]]; then
|
|
|
|
|
print_pass " $container_name: healthy ✓"
|
|
|
|
@@ -264,7 +276,7 @@ done
|
|
|
|
|
if [[ $HEALTHY -gt 0 ]]; then
|
|
|
|
|
print_pass "✓ $HEALTHY containers are healthy"
|
|
|
|
|
else
|
|
|
|
|
print_warning "No healthy containers yet (may still be starting)"
|
|
|
|
|
print_warning "No healthy containers yet; they may still be starting"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# === SECTION 7: Cloud Parallels ===
|
|
|
|
|