Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/scripts/bash/e2e/apply-clusternetworks.sh
Original file line number Diff line number Diff line change
@@ -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
17 changes: 17 additions & 0 deletions .github/scripts/bash/e2e/common.sh
Original file line number Diff line number Diff line change
@@ -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
204 changes: 204 additions & 0 deletions .github/scripts/bash/e2e/configure-virtualization.sh
Original file line number Diff line number Diff line change
@@ -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 <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleSource
metadata:
name: deckhouse-dev
spec:
registry:
ca: ""
dockerCfg: "${DEV_REGISTRY_DOCKER_CFG}"
repo: "${registry}/sys/deckhouse-oss/modules"
scheme: HTTPS
EOF
}

apply_virtualization_module_config() {
echo "[INFO] Apply Virtualization module config"
kubectl_apply_with_retry <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: virtualization
spec:
enabled: true
settings:
dvcr:
storage:
persistentVolumeClaim:
size: 10Gi
storageClassName: ${NESTED_STORAGE_CLASS_NAME}
type: PersistentVolumeClaim
virtualMachineCIDRs:
- 192.168.10.0/24
source: deckhouse-dev
version: 1
---
apiVersion: deckhouse.io/v1alpha2
kind: ModulePullOverride
metadata:
name: virtualization
spec:
imageTag: ${VIRTUALIZATION_TAG}
scanInterval: 120h
EOF
}

show_virtualization_config() {
echo "[INFO] Show ModuleSource"
kubectl get ms

echo "[INFO] Show module config virtualization info"
kubectl get mc virtualization

echo "[INFO] Show ModulePullOverride virtualization info"
kubectl get mpo virtualization
}

apply_module_source
wait_for_modulesource_active
wait_for_deckhouse_queue
wait_for_virtualization_dev_source
wait_for_deckhouse_queue
apply_virtualization_module_config
show_virtualization_config
36 changes: 36 additions & 0 deletions .github/scripts/bash/e2e/deckhouse.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/usr/bin/env bash

show_deckhouse_state() {
echo "[DEBUG] Show deckhouse pods"
kubectl -n d8-system get pods -l app=deckhouse -o wide || true
echo "[DEBUG] Show queue (first 25 lines)"
d8 s queue list | head -n25 || true
}

wait_for_deckhouse_queue() {
local count=60
local delay=10
local queue_count

for i in $(seq 1 "$count"); do
queue_count="$(d8 s queue list | grep -Po '([0-9]+)(?= active)' || true)"
echo "[INFO] Wait until Deckhouse queue is empty ${i}/${count}, active=${queue_count:-unknown}"

if [ "$queue_count" = "0" ]; then
echo "[SUCCESS] Deckhouse queue is empty"
return 0
fi

if (( i % 5 == 0 )); then
show_deckhouse_state
fi

if [ "$i" -lt "$count" ]; then
sleep "$delay"
fi
done

echo "[ERROR] Deckhouse queue is not empty"
show_deckhouse_state
return 1
}
Loading
Loading