From 2c97fdaf4607e719715eb0d06a0a65da795c9177 Mon Sep 17 00:00:00 2001 From: zhaoxiangchun Date: Fri, 13 Mar 2020 14:07:43 +0800 Subject: [PATCH] =?UTF-8?q?vmware=20=E5=AE=BF=E4=B8=BB=E6=9C=BA=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/multicloud/esxi/monitor.go | 54 +++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/pkg/multicloud/esxi/monitor.go b/pkg/multicloud/esxi/monitor.go index 2f95918e30..374e0ffbd0 100644 --- a/pkg/multicloud/esxi/monitor.go +++ b/pkg/multicloud/esxi/monitor.go @@ -1,6 +1,7 @@ package esxi import ( + "fmt" "strings" "time" @@ -19,15 +20,14 @@ var ( metricSpecsMap map[string][]string ) -func (client *SESXiClient) GetMonitorData(server jsonutils.JSONObject, metricSpecs map[string][]string, since time.Time, - until time.Time) (perfEntityMetricList []*types.PerfEntityMetric, IdNameTable map[int32]string, err error) { +func (client *SESXiClient) GetMonitorData(serverOrHost jsonutils.JSONObject, + monType string, metricSpecs map[string][]string, + since time.Time, until time.Time) (perfEntityMetricList []*types.PerfEntityMetric, IdNameTable map[int32]string, err error) { metricSpecsMap = metricSpecs - name, _ := server.GetString("name") - virtualMachines, err := client.getVirtualMachines() + managedEntity, err := client.getManagerEntiry(serverOrHost, monType) if err != nil { return nil, IdNameTable, err } - managedEntity := getManagerEntiry(virtualMachines, name) performanceManager := performance.NewManager(client.client.Client) perfCounters, err := performanceManager.CounterInfo(client.context) @@ -74,13 +74,51 @@ func (cli *SESXiClient) getVirtualMachines() ([]mo.VirtualMachine, error) { return virtualMachines, nil } -func getManagerEntiry(virtualMachines []mo.VirtualMachine, name string) *mo.ManagedEntity { +func (cli *SESXiClient) GetHostSystem() ([]mo.HostSystem, error) { + var hostSystems []mo.HostSystem + err := cli.scanAllMObjects(HOST_SYSTEM_PROPS, &hostSystems) + if err != nil { + return hostSystems, errors.Wrap(err, "cli.scanAllMObjects host") + } + return hostSystems, nil +} + +func (cli *SESXiClient) getManagerEntiry(serverOrHost jsonutils.JSONObject, monType string) (*mo.ManagedEntity, error) { + switch monType { + case "VirtualMachine": + return cli.getManagerEntityofVm(serverOrHost) + case "HostSystem": + return cli.getManagerEntityofHost(serverOrHost) + } + return nil, fmt.Errorf("monType error") +} + +func (cli *SESXiClient) getManagerEntityofVm(server jsonutils.JSONObject) (*mo.ManagedEntity, error) { + name, _ := server.GetString("name") + virtualMachines, err := cli.getVirtualMachines() + if err != nil { + return nil, err + } for _, virtualMachine := range virtualMachines { if virtualMachine.Name == name { - return virtualMachine.Entity() + return virtualMachine.Entity(), nil } } - return nil + return nil, fmt.Errorf("No ManagerEntiry for %s vm", name) +} + +func (cli *SESXiClient) getManagerEntityofHost(host jsonutils.JSONObject) (*mo.ManagedEntity, error) { + name, _ := host.GetString("name") + hostSystems, err := cli.GetHostSystem() + if err != nil { + return nil, err + } + for _, hostSystem := range hostSystems { + if strings.Contains(hostSystem.Name, name) || strings.Contains(name, hostSystem.Name) { + return hostSystem.Entity(), nil + } + } + return nil, fmt.Errorf("No ManagerEntiry for %s host", name) } //根据perfCounterInfos装载metricIdTable、metricNameTable、metricIdNameTable