Add vCenter cache rebuild functionality and related API endpoint
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user