diff --git a/.github/scripts/bash/e2e/apply-clusternetworks.sh b/.github/scripts/bash/e2e/apply-clusternetworks.sh new file mode 100644 index 0000000000..b016661578 --- /dev/null +++ b/.github/scripts/bash/e2e/apply-clusternetworks.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=.github/scripts/bash/e2e/common.sh +source "${SCRIPT_DIR}/common.sh" + +manifest="$(mktemp)" +trap 'rm -f "$manifest"' EXIT + +cat > "$manifest" + +count=12 +delay=10 + +for i in $(seq 1 "$count"); do + echo "[INFO] Apply ClusterNetworks attempt ${i}/${count}" + if kubectl apply -f "$manifest"; then + exit 0 + fi + + if [ "$i" -lt "$count" ]; then + echo "[WARN] Failed to apply ClusterNetworks, retrying in ${delay} seconds..." + kubectl -n d8-sdn get endpoints controller-sdn-admission || true + kubectl get clusternetworks.network.deckhouse.io || true + sleep "$delay" + fi +done + +echo "[ERROR] Failed to apply ClusterNetworks after ${count} attempts" +kubectl -n d8-sdn get pods,svc,endpoints || true +kubectl get clusternetworks.network.deckhouse.io || true +exit 1 diff --git a/.github/scripts/bash/e2e/common.sh b/.github/scripts/bash/e2e/common.sh new file mode 100644 index 0000000000..24899f23e8 --- /dev/null +++ b/.github/scripts/bash/e2e/common.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +on_error() { + local exit_code=$? + echo "[ERROR] Command failed with exit code ${exit_code} at line ${BASH_LINENO[0]}: ${BASH_COMMAND}" >&2 +} + +require_env() { + local name="$1" + + if [ -z "${!name:-}" ]; then + echo "[ERROR] Required environment variable is not set: ${name}" >&2 + exit 1 + fi +} + +trap on_error ERR diff --git a/.github/scripts/bash/e2e/configure-virtualization.sh b/.github/scripts/bash/e2e/configure-virtualization.sh new file mode 100644 index 0000000000..efa9215815 --- /dev/null +++ b/.github/scripts/bash/e2e/configure-virtualization.sh @@ -0,0 +1,204 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=.github/scripts/bash/e2e/common.sh +source "${SCRIPT_DIR}/common.sh" +# shellcheck source=.github/scripts/bash/e2e/deckhouse.sh +source "${SCRIPT_DIR}/deckhouse.sh" + +require_env DEV_REGISTRY_DOCKER_CFG +require_env NESTED_STORAGE_CLASS_NAME +require_env VIRTUALIZATION_TAG + +kubectl_apply_with_retry() { + local count=20 + local delay=10 + local manifest + manifest="$(mktemp)" + cat > "$manifest" + + for i in $(seq 1 "$count"); do + echo "[INFO] kubectl apply attempt ${i}/${count}" + if kubectl apply -f "$manifest"; then + rm -f "$manifest" + return 0 + fi + + if [ "$i" -lt "$count" ]; then + echo "[WARN] kubectl apply failed, retrying in ${delay}s" + show_deckhouse_state + sleep "$delay" + fi + done + + echo "[ERROR] kubectl apply failed after ${count} attempts" + rm -f "$manifest" + return 1 +} + +show_modulesource_status() { + local ms_json + local phase + local message + + if ! ms_json="$(kubectl get ms deckhouse-dev -o json 2>/dev/null)"; then + echo "[DEBUG] ModuleSource deckhouse-dev is not found" + return 0 + fi + + phase="$(jq -r '.status.phase // "unknown"' <<< "$ms_json")" + message="$(jq -r '.status.message // ""' <<< "$ms_json")" + + echo "[DEBUG] ModuleSource deckhouse-dev phase: ${phase}" + if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then + echo "[DEBUG] ModuleSource deckhouse-dev problem: registry authentication failed (401 Unauthorized)" + fi +} + +wait_for_modulesource_active() { + local count=30 + local delay=10 + local ms_json + local phase + local message + + for i in $(seq 1 "$count"); do + ms_json="$(kubectl get ms deckhouse-dev -o json 2>/dev/null || true)" + phase="$(jq -r '.status.phase // "unknown"' <<< "$ms_json" 2>/dev/null || true)" + message="$(jq -r '.status.message // ""' <<< "$ms_json" 2>/dev/null || true)" + + echo "[INFO] Wait for ModuleSource deckhouse-dev to be Active ${i}/${count}, phase=${phase:-unknown}" + if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then + echo "[INFO] ModuleSource deckhouse-dev problem: registry authentication failed (401 Unauthorized)" + fi + + if [ "$phase" = "Active" ]; then + echo "[SUCCESS] ModuleSource deckhouse-dev is Active" + kubectl get ms deckhouse-dev -o wide + return 0 + fi + + if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then + echo "[ERROR] ModuleSource deckhouse-dev registry authentication failed. Check DEV_REGISTRY_DOCKER_CFG credentials." >&2 + return 1 + fi + + if (( i % 5 == 0 )); then + show_deckhouse_state + fi + + if [ "$i" -lt "$count" ]; then + sleep "$delay" + fi + done + + echo "[ERROR] ModuleSource deckhouse-dev did not become Active" + show_modulesource_status + show_deckhouse_state + return 1 +} + +wait_for_virtualization_dev_source() { + local count=60 + local delay=10 + local available_sources + + for i in $(seq 1 "$count"); do + available_sources="$(kubectl get modules virtualization -o json 2>/dev/null | jq -r '.properties.availableSources // [] | join(",")' || true)" + echo "[INFO] Wait for virtualization module source deckhouse-dev ${i}/${count}, availableSources=${available_sources:-none}" + + if echo ",${available_sources}," | grep -q ",deckhouse-dev,"; then + echo "[SUCCESS] deckhouse-dev is available for virtualization module" + kubectl get modules virtualization -o wide + return 0 + fi + + if (( i % 5 == 0 )); then + echo "[DEBUG] Show ModuleSource" + show_modulesource_status + echo "[DEBUG] Show virtualization module" + kubectl get modules virtualization -o yaml || true + show_deckhouse_state + fi + + if [ "$i" -lt "$count" ]; then + sleep "$delay" + fi + done + + echo "[ERROR] deckhouse-dev did not become available for virtualization module" + show_modulesource_status + kubectl get modules virtualization -o yaml || true + return 1 +} + +apply_module_source() { + local registry + registry="$(base64 -d <<< "$DEV_REGISTRY_DOCKER_CFG" | jq '.auths | to_entries | .[] | .key' -r)" + + echo "[INFO] Apply ModuleSource dev config" + kubectl_apply_with_retry < "$manifest" - - for i in $(seq 1 "$count"); do - echo "[INFO] kubectl apply attempt ${i}/${count}" - if kubectl apply -f "$manifest"; then - rm -f "$manifest" - return 0 - fi - - if [ "$i" -lt "$count" ]; then - echo "[WARN] kubectl apply failed, retrying in ${delay}s" - sleep "$delay" - fi - done - - echo "[ERROR] kubectl apply failed after ${count} attempts" - rm -f "$manifest" - return 1 - } - - REGISTRY=$(base64 -d <<< "${{secrets.DEV_REGISTRY_DOCKER_CFG}}" | jq '.auths | to_entries | .[] | .key' -r) - - echo "[INFO] Apply ModuleSource dev config" - kubectl_apply_with_retry <