Add vCenter reference cache tables and update related functions
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:
@@ -429,20 +429,17 @@ func (v *Vcenter) findVmDeletionEvents(ctx context.Context, begin, end time.Time
|
||||
if len(events) == 0 {
|
||||
break
|
||||
}
|
||||
pageCount++
|
||||
processEvents(events)
|
||||
if candidateSet != nil && foundCandidates >= len(candidateSet) {
|
||||
break
|
||||
}
|
||||
pageCount++
|
||||
if pageCount >= maxEventPages {
|
||||
if v.Logger != nil {
|
||||
v.Logger.Warn("vcenter deletion events truncated", "vcenter", v.Vurl, "label", label, "pages", pageCount, "page_size", eventPageSize, "window_start_utc", beginUTC, "window_end_utc", endUTC)
|
||||
}
|
||||
break
|
||||
}
|
||||
if len(events) < int(eventPageSize) {
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -454,6 +451,7 @@ func (v *Vcenter) findVmDeletionEvents(ctx context.Context, begin, end time.Time
|
||||
BeginTime: &beginUTC,
|
||||
EndTime: &endUTC,
|
||||
},
|
||||
MaxCount: eventPageSize,
|
||||
DisableFullMessage: &disableFullMessage,
|
||||
EventTypeId: []string{
|
||||
"VmRemovedEvent",
|
||||
@@ -477,6 +475,7 @@ func (v *Vcenter) findVmDeletionEvents(ctx context.Context, begin, end time.Time
|
||||
BeginTime: &beginUTC,
|
||||
EndTime: &endUTC,
|
||||
},
|
||||
MaxCount: eventPageSize,
|
||||
DisableFullMessage: &disableFullMessage,
|
||||
}
|
||||
fc, err := mgr.CreateCollectorForEvents(ctx, fallbackFilter)
|
||||
@@ -673,31 +672,55 @@ func (v *Vcenter) GetHostSystemObject(hostRef types.ManagedObjectReference) (*mo
|
||||
return &hs, nil
|
||||
}
|
||||
|
||||
func (v *Vcenter) GetHostLookupByRef(hostRef types.ManagedObjectReference) (HostLookup, error) {
|
||||
lookup := HostLookup{}
|
||||
|
||||
var host mo.HostSystem
|
||||
if err := v.client.RetrieveOne(v.ctx, hostRef, []string{"parent"}, &host); err != nil {
|
||||
return lookup, fmt.Errorf("failed to retrieve host parent: %w", err)
|
||||
}
|
||||
|
||||
if host.Parent != nil && (host.Parent.Type == "ClusterComputeResource" || host.Parent.Type == "ComputeResource") {
|
||||
var moCompute mo.ComputeResource
|
||||
if err := v.client.RetrieveOne(v.ctx, *host.Parent, []string{"name"}, &moCompute); err != nil {
|
||||
if v.Logger != nil {
|
||||
v.Logger.Warn("failed to resolve cluster/compute name from host parent", "host_ref", hostRef.Value, "error", err)
|
||||
}
|
||||
} else {
|
||||
lookup.Cluster = moCompute.Name
|
||||
}
|
||||
}
|
||||
|
||||
entities, err := mo.Ancestors(v.ctx, v.client.Client, v.client.ServiceContent.PropertyCollector, hostRef)
|
||||
if err != nil {
|
||||
if v.Logger != nil {
|
||||
v.Logger.Warn("failed to resolve datacenter from host ancestors", "host_ref", hostRef.Value, "error", err)
|
||||
}
|
||||
return lookup, nil
|
||||
}
|
||||
for _, entity := range entities {
|
||||
if entity.Self.Type != "Datacenter" {
|
||||
continue
|
||||
}
|
||||
lookup.Datacenter = entity.Name
|
||||
break
|
||||
}
|
||||
|
||||
return lookup, nil
|
||||
}
|
||||
|
||||
// Function to find the cluster or compute resource from a host reference
|
||||
func (v *Vcenter) GetClusterFromHost(hostRef *types.ManagedObjectReference) (string, error) {
|
||||
if hostRef == nil {
|
||||
v.Logger.Warn("nil hostRef passed to GetClusterFromHost")
|
||||
return "", nil
|
||||
}
|
||||
var host mo.HostSystem
|
||||
err := v.client.RetrieveOne(v.ctx, *hostRef, []string{"parent"}, &host)
|
||||
lookup, err := v.GetHostLookupByRef(*hostRef)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to retrieve host parent: %w", err)
|
||||
v.Logger.Error("cant get host lookup", "error", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
if host.Parent == nil {
|
||||
return "", nil
|
||||
}
|
||||
if host.Parent.Type != "ClusterComputeResource" && host.Parent.Type != "ComputeResource" {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
var moCompute mo.ComputeResource
|
||||
if err := v.client.RetrieveOne(v.ctx, *host.Parent, []string{"name"}, &moCompute); err != nil {
|
||||
return "", fmt.Errorf("failed to retrieve compute resource: %w", err)
|
||||
}
|
||||
v.Logger.Debug("vm host parent compute resource resolved", "name", moCompute.Name, "host_ref", hostRef.Value)
|
||||
return moCompute.Name, nil
|
||||
return lookup.Cluster, nil
|
||||
}
|
||||
|
||||
// Function to determine the datacenter a VM belongs to
|
||||
@@ -784,12 +807,19 @@ func (v *Vcenter) FindVMByIDWithDatacenter(vmID string, dcID string) (*mo.Virtua
|
||||
return &vm, nil
|
||||
}
|
||||
|
||||
func (v *Vcenter) GetResourcePoolNameByRef(resourcePoolRef types.ManagedObjectReference) (string, error) {
|
||||
var pool mo.ResourcePool
|
||||
if err := v.client.RetrieveOne(v.ctx, resourcePoolRef, []string{"name"}, &pool); err != nil {
|
||||
return "", fmt.Errorf("failed to retrieve resource pool: %w", err)
|
||||
}
|
||||
return pool.Name, nil
|
||||
}
|
||||
|
||||
// Helper function to retrieve the resource pool for the VM
|
||||
func (v *Vcenter) GetVmResourcePool(vm mo.VirtualMachine) (string, error) {
|
||||
var resourcePool string
|
||||
if vm.ResourcePool != nil {
|
||||
rp := object.NewResourcePool(v.client.Client, *vm.ResourcePool)
|
||||
rpName, err := rp.ObjectName(v.ctx)
|
||||
rpName, err := v.GetResourcePoolNameByRef(*vm.ResourcePool)
|
||||
if err != nil {
|
||||
v.Logger.Error("failed to get resource pool name", "error", err)
|
||||
return resourcePool, err
|
||||
|
||||
Reference in New Issue
Block a user