Skip to content

Commit 713bf84

Browse files
authored
Merge branch 'main' into fix/vmop/migration-failed-target
2 parents 153adfb + 433d415 commit 713bf84

35 files changed

Lines changed: 1101 additions & 284 deletions
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env bash
2+
3+
set -Eeuo pipefail
4+
5+
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
6+
# shellcheck source=.github/scripts/bash/e2e/common.sh
7+
source "${SCRIPT_DIR}/common.sh"
8+
9+
manifest="$(mktemp)"
10+
trap 'rm -f "$manifest"' EXIT
11+
12+
cat > "$manifest"
13+
14+
count=12
15+
delay=10
16+
17+
for i in $(seq 1 "$count"); do
18+
echo "[INFO] Apply ClusterNetworks attempt ${i}/${count}"
19+
if kubectl apply -f "$manifest"; then
20+
exit 0
21+
fi
22+
23+
if [ "$i" -lt "$count" ]; then
24+
echo "[WARN] Failed to apply ClusterNetworks, retrying in ${delay} seconds..."
25+
kubectl -n d8-sdn get endpoints controller-sdn-admission || true
26+
kubectl get clusternetworks.network.deckhouse.io || true
27+
sleep "$delay"
28+
fi
29+
done
30+
31+
echo "[ERROR] Failed to apply ClusterNetworks after ${count} attempts"
32+
kubectl -n d8-sdn get pods,svc,endpoints || true
33+
kubectl get clusternetworks.network.deckhouse.io || true
34+
exit 1

.github/scripts/bash/e2e/common.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/usr/bin/env bash
2+
3+
on_error() {
4+
local exit_code=$?
5+
echo "[ERROR] Command failed with exit code ${exit_code} at line ${BASH_LINENO[0]}: ${BASH_COMMAND}" >&2
6+
}
7+
8+
require_env() {
9+
local name="$1"
10+
11+
if [ -z "${!name:-}" ]; then
12+
echo "[ERROR] Required environment variable is not set: ${name}" >&2
13+
exit 1
14+
fi
15+
}
16+
17+
trap on_error ERR
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
#!/usr/bin/env bash
2+
3+
set -Eeuo pipefail
4+
5+
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
6+
# shellcheck source=.github/scripts/bash/e2e/common.sh
7+
source "${SCRIPT_DIR}/common.sh"
8+
# shellcheck source=.github/scripts/bash/e2e/deckhouse.sh
9+
source "${SCRIPT_DIR}/deckhouse.sh"
10+
11+
require_env DEV_REGISTRY_DOCKER_CFG
12+
require_env NESTED_STORAGE_CLASS_NAME
13+
require_env VIRTUALIZATION_TAG
14+
15+
kubectl_apply_with_retry() {
16+
local count=20
17+
local delay=10
18+
local manifest
19+
manifest="$(mktemp)"
20+
cat > "$manifest"
21+
22+
for i in $(seq 1 "$count"); do
23+
echo "[INFO] kubectl apply attempt ${i}/${count}"
24+
if kubectl apply -f "$manifest"; then
25+
rm -f "$manifest"
26+
return 0
27+
fi
28+
29+
if [ "$i" -lt "$count" ]; then
30+
echo "[WARN] kubectl apply failed, retrying in ${delay}s"
31+
show_deckhouse_state
32+
sleep "$delay"
33+
fi
34+
done
35+
36+
echo "[ERROR] kubectl apply failed after ${count} attempts"
37+
rm -f "$manifest"
38+
return 1
39+
}
40+
41+
show_modulesource_status() {
42+
local ms_json
43+
local phase
44+
local message
45+
46+
if ! ms_json="$(kubectl get ms deckhouse-dev -o json 2>/dev/null)"; then
47+
echo "[DEBUG] ModuleSource deckhouse-dev is not found"
48+
return 0
49+
fi
50+
51+
phase="$(jq -r '.status.phase // "unknown"' <<< "$ms_json")"
52+
message="$(jq -r '.status.message // ""' <<< "$ms_json")"
53+
54+
echo "[DEBUG] ModuleSource deckhouse-dev phase: ${phase}"
55+
if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then
56+
echo "[DEBUG] ModuleSource deckhouse-dev problem: registry authentication failed (401 Unauthorized)"
57+
fi
58+
}
59+
60+
wait_for_modulesource_active() {
61+
local count=30
62+
local delay=10
63+
local ms_json
64+
local phase
65+
local message
66+
67+
for i in $(seq 1 "$count"); do
68+
ms_json="$(kubectl get ms deckhouse-dev -o json 2>/dev/null || true)"
69+
phase="$(jq -r '.status.phase // "unknown"' <<< "$ms_json" 2>/dev/null || true)"
70+
message="$(jq -r '.status.message // ""' <<< "$ms_json" 2>/dev/null || true)"
71+
72+
echo "[INFO] Wait for ModuleSource deckhouse-dev to be Active ${i}/${count}, phase=${phase:-unknown}"
73+
if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then
74+
echo "[INFO] ModuleSource deckhouse-dev problem: registry authentication failed (401 Unauthorized)"
75+
fi
76+
77+
if [ "$phase" = "Active" ]; then
78+
echo "[SUCCESS] ModuleSource deckhouse-dev is Active"
79+
kubectl get ms deckhouse-dev -o wide
80+
return 0
81+
fi
82+
83+
if echo "$message" | grep -Eqi '401 Unauthorized|Auth failed'; then
84+
echo "[ERROR] ModuleSource deckhouse-dev registry authentication failed. Check DEV_REGISTRY_DOCKER_CFG credentials." >&2
85+
return 1
86+
fi
87+
88+
if (( i % 5 == 0 )); then
89+
show_deckhouse_state
90+
fi
91+
92+
if [ "$i" -lt "$count" ]; then
93+
sleep "$delay"
94+
fi
95+
done
96+
97+
echo "[ERROR] ModuleSource deckhouse-dev did not become Active"
98+
show_modulesource_status
99+
show_deckhouse_state
100+
return 1
101+
}
102+
103+
wait_for_virtualization_dev_source() {
104+
local count=60
105+
local delay=10
106+
local available_sources
107+
108+
for i in $(seq 1 "$count"); do
109+
available_sources="$(kubectl get modules virtualization -o json 2>/dev/null | jq -r '.properties.availableSources // [] | join(",")' || true)"
110+
echo "[INFO] Wait for virtualization module source deckhouse-dev ${i}/${count}, availableSources=${available_sources:-none}"
111+
112+
if echo ",${available_sources}," | grep -q ",deckhouse-dev,"; then
113+
echo "[SUCCESS] deckhouse-dev is available for virtualization module"
114+
kubectl get modules virtualization -o wide
115+
return 0
116+
fi
117+
118+
if (( i % 5 == 0 )); then
119+
echo "[DEBUG] Show ModuleSource"
120+
show_modulesource_status
121+
echo "[DEBUG] Show virtualization module"
122+
kubectl get modules virtualization -o yaml || true
123+
show_deckhouse_state
124+
fi
125+
126+
if [ "$i" -lt "$count" ]; then
127+
sleep "$delay"
128+
fi
129+
done
130+
131+
echo "[ERROR] deckhouse-dev did not become available for virtualization module"
132+
show_modulesource_status
133+
kubectl get modules virtualization -o yaml || true
134+
return 1
135+
}
136+
137+
apply_module_source() {
138+
local registry
139+
registry="$(base64 -d <<< "$DEV_REGISTRY_DOCKER_CFG" | jq '.auths | to_entries | .[] | .key' -r)"
140+
141+
echo "[INFO] Apply ModuleSource dev config"
142+
kubectl_apply_with_retry <<EOF
143+
apiVersion: deckhouse.io/v1alpha1
144+
kind: ModuleSource
145+
metadata:
146+
name: deckhouse-dev
147+
spec:
148+
registry:
149+
ca: ""
150+
dockerCfg: "${DEV_REGISTRY_DOCKER_CFG}"
151+
repo: "${registry}/sys/deckhouse-oss/modules"
152+
scheme: HTTPS
153+
EOF
154+
}
155+
156+
apply_virtualization_module_config() {
157+
echo "[INFO] Apply Virtualization module config"
158+
kubectl_apply_with_retry <<EOF
159+
apiVersion: deckhouse.io/v1alpha1
160+
kind: ModuleConfig
161+
metadata:
162+
name: virtualization
163+
spec:
164+
enabled: true
165+
settings:
166+
dvcr:
167+
storage:
168+
persistentVolumeClaim:
169+
size: 10Gi
170+
storageClassName: ${NESTED_STORAGE_CLASS_NAME}
171+
type: PersistentVolumeClaim
172+
virtualMachineCIDRs:
173+
- 192.168.10.0/24
174+
source: deckhouse-dev
175+
version: 1
176+
---
177+
apiVersion: deckhouse.io/v1alpha2
178+
kind: ModulePullOverride
179+
metadata:
180+
name: virtualization
181+
spec:
182+
imageTag: ${VIRTUALIZATION_TAG}
183+
scanInterval: 120h
184+
EOF
185+
}
186+
187+
show_virtualization_config() {
188+
echo "[INFO] Show ModuleSource"
189+
kubectl get ms
190+
191+
echo "[INFO] Show module config virtualization info"
192+
kubectl get mc virtualization
193+
194+
echo "[INFO] Show ModulePullOverride virtualization info"
195+
kubectl get mpo virtualization
196+
}
197+
198+
apply_module_source
199+
wait_for_modulesource_active
200+
wait_for_deckhouse_queue
201+
wait_for_virtualization_dev_source
202+
wait_for_deckhouse_queue
203+
apply_virtualization_module_config
204+
show_virtualization_config
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
3+
show_deckhouse_state() {
4+
echo "[DEBUG] Show deckhouse pods"
5+
kubectl -n d8-system get pods -l app=deckhouse -o wide || true
6+
echo "[DEBUG] Show queue (first 25 lines)"
7+
d8 s queue list | head -n25 || true
8+
}
9+
10+
wait_for_deckhouse_queue() {
11+
local count=60
12+
local delay=10
13+
local queue_count
14+
15+
for i in $(seq 1 "$count"); do
16+
queue_count="$(d8 s queue list | grep -Po '([0-9]+)(?= active)' || true)"
17+
echo "[INFO] Wait until Deckhouse queue is empty ${i}/${count}, active=${queue_count:-unknown}"
18+
19+
if [ "$queue_count" = "0" ]; then
20+
echo "[SUCCESS] Deckhouse queue is empty"
21+
return 0
22+
fi
23+
24+
if (( i % 5 == 0 )); then
25+
show_deckhouse_state
26+
fi
27+
28+
if [ "$i" -lt "$count" ]; then
29+
sleep "$delay"
30+
fi
31+
done
32+
33+
echo "[ERROR] Deckhouse queue is not empty"
34+
show_deckhouse_state
35+
return 1
36+
}

0 commit comments

Comments
 (0)