fix(ui): distinguish AI Runway integration from runtime install status #906
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Controller Tests | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| e2e-controller: | |
| runs-on: ubuntu-latest-16-cores | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 | |
| - name: Setup Go | |
| uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 | |
| with: | |
| go-version: "1.25" | |
| cache-dependency-path: controller/go.sum | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 | |
| with: | |
| bun-version: latest | |
| - name: Setup Kind | |
| run: | | |
| go install sigs.k8s.io/kind@latest | |
| kind create cluster --name airunway-e2e --wait 120s | |
| - name: Install KAITO operator | |
| run: | | |
| helm repo add kaito https://kaito-project.github.io/kaito/charts/kaito | |
| # If Gateway API Inference Extension CRDs are pre-installed (e.g. via kubectl apply), | |
| # add --skip-crds to avoid a field-manager conflict on InferencePool. | |
| helm install kaito-workspace kaito/workspace \ | |
| --namespace kaito-workspace \ | |
| --create-namespace \ | |
| --set featureGates.disableNodeAutoProvisioning=true | |
| kubectl wait --for=condition=Available deployment -n kaito-workspace -l app.kubernetes.io/name=workspace --timeout=120s | |
| - name: Build and deploy controller | |
| run: | | |
| make controller-docker-build CONTROLLER_IMG=airunway-controller:e2e | |
| kind load docker-image airunway-controller:e2e --name airunway-e2e | |
| make controller-deploy CONTROLLER_IMG=airunway-controller:e2e | |
| kubectl wait --for=condition=Available deployment -n airunway-system -l control-plane=controller-manager --timeout=120s | |
| - name: Build and deploy KAITO provider | |
| run: | | |
| make -C providers/kaito docker-build IMG=kaito-provider:e2e | |
| kind load docker-image kaito-provider:e2e --name airunway-e2e | |
| make -C providers/kaito deploy IMG=kaito-provider:e2e | |
| kubectl wait --for=condition=Available deployment -n airunway-system -l control-plane=kaito-provider --timeout=120s | |
| - name: Wait for provider registration | |
| run: | | |
| kubectl wait --for=jsonpath='{.status.ready}'=true inferenceproviderconfig/kaito --timeout=120s | |
| - name: Create CPU-only ModelDeployment | |
| run: | | |
| kubectl apply -f controller/test/e2e/testdata/cpu-modeldeployment.yaml | |
| - name: Wait for ModelDeployment to reach Running phase | |
| run: | | |
| kubectl wait --for=condition=WorkspaceSucceeded workspace/llama-cpu-e2e -n default --timeout=600s 2>/dev/null || true | |
| echo "Waiting for ModelDeployment to reach Running phase..." | |
| for i in $(seq 1 60); do | |
| PHASE=$(kubectl get modeldeployment llama-cpu-e2e -o jsonpath='{.status.phase}' 2>/dev/null || echo "") | |
| echo "Attempt $i/60: phase=$PHASE" | |
| if [ "$PHASE" = "Running" ]; then | |
| echo "✅ ModelDeployment is Running" | |
| exit 0 | |
| fi | |
| sleep 10 | |
| done | |
| echo "❌ Timed out waiting for ModelDeployment to reach Running phase" | |
| exit 1 | |
| - name: Test inference endpoint | |
| run: | | |
| # Get the actual service port | |
| SVC_PORT=$(kubectl get svc llama-cpu-e2e -n default -o jsonpath='{.spec.ports[0].port}') | |
| echo "Service port: $SVC_PORT" | |
| kubectl port-forward svc/llama-cpu-e2e 8080:${SVC_PORT} -n default & | |
| sleep 5 | |
| RESPONSE=$(curl -sf http://localhost:8080/v1/chat/completions \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "model": "llama-3.2-1b-instruct", | |
| "messages": [{"role": "user", "content": "Say hello in one word."}], | |
| "max_tokens": 10 | |
| }') | |
| echo "Response: $RESPONSE" | |
| echo "$RESPONSE" | jq -e '.choices' > /dev/null | |
| echo "$RESPONSE" | jq -e '.choices[0].message.content' > /dev/null | |
| echo "✅ Inference endpoint responded with valid chat completion" | |
| - name: Collect debug info | |
| if: failure() | |
| run: | | |
| echo "=== ModelDeployments ===" | |
| kubectl get modeldeployments -A -o yaml | |
| echo "=== InferenceProviderConfigs ===" | |
| kubectl get inferenceproviderconfigs -o yaml | |
| echo "=== Workspaces ===" | |
| kubectl get workspaces -A -o yaml | |
| echo "=== Controller Logs ===" | |
| kubectl logs -n airunway-system -l control-plane=controller-manager --tail=100 | |
| echo "=== KAITO Provider Logs ===" | |
| kubectl logs -n airunway-system -l control-plane=kaito-provider --tail=100 | |
| echo "=== Events ===" | |
| kubectl get events -A --sort-by=.lastTimestamp | |
| echo "=== Pods ===" | |
| kubectl get pods -A | |
| - name: Cleanup | |
| if: always() | |
| run: | | |
| kind delete cluster --name airunway-e2e |