Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
69c80c7
fixes
matthewgrossman Jun 25, 2026
6ef146d
use temp images
matthewgrossman Jun 25, 2026
d9d8b37
fix: increase log wait timeouts to 240s and pin images for faster CI …
matthewgrossman Jun 25, 2026
8c13776
fix(jobs): fix launcher silently dropping OTLP logs for fast-exiting …
matthewgrossman Jun 26, 2026
b1a2f5a
fix: review feedback — lower timeouts, remove pin, clean up
matthewgrossman Jun 26, 2026
bbbe6ad
fix(jobs): use BatchProcessor with proper shutdown instead of SimpleP…
matthewgrossman Jun 26, 2026
daa261a
fix: revert log timeout changes and fix stale comment
matthewgrossman Jun 26, 2026
94335f6
feat: add subprocess_only/container_only markers, run all e2e on Kind
matthewgrossman Jun 26, 2026
0585c9e
Merge branch 'main' into mgrossman/aircore-844-validate-and-adapt-dat…
matthewgrossman Jun 26, 2026
1b7ac88
fix(jobs): auto-provision persistent storage on K8s, matching subprocess
matthewgrossman Jun 26, 2026
0ad3d8f
docs: add TODO for explicit persistent storage declaration on job spec
matthewgrossman Jun 26, 2026
c24bb68
docs: explain footgun rationale for auto-provisioning persistent storage
matthewgrossman Jun 26, 2026
7e3aac4
fix(jobs): make persistent storage optional with guarding property
matthewgrossman Jun 26, 2026
88ffcd8
fix: skip NGC tests with placeholder key, mark pause/resume flaky, re…
matthewgrossman Jun 26, 2026
e085412
remove flaky test
matthewgrossman Jun 26, 2026
7b7ee75
disable other one too
matthewgrossman Jun 26, 2026
23452cd
lint
matthewgrossman Jun 26, 2026
a9e3776
self code review
matthewgrossman Jun 26, 2026
85b1cbf
reduce code
matthewgrossman Jun 26, 2026
5a6470f
Merge branch 'main' into mgrossman/aircore-844-validate-and-adapt-dat…
matthewgrossman Jun 26, 2026
f114daa
remove from PR checks
matthewgrossman Jun 26, 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
187 changes: 187 additions & 0 deletions .github/actions/setup-kind-cluster/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
name: Setup Kind cluster with NeMo Platform
description: >
Creates a Kind cluster, installs tooling (kind, kubectl, Helm, uv),
pre-pulls images, deploys NeMo Platform via Helm, and waits for the
API to become healthy.

inputs:
kind_cluster_name:
description: Kind cluster name
required: true
kube_namespace:
description: Kubernetes namespace for NeMo Platform
required: false
default: nemo-platform
kube_gateway_name:
description: Gateway resource name
required: false
default: nmp-e2e-gateway
image_registry:
description: Container image registry
required: true
image_tag:
description: Container image tag
required: true
helm_values:
description: Helm values file path (relative to repo root)
required: false
default: e2e/k8s/values/kind.yaml
kind_image_pull_token:
description: Token for pulling images into Kind
required: true
kind_image_pull_user:
description: Username for pulling images into Kind
required: true
ngc_api_key:
description: NGC API key (can be a placeholder for CPU-only)
required: false
default: not-used

outputs:
cluster_url:
description: The NeMo Platform cluster URL
value: ${{ steps.export-url.outputs.cluster_url }}

runs:
using: composite
steps:
- name: Free disk space
uses: ./.github/actions/free-disk-space
with:
disable_swap: "true"
remove_haskell: "true"
remove_java: "true"
remove_ruby: "true"
remove_swift: "true"
prune_docker: "true"

- name: Install kind
shell: bash
env:
KIND_VERSION: v0.32.0
run: |
set -euo pipefail

case "$(uname -m)" in
x86_64) arch=amd64 ;;
aarch64|arm64) arch=arm64 ;;
*)
echo "Unsupported architecture: $(uname -m)" >&2
exit 1
;;
esac

kind_url="https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-linux-${arch}"
curl -fsSLo "${RUNNER_TEMP}/kind" "${kind_url}"
curl -fsSLo "${RUNNER_TEMP}/kind.sha256sum" "${kind_url}.sha256sum"
sed "s# kind-linux-${arch}# ${RUNNER_TEMP}/kind#" "${RUNNER_TEMP}/kind.sha256sum" | sha256sum -c -
sudo install -m 0755 "${RUNNER_TEMP}/kind" /usr/local/bin/kind

- name: Install kubectl
shell: bash
env:
KUBECTL_VERSION: v1.33.7
run: |
set -euo pipefail

case "$(uname -m)" in
x86_64) arch=amd64 ;;
aarch64|arm64) arch=arm64 ;;
*)
echo "Unsupported architecture: $(uname -m)" >&2
exit 1
;;
esac

kubectl_url="https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${arch}/kubectl"
curl -fsSLo "${RUNNER_TEMP}/kubectl" "${kubectl_url}"
curl -fsSLo "${RUNNER_TEMP}/kubectl.sha256" "${kubectl_url}.sha256"
echo "$(cat "${RUNNER_TEMP}/kubectl.sha256") ${RUNNER_TEMP}/kubectl" | sha256sum -c -
sudo install -m 0755 "${RUNNER_TEMP}/kubectl" /usr/local/bin/kubectl

- name: Install Helm
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5.0.0

- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
with:
python-version: "3.13"
enable-cache: true
version-file: pyproject.toml
cache-dependency-glob: uv.lock

- name: Start kind cluster
shell: bash
env:
KIND_CLUSTER_NAME: ${{ inputs.kind_cluster_name }}
KUBE_NAMESPACE: ${{ inputs.kube_namespace }}
NGC_API_KEY: ${{ inputs.ngc_api_key }}
run: bash e2e/k8s/scripts/setup_local_kind_cpu.sh

- name: Set default kubectl namespace
shell: bash
env:
NAMESPACE: ${{ inputs.kube_namespace }}
run: kubectl config set-context --current --namespace="${NAMESPACE}"

- name: Verify Gateway API setup
shell: bash
env:
NAMESPACE: ${{ inputs.kube_namespace }}
KUBE_GATEWAY_NAME: ${{ inputs.kube_gateway_name }}
run: |
set -euo pipefail
kubectl wait --for=condition=Established crd/gateways.gateway.networking.k8s.io --timeout=2m
kubectl wait --for=condition=Established crd/httproutes.gateway.networking.k8s.io --timeout=2m
kubectl get gatewayclass cloud-provider-kind
kubectl -n "${NAMESPACE}" get gateway "${KUBE_GATEWAY_NAME}"

- name: Pre-pull GHCR images into kind
shell: bash
env:
KIND_IMAGE_PULL_TOKEN: ${{ inputs.kind_image_pull_token }}
KIND_IMAGE_PULL_USER: ${{ inputs.kind_image_pull_user }}
NMP_E2E_REGISTRY: ${{ inputs.image_registry }}
NMP_E2E_TAG: ${{ inputs.image_tag }}
run: |
e2e/k8s/scripts/prepull_kind_images.sh \
"${NMP_E2E_REGISTRY}/nmp-api:${NMP_E2E_TAG}" \
"${NMP_E2E_REGISTRY}/nmp-core:${NMP_E2E_TAG}" \
"${NMP_E2E_REGISTRY}/nmp-cpu-tasks:${NMP_E2E_TAG}"

- name: Install NeMo Platform
shell: bash
env:
NAMESPACE: ${{ inputs.kube_namespace }}
NMP_E2E_REGISTRY: ${{ inputs.image_registry }}
NMP_E2E_TAG: ${{ inputs.image_tag }}
HELM_VALUES: ${{ inputs.helm_values }}
REQUIRE_NMP_E2E_IMAGES: "true"
POSTGRES_IMAGE: docker.io/library/postgres
BUSYBOX_IMAGE: docker.io/library/busybox
run: |
if ! e2e/k8s/scripts/install_helm_e2e.sh; then
echo "--- helm list -A ---"
helm list -A || true
echo "--- helm status ${NAMESPACE}/nemo-platform ---"
helm status -n "${NAMESPACE}" nemo-platform || true
echo "--- kubectl get all -n ${NAMESPACE} ---"
kubectl get all -n "${NAMESPACE}" || true
exit 1
fi

- name: Export cluster URL
id: export-url
shell: bash
env:
NMP_E2E_CLUSTER_URL: ${{ env.NMP_E2E_CLUSTER_URL }}
run: |
echo "cluster_url=${NMP_E2E_CLUSTER_URL}" >> "${GITHUB_OUTPUT}"

- name: Wait for API
shell: bash
env:
NMP_E2E_CLUSTER_URL: ${{ env.NMP_E2E_CLUSTER_URL }}
run: |
test -n "${NMP_E2E_CLUSTER_URL}"
e2e/k8s/scripts/wait_for_api.sh "${NMP_E2E_CLUSTER_URL}/cluster-info" 120
Loading
Loading