From c9375f30995da69bf6a181d4e5e25babf3b39cfc Mon Sep 17 00:00:00 2001 From: Nathan Coad Date: Tue, 15 Oct 2024 08:51:35 +1100 Subject: [PATCH] improve logic for temporary VM renames --- internal/tasks/processEvents.go | 161 ++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 71 deletions(-) diff --git a/internal/tasks/processEvents.go b/internal/tasks/processEvents.go index 8580fc7..dd45035 100644 --- a/internal/tasks/processEvents.go +++ b/internal/tasks/processEvents.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "log/slog" + "strings" "time" "vctp/db/queries" "vctp/internal/vcenter" @@ -54,86 +55,104 @@ func (c *CronTask) RunVmCheck(ctx context.Context, logger *slog.Logger) error { if err != nil { c.Logger.Error("Can't locate vm in vCenter", "vmID", evt.VmId.String, "error", err) + continue } else if vmObject == nil { c.Logger.Debug("didn't find VM", "vm_id", evt.VmId.String) - numRam = 0 - numVcpus = 0 - totalDiskGB = 0 - isTemplate = "FALSE" - folderPath = "" - vmUuid = "" - } else { - c.Logger.Debug("found VM") - srmPlaceholder = "FALSE" // Default assumption - //prettyPrint(vmObject) - // calculate VM properties we want to store - if vmObject.Config != nil { - numRam = vmObject.Config.Hardware.MemoryMB - numVcpus = vmObject.Config.Hardware.NumCPU - vmUuid = vmObject.Config.Uuid + // TODO - if VM name ends with -tmp or -phVm then we mark this record as processed and stop trying to find a VM that doesnt exist anymore - var totalDiskBytes int64 + if strings.HasSuffix(evt.VmName.String, "-phVm") || strings.HasSuffix(evt.VmName.String, "-tmp") { + c.Logger.Info("VM name indicates temporary VM, marking as processed", "vm_name", evt.VmName.String) - // Calculate the total disk allocated in GB - for _, device := range vmObject.Config.Hardware.Device { - if disk, ok := device.(*types.VirtualDisk); ok { - - // Print the filename of the backing device - if _, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok { - //c.Logger.Debug("Adding disk", "size_bytes", disk.CapacityInBytes, "backing_file", backing.FileName) - } else { - //c.Logger.Debug("Adding disk, unknown backing type", "size_bytes", disk.CapacityInBytes) - } - - totalDiskBytes += disk.CapacityInBytes - //totalDiskGB += float64(disk.CapacityInBytes / 1024 / 1024 / 1024) // Convert from bytes to GB - } - } - totalDiskGB = float64(totalDiskBytes / 1024 / 1024 / 1024) - c.Logger.Debug("Converted total disk size", "bytes", totalDiskBytes, "GB", totalDiskGB) - - // Determine if the VM is a normal VM or an SRM placeholder - if vmObject.Config.ManagedBy != nil && vmObject.Config.ManagedBy.ExtensionKey == "com.vmware.vcDr" { - if vmObject.Config.ManagedBy.Type == "placeholderVm" { - c.Logger.Debug("VM is a placeholder") - srmPlaceholder = "TRUE" - } else { - c.Logger.Debug("VM is managed by SRM but not a placeholder", "details", vmObject.Config.ManagedBy) - } - } - - if vmObject.Config.Template { - isTemplate = "TRUE" - } else { - isTemplate = "FALSE" - } - - // Retrieve the full folder path of the VM - folderPath, err = vc.GetVMFolderPath(*vmObject) + err = c.Database.Queries().UpdateEventsProcessed(ctx, evt.Eid) if err != nil { - c.Logger.Error("failed to get vm folder path", "error", err) - folderPath = "" + c.Logger.Error("Unable to mark this event as processed", "event_id", evt.Eid, "error", err) } else { - c.Logger.Debug("Found vm folder path", "folder_path", folderPath) + //c.Logger.Debug("Marked event as processed", "event_id", evt.Eid) } - - // Retrieve the resource pool of the VM - rpName, _ = vc.GetVmResourcePool(*vmObject) - - foundVm = true - } else { - c.Logger.Error("Empty VM config") - } - - //c.Logger.Debug("VM has runtime data", "power_state", vmObject.Runtime.PowerState) - if vmObject.Runtime.PowerState == "poweredOff" { - poweredOn = "FALSE" - } else { - poweredOn = "TRUE" } + /* + numRam = 0 + numVcpus = 0 + totalDiskGB = 0 + isTemplate = "FALSE" + folderPath = "" + vmUuid = "" + */ + continue } + + //c.Logger.Debug("found VM") + srmPlaceholder = "FALSE" // Default assumption + //prettyPrint(vmObject) + + // calculate VM properties we want to store + if vmObject.Config != nil { + numRam = vmObject.Config.Hardware.MemoryMB + numVcpus = vmObject.Config.Hardware.NumCPU + vmUuid = vmObject.Config.Uuid + + var totalDiskBytes int64 + + // Calculate the total disk allocated in GB + for _, device := range vmObject.Config.Hardware.Device { + if disk, ok := device.(*types.VirtualDisk); ok { + + // Print the filename of the backing device + if _, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok { + //c.Logger.Debug("Adding disk", "size_bytes", disk.CapacityInBytes, "backing_file", backing.FileName) + } else { + //c.Logger.Debug("Adding disk, unknown backing type", "size_bytes", disk.CapacityInBytes) + } + + totalDiskBytes += disk.CapacityInBytes + //totalDiskGB += float64(disk.CapacityInBytes / 1024 / 1024 / 1024) // Convert from bytes to GB + } + } + totalDiskGB = float64(totalDiskBytes / 1024 / 1024 / 1024) + c.Logger.Debug("Converted total disk size", "bytes", totalDiskBytes, "GB", totalDiskGB) + + // Determine if the VM is a normal VM or an SRM placeholder + if vmObject.Config.ManagedBy != nil && vmObject.Config.ManagedBy.ExtensionKey == "com.vmware.vcDr" { + if vmObject.Config.ManagedBy.Type == "placeholderVm" { + c.Logger.Debug("VM is a placeholder") + srmPlaceholder = "TRUE" + } else { + c.Logger.Debug("VM is managed by SRM but not a placeholder", "details", vmObject.Config.ManagedBy) + } + } + + if vmObject.Config.Template { + isTemplate = "TRUE" + } else { + isTemplate = "FALSE" + } + + // Retrieve the full folder path of the VM + folderPath, err = vc.GetVMFolderPath(*vmObject) + if err != nil { + c.Logger.Error("failed to get vm folder path", "error", err) + folderPath = "" + } else { + c.Logger.Debug("Found vm folder path", "folder_path", folderPath) + } + + // Retrieve the resource pool of the VM + rpName, _ = vc.GetVmResourcePool(*vmObject) + + foundVm = true + } else { + c.Logger.Error("Empty VM config") + } + + //c.Logger.Debug("VM has runtime data", "power_state", vmObject.Runtime.PowerState) + if vmObject.Runtime.PowerState == "poweredOff" { + poweredOn = "FALSE" + } else { + poweredOn = "TRUE" + } + err = vc.Logout() if err != nil { c.Logger.Error("unable to logout of vcenter", "error", err) @@ -162,7 +181,7 @@ func (c *CronTask) RunVmCheck(ctx context.Context, logger *slog.Logger) error { PoweredOn: poweredOn, } - c.Logger.Debug("database params", "params", params) + //c.Logger.Debug("database params", "params", params) // Insert the new inventory record into the database _, err := c.Database.Queries().CreateInventory(ctx, params) @@ -176,7 +195,7 @@ func (c *CronTask) RunVmCheck(ctx context.Context, logger *slog.Logger) error { if err != nil { c.Logger.Error("Unable to mark this event as processed", "event_id", evt.Eid, "error", err) } else { - c.Logger.Debug("Marked event as processed", "event_id", evt.Eid) + //c.Logger.Debug("Marked event as processed", "event_id", evt.Eid) } } } else {