-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhf.workflow.sh
More file actions
executable file
·243 lines (192 loc) · 6.38 KB
/
hf.workflow.sh
File metadata and controls
executable file
·243 lines (192 loc) · 6.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#!/bin/bash
# Real adapter workflow: exercises the full cluster/nodepool lifecycle and waits
# for real adapters to report status instead of simulating them via API posts.
#
# Steps:
# - generate a random name to identify the test
# - create a cluster
# - show cluster table
# - wait for Ready=True (adapters converge)
# - patch cluster labels
# - show cluster table
# - wait for Ready=False (generation bump makes it not-ready)
# - wait for Ready=True (adapters reconverge)
# - patch cluster spec
# - show cluster table
# - wait for Ready=False
# - wait for Ready=True
# - create a nodepool
# - show nodepool table
# - wait for nodepool Ready=True
# - patch nodepool labels
# - show nodepool table
# - wait for nodepool Ready=False
# - wait for nodepool Ready=True
# - patch nodepool spec
# - show nodepool table
# - wait for nodepool Ready=False
# - wait for nodepool Ready=True
# - delete the cluster
# - show cluster table
# - wait for cluster Ready=True (deletion acknowledged)
# - show nodepool table
# - wait for nodepool Ready=True (deletion acknowledged)
source "$(dirname "$(realpath "$0")")/hf.lib.sh"
hf_require_config api-url api-version
hf_require_jq
DIR="$(dirname "$(realpath "$0")")"
# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------
_step() {
echo ""
echo -e "${BOLD}${CYAN}==> $*${NC}"
}
_expect() {
echo -e "${BOLD}${YELLOW}>>> Expected: $*${NC}"
}
# Poll until status.conditions[type=Ready].status equals $3.
# Usage: _wait_ready <cluster|nodepool> <id> <True|False> [timeout_secs]
_wait_ready() {
local resource="$1"
local id="$2"
local expected="$3"
local timeout="${4:-120}"
local interval=3
local elapsed=0
local url
case "$resource" in
cluster)
url="${HF_API_URL}/api/hyperfleet/${HF_API_VERSION}/clusters/${id}"
;;
nodepool)
local cluster_id
cluster_id=$(hf_cluster_id)
url="${HF_API_URL}/api/hyperfleet/${HF_API_VERSION}/clusters/${cluster_id}/nodepools/${id}"
;;
*)
hf_die "Unknown resource type: $resource"
;;
esac
hf_info "Waiting for $resource Ready=$expected (timeout ${timeout}s)..."
while true; do
local status
status=$(curl -s "$url" | jq -r '
.status.conditions // [] |
map(select(.type == "Ready")) |
.[0].status // "Unknown"
')
if [[ "$status" == "$expected" ]]; then
hf_info " $resource Ready=$status ✓"
return 0
fi
if (( elapsed >= timeout )); then
hf_error "Timed out after ${timeout}s waiting for $resource Ready=$expected (current: $status)"
return 1
fi
printf "\r %s Ready=%-7s waiting... %ds" "$resource" "$status" "$elapsed"
sleep "$interval"
elapsed=$(( elapsed + interval ))
done
}
# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
TEST_ID="$(openssl rand -hex 4)"
CLUSTER_NAME="test-${TEST_ID}"
NODEPOOL_NAME="test-${TEST_ID}"
hf_info "Starting workflow: $TEST_ID"
hf_info " Cluster: $CLUSTER_NAME"
hf_info " NodePool: $NODEPOOL_NAME"
# ---------------------------------------------------------------------------
# Cluster lifecycle
# ---------------------------------------------------------------------------
_step "Creating cluster: $CLUSTER_NAME"
"$DIR/hf.cluster.create.sh" "$CLUSTER_NAME"
CLUSTER_ID=$(hf_cluster_id)
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=False (just created)"
_step "Waiting for cluster to become Ready"
_wait_ready cluster "$CLUSTER_ID" True
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=True"
_step "Patching cluster labels"
"$DIR/hf.cluster.patch.sh" labels
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=False (generation bumped)"
_step "Waiting for cluster to become Ready again"
_wait_ready cluster "$CLUSTER_ID" True
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=True"
_step "Patching cluster spec"
"$DIR/hf.cluster.patch.sh" spec
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=False (generation bumped)"
_step "Waiting for cluster to become Ready again"
_wait_ready cluster "$CLUSTER_ID" True
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=True"
# ---------------------------------------------------------------------------
# NodePool lifecycle
# ---------------------------------------------------------------------------
_step "Creating nodepool: $NODEPOOL_NAME"
"$DIR/hf.nodepool.create.sh" "$NODEPOOL_NAME"
NODEPOOL_ID=$(hf_nodepool_id)
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=False (just created)"
_step "Waiting for nodepool to become Ready"
_wait_ready nodepool "$NODEPOOL_ID" True
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=True"
_step "Patching nodepool labels"
"$DIR/hf.nodepool.patch.sh" labels
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=False (generation bumped)"
_step "Waiting for nodepool to become Ready again"
_wait_ready nodepool "$NODEPOOL_ID" True
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=True"
_step "Patching nodepool spec"
"$DIR/hf.nodepool.patch.sh" spec
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=False (generation bumped)"
_step "Waiting for nodepool to become Ready again"
_wait_ready nodepool "$NODEPOOL_ID" True
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=True"
# ---------------------------------------------------------------------------
# Cluster deletion
# ---------------------------------------------------------------------------
_step "Deleting cluster: $CLUSTER_NAME"
"$DIR/hf.cluster.delete.sh"
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=False (deletion in progress)"
_step "Waiting for cluster deletion to be acknowledged"
_wait_ready cluster "$CLUSTER_ID" True
_step "Cluster table"
"$DIR/hf.cluster.table.sh"
_expect "Ready=True"
# ---------------------------------------------------------------------------
# NodePool post-deletion
# ---------------------------------------------------------------------------
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=False (cluster deleted)"
_step "Waiting for nodepool deletion to be acknowledged"
_wait_ready nodepool "$NODEPOOL_ID" True
_step "NodePool table"
"$DIR/hf.nodepool.table.sh"
_expect "Ready=True"