Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
e4aedbf
ci(hot-cluster): Add POC hot-cluster CI workflow
sjd78 Mar 9, 2026
030ce03
Setup "ci-env" using helm "ci-test-stack" to manage CI test environments
sjd78 Apr 14, 2026
f77b00c
push some ci-test-stack changes, include rolebinding instead of in th…
sjd78 Apr 22, 2026
57ff3f5
rearrange the custom images
sjd78 Apr 23, 2026
d8767e7
simplify arc scripts
sjd78 Apr 23, 2026
6b95ab8
test2: patch kubevirt-user-settings
sjd78 Apr 22, 2026
85b115f
migrate ci-env to a helm chart
sjd78 Apr 23, 2026
72e66f5
update installs so everything works nicely
sjd78 Apr 23, 2026
2dd4a93
docs(ci): fix workflow name typo in README
sjd78 Apr 30, 2026
9ce2f10
ci(poc-test2): run check-runner and build-plugin-image in parallel
sjd78 Apr 30, 2026
7850354
ci-env-controller: add helpful deployment notes
sjd78 May 12, 2026
02b713c
docs(ci): add POC_OUTLINE.md
sjd78 May 12, 2026
06a031e
CNV-74265: Rename hot-cluster workflows and consolidate docs
galkremer1 Jun 17, 2026
488c0a9
Fix IC_KEY config
galkremer1 Jun 17, 2026
136ac4b
ci(hot-cluster): fix setup workflow script paths and install ci-env-c…
galkremer1 Jun 23, 2026
5a6ef99
ci(hot-cluster): log IBM Cloud infra-permissions in setup workflow
galkremer1 Jun 24, 2026
8778a06
ci(hot-cluster): map worker zone to infra-permissions region
galkremer1 Jun 24, 2026
005efee
ci(hot-cluster): make IAM diagnostics visible in logs and artifacts
galkremer1 Jun 24, 2026
7569633
ci(hot-cluster): add VPC Gen2 provisioning path alongside classic
galkremer1 Jun 24, 2026
ce0fcfc
ci(hot-cluster): auto-create COS instance for VPC if not provided
galkremer1 Jun 24, 2026
1346c97
ci(hot-cluster): fix COS instance creation (no --output json support)
galkremer1 Jun 24, 2026
ba9457e
ci(hot-cluster): fix COS plan name for non-interactive creation
galkremer1 Jun 24, 2026
dec458b
ci(hot-cluster): use COS standard plan ID for unambiguous creation
galkremer1 Jun 24, 2026
474dbd8
ci(hot-cluster): specify COS deployment name to avoid interactive prompt
galkremer1 Jun 24, 2026
bb89825
ci(hot-cluster): add IPI prerequisite checks to IAM diagnostics
galkremer1 Jun 24, 2026
660062d
ci(hot-cluster): add ipi diagnostics-only mode to setup workflow
galkremer1 Jun 24, 2026
2aa1b33
ci(hot-cluster): add IPI cluster creation path (experimental)
galkremer1 Jun 24, 2026
cf4e298
ci(hot-cluster): fix IPI flavor format (bx2-4x16 not bx2.4x16)
galkremer1 Jun 24, 2026
344365a
docs: add hot cluster CI status and follow-up guide
galkremer1 Jun 24, 2026
d878863
ci(hot-cluster): use cnv-ui.com as IPI baseDomain
galkremer1 Jun 24, 2026
33af1b0
ci(hot-cluster): use existing cnv-ui resource group for IPI
galkremer1 Jun 24, 2026
a3fb934
ci(hot-cluster): production cleanup and IPI bootstrap fix
galkremer1 Jun 24, 2026
cd8da56
ci: trigger workflow re-index
galkremer1 Jun 24, 2026
4e504a7
ci(hot-cluster): fix invalid YAML from heredoc and use template file
galkremer1 Jun 24, 2026
533f9ff
ci(hot-cluster): install oc + ccoctl before manifest generation
galkremer1 Jun 24, 2026
c0ff42c
ci(hot-cluster): fix kubeconfig path and add debug output
galkremer1 Jun 24, 2026
59fef6c
ci(hot-cluster): add one-off IPI destroy workflow for orphaned clusters
galkremer1 Jun 24, 2026
06b4c82
ci(hot-cluster): auto-cleanup old IPI resources before new install
galkremer1 Jun 24, 2026
65b7ace
ci(hot-cluster): scope IPI cleanup to DNS records only, by exact clus…
galkremer1 Jun 24, 2026
9d29c5f
ci(hot-cluster): remove ccoctl/manual credentials, let installer hand…
galkremer1 Jun 24, 2026
bbc85f2
ci(hot-cluster): fix IPI credentials with manual secret generation
galkremer1 Jun 25, 2026
150c2e0
ci(hot-cluster): move IPI cleanup to end of job, destroy on any failure
galkremer1 Jun 25, 2026
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
11 changes: 9 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
**/node_modules
dist/
node_modules/
.cursor/
.github/
.husky/
.vscode/

coverage/
cypress/
dist/

*.env
58 changes: 58 additions & 0 deletions .github/actions/ci-env-release/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Release CI Test Environment
description: >
Signal the ci-env-controller to tear down a test environment by patching
the trigger ConfigMap to desired-state=absent, then wait for cleanup to
complete and delete the ConfigMap.

inputs:
configmap-name:
description: Name of the trigger ConfigMap
required: true
ci-env-namespace:
description: Namespace where ci-env-controller runs
default: ci-env
timeout:
description: Max seconds to wait for cleanup to complete
default: '300'

runs:
using: composite
steps:
- name: Release environment
shell: bash
env:
CM_NAME: ${{ inputs.configmap-name }}
CM_NS: ${{ inputs.ci-env-namespace }}
TIMEOUT: ${{ inputs.timeout }}
run: |
if ! oc get configmap "${CM_NAME}" -n "${CM_NS}" &>/dev/null; then
echo "ConfigMap ${CM_NS}/${CM_NAME} not found, nothing to clean up."
exit 0
fi

oc patch configmap "${CM_NAME}" -n "${CM_NS}" \
--type merge -p '{"data":{"desired-state":"absent"}}'

echo "Waiting for controller to clean up..."
INTERVAL=5
ELAPSED=0

while true; do
STATUS="$(oc get configmap "${CM_NAME}" -n "${CM_NS}" \
-o jsonpath='{.data.status}' 2>/dev/null || echo "")"

if [[ "${STATUS}" == "cleaned" ]]; then
echo "Cleanup complete."
break
fi

if (( ELAPSED >= TIMEOUT )); then
echo "::warning::Timed out waiting for controller cleanup (status=${STATUS})"
break
fi

sleep "${INTERVAL}"
ELAPSED=$(( ELAPSED + INTERVAL ))
done

oc delete configmap "${CM_NAME}" -n "${CM_NS}" 2>/dev/null || true
124 changes: 124 additions & 0 deletions .github/actions/ci-env-request/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
name: Request CI Test Environment
description: >
Create a trigger ConfigMap for the ci-env-controller and wait until the
test environment (namespace, console, plugin) is provisioned and ready.

inputs:
plugin-image:
description: Plugin container image to deploy
required: true
test-namespace:
description: Kubernetes namespace for the test environment
required: true
configmap-name:
description: Name of the trigger ConfigMap
required: true
ci-env-namespace:
description: Namespace where ci-env-controller runs
default: ci-env
timeout:
description: Max seconds to wait for environment to become ready
default: '360'

outputs:
bridge-base-address:
description: In-cluster URL for the console bridge
value: ${{ steps.wait.outputs.bridge-base-address }}
console-route:
description: External HTTPS route for the console
value: ${{ steps.wait.outputs.console-route }}

runs:
using: composite
steps:
- name: Create trigger ConfigMap
shell: bash
run: |
cat <<EOF | oc create -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: ${{ inputs.configmap-name }}
namespace: ${{ inputs.ci-env-namespace }}
labels:
ci.kubevirt-plugin/type: test-environment
data:
desired-state: "present"
plugin-image: "${{ inputs.plugin-image }}"
test-namespace: "${{ inputs.test-namespace }}"
EOF
echo "Created trigger ConfigMap ${{ inputs.configmap-name }} in ${{ inputs.ci-env-namespace }}"

- name: Wait for environment ready
id: wait
shell: bash
env:
CM_NAME: ${{ inputs.configmap-name }}
CM_NS: ${{ inputs.ci-env-namespace }}
TIMEOUT: ${{ inputs.timeout }}
run: |
echo "Waiting for ci-env-controller to provision the test environment..."
INTERVAL=10
ELAPSED=0

while true; do
STATUS="$(oc get configmap "${CM_NAME}" -n "${CM_NS}" \
-o jsonpath='{.data.status}' 2>/dev/null || echo "")"

case "${STATUS}" in
ready)
echo "Environment is ready."
break
;;
error)
ERR_MSG="$(oc get configmap "${CM_NAME}" -n "${CM_NS}" \
-o jsonpath='{.data.error-message}' 2>/dev/null || echo "unknown error")"
echo "::error::Environment provisioning failed: ${ERR_MSG}"
exit 1
;;
*)
if (( ELAPSED >= TIMEOUT )); then
echo "::error::Timed out waiting for environment (status=${STATUS:-pending})"
exit 1
fi
echo " status=${STATUS:-pending} (${ELAPSED}s / ${TIMEOUT}s)..."
sleep "${INTERVAL}"
ELAPSED=$(( ELAPSED + INTERVAL ))
;;
esac
done

BRIDGE_BASE_ADDRESS="$(oc get configmap "${CM_NAME}" -n "${CM_NS}" \
-o jsonpath='{.data.bridge-base-address}')"
CONSOLE_ROUTE="$(oc get configmap "${CM_NAME}" -n "${CM_NS}" \
-o jsonpath='{.data.console-route}' 2>/dev/null || echo "")"

echo "bridge-base-address=${BRIDGE_BASE_ADDRESS}" >> "${GITHUB_OUTPUT}"
echo "console-route=${CONSOLE_ROUTE}" >> "${GITHUB_OUTPUT}"

- name: Write job summary
shell: bash
env:
CM_NAME: ${{ inputs.configmap-name }}
CM_NS: ${{ inputs.ci-env-namespace }}
PLUGIN_IMAGE: ${{ inputs.plugin-image }}
TEST_NS: ${{ inputs.test-namespace }}
BRIDGE: ${{ steps.wait.outputs.bridge-base-address }}
ROUTE: ${{ steps.wait.outputs.console-route }}
run: |
{
echo "<details><summary>CI Test Environment</summary>"
echo ""
echo "| Input Parameter | Value |"
echo "|------|-------|"
echo "| ConfigMap | \`${CM_NS}/${CM_NAME}\` |"
echo "| Plugin image | \`${PLUGIN_IMAGE}\` |"
echo "| Test namespace | \`${TEST_NS}\` |"
echo ""
echo "| Output Parameter | Value |"
echo "|------|-------|"
echo "| Bridge base address | \`${BRIDGE}\` |"
echo "| Console route | \`${ROUTE}\` |"
echo ""
echo "</details>"
} >> "${GITHUB_STEP_SUMMARY}"
Loading
Loading