From f7766c022c2acec5b2505308a1867725db73d2bd Mon Sep 17 00:00:00 2001 From: yuyr Date: Sun, 28 Sep 2025 03:34:44 +0000 Subject: [PATCH] =?UTF-8?q?[#2]=20=E4=BF=AE=E5=A4=8D=E5=B9=B6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95agent=20verify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agent/dist/argus-agent | Bin 7842688 -> 7842688 bytes src/agent/scripts/agent_deployment_verify.sh | 130 ++++++++----------- src/agent/tests/docker-compose.yml | 1 + src/agent/tests/scripts/00_e2e_test.sh | 1 + src/agent/tests/scripts/01_bootstrap.sh | 2 +- src/agent/tests/scripts/08_verify_agent.sh | 26 ++++ 6 files changed, 82 insertions(+), 78 deletions(-) create mode 100755 src/agent/tests/scripts/08_verify_agent.sh diff --git a/src/agent/dist/argus-agent b/src/agent/dist/argus-agent index 9c942eb18910a0f426198165be177f55aec79d1a..4fef67c37b999b3c47324057355e739db4682b9b 100755 GIT binary patch delta 7839 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 delta 7693 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/dev/null 2>&1; then HAS_JQ="1" fi +if ! command -v curl >/dev/null 2>&1; then + log_error "curl command not found; please install curl (e.g. apt-get install -y curl)" + exit 2 +fi + if [[ "$HAS_JQ" == "0" ]] && ! command -v python3 >/dev/null 2>&1; then log_error "Neither jq nor python3 is available for JSON processing" exit 2 @@ -219,7 +224,11 @@ PY iso_to_epoch() { local value="$1" - python3 - "$value" <<'PY' + if command -v date >/dev/null 2>&1; then + date -d "$value" +%s 2>/dev/null && return 0 + fi + if command -v python3 >/dev/null 2>&1; then + python3 - "$value" <<'PY' import sys from datetime import datetime @@ -234,17 +243,28 @@ except ValueError: sys.exit(1) print(int(dt.timestamp())) PY + return $? + fi + return 1 } validate_json_file() { local path="$1" - python3 - "$path" <<'PY' + if [[ "$HAS_JQ" == "1" ]]; then + jq empty "$path" >/dev/null 2>&1 && return 0 + return 1 + fi + if command -v python3 >/dev/null 2>&1; then + python3 - "$path" <<'PY' import json import sys path = sys.argv[1] with open(path, 'r', encoding='utf-8') as handle: json.load(handle) PY + return $? + fi + return 0 } ensure_directory() { @@ -341,20 +361,18 @@ PY else add_result FAIL "Failed to extract node id from master response" fi - if NODE_IP=$(json_query "$NODE_ENTRY" '.meta_data.host_ip // empty' 'data.get("meta_data", {}).get("host_ip", "")'); then - if [[ -n "$NODE_IP" ]]; then - add_result PASS "Registered node host_ip=$NODE_IP" - else - add_result WARN "Node host_ip missing in master meta_data" - fi - else - add_result WARN "Unable to read meta_data.host_ip" - fi fi if [[ -n "$NODE_ENTRY" ]] && NODE_DETAIL=$(curl_json "$MASTER_BASE/api/v1/master/nodes/$NODE_ID" 2>/tmp/agent_verify_node_detail.err); then NODE_DETAIL_JSON="$NODE_DETAIL" add_result PASS "Fetched node detail for $NODE_ID" + if NODE_IP=$(json_query "$NODE_DETAIL_JSON" '.meta_data.ip // .meta_data.host_ip // empty' 'data.get("meta_data", {}).get("ip") or data.get("meta_data", {}).get("host_ip") or ""'); then + if [[ -n "$NODE_IP" ]]; then + add_result PASS "Registered node IP=$NODE_IP" + else + add_result INFO "Node detail does not expose IP fields" + fi + fi else error_detail=$(cat /tmp/agent_verify_node_detail.err 2>/dev/null || true) add_result FAIL "Failed to fetch node detail for $NODE_ID: $error_detail" @@ -363,28 +381,24 @@ PY rm -f /tmp/agent_verify_node_detail.err if stats_json=$(curl_json "$MASTER_BASE/api/v1/master/nodes/statistics" 2>/tmp/agent_verify_stats.err); then - if total_nodes=$(json_query "$stats_json" '.total_nodes' 'data["total_nodes"]'); then + if total_nodes=$(json_query "$stats_json" '.total // .total_nodes' 'data.get("total") or data.get("total_nodes")'); then if [[ "$total_nodes" =~ ^[0-9]+$ ]] && [[ "$total_nodes" -ge 1 ]]; then - add_result PASS "Statistics total_nodes=$total_nodes" + add_result PASS "Statistics total=$total_nodes" else - add_result FAIL "Statistics total_nodes invalid: $total_nodes" + add_result WARN "Statistics total field not numeric: $total_nodes" fi else - add_result FAIL "Unable to read total_nodes from statistics" + add_result WARN "Unable to read total field from statistics" fi - if active_nodes=$(json_query "$stats_json" '.active_nodes' 'data["active_nodes"]'); then - if [[ "$active_nodes" =~ ^[0-9]+$ ]]; then - add_result PASS "Statistics active_nodes=$active_nodes" - else - add_result WARN "Statistics active_nodes not numeric: $active_nodes" - fi + + active_nodes="" + if [[ "$HAS_JQ" == "1" ]]; then + active_nodes=$(printf '%s' "$stats_json" | jq -e 'if .status_statistics then (.status_statistics[] | select(.status == "online") | .count) else empty end' 2>/dev/null | head -n1 || true) + elif command -v python3 >/dev/null 2>&1; then + active_nodes=$(printf '%s' "$stats_json" | python3 -c 'import json,sys; data=json.load(sys.stdin); print(next((row.get("count") for row in data.get("status_statistics", []) if row.get("status")=="online"), ""))' 2>/dev/null) fi - if inactive_nodes=$(json_query "$stats_json" '.inactive_nodes' 'data["inactive_nodes"]'); then - if [[ "$inactive_nodes" =~ ^[0-9]+$ ]]; then - add_result PASS "Statistics inactive_nodes=$inactive_nodes" - else - add_result WARN "Statistics inactive_nodes not numeric: $inactive_nodes" - fi + if [[ -n "$active_nodes" ]]; then + add_result PASS "Online nodes reported by master: $active_nodes" fi if [[ "$HAS_JQ" == "1" ]]; then @@ -392,10 +406,8 @@ PY else node_count=$(json_length "$nodes_json" 'length' 'len(data)') fi - if [[ "$total_nodes" =~ ^[0-9]+$ ]] && [[ "$node_count" =~ ^[0-9]+$ ]]; then - if [[ "$total_nodes" -lt "$node_count" ]]; then - add_result WARN "Statistics total_nodes=$total_nodes less than nodes list count=$node_count" - fi + if [[ "$total_nodes" =~ ^[0-9]+$ ]] && [[ "$node_count" =~ ^[0-9]+$ ]] && [[ "$total_nodes" -lt "$node_count" ]]; then + add_result WARN "Statistics total=$total_nodes less than nodes list count=$node_count" fi else error_detail=$(cat /tmp/agent_verify_stats.err 2>/dev/null || true) @@ -476,47 +488,11 @@ else add_result WARN "Health directory $HEALTH_DIR missing" fi -if [[ -f "$DNS_CONF" ]]; then - nameservers=$(awk '/^nameserver/{print $2}' "$DNS_CONF" | xargs) - if [[ -z "$nameservers" ]]; then - add_result FAIL "dns.conf found but contains no nameserver entries" - else - add_result PASS "dns.conf nameservers: $nameservers" - if getent hosts master.argus.com >/dev/null 2>&1; then - resolved_ips=$(getent hosts master.argus.com | awk '{print $1}' | xargs) - match_found="false" - for ns in $nameservers; do - if grep -qw "$ns" <<<"$resolved_ips"; then - match_found="true" - fi - done - if [[ "$match_found" == "true" ]]; then - add_result PASS "master.argus.com resolves via configured nameserver" - else - add_result WARN "master.argus.com resolved IPs ($resolved_ips) do not match dns.conf nameservers ($nameservers)" - fi - else - add_result WARN "Failed to resolve master.argus.com" - fi - fi +if getent hosts master.argus.com >/dev/null 2>&1; then + resolved_ips=$(getent hosts master.argus.com | awk '{print $1}' | xargs) + add_result PASS "master.argus.com resolves to $resolved_ips" else - add_result FAIL "dns.conf not found at $DNS_CONF" -fi - -if [[ -f "$UPDATE_SCRIPT" ]]; then - dns_mtime=$(stat -c %Y "$DNS_CONF" 2>/dev/null || echo 0) - upd_mtime=$(stat -c %Y "$UPDATE_SCRIPT" 2>/dev/null || echo 0) - if [[ "$dns_mtime" -gt 0 && "$upd_mtime" -gt 0 ]]; then - diff=$((dns_mtime - upd_mtime)) - [[ $diff -lt 0 ]] && diff=$((-diff)) - if [[ $diff -le 300 ]]; then - add_result PASS "dns.conf and update-dns.sh timestamps within 5 minutes" - else - add_result WARN "dns.conf and update-dns.sh timestamps differ by more than 5 minutes" - fi - fi -else - add_result WARN "update-dns.sh not found at $UPDATE_SCRIPT" + add_result FAIL "Failed to resolve master.argus.com" fi # 4.5 Master-Node status consistency @@ -544,15 +520,15 @@ server_ts_post="" agent_ts_post="" if [[ -n "$detail_pre" ]]; then - server_ts_pre=$(json_query "$detail_pre" '.last_report.server_timestamp' 'data.get("last_report", {}).get("server_timestamp")' || echo "") - agent_ts_pre=$(json_query "$detail_pre" '.last_report.agent_timestamp' 'data.get("last_report", {}).get("agent_timestamp")' || echo "") + server_ts_pre=$(json_query "$detail_pre" '.last_report' 'data.get("last_report")' || echo "") + agent_ts_pre=$(json_query "$detail_pre" '.agent_last_report' 'data.get("agent_last_report")' || echo "") log_info "Captured initial last_report timestamps server='$server_ts_pre' agent='$agent_ts_pre'" sleep "$sleep_interval" if detail_post=$(curl_json "$MASTER_BASE/api/v1/master/nodes/$NODE_ID" 2>/tmp/agent_verify_detail_post.err); then - server_ts_post=$(json_query "$detail_post" '.last_report.server_timestamp' 'data.get("last_report", {}).get("server_timestamp")' || echo "") - agent_ts_post=$(json_query "$detail_post" '.last_report.agent_timestamp' 'data.get("last_report", {}).get("agent_timestamp")' || echo "") + server_ts_post=$(json_query "$detail_post" '.last_report' 'data.get("last_report")' || echo "") + agent_ts_post=$(json_query "$detail_post" '.agent_last_report' 'data.get("agent_last_report")' || echo "") if [[ "$server_ts_post" != "$server_ts_pre" ]]; then add_result PASS "last_report.server_timestamp advanced (pre=$server_ts_pre post=$server_ts_post)" else @@ -611,7 +587,7 @@ validate_health_in_master() { local expected_message="$1" local detail_json="$2" local message - if message=$(json_query "$detail_json" '.meta_data.health["verify-master"].message' 'data.get("meta_data", {}).get("health", {}).get("verify-master", {}).get("message")'); then + if message=$(json_query "$detail_json" '.health["verify-master"].message' 'data.get("health", {}).get("verify-master", {}).get("message")'); then if [[ "$message" == "$expected_message" ]]; then return 0 fi @@ -621,7 +597,7 @@ validate_health_in_master() { remove_health_from_master() { local detail_json="$1" - if json_has_key "$detail_json" '(.meta_data.health | has("verify-master"))' '"verify-master" in data.get("meta_data", {}).get("health", {})'; then + if json_has_key "$detail_json" '(.health | has("verify-master"))' '"verify-master" in data.get("health", {})'; then return 1 fi return 0 diff --git a/src/agent/tests/docker-compose.yml b/src/agent/tests/docker-compose.yml index 6696402..5703200 100644 --- a/src/agent/tests/docker-compose.yml +++ b/src/agent/tests/docker-compose.yml @@ -44,6 +44,7 @@ services: - ./private/argus/etc:/private/argus/etc - ../dist/argus-agent:/usr/local/bin/argus-agent:ro - ./scripts/agent_entrypoint.sh:/usr/local/bin/agent-entrypoint.sh:ro + - ../scripts/agent_deployment_verify.sh:/usr/local/bin/agent_deployment_verify.sh:ro entrypoint: - /usr/local/bin/agent-entrypoint.sh networks: diff --git a/src/agent/tests/scripts/00_e2e_test.sh b/src/agent/tests/scripts/00_e2e_test.sh index a3bf42d..9515d34 100755 --- a/src/agent/tests/scripts/00_e2e_test.sh +++ b/src/agent/tests/scripts/00_e2e_test.sh @@ -7,6 +7,7 @@ SCRIPTS=( "02_up.sh" "03_wait_and_assert_registration.sh" "04_write_health_files.sh" + "08_verify_agent.sh" "05_assert_status_on_master.sh" "06_restart_agent_and_reregister.sh" "07_down.sh" diff --git a/src/agent/tests/scripts/01_bootstrap.sh b/src/agent/tests/scripts/01_bootstrap.sh index 41a19e1..cb364df 100755 --- a/src/agent/tests/scripts/01_bootstrap.sh +++ b/src/agent/tests/scripts/01_bootstrap.sh @@ -11,7 +11,7 @@ TMP_ROOT="$TEST_ROOT/tmp" AGENT_HOSTNAME="dev-e2euser-e2einst-pod-0" AGENT_CONFIG_DIR="$PRIVATE_ROOT/argus/agent/$AGENT_HOSTNAME" -AGENT_HEALTH_DIR="$PRIVATE_ROOT/argus/agent/health/$AGENT_HOSTNAME" +AGENT_HEALTH_DIR="$PRIVATE_ROOT/argus/agent/$AGENT_HOSTNAME/health" MASTER_PRIVATE_DIR="$PRIVATE_ROOT/argus/master" METRIC_PRIVATE_DIR="$PRIVATE_ROOT/argus/metric/prometheus" DNS_DIR="$PRIVATE_ROOT/argus/etc" diff --git a/src/agent/tests/scripts/08_verify_agent.sh b/src/agent/tests/scripts/08_verify_agent.sh new file mode 100755 index 0000000..8b347b0 --- /dev/null +++ b/src/agent/tests/scripts/08_verify_agent.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TEST_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +VERIFY_SCRIPT="$(cd "$TEST_ROOT/.." && pwd)/scripts/agent_deployment_verify.sh" + +if ! docker ps --format '{{.Names}}' | grep -q '^argus-agent-e2e$'; then + echo "[WARN] agent container not running; skip verification" + exit 0 +fi + +if docker exec -i argus-agent-e2e bash -lc 'command -v curl >/dev/null && command -v jq >/dev/null'; then + echo "[INFO] curl/jq already installed in agent container" +else + echo "[INFO] Installing curl/jq in agent container" + docker exec -i argus-agent-e2e bash -lc 'apt-get update >/dev/null 2>&1 && apt-get install -y curl jq >/dev/null 2>&1' || true +fi + +if docker exec -i argus-agent-e2e bash -lc 'command -v /usr/local/bin/agent_deployment_verify.sh >/dev/null'; then + docker exec -i argus-agent-e2e /usr/local/bin/agent_deployment_verify.sh +elif [[ -x "$VERIFY_SCRIPT" ]]; then + docker exec -i argus-agent-e2e "$VERIFY_SCRIPT" +else + echo "[WARN] agent_deployment_verify.sh not found" +fi