Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 26 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,30 @@ jobs:
timeout 30 bash -c 'until curl -s http://localhost:8001/health; do sleep 1; done' || echo "Health check failed (expected for gRPC)"
docker stop test-server || true

k8s-grpc-test:
name: Kubernetes gRPC Transfer Test
runs-on: ubuntu-latest
needs: test

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install kubectl
run: |
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

- name: Run gRPC transfer K8s test
run: |
chmod +x test_grpc_transfer_k8s.sh
./test_grpc_transfer_k8s.sh

benchmark:
name: Performance Benchmarks
runs-on: ubuntu-latest
Expand Down Expand Up @@ -263,7 +287,7 @@ jobs:
release:
name: Create Release
runs-on: ubuntu-latest
needs: [test, integration-test, security-audit, docker-build]
needs: [test, integration-test, security-audit, docker-build, k8s-grpc-test]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'

steps:
Expand Down Expand Up @@ -306,7 +330,7 @@ jobs:
notify:
name: Notify on Failure
runs-on: ubuntu-latest
needs: [test, integration-test, security-audit, docker-build]
needs: [test, integration-test, security-audit, docker-build, k8s-grpc-test]
if: failure()

steps:
Expand Down
99 changes: 99 additions & 0 deletions helm/values-local-storage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# Values for testing gRPC file transfer without shared storage (no PVC)
# This configuration uses emptyDir volumes instead of PersistentVolumeClaims,
# which means the server and client have isolated storage and must transfer
# files via gRPC streaming.

replicaCount: 1

image:
repository: modelexpress
pullPolicy: IfNotPresent
tag: "test"

# No image pull secrets needed for local testing
imagePullSecrets: []

serviceAccount:
create: true
annotations: {}

podAnnotations: {}

podLabels: {}

# Disable security context for local testing - allow running as root
podSecurityContext: {}

securityContext:
runAsNonRoot: false

service:
type: ClusterIP
port: 8001

ingress:
enabled: false

# Minimal resources for testing
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 256Mi

# Disable PVC-based persistence - use emptyDir instead
persistence:
enabled: false

# Use emptyDir for ephemeral storage (server-side cache)
extraVolumes:
- name: model-cache
emptyDir:
sizeLimit: 2Gi

extraVolumeMounts:
- name: model-cache
mountPath: /root

env:
MODEL_EXPRESS_SERVER_PORT: "8001"
MODEL_EXPRESS_LOGGING_LEVEL: "debug"
MODEL_EXPRESS_DATABASE_PATH: "/tmp/models.db"
MODEL_EXPRESS_CACHE_DIRECTORY: "/root"
# Note: HOME is set to /root so HuggingFace cache uses /root/.cache/huggingface
HOME: "/root"

livenessProbe:
enabled: true
tcpSocket:
port: 8001
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3

readinessProbe:
enabled: true
tcpSocket:
port: 8001
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3

nodeSelector: {}

tolerations: []

affinity: {}

extraEnv: []

args: []

command: []
Loading
Loading