github.com/netdata/go.d.plugin@v0.58.1/modules/vsphere/discover/build.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package discover 4 5 import ( 6 "time" 7 8 rs "github.com/netdata/go.d.plugin/modules/vsphere/resources" 9 10 "github.com/vmware/govmomi/vim25/mo" 11 ) 12 13 func (d Discoverer) build(raw *resources) *rs.Resources { 14 d.Debug("discovering : building : starting building resources process") 15 t := time.Now() 16 17 var res rs.Resources 18 res.DataCenters = d.buildDatacenters(raw.dcs) 19 res.Folders = d.buildFolders(raw.folders) 20 res.Clusters = d.buildClusters(raw.clusters) 21 fixClustersParentID(&res) 22 res.Hosts = d.buildHosts(raw.hosts) 23 res.VMs = d.buildVMs(raw.vms) 24 25 d.Infof("discovering : building : built %d/%d dcs, %d/%d folders, %d/%d clusters, %d/%d hosts, %d/%d vms, process took %s", 26 len(res.DataCenters), 27 len(raw.dcs), 28 len(res.Folders), 29 len(raw.folders), 30 len(res.Clusters), 31 len(raw.clusters), 32 len(res.Hosts), 33 len(raw.hosts), 34 len(res.VMs), 35 len(raw.vms), 36 time.Since(t), 37 ) 38 return &res 39 } 40 41 // cluster parent is folder by default 42 // should be called after buildDatacenters, buildFolders and buildClusters 43 func fixClustersParentID(res *rs.Resources) { 44 for _, c := range res.Clusters { 45 c.ParentID = findClusterDcID(c.ParentID, res.Folders) 46 } 47 } 48 49 func findClusterDcID(parentID string, folders rs.Folders) string { 50 f := folders.Get(parentID) 51 if f == nil { 52 return parentID 53 } 54 return findClusterDcID(f.ParentID, folders) 55 } 56 57 func (Discoverer) buildDatacenters(raw []mo.Datacenter) rs.DataCenters { 58 dcs := make(rs.DataCenters) 59 for _, d := range raw { 60 dcs.Put(newDC(d)) 61 } 62 return dcs 63 } 64 65 func newDC(raw mo.Datacenter) *rs.Datacenter { 66 // Datacenter1 datacenter-2 group-h4 group-v3 67 return &rs.Datacenter{ 68 Name: raw.Name, 69 ID: raw.Reference().Value, 70 } 71 } 72 73 func (Discoverer) buildFolders(raw []mo.Folder) rs.Folders { 74 fs := make(rs.Folders) 75 for _, d := range raw { 76 fs.Put(newFolder(d)) 77 } 78 return fs 79 } 80 81 func newFolder(raw mo.Folder) *rs.Folder { 82 // vm group-v55 datacenter-54 83 // host group-h56 datacenter-54 84 // datastore group-s57 datacenter-54 85 // network group-n58 datacenter-54 86 return &rs.Folder{ 87 Name: raw.Name, 88 ID: raw.Reference().Value, 89 ParentID: raw.Parent.Value, 90 } 91 } 92 93 func (Discoverer) buildClusters(raw []mo.ComputeResource) rs.Clusters { 94 clusters := make(rs.Clusters) 95 for _, c := range raw { 96 clusters.Put(newCluster(c)) 97 } 98 return clusters 99 } 100 101 func newCluster(raw mo.ComputeResource) *rs.Cluster { 102 // s - dummy cluster, c - created by user cluster 103 // 192.168.0.201 domain-s61 group-h4 104 // New Cluster1 domain-c52 group-h67 105 return &rs.Cluster{ 106 Name: raw.Name, 107 ID: raw.Reference().Value, 108 ParentID: raw.Parent.Value, 109 } 110 } 111 112 const ( 113 poweredOn = "poweredOn" 114 ) 115 116 func (d Discoverer) buildHosts(raw []mo.HostSystem) rs.Hosts { 117 var num int 118 hosts := make(rs.Hosts) 119 for _, h := range raw { 120 // poweredOn | poweredOff | standBy | unknown 121 if h.Runtime.PowerState != poweredOn { 122 num++ 123 continue 124 } 125 // connected | notResponding | disconnected 126 //if v.Runtime.ConnectionState == "" { 127 // 128 //} 129 hosts.Put(newHost(h)) 130 } 131 if num > 0 { 132 d.Infof("discovering : building : removed %d hosts (not powered on)", num) 133 } 134 return hosts 135 } 136 137 func newHost(raw mo.HostSystem) *rs.Host { 138 // 192.168.0.201 host-22 domain-s61 139 // 192.168.0.202 host-28 domain-c52 140 // 192.168.0.203 host-33 domain-c52 141 return &rs.Host{ 142 Name: raw.Name, 143 ID: raw.Reference().Value, 144 ParentID: raw.Parent.Value, 145 OverallStatus: string(raw.Summary.OverallStatus), 146 Ref: raw.Reference(), 147 } 148 } 149 150 func (d Discoverer) buildVMs(raw []mo.VirtualMachine) rs.VMs { 151 var num int 152 vms := make(rs.VMs) 153 for _, v := range raw { 154 // poweredOff | poweredOn | suspended 155 if v.Runtime.PowerState != poweredOn { 156 num++ 157 continue 158 } 159 // connected | disconnected | orphaned | inaccessible | invalid 160 //if v.Runtime.ConnectionState == "" { 161 // 162 //} 163 vms.Put(newVM(v)) 164 } 165 if num > 0 { 166 d.Infof("discovering : building : removed %d vms (not powered on)", num) 167 } 168 return vms 169 } 170 171 func newVM(raw mo.VirtualMachine) *rs.VM { 172 // deb91 vm-25 group-v3 host-22 173 return &rs.VM{ 174 Name: raw.Name, 175 ID: raw.Reference().Value, 176 ParentID: raw.Runtime.Host.Value, 177 OverallStatus: string(raw.Summary.OverallStatus), 178 Ref: raw.Reference(), 179 } 180 }