- Added lock file exclusions for pnpm in .gitignore. - Removed obsolete package-lock.json from the api and portal directories. - Enhanced Cloudflare adapter with additional interfaces for zones and tunnels. - Improved Proxmox adapter error handling and logging for API requests. - Updated Proxmox VM parameters with validation rules in the API schema. - Enhanced documentation for Proxmox VM specifications and examples.
175 lines
5.0 KiB
Go
175 lines
5.0 KiB
Go
package proxmox
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestTenantTagFormat(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
tenantID string
|
|
want string
|
|
}{
|
|
{"simple tenant ID", "tenant123", "tenant_tenant123"},
|
|
{"numeric tenant ID", "123", "tenant_123"},
|
|
{"uuid tenant ID", "550e8400-e29b-41d4-a716-446655440000", "tenant_550e8400-e29b-41d4-a716-446655440000"},
|
|
{"tenant with underscore", "tenant_001", "tenant_tenant_001"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Test tag format generation (as it would be written)
|
|
tag := "tenant_" + tt.tenantID
|
|
if tag != tt.want {
|
|
t.Errorf("Tenant tag format = %q, want %q", tag, tt.want)
|
|
}
|
|
|
|
// Verify tag contains tenant ID
|
|
if !strings.Contains(tag, tt.tenantID) {
|
|
t.Errorf("Tenant tag %q does not contain tenant ID %q", tag, tt.tenantID)
|
|
}
|
|
|
|
// Verify tag starts with "tenant_"
|
|
if !strings.HasPrefix(tag, "tenant_") {
|
|
t.Errorf("Tenant tag %q does not start with 'tenant_'", tag)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTenantTagParsing(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
tags string
|
|
tenantID string
|
|
shouldMatch bool
|
|
}{
|
|
{"single tenant tag", "tenant_123", "123", true},
|
|
{"multiple tags with tenant", "tenant_123,os-ubuntu,env-prod", "123", true},
|
|
{"tenant tag at start", "tenant_123,other-tag", "123", true},
|
|
{"tenant tag at end", "other-tag,tenant_123", "123", true},
|
|
{"tenant tag in middle", "tag1,tenant_123,tag2", "123", true},
|
|
{"wrong tenant ID", "tenant_123", "456", false},
|
|
{"no tenant tag", "os-ubuntu,env-prod", "123", false},
|
|
{"empty tags", "", "123", false},
|
|
{"colon format (old, wrong)", "tenant:123", "123", false}, // Should NOT match colon format
|
|
{"similar but different prefix", "mytenant_123", "123", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Simulate tag checking logic as in ListVMs
|
|
tenantTag := "tenant_" + tt.tenantID
|
|
matches := strings.Contains(tt.tags, tenantTag)
|
|
|
|
if matches != tt.shouldMatch {
|
|
t.Errorf("Tag matching: tags=%q, tenantID=%q, matches=%v, want %v",
|
|
tt.tags, tt.tenantID, matches, tt.shouldMatch)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTenantTagConsistency(t *testing.T) {
|
|
// Verify that write and read formats are consistent
|
|
tenantID := "test-tenant-123"
|
|
|
|
// Write format (as it would be written in createVM)
|
|
writeTag := "tenant_" + tenantID
|
|
|
|
// Read format (as it would be checked in ListVMs)
|
|
readTag := "tenant_" + tenantID
|
|
|
|
if writeTag != readTag {
|
|
t.Errorf("Write tag %q does not match read tag %q", writeTag, readTag)
|
|
}
|
|
|
|
// Verify they both use underscore
|
|
if !strings.Contains(writeTag, "tenant_") {
|
|
t.Error("Write tag does not use underscore format")
|
|
}
|
|
if !strings.Contains(readTag, "tenant_") {
|
|
t.Error("Read tag does not use underscore format")
|
|
}
|
|
|
|
// Verify they do NOT use colon (old format)
|
|
if strings.Contains(writeTag, "tenant:") {
|
|
t.Error("Write tag incorrectly uses colon format")
|
|
}
|
|
if strings.Contains(readTag, "tenant:") {
|
|
t.Error("Read tag incorrectly uses colon format")
|
|
}
|
|
}
|
|
|
|
func TestTenantTagWithVMList(t *testing.T) {
|
|
// Test scenario: multiple VMs with different tenant tags
|
|
vmTags := []struct {
|
|
vmID int
|
|
tags string
|
|
tenantID string
|
|
}{
|
|
{100, "tenant_123,os-ubuntu", "123"},
|
|
{101, "tenant_456,os-debian", "456"},
|
|
{102, "tenant_123,os-centos", "123"},
|
|
{103, "os-fedora", ""}, // No tenant tag
|
|
}
|
|
|
|
// Filter for tenant 123
|
|
filterTenantID := "123"
|
|
tenantTag := "tenant_" + filterTenantID
|
|
|
|
var filteredVMs []int
|
|
for _, vm := range vmTags {
|
|
if vm.tags != "" && strings.Contains(vm.tags, tenantTag) {
|
|
filteredVMs = append(filteredVMs, vm.vmID)
|
|
}
|
|
}
|
|
|
|
// Should only get VMs 100 and 102
|
|
expectedVMs := []int{100, 102}
|
|
if len(filteredVMs) != len(expectedVMs) {
|
|
t.Errorf("Filtered VMs count = %d, want %d", len(filteredVMs), len(expectedVMs))
|
|
}
|
|
|
|
for i, expectedVMID := range expectedVMs {
|
|
if filteredVMs[i] != expectedVMID {
|
|
t.Errorf("Filtered VM[%d] = %d, want %d", i, filteredVMs[i], expectedVMID)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestTenantTagFormatInVMSpec tests the tenant tag format when creating a VM spec
|
|
func TestTenantTagFormatInVMSpec(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// This test verifies the format would be correct if we had a real client
|
|
// Since we can't easily mock the full client creation, we test the format logic
|
|
tenantID := "test-tenant"
|
|
|
|
// Simulate the tag format as it would be set in createVM
|
|
vmConfig := make(map[string]interface{})
|
|
vmConfig["tags"] = "tenant_" + tenantID
|
|
|
|
// Verify format
|
|
if tags, ok := vmConfig["tags"].(string); ok {
|
|
if tags != "tenant_"+tenantID {
|
|
t.Errorf("VM config tags = %q, want %q", tags, "tenant_"+tenantID)
|
|
}
|
|
|
|
// Verify it uses underscore, not colon
|
|
if strings.Contains(tags, "tenant:") {
|
|
t.Error("Tags incorrectly use colon format")
|
|
}
|
|
if !strings.Contains(tags, "tenant_") {
|
|
t.Error("Tags do not use underscore format")
|
|
}
|
|
} else {
|
|
t.Error("Failed to get tags from VM config")
|
|
}
|
|
|
|
_ = ctx // Suppress unused variable warning
|
|
}
|
|
|