# 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*

