diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/vsphere/discover/build.go | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/vsphere/discover/build.go b/src/go/collectors/go.d.plugin/modules/vsphere/discover/build.go new file mode 100644 index 000000000..3bf9bfb48 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/vsphere/discover/build.go @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package discover + +import ( + "time" + + rs "github.com/netdata/netdata/go/go.d.plugin/modules/vsphere/resources" + + "github.com/vmware/govmomi/vim25/mo" +) + +func (d Discoverer) build(raw *resources) *rs.Resources { + d.Debug("discovering : building : starting building resources process") + t := time.Now() + + var res rs.Resources + res.DataCenters = d.buildDatacenters(raw.dcs) + res.Folders = d.buildFolders(raw.folders) + res.Clusters = d.buildClusters(raw.clusters) + fixClustersParentID(&res) + res.Hosts = d.buildHosts(raw.hosts) + res.VMs = d.buildVMs(raw.vms) + + d.Infof("discovering : building : built %d/%d dcs, %d/%d folders, %d/%d clusters, %d/%d hosts, %d/%d vms, process took %s", + len(res.DataCenters), + len(raw.dcs), + len(res.Folders), + len(raw.folders), + len(res.Clusters), + len(raw.clusters), + len(res.Hosts), + len(raw.hosts), + len(res.VMs), + len(raw.vms), + time.Since(t), + ) + return &res +} + +// cluster parent is folder by default +// should be called after buildDatacenters, buildFolders and buildClusters +func fixClustersParentID(res *rs.Resources) { + for _, c := range res.Clusters { + c.ParentID = findClusterDcID(c.ParentID, res.Folders) + } +} + +func findClusterDcID(parentID string, folders rs.Folders) string { + f := folders.Get(parentID) + if f == nil { + return parentID + } + return findClusterDcID(f.ParentID, folders) +} + +func (Discoverer) buildDatacenters(raw []mo.Datacenter) rs.DataCenters { + dcs := make(rs.DataCenters) + for _, d := range raw { + dcs.Put(newDC(d)) + } + return dcs +} + +func newDC(raw mo.Datacenter) *rs.Datacenter { + // Datacenter1 datacenter-2 group-h4 group-v3 + return &rs.Datacenter{ + Name: raw.Name, + ID: raw.Reference().Value, + } +} + +func (Discoverer) buildFolders(raw []mo.Folder) rs.Folders { + fs := make(rs.Folders) + for _, d := range raw { + fs.Put(newFolder(d)) + } + return fs +} + +func newFolder(raw mo.Folder) *rs.Folder { + // vm group-v55 datacenter-54 + // host group-h56 datacenter-54 + // datastore group-s57 datacenter-54 + // network group-n58 datacenter-54 + return &rs.Folder{ + Name: raw.Name, + ID: raw.Reference().Value, + ParentID: raw.Parent.Value, + } +} + +func (Discoverer) buildClusters(raw []mo.ComputeResource) rs.Clusters { + clusters := make(rs.Clusters) + for _, c := range raw { + clusters.Put(newCluster(c)) + } + return clusters +} + +func newCluster(raw mo.ComputeResource) *rs.Cluster { + // s - dummy cluster, c - created by user cluster + // 192.168.0.201 domain-s61 group-h4 + // New Cluster1 domain-c52 group-h67 + return &rs.Cluster{ + Name: raw.Name, + ID: raw.Reference().Value, + ParentID: raw.Parent.Value, + } +} + +const ( + poweredOn = "poweredOn" +) + +func (d Discoverer) buildHosts(raw []mo.HostSystem) rs.Hosts { + var num int + hosts := make(rs.Hosts) + for _, h := range raw { + // poweredOn | poweredOff | standBy | unknown + if h.Runtime.PowerState != poweredOn { + num++ + continue + } + // connected | notResponding | disconnected + //if v.Runtime.ConnectionState == "" { + // + //} + hosts.Put(newHost(h)) + } + if num > 0 { + d.Infof("discovering : building : removed %d hosts (not powered on)", num) + } + return hosts +} + +func newHost(raw mo.HostSystem) *rs.Host { + // 192.168.0.201 host-22 domain-s61 + // 192.168.0.202 host-28 domain-c52 + // 192.168.0.203 host-33 domain-c52 + return &rs.Host{ + Name: raw.Name, + ID: raw.Reference().Value, + ParentID: raw.Parent.Value, + OverallStatus: string(raw.Summary.OverallStatus), + Ref: raw.Reference(), + } +} + +func (d Discoverer) buildVMs(raw []mo.VirtualMachine) rs.VMs { + var num int + vms := make(rs.VMs) + for _, v := range raw { + // poweredOff | poweredOn | suspended + if v.Runtime.PowerState != poweredOn { + num++ + continue + } + // connected | disconnected | orphaned | inaccessible | invalid + //if v.Runtime.ConnectionState == "" { + // + //} + vms.Put(newVM(v)) + } + if num > 0 { + d.Infof("discovering : building : removed %d vms (not powered on)", num) + } + return vms +} + +func newVM(raw mo.VirtualMachine) *rs.VM { + // deb91 vm-25 group-v3 host-22 + return &rs.VM{ + Name: raw.Name, + ID: raw.Reference().Value, + ParentID: raw.Runtime.Host.Value, + OverallStatus: string(raw.Summary.OverallStatus), + Ref: raw.Reference(), + } +} |