137 lines
4.0 KiB
Markdown
137 lines
4.0 KiB
Markdown
|
|
# Code Inconsistencies Found
|
||
|
|
|
||
|
|
## Critical Inconsistencies
|
||
|
|
|
||
|
|
### 1. Missing Variable Assignment in Controller
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/pkg/controller/virtualmachine/controller.go:64`
|
||
|
|
|
||
|
|
**Issue**: Code search shows line 64 has `proxmox.NewClient(` but the actual file shows it's correctly assigned. However, there's a potential issue with error handling.
|
||
|
|
|
||
|
|
**Current Code**:
|
||
|
|
```go
|
||
|
|
// Line 63-72
|
||
|
|
// Create Proxmox client
|
||
|
|
proxmoxClient, err := proxmox.NewClient(
|
||
|
|
site.Endpoint,
|
||
|
|
creds.Username,
|
||
|
|
creds.Password,
|
||
|
|
site.InsecureSkipTLSVerify,
|
||
|
|
)
|
||
|
|
if err != nil {
|
||
|
|
return ctrl.Result{}, errors.Wrap(err, "cannot create Proxmox client")
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Status**: ✅ Actually correct - variable is assigned. No fix needed.
|
||
|
|
|
||
|
|
### 2. Inconsistent Client Creation in VMScaleSet Controller
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/pkg/controller/vmscaleset/controller.go:47`
|
||
|
|
|
||
|
|
**Issue**: Creates client with empty parameters, likely a bug.
|
||
|
|
|
||
|
|
**Current Code**:
|
||
|
|
```go
|
||
|
|
proxmoxClient := proxmox.NewClient("", "", "")
|
||
|
|
```
|
||
|
|
|
||
|
|
**Problem**: This will always fail or use invalid credentials.
|
||
|
|
|
||
|
|
**Fix Required**: Should use proper credentials from ProviderConfig, similar to virtualmachine controller.
|
||
|
|
|
||
|
|
### 3. Inconsistent Error Handling Patterns
|
||
|
|
|
||
|
|
**Location**: Multiple files
|
||
|
|
|
||
|
|
**Pattern 1** (virtualmachine/controller.go):
|
||
|
|
- Credentials error → requeue after 30s
|
||
|
|
- Site error → requeue after 30s
|
||
|
|
- VM creation error → no requeue (immediate return)
|
||
|
|
|
||
|
|
**Pattern 2** (Other controllers):
|
||
|
|
- Various requeue strategies
|
||
|
|
|
||
|
|
**Recommendation**: Standardize error handling with:
|
||
|
|
- Retryable errors → requeue with exponential backoff
|
||
|
|
- Non-retryable errors → no requeue, update status with error condition
|
||
|
|
- Partial creation errors → cleanup + requeue with longer delay
|
||
|
|
|
||
|
|
### 4. importdisk API Usage Without Version Check
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/pkg/proxmox/client.go:397`
|
||
|
|
|
||
|
|
**Issue**: Uses importdisk API without checking if it's available.
|
||
|
|
|
||
|
|
**Current Code**:
|
||
|
|
```go
|
||
|
|
importPath := fmt.Sprintf("/nodes/%s/qemu/%d/importdisk", spec.Node, vmID)
|
||
|
|
if err := c.httpClient.Post(ctx, importPath, importConfig, &importResult); err != nil {
|
||
|
|
return nil, errors.Wrapf(err, "failed to import image...")
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Problem**: No check if Proxmox version supports this API.
|
||
|
|
|
||
|
|
**Fix Required**: Add version check or API availability check before use.
|
||
|
|
|
||
|
|
### 5. Inconsistent Status Field Names
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/apis/v1alpha1/virtualmachine_types.go:56`
|
||
|
|
|
||
|
|
**Issue**: Status field is `VMID` but JSON tag is `vmId` (camelCase).
|
||
|
|
|
||
|
|
**Current Code**:
|
||
|
|
```go
|
||
|
|
VMID int `json:"vmId,omitempty"`
|
||
|
|
```
|
||
|
|
|
||
|
|
**Problem**: Inconsistent naming (Go uses VMID, JSON uses vmId).
|
||
|
|
|
||
|
|
**Impact**: Minor - works but inconsistent.
|
||
|
|
|
||
|
|
### 6. No Cleanup on Partial VM Creation
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/pkg/controller/virtualmachine/controller.go:142-145`
|
||
|
|
|
||
|
|
**Issue**: When CreateVM fails, no cleanup of partially created VM.
|
||
|
|
|
||
|
|
**Current Code**:
|
||
|
|
```go
|
||
|
|
createdVM, err := proxmoxClient.CreateVM(ctx, vmSpec)
|
||
|
|
if err != nil {
|
||
|
|
return ctrl.Result{}, errors.Wrap(err, "cannot create VM")
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Problem**: If VM is created but import fails, VM remains orphaned.
|
||
|
|
|
||
|
|
**Fix Required**: Add cleanup logic in error path.
|
||
|
|
|
||
|
|
### 7. Lock File Handling Not Used in Error Recovery
|
||
|
|
|
||
|
|
**File**: `crossplane-provider-proxmox/pkg/proxmox/client.go:803-821`
|
||
|
|
|
||
|
|
**Issue**: UnlockVM function exists but not called during error recovery.
|
||
|
|
|
||
|
|
**Current Code**: UnlockVM is defined but never used in CreateVM error paths.
|
||
|
|
|
||
|
|
**Fix Required**: Call UnlockVM before DeleteVM in cleanup operations.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Summary of Required Fixes
|
||
|
|
|
||
|
|
1. ✅ **virtualmachine/controller.go:64** - Actually correct, no fix needed
|
||
|
|
2. ❌ **vmscaleset/controller.go:47** - Fix client creation
|
||
|
|
3. ⚠️ **Error handling** - Standardize across all controllers
|
||
|
|
4. ❌ **importdisk API** - Add version/availability check
|
||
|
|
5. ⚠️ **Status field naming** - Consider consistency (low priority)
|
||
|
|
6. ❌ **Partial VM cleanup** - Add cleanup in error paths
|
||
|
|
7. ❌ **Lock file handling** - Use UnlockVM in cleanup
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Last Updated: 2025-12-12*
|
||
|
|
|