package handler import ( "context" "database/sql" "fmt" "net/http" "vctp/db/queries" "vctp/internal/vcenter" ) // VmUpdate receives the CloudEvent for a VM modification or move func (h *Handler) VmUpdateDetails(w http.ResponseWriter, r *http.Request) { var matchFound bool var inventoryId int64 var srmPlaceholder string var vmUuid string var dbUuid string ctx := context.Background() // reload settings in case vcenter list has changed h.Settings.ReadYMLSettings() for _, url := range h.Settings.Values.Settings.VcenterAddresses { h.Logger.Debug("connecting to vcenter", "url", url) vc := vcenter.New(h.Logger, h.VcCreds) vc.Login(url) // Get list of VMs from vcenter vms, err := vc.GetAllVmReferences() // Get list of VMs from inventory table h.Logger.Debug("Querying inventory table") results, err := h.Database.Queries().GetInventoryByVcenter(ctx, url) if err != nil { h.Logger.Error("Unable to query inventory table", "error", err) w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Unable to query inventory table %s\n", err) } if len(results) == 0 { h.Logger.Error("Empty inventory results") } // Iterate VMs from vcenter and see if they were in the database for _, vm := range vms { matchFound = false inventoryId = 0 srmPlaceholder = "FALSE" // Default assumption vmUuid = "" for _, dbvm := range results { if dbvm.VmId.String == vm.Reference().Value { h.Logger.Debug("Found VM in database", "vm_name", dbvm.Name, "id", dbvm.VmId.String) matchFound = true inventoryId = dbvm.Iid dbUuid = dbvm.VmUuid.String break } } if matchFound { //h.Logger.Debug("Need to update VM in inventory table", "MoRef", vm.Reference()) vmObj, err := vc.ConvertObjToMoVM(vm) if err != nil { h.Logger.Error("Received error getting vm managedobject", "error", err) continue } if vmObj.Config != nil { vmUuid = vmObj.Config.Uuid // Determine if the VM is a normal VM or an SRM placeholder if vmObj.Config.ManagedBy != nil && vmObj.Config.ManagedBy.ExtensionKey == "com.vmware.vcDr" { if vmObj.Config.ManagedBy.Type == "placeholderVm" { h.Logger.Debug("VM is a placeholder") srmPlaceholder = "TRUE" } else { h.Logger.Debug("VM is managed by SRM but not a placeholder", "details", vmObj.Config.ManagedBy) } } if srmPlaceholder == "TRUE" || vmUuid != dbUuid { h.Logger.Debug("Need to update vm", "name", vmObj.Name, "srm_placeholder", srmPlaceholder, "uuid", vmUuid) params := queries.InventoryUpdateParams{ Iid: inventoryId, SrmPlaceholder: srmPlaceholder, Uuid: sql.NullString{String: vmUuid, Valid: vmUuid != ""}, } h.Logger.Debug("database params", "params", params) err := h.Database.Queries().InventoryUpdate(context.Background(), params) if err != nil { h.Logger.Error("Error received updating inventory for VM", "name", vmObj.Name, "error", err) } } } else { h.Logger.Warn("VM no longer present in vcenter or missing config values", "MoRef", vm.Reference()) } } } } h.Logger.Debug("Processed vm update successfully") w.WriteHeader(http.StatusOK) // TODO - return some JSON fmt.Fprintf(w, "Processed vm update successfully") }