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  }