@@ -16,6 +16,8 @@ DEVWORKSPACE_LINK="https://gist.githubusercontent.com/rohanKanojia/ecf625afaf3fe
1616MAX_VUS=" 100"
1717DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS=" 1200"
1818SEPARATE_NAMESPACES=" false"
19+ DELETE_DEVWORKSPACE_AFTER_READY=" true"
20+ MAX_DEVWORKSPACES=" -1"
1921CREATE_AUTOMOUNT_RESOURCES=" false"
2022LOGS_DIR=" logs"
2123TEST_DURATION_IN_MINUTES=" 25"
@@ -57,7 +59,9 @@ Usage: $0 [options]
5759Options:
5860 --mode <operator|binary> Mode to run the script (default: operator)
5961 --max-vus <int> Number of virtual users for k6 (default: 100)
62+ --max-devworkspaces <int> Maximum number of DevWorkspaces to create (by default, it's not specified)
6063 --separate-namespaces <true|false> Use separate namespaces for workspaces (default: false)
64+ --delete-devworkspace-after-ready Delete DevWorkspace once it becomes Ready (default: true)
6165 --devworkspace-ready-timeout-seconds <int> Timeout in seconds for workspace to become ready (default: 1200)
6266 --devworkspace-link <string> DevWorkspace link (default: empty, opinionated DevWorkspace is created)
6367 --create-automount-resources <true|false> Whether to create automount resources (default: false)
@@ -77,6 +81,10 @@ parse_arguments() {
7781 MAX_VUS=" $2 " ; shift 2;;
7882 --separate-namespaces)
7983 SEPARATE_NAMESPACES=" $2 " ; shift 2;;
84+ --max-devworkspaces)
85+ MAX_DEVWORKSPACES=" $2 " ; shift 2;;
86+ --delete-devworkspace-after-ready)
87+ DELETE_DEVWORKSPACE_AFTER_READY=" $2 " ; shift 2;;
8088 --devworkspace-ready-timeout-seconds)
8189 DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS=" $2 " ; shift 2;;
8290 --devworkspace-link)
@@ -173,11 +181,40 @@ start_background_watchers() {
173181 kubectl get dw --watch --all-namespaces \
174182 >> " ${LOGS_DIR} /${TIMESTAMP} _dw_watch.log" 2>&1 &
175183 PID_DW_WATCH=$!
184+
185+ log_failed_devworkspaces &
186+ PID_FAILED_DW_POLL=$!
187+ }
188+
189+ log_failed_devworkspaces () {
190+ echo " 📄 Starting periodic failed DevWorkspaces report (every 10s)..."
191+
192+ POLL_INTERVAL=10 # in seconds
193+ ITERATIONS=$(( (TEST_DURATION_IN_MINUTES * 60 ) / POLL_INTERVAL))
194+
195+ for (( i = 0 ; i < ITERATIONS; i++ )) ; do
196+ OUTPUT=$( kubectl get devworkspaces --all-namespaces -o json | jq -r '
197+ .items[]
198+ | select(.status.phase == "Failed")
199+ | [
200+ .metadata.namespace,
201+ .metadata.name,
202+ .status.phase,
203+ (.status.message // "No message")
204+ ]
205+ | @csv' )
206+
207+ if [ -n " $OUTPUT " ]; then
208+ echo " $OUTPUT " > " ${LOGS_DIR} /dw_failure_report.csv"
209+ fi
210+
211+ sleep " $POLL_INTERVAL "
212+ done
176213}
177214
178215stop_background_watchers () {
179216 echo " 🛑 Stopping background watchers..."
180- kill " $PID_EVENTS_WATCH " " $PID_DW_WATCH " 2> /dev/null || true
217+ kill " $PID_EVENTS_WATCH " " $PID_DW_WATCH " " $PID_FAILED_DW_POLL " 2> /dev/null || true
181218}
182219
183220install_k6_operator () {
@@ -235,6 +272,10 @@ spec:
235272 value: '${TEST_DURATION_IN_MINUTES} '
236273 - name: DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS
237274 value: '${DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS} '
275+ - name: DELETE_DEVWORKSPACE_AFTER_READY
276+ value: '${DELETE_DEVWORKSPACE_AFTER_READY} '
277+ - name: MAX_DEVWORKSPACES
278+ value: '${MAX_DEVWORKSPACES} '
238279EOF
239280}
240281
@@ -330,6 +371,8 @@ run_k6_binary_test() {
330371 MAX_VUS=" ${MAX_VUS} " \
331372 TEST_DURATION_IN_MINUTES=" ${TEST_DURATION_IN_MINUTES} " \
332373 DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS=" ${DEV_WORKSPACE_READY_TIMEOUT_IN_SECONDS} " \
374+ DELETE_DEVWORKSPACE_AFTER_READY=" ${DELETE_DEVWORKSPACE_AFTER_READY} " \
375+ MAX_DEVWORKSPACES=" ${MAX_DEVWORKSPACES} " \
333376 k6 run " ${K6_SCRIPT} "
334377 exit_code=$?
335378 if [ $exit_code -ne 0 ]; then
@@ -338,4 +381,5 @@ run_k6_binary_test() {
338381 return 0
339382}
340383
384+ trap stop_background_watchers EXIT
341385main " $@ "
0 commit comments