Resource Validation#
After configuring pools, add resource validation rules to prevent workflows from requesting more resources than available on your nodes. Validation acts as a pre-flight check that rejects invalid requests before they reach the scheduler.
Why Use Resource Validation?#
Resource validation provides guardrails that protect your cluster and improve user experience:
- ✓ Prevent Scheduling Failures
Reject workflows that request more CPU, memory, or GPU than any node can provide, avoiding pods getting stuck in pending state.
- ✓ Catch Configuration Errors
Detect invalid resource specifications (negative values, zero allocations, incorrect units) before submission.
- ✓ Provide Clear Feedback
Give users immediate, actionable error messages explaining what’s wrong and how to fix it.
- ✓ Optimize Resource Utilization
Enforce safety margins and best practices for resource allocation across your cluster.
How It Works#
Validation Flow#
1. Submit Workflow 📝
User requests resources
2. Validate Rules ⚖️
Check against capacity
3. Proceed or Reject ✓✗
Accept or deny
Rule Structure#
Each validation rule has four components:
operator: LE
left_operand: '{{USER_CPU}}'
right_operand: '{{K8_CPU}}'
assert_message: CPU {{USER_CPU}} exceeds node capacity {{K8_CPU}}
operator: Comparison type (EQ, LT, LE, GT, GE)
left_operand: User-requested value (e.g.,
{{USER_CPU}})right_operand: Limit or node capacity (e.g.,
{{K8_CPU}})assert_message: Error shown when validation fails
Note
For detailed configuration fields and all available variables, see /api/configs/resource_validation in the API reference documentation.
Practical Guide#
📄 Edit in your Helm values file
Everything on this section is to be added in your Helm values file under services.configs.
Apply changes with helm upgrade.
Standard Validation Rules#
Create validation templates for common resources: CPU, GPU, memory, and storage.
Step 1: Understand the Available Variables
Available Variables
- User Request Variables:
{{USER_CPU}}- CPU count requested{{USER_GPU}}- GPU count requested{{USER_MEMORY}}- Memory requested (e.g., “8Gi”){{USER_STORAGE}}- Storage requested (e.g., “100Gi”)
Note
The values from the user request variables are the same values that are provided in the resource spec of a workflow.
- Node Capacity Variables:
{{K8_CPU}}- Available CPU on nodes{{K8_GPU}}- Available GPU on nodes{{K8_MEMORY}}- Available memory on nodes{{K8_STORAGE}}- Available storage on nodes
Note
The values from the node capacity variables are the same values that are reported by the Kubernetes
API in the allocatable fields. {{K8_MEMORY}} and {{K8_STORAGE}} support units B, Ki,
Mi, Gi and Ti.
Note
If the CPU allocatable provided by Kubernetes is in the format of m,
{{K8_CPU}} will be an integer value after rounding down the CPU allocatable value.
- Operators:
EQ (equal)
LT (less than)
LE (less/equal)
GT (greater than)
GE (greater/equal)
NE (not equal)
For all available variables and detailed configuration fields, see /api/configs/resource_validation.
Step 2: Define Validation Rules in Helm Values
Add recommended validation templates under services.configs.resourceValidations:
services:
configs:
enabled: true
resourceValidations:
default_cpu:
- operator: LE
left_operand: '{{USER_CPU}}'
right_operand: '{{K8_CPU}}'
assert_message: CPU {{USER_CPU}} exceeds node capacity {{K8_CPU}}
- operator: GT
left_operand: '{{USER_CPU}}'
right_operand: '0'
assert_message: CPU {{USER_CPU}} must be greater than 0
default_gpu:
- operator: LE
left_operand: '{{USER_GPU}}'
right_operand: '{{K8_GPU}}'
assert_message: GPU {{USER_GPU}} exceeds node capacity {{K8_GPU}}
- operator: GE
left_operand: '{{USER_GPU}}'
right_operand: '0'
assert_message: GPU {{USER_GPU}} cannot be negative
default_memory:
- operator: LT
left_operand: '{{USER_MEMORY}}'
right_operand: '{{K8_MEMORY}}'
assert_message: Memory {{USER_MEMORY}} exceeds node capacity {{K8_MEMORY}}
- operator: GT
left_operand: '{{USER_MEMORY}}'
right_operand: '0'
assert_message: Memory {{USER_MEMORY}} must be greater than 0
default_storage:
- operator: LT
left_operand: '{{USER_STORAGE}}'
right_operand: '{{K8_STORAGE}}'
assert_message: Storage {{USER_STORAGE}} exceeds node capacity {{K8_STORAGE}}
- operator: GT
left_operand: '{{USER_STORAGE}}'
right_operand: '0'
assert_message: Storage {{USER_STORAGE}} must be greater than 0
Step 3: Reference in Pool Configuration
Add validation templates to your pool’s common_resource_validations field:
services:
configs:
pools:
my-pool:
backend: default
common_resource_validations:
- default_cpu
- default_memory
- default_storage
- default_gpu
Step 4: Apply
helm upgrade osmo deployments/charts/service -f my-values.yaml
Additional Examples#
Custom GPU Validation - Enforce Minimum GPU Requirements
Create validation for workloads requiring at least 2 GPUs:
services:
configs:
resourceValidations:
min_2_gpu:
- operator: GE
left_operand: '{{USER_GPU}}'
right_operand: '2'
assert_message: This pool requires minimum 2 GPUs, you requested {{USER_GPU}}
- operator: LE
left_operand: '{{USER_GPU}}'
right_operand: '{{K8_GPU}}'
assert_message: GPU {{USER_GPU}} exceeds node capacity {{K8_GPU}}
Memory Safety Margins - Prevent 100% Utilization
Enforce 80% maximum memory usage to leave headroom:
services:
configs:
resourceValidations:
memory_80_percent:
- operator: LT
left_operand: '{{USER_MEMORY}}'
right_operand: '{{K8_MEMORY}} * 0.8'
assert_message: Memory {{USER_MEMORY}} exceeds 80% of node capacity
Platform-Specific Rules - Different Limits Per Platform
Create different validation rules for different hardware platforms:
services:
configs:
resourceValidations:
a100_validation:
- operator: LE
left_operand: '{{USER_GPU}}'
right_operand: '8'
assert_message: A100 platform supports max 8 GPUs
h100_validation:
- operator: LE
left_operand: '{{USER_GPU}}'
right_operand: '8'
assert_message: H100 platform supports max 8 GPUs
Troubleshooting#
- Validation Always Fails
Check Kubernetes nodes are properly labeled and available
Verify node variables are populated:
kubectl describe nodes
- Inconsistent Results
Ensure all nodes report resources consistently
Check no nodes are in unschedulable state
- Unit Conversion Errors
Use consistent units between requests and validation (For example, use
GivsGB)Review variable substitution in error messages
- Debugging Tips
Start with simple rules and add complexity gradually
Test validation with different resource values
Examine OSMO service logs for detailed rule evaluation
Tip
Best Practices
Don’t allow 100% resource utilization - leave margins for system overhead and unexpected spikes
Use
LT(less than) instead ofLE(less/equal) for memory and storage to ensure safety marginsWrite clear error messages that include variable values to help users fix issues quickly
Test rules with edge cases (minimum values, maximum values, invalid inputs)