Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
6101b57
feat: add opt-in strategic merge for single-key dict lists
fabiendupont Feb 25, 2026
6d240f7
feat: support __remove__ sentinel in dict merges
fabiendupont Feb 25, 2026
aef1cde
feat: refactor templates into layered validation-only configs
fabiendupont Mar 6, 2026
44e8619
feat: add AWS EKS layered config as reference implementation
fabiendupont Mar 6, 2026
3ae5fbd
feat: add Carbide control-plane provider implementation
fabiendupont Mar 6, 2026
38a948b
feat: add Carbide network, image-registry, and bare-metal providers
fabiendupont Mar 6, 2026
15abf04
feat: add Carbide IAM, full API coverage, and dynamic scope checking
fabiendupont Mar 6, 2026
f789605
feat: add Carbide platforms to test catalog
fabiendupont Mar 10, 2026
5d0d822
feat: add OpenShift KaaS provisioning on Carbide
fabiendupont Mar 6, 2026
c016988
feat: add OpenShift KaaS validation with shared K8s inventory
fabiendupont Mar 6, 2026
cc12fe6
feat: add OpenShift IAM validation with Keycloak (RHBK operator)
fabiendupont Mar 6, 2026
94a57eb
feat: add OpenShift GPU network validation
fabiendupont Mar 8, 2026
6bf7292
feat: add OpenShift storage validation (ODF on NVMe)
fabiendupont Mar 8, 2026
f7e930c
feat: add OpenShift VM validation (KubeVirt + GPU passthrough)
fabiendupont Mar 8, 2026
ae6976e
feat: add OpenShift MachineSet scaling validation
fabiendupont Mar 8, 2026
f5e0b36
feat: add OpenShift security and GPU health validation
fabiendupont Mar 8, 2026
f45c1ef
feat: add OpenShift DRA and ComputeDomain validation
fabiendupont Mar 8, 2026
a016d93
feat: add OpenShift ARM/aarch64 platform validation
fabiendupont Mar 8, 2026
06184f3
feat: add OpenShift Hosted Control Plane provisioning via CAPI
fabiendupont Mar 9, 2026
c12be6a
feat: add OpenShift platforms to test catalog
fabiendupont Mar 10, 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
71 changes: 71 additions & 0 deletions isvctl/configs/aws/eks-layered.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary

# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
# property and proprietary rights in and to this material, related
# documentation and any modifications thereto. Any use, reproduction,
# disclosure or distribution of this material and related documentation
# without an express license agreement from NVIDIA CORPORATION or
# its affiliates is strictly prohibited.

# AWS EKS - Layered Provider Configuration
#
# Supplies commands (Terraform stubs) and context overrides for the
# kaas template. Use with the template for composable validation:
#
# isvctl test run \
# -f isvctl/configs/templates/kaas.yaml \
# -f isvctl/configs/aws/eks-layered.yaml
#
# For a self-contained config (no template needed), use eks.yaml instead.
#
# Environment Variables:
# TF_AUTO_APPROVE — Skip Terraform approval prompts (default: false)
# TF_VAR_* — Terraform variables (region, instance types, etc.)
# AWS_SKIP_TEARDOWN — Preserve resources after test (default: false)
# NGC_API_KEY — NGC API key for NIM workloads
# AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY — AWS credentials

version: "1.0"

# =============================================================================
# Provider-specific commands (Terraform stubs)
# =============================================================================
commands:
kubernetes:
phases: ["setup", "test", "teardown"]
steps:
- name: provision_cluster
phase: setup
command: "../stubs/aws/eks/setup.sh"
timeout: 1800
env:
TF_AUTO_APPROVE: "true"
TF_VAR_region: "us-west-2"
TF_VAR_gpu_node_instance_types: '["g5.xlarge"]'
TF_VAR_gpu_node_desired_size: "1"
# Override with your IP CIDR for security (e.g., '["203.0.113.0/24"]')
# TF_VAR_cluster_endpoint_public_access_cidrs: '["0.0.0.0/0"]'

- name: teardown_cluster
phase: teardown
command: "../stubs/aws/eks/teardown.sh"
timeout: 1800
env:
TF_AUTO_APPROVE: "true"

# =============================================================================
# Context overrides for template defaults
# =============================================================================
# Single g5.xlarge GPU node = 1 GPU total (template defaults to 3)
context:
total_gpus: "1"

# =============================================================================
# Validation overrides (optional)
# =============================================================================
# The template provides all checks with sensible defaults. Override only
# what differs for this provider. Use {__merge__: true} to merge into
# the template's check list instead of replacing it.
tests:
description: "AWS EKS GPU cluster validation"
88 changes: 88 additions & 0 deletions isvctl/configs/carbide/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Carbide Provider

Provider implementation for [NVIDIA Carbide](https://github.com/fabiendupont/cloud-provider-nvidia-carbide) bare-metal infrastructure management. Uses `carbidecli` to interact with the Carbide API.

## Template Coverage

| Template | Carbide Config | Status |
|----------|---------------|--------|
| `control-plane` | `control-plane.yaml` | SSH key + VPC lifecycle |
| `network` | `network.yaml` | VPC, subnet, prefix, NSG |
| `image-registry` | `image-registry.yaml` | OperatingSystem + InstanceType CRUD |
| `bm` | `bm.yaml` | Instance launch/describe/reboot/teardown |
| `iam` | `iam.yaml` | Token validation, scope coverage, write access |
| `vm` | — | Not applicable (VMs are a platform concern, e.g., KubeVirt) |
| `kaas` | — | Not applicable (K8s installation is a platform concern) |

## Usage

```bash
# IAM: token validation + scope coverage (run first)
isvctl test run \
-f isvctl/configs/templates/iam.yaml \
-f isvctl/configs/carbide/iam.yaml

# Control plane validation
isvctl test run \
-f isvctl/configs/templates/control-plane.yaml \
-f isvctl/configs/carbide/control-plane.yaml

# Network validation
CARBIDE_SITE_ID=<uuid> isvctl test run \
-f isvctl/configs/templates/network.yaml \
-f isvctl/configs/carbide/network.yaml

# Image registry validation
CARBIDE_SITE_ID=<uuid> isvctl test run \
-f isvctl/configs/templates/image-registry.yaml \
-f isvctl/configs/carbide/image-registry.yaml

# Bare metal instance validation
CARBIDE_SITE_ID=<uuid> CARBIDE_OS_ID=<uuid> CARBIDE_INSTANCE_TYPE=<uuid> \
isvctl test run \
-f isvctl/configs/templates/bm.yaml \
-f isvctl/configs/carbide/bm.yaml
```

## Authentication

`carbidecli` handles authentication via its own config (`~/.carbide/config.yaml`) or environment variables:

| Variable | Description |
|----------|-------------|
| `CARBIDE_TOKEN` | API bearer token |
| `CARBIDE_API_KEY` | NGC API key |
| `CARBIDE_ORG` | Organization/tenant name |

## Required Environment Variables

| Variable | Used by | Description |
|----------|---------|-------------|
| `CARBIDE_SITE_ID` | network, image-registry, bm | Site UUID for resource creation |
| `CARBIDE_OS_ID` | bm | Operating system UUID for instance provisioning |
| `CARBIDE_INSTANCE_TYPE` | bm | Instance type UUID (hardware profile) |
| `CARBIDE_VPC_ID` | bm (optional) | Pre-existing VPC to use |
| `CARBIDE_SSH_KEY_GROUP` | bm (optional) | SSH key group for instance access |

## Extending for Platforms

Carbide provides bare-metal infrastructure. Platforms (OpenShift, RHEL+Slurm, etc.) build on top:

```bash
# OpenShift on Carbide
isvctl test run \
-f isvctl/configs/templates/kaas.yaml \
-f isvctl/configs/openshift/kaas-provision.yaml # AI + Carbide orchestration
-f isvctl/configs/openshift/kaas-overrides.yaml # OpenShift-specific checks

# RHEL + Slurm on Carbide
isvctl test run \
-f isvctl/configs/templates/bm.yaml \
-f isvctl/configs/carbide/bm.yaml \
-f isvctl/configs/slurm/bm-overrides.yaml # Slurm-specific checks
```

The platform layer handles:
- Orchestrating K8s/Slurm installation on Carbide bare metal
- Platform-specific operators (GPU Operator, Network Operator)
- Platform-specific validations (KubeVirt, DRA, ComputeDomains)
146 changes: 146 additions & 0 deletions isvctl/configs/carbide/bm.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary

# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
# property and proprietary rights in and to this material, related
# documentation and any modifications thereto. Any use, reproduction,
# disclosure or distribution of this material and related documentation
# without an express license agreement from NVIDIA CORPORATION or
# its affiliates is strictly prohibited.

# Carbide Bare Metal (BMaaS) - Layered Provider Configuration
#
# Supplies commands (carbidecli stubs) for the bm template.
# Tests bare-metal GPU instance lifecycle: launch, list, describe,
# reboot, NIM deploy, teardown, and verification.
#
# Mapping to template concepts:
# launch_instance → carbidecli instance create
# list_instances → carbidecli instance list
# describe_instance → carbidecli instance get
# reboot_instance → carbidecli instance reboot
# reinstall_instance → skip (not supported by Carbide)
# deploy_nim → shared NIM deploy script (SSH-based)
# teardown_nim → shared NIM teardown script (SSH-based)
# teardown → carbidecli instance delete
# verify_teardown → carbidecli instance get (verify terminated)
#
# Usage:
# isvctl test run \
# -f isvctl/configs/templates/bm.yaml \
# -f isvctl/configs/carbide/bm.yaml
#
# Environment:
# carbidecli handles auth via config or env vars:
# CARBIDE_TOKEN / CARBIDE_API_KEY — Authentication
# CARBIDE_ORG — Organization
# CARBIDE_SITE_ID — Site UUID (required)
# CARBIDE_OS_ID — Operating system UUID (required)
# CARBIDE_INSTANCE_TYPE — Instance type (required)

version: "1.0"

commands:
bm:
phases: ["setup", "test", "teardown"]
steps:
# Launch bare-metal GPU instance
- name: launch_instance
phase: setup
command: "python3 ../stubs/carbide/bm/launch_instance.py"
args:
- "--site-id"
- "{{ context.site_id }}"
- "--os-id"
- "{{ context.os_id }}"
- "--instance-type"
- "{{ context.instance_type }}"
timeout: 1200

# List instances - verify instance is visible
- name: list_instances
phase: test
command: "python3 ../stubs/carbide/bm/list_instances.py"
args:
- "--site-id"
- "{{ context.site_id }}"
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
timeout: 120

# Describe instance - test phase anchor for SSH/GPU validations
- name: describe_instance
phase: test
command: "python3 ../stubs/carbide/bm/describe_instance.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
timeout: 120

# Reboot instance and validate recovery
- name: reboot_instance
phase: test
command: "python3 ../stubs/carbide/bm/reboot_instance.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
- "--public-ip"
- "{{steps.launch_instance.public_ip}}"
timeout: 1800

# Reinstall not supported by Carbide - always skipped
- name: reinstall_instance
phase: test
skip: true
command: "python3 ../stubs/carbide/bm/reinstall_instance.py"
timeout: 60

# Deploy NIM container via SSH (shared script)
# Requires NGC_API_KEY env var
- name: deploy_nim
phase: test
command: "python3 ../stubs/common/deploy_nim.py"
args:
- "--host"
- "{{steps.launch_instance.public_ip}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
timeout: 1800

# Teardown NIM container via SSH (shared script)
- name: teardown_nim
phase: teardown
command: "python3 ../stubs/common/teardown_nim.py"
args:
- "--host"
- "{{steps.launch_instance.public_ip}}"
- "--key-file"
- "{{steps.launch_instance.key_file}}"
timeout: 120

# Teardown bare-metal instance
- name: teardown
phase: teardown
command: "python3 ../stubs/carbide/bm/teardown.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
timeout: 600

# Verify instance is terminated
- name: verify_teardown
phase: teardown
command: "python3 ../stubs/carbide/bm/verify_terminated.py"
args:
- "--instance-id"
- "{{steps.launch_instance.instance_id}}"
timeout: 120

# Provider-specific context
context:
site_id: "{{ env.CARBIDE_SITE_ID | default('') }}"
os_id: "{{ env.CARBIDE_OS_ID | default('') }}"
instance_type: "{{ env.CARBIDE_INSTANCE_TYPE | default('') }}"

tests:
description: "Carbide bare metal (BMaaS): instance lifecycle, GPU, NIM deploy"
Loading