250 lines
4.8 KiB
Markdown
250 lines
4.8 KiB
Markdown
|
|
# Validation Rules - Proxmox Provider
|
||
|
|
|
||
|
|
This document describes all validation rules enforced by the Proxmox provider.
|
||
|
|
|
||
|
|
## VM Name Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateVMName()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Length**: 1-100 characters
|
||
|
|
- **Valid Characters**: Alphanumeric, hyphen (`-`), underscore (`_`), dot (`.`), space
|
||
|
|
- **Restrictions**:
|
||
|
|
- Cannot be empty
|
||
|
|
- Cannot start or end with spaces
|
||
|
|
- Spaces allowed in middle only
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `"web-server-01"`
|
||
|
|
- `"vm.001"`
|
||
|
|
- `"my vm"`
|
||
|
|
- `"VM_001"`
|
||
|
|
- `"test-vm-name"`
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `""` (empty)
|
||
|
|
- `" vm"` (starts with space)
|
||
|
|
- `"vm "` (ends with space)
|
||
|
|
- `"vm@001"` (invalid character `@`)
|
||
|
|
- `"vm#001"` (invalid character `#`)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Memory Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateMemory()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Required**: Yes
|
||
|
|
- **Format**: Supports multiple formats (case-insensitive)
|
||
|
|
- `Gi`, `G` - Gibibytes
|
||
|
|
- `Mi`, `M` - Mebibytes
|
||
|
|
- `Ki`, `K` - Kibibytes
|
||
|
|
- Plain number - Assumed MB
|
||
|
|
- **Range**: 128 MB - 2 TB (2,097,152 MB)
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `"128Mi"` (minimum)
|
||
|
|
- `"4Gi"` (4 GiB = 4096 MB)
|
||
|
|
- `"8192Mi"` (8192 MB)
|
||
|
|
- `"4096"` (assumed MB)
|
||
|
|
- `"2Ti"` (2 TiB, converted to MB)
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `""` (empty)
|
||
|
|
- `"127Mi"` (below minimum)
|
||
|
|
- `"2097153Mi"` (above maximum)
|
||
|
|
- `"invalid"` (invalid format)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Disk Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateDisk()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Required**: Yes
|
||
|
|
- **Format**: Supports multiple formats (case-insensitive)
|
||
|
|
- `Ti`, `T` - Tebibytes
|
||
|
|
- `Gi`, `G` - Gibibytes
|
||
|
|
- `Mi`, `M` - Mebibytes
|
||
|
|
- Plain number - Assumed GB
|
||
|
|
- **Range**: 1 GB - 100 TB (102,400 GB)
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `"1Gi"` (minimum)
|
||
|
|
- `"50Gi"` (50 GB)
|
||
|
|
- `"100Gi"` (100 GB)
|
||
|
|
- `"1Ti"` (1 TiB = 1024 GB)
|
||
|
|
- `"100"` (assumed GB)
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `""` (empty)
|
||
|
|
- `"0.5Gi"` (below minimum)
|
||
|
|
- `"102401Gi"` (above maximum)
|
||
|
|
- `"invalid"` (invalid format)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## CPU Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateCPU()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Required**: Yes
|
||
|
|
- **Type**: Integer
|
||
|
|
- **Range**: 1-1024 cores
|
||
|
|
- **Default**: 2
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `1` (minimum)
|
||
|
|
- `2`, `4`, `8`, `16`
|
||
|
|
- `1024` (maximum)
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `0` (below minimum)
|
||
|
|
- `-1` (negative)
|
||
|
|
- `1025` (above maximum)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Network Bridge Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateNetworkBridge()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Required**: Yes
|
||
|
|
- **Format**: Alphanumeric, hyphen, underscore
|
||
|
|
- **Additional**: Bridge must exist on target node (validated at runtime)
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `"vmbr0"`
|
||
|
|
- `"vmbr1"`
|
||
|
|
- `"custom-bridge"`
|
||
|
|
- `"bridge_01"`
|
||
|
|
- `"BRIDGE"`
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `""` (empty)
|
||
|
|
- `"vmbr 0"` (contains space)
|
||
|
|
- `"vmbr@0"` (invalid character)
|
||
|
|
- `"vmbr.0"` (dot typically not used)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Image Specification Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateImageSpec()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Required**: Yes
|
||
|
|
- **Formats**: Three formats supported
|
||
|
|
|
||
|
|
#### 1. Template VMID (Numeric)
|
||
|
|
- **Range**: 100-999999999
|
||
|
|
- **Example**: `"100"`, `"1000"`
|
||
|
|
|
||
|
|
#### 2. Volume ID (Volid Format)
|
||
|
|
- **Format**: `storage:path/to/image`
|
||
|
|
- **Requirements**:
|
||
|
|
- Must contain `:`
|
||
|
|
- Storage name before `:` cannot be empty
|
||
|
|
- Path after `:` cannot be empty
|
||
|
|
- **Example**: `"local:iso/ubuntu-22.04.iso"`
|
||
|
|
|
||
|
|
#### 3. Image Name
|
||
|
|
- **Length**: 1-255 characters
|
||
|
|
- **Format**: Alphanumeric, hyphen, underscore, dot
|
||
|
|
- **Example**: `"ubuntu-22.04-cloud"`
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `"100"` (template VMID)
|
||
|
|
- `"local:iso/ubuntu-22.04.iso"` (volid)
|
||
|
|
- `"ubuntu-22.04-cloud"` (image name)
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `""` (empty)
|
||
|
|
- `"99"` (VMID too small)
|
||
|
|
- `"1000000000"` (VMID too large)
|
||
|
|
- `":path"` (missing storage)
|
||
|
|
- `"storage:"` (missing path)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## VMID Validation
|
||
|
|
|
||
|
|
**Function**: `ValidateVMID()`
|
||
|
|
|
||
|
|
### Rules
|
||
|
|
- **Range**: 100-999999999
|
||
|
|
- **Type**: Integer
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
✅ **Valid**:
|
||
|
|
- `100` (minimum)
|
||
|
|
- `1000`, `10000`
|
||
|
|
- `999999999` (maximum)
|
||
|
|
|
||
|
|
❌ **Invalid**:
|
||
|
|
- `99` (below minimum)
|
||
|
|
- `0`, `-1` (invalid)
|
||
|
|
- `1000000000` (above maximum)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Validation Timing
|
||
|
|
|
||
|
|
Validation occurs at multiple stages:
|
||
|
|
|
||
|
|
1. **Controller Validation**: Before VM creation
|
||
|
|
- All input validation functions are called
|
||
|
|
- Errors reported via Kubernetes Conditions
|
||
|
|
- VM creation blocked if validation fails
|
||
|
|
|
||
|
|
2. **Runtime Validation**: During VM creation
|
||
|
|
- Network bridge existence checked
|
||
|
|
- Storage availability verified
|
||
|
|
- Node health checked
|
||
|
|
|
||
|
|
3. **API Validation**: Proxmox API validation
|
||
|
|
- Proxmox may reject invalid configurations
|
||
|
|
- Errors reported and handled appropriately
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Error Messages
|
||
|
|
|
||
|
|
Validation errors include:
|
||
|
|
- **Clear error messages** describing what's wrong
|
||
|
|
- **Expected values** when applicable
|
||
|
|
- **Suggestions** for fixing issues
|
||
|
|
|
||
|
|
Example:
|
||
|
|
```
|
||
|
|
Error: memory 64Mi (64 MB) is below minimum of 128 MB
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
1. **Validate Early**: Check configurations before deployment
|
||
|
|
2. **Use Clear Names**: Follow VM naming conventions
|
||
|
|
3. **Verify Resources**: Ensure network bridges and storage exist
|
||
|
|
4. **Check Quotas**: Verify resource limits before creation
|
||
|
|
5. **Monitor Errors**: Watch for validation failures in status conditions
|
||
|
|
|