Skip to content

Commit 91c3145

Browse files
committed
feat(cypress): add interactive environment configuration script
1 parent 9a7a190 commit 91c3145

1 file changed

Lines changed: 353 additions & 0 deletions

File tree

web/cypress/configure-env.sh

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
#!/usr/bin/env bash
2+
3+
# Only set strict error handling when not sourced
4+
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
5+
set -euo pipefail
6+
fi
7+
8+
# Generated with Claude Code – Gemini 2.5
9+
#
10+
# Interactive configurator for Cypress environment variables used by this repo's tests.
11+
#
12+
# How to use:
13+
# 1) To set variables in your current shell: source this file
14+
# source ./configure-env.sh
15+
# 2) To generate an exports file and source it later: run normally and then source the output
16+
# ./configure-env.sh
17+
# source ./export-env.sh
18+
# 3) To show current configuration without making changes:
19+
# ./configure-env.sh --show
20+
21+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22+
OUTPUT_FILE_DEFAULT="$SCRIPT_DIR/export-env.sh"
23+
24+
is_sourced() {
25+
# Returns 0 if sourced, 1 if executed
26+
[[ "${BASH_SOURCE[0]}" != "$0" ]]
27+
}
28+
29+
print_header() {
30+
echo "";
31+
echo "========================================";
32+
echo "Cypress environment setup";
33+
echo "========================================";
34+
echo "This will configure variables used by tests in web/cypress.";
35+
echo "Values in parentheses are defaults (press Enter to accept).";
36+
echo "";
37+
}
38+
39+
print_usage() {
40+
cat <<'EOF'
41+
Usage: configure-env.sh [--show] [--help]
42+
43+
Options:
44+
--show, -s Show current values of Cypress environment variables and exit
45+
--help, -h Show this help and exit
46+
47+
Run without flags to be interactively prompted and either export to current shell (if sourced) or write an export file.
48+
EOF
49+
}
50+
51+
ask() {
52+
# Usage: ask "Prompt" "default"
53+
local prompt=$1
54+
local default_value=${2-}
55+
local input
56+
if [[ -n "$default_value" ]]; then
57+
read -r -p "$prompt [$default_value]: " input || true
58+
echo "${input:-$default_value}"
59+
else
60+
read -r -p "$prompt: " input || true
61+
echo "$input"
62+
fi
63+
}
64+
65+
ask_required() {
66+
# Usage: ask_required "Prompt" "default"
67+
local prompt=$1
68+
local default_value=${2-}
69+
local value
70+
while true; do
71+
value=$(ask "$prompt" "$default_value")
72+
if [[ -n "$value" ]]; then
73+
echo "$value"
74+
return 0
75+
fi
76+
echo "Value is required. Please enter a value." 1>&2
77+
done
78+
}
79+
80+
ask_yes_no() {
81+
# Usage: ask_yes_no "Prompt" "default_y_or_n"
82+
local prompt=$1
83+
local default_answer=${2:-n}
84+
local suffix="[y/N]"
85+
[[ "$default_answer" =~ ^[Yy]$ ]] && suffix="[Y/n]"
86+
local yn
87+
while true; do
88+
read -r -p "$prompt $suffix: " yn || true
89+
yn=${yn:-$default_answer}
90+
case "$yn" in
91+
[Yy]|[Yy][Ee][Ss]) echo "y"; return 0;;
92+
[Nn]|[Nn][Oo]) echo "n"; return 0;;
93+
"") [[ "$default_answer" =~ ^[Yy]$ ]] && echo "y" || echo "n"; return 0;;
94+
esac
95+
echo "Please answer y or n." 1>&2
96+
done
97+
}
98+
99+
bool_to_default_yn() {
100+
# Map truthy/falsey env values to y/n default for yes/no prompts
101+
local v=${1-}
102+
case "${v,,}" in
103+
true|1|yes|y) echo "y" ;;
104+
false|0|no|n|"") echo "n" ;;
105+
*) echo "n" ;;
106+
esac
107+
}
108+
109+
escape_for_single_quotes() {
110+
# Escape single quotes for use inside single-quoted strings
111+
# shellcheck disable=SC2001
112+
sed "s/'/'\\''/g"
113+
}
114+
115+
write_exports_file() {
116+
local file_path=$1
117+
shift
118+
local -a lines=("$@")
119+
{
120+
echo "# Generated by configure-env.sh on $(date -u '+%Y-%m-%dT%H:%M:%SZ')"
121+
echo "# shellcheck shell=bash"
122+
echo "# Source this file to export Cypress variables for this repository"
123+
echo ""
124+
for line in "${lines[@]}"; do
125+
echo "$line"
126+
done
127+
} > "$file_path"
128+
echo "Wrote $file_path"
129+
}
130+
131+
print_current_config() {
132+
echo ""
133+
echo "Current Cypress configuration:"
134+
local v
135+
136+
# helper to print name/value with [unset]
137+
local print_var
138+
print_var() {
139+
local name=$1
140+
local value=${2-}
141+
if [[ -z "${value:-}" ]]; then
142+
echo " $name: [unset]"
143+
else
144+
echo " $name: $value"
145+
fi
146+
}
147+
148+
# BASE_URL
149+
print_var "CYPRESS_BASE_URL" "${CYPRESS_BASE_URL-}"
150+
151+
# LOGIN_IDP
152+
print_var "CYPRESS_LOGIN_IDP" "${CYPRESS_LOGIN_IDP-}"
153+
154+
# LOGIN_USERS (mask password if present)
155+
v=${CYPRESS_LOGIN_USERS-}
156+
if [[ -n "${v:-}" && "$v" == *:* ]]; then
157+
v="${v%%:*}:********"
158+
fi
159+
print_var "CYPRESS_LOGIN_USERS" "$v"
160+
161+
# KUBECONFIG_PATH with existence note
162+
v=${CYPRESS_KUBECONFIG_PATH-}
163+
if [[ -n "${v:-}" && ! -f "$v" ]]; then
164+
v+=" (file not found)"
165+
fi
166+
print_var "CYPRESS_KUBECONFIG_PATH" "$v"
167+
168+
# Optional vars
169+
print_var "CYPRESS_MP_IMAGE" "${CYPRESS_MP_IMAGE-}"
170+
print_var "CYPRESS_SKIP_COO_INSTALL" "${CYPRESS_SKIP_COO_INSTALL-}"
171+
print_var "CYPRESS_COO_UI_INSTALL" "${CYPRESS_COO_UI_INSTALL-}"
172+
print_var "CYPRESS_KONFLUX_COO_BUNDLE_IMAGE" "${CYPRESS_KONFLUX_COO_BUNDLE_IMAGE-}"
173+
print_var "CYPRESS_CUSTOM_COO_BUNDLE_IMAGE" "${CYPRESS_CUSTOM_COO_BUNDLE_IMAGE-}"
174+
print_var "CYPRESS_MCP_CONSOLE_IMAGE" "${CYPRESS_MCP_CONSOLE_IMAGE-}"
175+
}
176+
177+
main() {
178+
# Flags
179+
local mode_show=false
180+
while [[ $# -gt 0 ]]; do
181+
case "$1" in
182+
--show|-s)
183+
mode_show=true
184+
shift
185+
;;
186+
--help|-h)
187+
print_usage
188+
return 0
189+
;;
190+
*)
191+
echo "Unknown option: $1" 1>&2
192+
print_usage
193+
return 1
194+
;;
195+
esac
196+
done
197+
198+
if $mode_show; then
199+
print_current_config
200+
return 0
201+
fi
202+
print_header
203+
204+
# Defaults from current environment if present
205+
local def_base_url=${CYPRESS_BASE_URL-}
206+
local def_login_idp=${CYPRESS_LOGIN_IDP-}
207+
local def_login_users=${CYPRESS_LOGIN_USERS-}
208+
local def_kubeconfig=${CYPRESS_KUBECONFIG_PATH-${KUBECONFIG-}}
209+
local def_mp_image=${CYPRESS_MP_IMAGE-}
210+
local def_skip_coo=${CYPRESS_SKIP_COO_INSTALL-}
211+
local def_coo_ui_install=${CYPRESS_COO_UI_INSTALL-}
212+
local def_konflux_bundle=${CYPRESS_KONFLUX_COO_BUNDLE_IMAGE-}
213+
local def_custom_coo_bundle=${CYPRESS_CUSTOM_COO_BUNDLE_IMAGE-}
214+
local def_mcp_console_image=${CYPRESS_MCP_CONSOLE_IMAGE-}
215+
216+
# Required basics
217+
local base_url
218+
while true; do
219+
base_url=$(ask_required "Console base URL (e.g. https://console-openshift-console.apps.<cluster>)" "$def_base_url")
220+
if [[ "$base_url" =~ ^https?:// ]]; then
221+
break
222+
fi
223+
echo "Must start with http:// or https://" 1>&2
224+
done
225+
226+
echo ""
227+
echo "Login method"
228+
echo " 1) kubeadmin (kube:admin)"
229+
echo " 2) Custom identity provider"
230+
local login_choice
231+
while true; do
232+
login_choice=$(ask "Choose 1 or 2" "${def_login_idp:+2}")
233+
case "$login_choice" in
234+
1)
235+
def_login_idp="kube:admin"
236+
;;
237+
2|"")
238+
:
239+
;;
240+
*) echo "Please enter 1 or 2." 1>&2; continue;;
241+
esac
242+
break
243+
done
244+
245+
local login_idp
246+
if [[ "${def_login_idp:-}" == "kube:admin" || "$login_choice" == "1" ]]; then
247+
login_idp="kube:admin"
248+
else
249+
login_idp=$(ask_required "Login identity provider name" "${def_login_idp:-flexy-htpasswd-provider}")
250+
fi
251+
252+
local login_user login_pass login_users
253+
if [[ "$login_idp" == "kube:admin" ]]; then
254+
login_user="kubeadmin"
255+
login_pass=$(ask_required "kubeadmin password" "${def_login_users##*:}")
256+
else
257+
login_user=$(ask_required "Username" "${def_login_users%%:*}")
258+
login_pass=$(ask_required "Password" "${def_login_users##*:}")
259+
fi
260+
login_users="$login_user:$login_pass"
261+
262+
local kubeconfig_default
263+
if [[ -n "$def_kubeconfig" ]]; then
264+
kubeconfig_default="$def_kubeconfig"
265+
elif [[ -f "$HOME/Downloads/kubeconfig" ]]; then
266+
kubeconfig_default="$HOME/Downloads/kubeconfig"
267+
else
268+
kubeconfig_default=""
269+
fi
270+
local kubeconfig
271+
kubeconfig=$(ask_required "Path to kubeconfig" "$kubeconfig_default")
272+
if [[ ! -f "$kubeconfig" ]]; then
273+
echo "Warning: file does not exist at $kubeconfig" 1>&2
274+
fi
275+
276+
echo ""
277+
echo "Optional settings"
278+
local mp_image
279+
mp_image=$(ask "Custom Monitoring Plugin image (CYPRESS_MP_IMAGE)" "$def_mp_image")
280+
281+
local skip_coo_install_ans
282+
skip_coo_install_ans=$(ask_yes_no "Skip Cluster Observability installation? (sets CYPRESS_SKIP_COO_INSTALL)" "$(bool_to_default_yn "$def_skip_coo")")
283+
local skip_coo_install="false"
284+
[[ "$skip_coo_install_ans" == "y" ]] && skip_coo_install="true"
285+
286+
local coo_ui_install_ans
287+
coo_ui_install_ans=$(ask_yes_no "Install COO from redhat-operators? (sets CYPRESS_COO_UI_INSTALL)" "$(bool_to_default_yn "$def_coo_ui_install")")
288+
local coo_ui_install="false"
289+
[[ "$coo_ui_install_ans" == "y" ]] && coo_ui_install="true"
290+
291+
local konflux_bundle
292+
konflux_bundle=$(ask "Konflux COO bundle image (CYPRESS_KONFLUX_COO_BUNDLE_IMAGE)" "$def_konflux_bundle")
293+
294+
local custom_coo_bundle
295+
custom_coo_bundle=$(ask "Custom COO bundle image (CYPRESS_CUSTOM_COO_BUNDLE_IMAGE)" "$def_custom_coo_bundle")
296+
297+
local mcp_console_image
298+
mcp_console_image=$(ask "Monitoring Console Plugin UI image (CYPRESS_MCP_CONSOLE_IMAGE)" "$def_mcp_console_image")
299+
300+
# Build export lines with safe quoting
301+
local -a export_lines
302+
export_lines+=("export CYPRESS_BASE_URL='$(printf %s "$base_url" | escape_for_single_quotes)'" )
303+
export_lines+=("export CYPRESS_LOGIN_IDP='$(printf %s "$login_idp" | escape_for_single_quotes)'" )
304+
export_lines+=("export CYPRESS_LOGIN_USERS='$(printf %s "$login_users" | escape_for_single_quotes)'" )
305+
export_lines+=("export CYPRESS_KUBECONFIG_PATH='$(printf %s "$kubeconfig" | escape_for_single_quotes)'" )
306+
if [[ -n "$mp_image" ]]; then
307+
export_lines+=("export CYPRESS_MP_IMAGE='$(printf %s "$mp_image" | escape_for_single_quotes)'" )
308+
fi
309+
export_lines+=("export CYPRESS_SKIP_COO_INSTALL='$(printf %s "$skip_coo_install" | escape_for_single_quotes)'" )
310+
export_lines+=("export CYPRESS_COO_UI_INSTALL='$(printf %s "$coo_ui_install" | escape_for_single_quotes)'" )
311+
if [[ -n "$konflux_bundle" ]]; then
312+
export_lines+=("export CYPRESS_KONFLUX_COO_BUNDLE_IMAGE='$(printf %s "$konflux_bundle" | escape_for_single_quotes)'" )
313+
fi
314+
if [[ -n "$custom_coo_bundle" ]]; then
315+
export_lines+=("export CYPRESS_CUSTOM_COO_BUNDLE_IMAGE='$(printf %s "$custom_coo_bundle" | escape_for_single_quotes)'" )
316+
fi
317+
if [[ -n "$mcp_console_image" ]]; then
318+
export_lines+=("export CYPRESS_MCP_CONSOLE_IMAGE='$(printf %s "$mcp_console_image" | escape_for_single_quotes)'" )
319+
fi
320+
321+
echo ""
322+
if is_sourced; then
323+
# Export directly into current shell
324+
for line in "${export_lines[@]}"; do
325+
eval "$line"
326+
done
327+
echo "Exported variables into current shell."
328+
else
329+
# Write to file so the user can source it
330+
local output_file
331+
output_file=$(ask "Write exports to file" "$OUTPUT_FILE_DEFAULT")
332+
write_exports_file "$output_file" "${export_lines[@]}"
333+
echo "To load them into your shell, run:"
334+
echo " source \"$output_file\""
335+
fi
336+
337+
echo ""
338+
echo "Configured values:"
339+
echo " CYPRESS_BASE_URL=$CYPRESS_BASE_URL"
340+
echo " CYPRESS_LOGIN_IDP=${CYPRESS_LOGIN_IDP:-$login_idp}"
341+
echo " CYPRESS_LOGIN_USERS=${CYPRESS_LOGIN_USERS:-$login_users}"
342+
echo " CYPRESS_KUBECONFIG_PATH=${CYPRESS_KUBECONFIG_PATH:-$kubeconfig}"
343+
[[ -n "${CYPRESS_MP_IMAGE-}$mp_image" ]] && echo " CYPRESS_MP_IMAGE=${CYPRESS_MP_IMAGE:-$mp_image}"
344+
echo " CYPRESS_SKIP_COO_INSTALL=${CYPRESS_SKIP_COO_INSTALL:-$skip_coo_install}"
345+
echo " CYPRESS_COO_UI_INSTALL=${CYPRESS_COO_UI_INSTALL:-$coo_ui_install}"
346+
[[ -n "${CYPRESS_KONFLUX_COO_BUNDLE_IMAGE-}$konflux_bundle" ]] && echo " CYPRESS_KONFLUX_COO_BUNDLE_IMAGE=${CYPRESS_KONFLUX_COO_BUNDLE_IMAGE:-$konflux_bundle}"
347+
[[ -n "${CYPRESS_CUSTOM_COO_BUNDLE_IMAGE-}$custom_coo_bundle" ]] && echo " CYPRESS_CUSTOM_COO_BUNDLE_IMAGE=${CYPRESS_CUSTOM_COO_BUNDLE_IMAGE:-$custom_coo_bundle}"
348+
[[ -n "${CYPRESS_MCP_CONSOLE_IMAGE-}$mcp_console_image" ]] && echo " CYPRESS_MCP_CONSOLE_IMAGE=${CYPRESS_MCP_CONSOLE_IMAGE:-$mcp_console_image}"
349+
}
350+
351+
main "$@"
352+
353+

0 commit comments

Comments
 (0)