Add vCenter cache rebuild functionality and related API endpoint
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-16 08:46:38 +11:00
parent 6fbd6bc9d2
commit bc84931c37
7 changed files with 425 additions and 24 deletions

View File

@@ -1161,6 +1161,35 @@ CREATE TABLE IF NOT EXISTS vcenter_host_cache (
})
}
// ClearVcenterReferenceCache removes cached folder/resource-pool/host references for a vCenter.
func ClearVcenterReferenceCache(ctx context.Context, dbConn *sqlx.DB, vcenter string) error {
vcenter = strings.TrimSpace(vcenter)
if vcenter == "" {
return nil
}
if err := EnsureVcenterReferenceCacheTables(ctx, dbConn); err != nil {
return err
}
tx, err := dbConn.BeginTxx(ctx, nil)
if err != nil {
return err
}
tables := []string{
"vcenter_folder_cache",
"vcenter_resource_pool_cache",
"vcenter_host_cache",
}
for _, tableName := range tables {
query := tx.Rebind(fmt.Sprintf(`DELETE FROM %s WHERE "Vcenter" = ?`, tableName))
if _, err := tx.ExecContext(ctx, query, vcenter); err != nil {
_ = tx.Rollback()
return err
}
}
return tx.Commit()
}
func LoadVcenterFolderCache(ctx context.Context, dbConn *sqlx.DB, vcenter string) (map[string]string, error) {
cache := make(map[string]string)
vcenter = strings.TrimSpace(vcenter)

View File

@@ -310,6 +310,52 @@ VALUES (?,?,?,?,?,?,?,?,?,?)
}
}
func TestClearVcenterReferenceCache(t *testing.T) {
ctx := context.Background()
dbConn := newTestSQLiteDB(t)
if err := EnsureVcenterReferenceCacheTables(ctx, dbConn); err != nil {
t.Fatalf("failed to ensure vcenter reference cache tables: %v", err)
}
if err := UpsertVcenterFolderCache(ctx, dbConn, "vc-a", "group-v123", "/Datacenters/DC1/vm/Prod", 1000); err != nil {
t.Fatalf("failed to upsert folder cache: %v", err)
}
if err := UpsertVcenterResourcePoolCache(ctx, dbConn, "vc-a", "resgroup-1", "Gold", 1000); err != nil {
t.Fatalf("failed to upsert resource pool cache: %v", err)
}
if err := UpsertVcenterHostCache(ctx, dbConn, "vc-a", "host-123", "Cluster-1", "DC1", 1000); err != nil {
t.Fatalf("failed to upsert host cache: %v", err)
}
if err := ClearVcenterReferenceCache(ctx, dbConn, "vc-a"); err != nil {
t.Fatalf("failed to clear vcenter reference cache: %v", err)
}
var folderCount int
if err := dbConn.Get(&folderCount, `SELECT COUNT(1) FROM vcenter_folder_cache WHERE "Vcenter" = ?`, "vc-a"); err != nil {
t.Fatalf("failed to count folder cache rows: %v", err)
}
if folderCount != 0 {
t.Fatalf("expected 0 folder cache rows after clear, got %d", folderCount)
}
var poolCount int
if err := dbConn.Get(&poolCount, `SELECT COUNT(1) FROM vcenter_resource_pool_cache WHERE "Vcenter" = ?`, "vc-a"); err != nil {
t.Fatalf("failed to count resource pool cache rows: %v", err)
}
if poolCount != 0 {
t.Fatalf("expected 0 resource pool cache rows after clear, got %d", poolCount)
}
var hostCount int
if err := dbConn.Get(&hostCount, `SELECT COUNT(1) FROM vcenter_host_cache WHERE "Vcenter" = ?`, "vc-a"); err != nil {
t.Fatalf("failed to count host cache rows: %v", err)
}
if hostCount != 0 {
t.Fatalf("expected 0 host cache rows after clear, got %d", hostCount)
}
}
func TestFetchVmLifecycleIgnoresStaleDeletionFromHourlyCache(t *testing.T) {
ctx := context.Background()
dbConn := newTestSQLiteDB(t)