From 1ef9a481c3dec0272a45c4d1f8f3cfd1bbcd5fcb Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 21 Apr 2020 20:15:47 +0800 Subject: [PATCH] =?UTF-8?q?VMware=20resource=20pool=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/multicloud/aliyun/aliyun.go | 2 +- pkg/multicloud/esxi/datacenter.go | 35 +++++++++++++++++++-- pkg/multicloud/esxi/manager.go | 18 ++++++++++- pkg/multicloud/esxi/provider/provider.go | 2 +- pkg/multicloud/esxi/resourcepool.go | 20 +++++++++++- pkg/multicloud/esxi/shell/resourcepool.go | 38 +++++++++++++++++++++++ pkg/multicloud/esxi/virtualmachine.go | 7 +++++ pkg/multicloud/huawei/huawei.go | 2 +- 8 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 pkg/multicloud/esxi/shell/resourcepool.go diff --git a/pkg/multicloud/aliyun/aliyun.go b/pkg/multicloud/aliyun/aliyun.go index 9df1bf51a9..4740c6e250 100644 --- a/pkg/multicloud/aliyun/aliyun.go +++ b/pkg/multicloud/aliyun/aliyun.go @@ -455,7 +455,7 @@ func (self *SAliyunClient) GetIProjects() ([]cloudprovider.ICloudProject, error) func (region *SAliyunClient) GetCapabilities() []string { caps := []string{ - // cloudprovider.CLOUD_CAPABILITY_PROJECT, + cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, diff --git a/pkg/multicloud/esxi/datacenter.go b/pkg/multicloud/esxi/datacenter.go index ab916077b8..372744ee8a 100644 --- a/pkg/multicloud/esxi/datacenter.go +++ b/pkg/multicloud/esxi/datacenter.go @@ -22,6 +22,7 @@ import ( "github.com/vmware/govmomi/vim25/types" "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" @@ -32,9 +33,10 @@ var DATACENTER_PROPS = []string{"name", "parent", "datastore", "network"} type SDatacenter struct { SManagedObject - ihosts []cloudprovider.ICloudHost - istorages []cloudprovider.ICloudStorage - inetworks []IVMNetwork + ihosts []cloudprovider.ICloudHost + istorages []cloudprovider.ICloudStorage + inetworks []IVMNetwork + iresoucePool []cloudprovider.ICloudProject Name string } @@ -63,6 +65,25 @@ func (dc *SDatacenter) getObjectDatacenter() *object.Datacenter { return object.NewDatacenter(dc.manager.client.Client, dc.object.Reference()) } +func (dc *SDatacenter) scanResourcePool() error { + if dc.iresoucePool == nil { + var pools []mo.ResourcePool + err := dc.manager.scanMObjects(dc.object.Entity().Self, RESOURCEPOOL_PROPS, &pools) + if err != nil { + return errors.Wrap(err, "scanMObjects") + } + dc.iresoucePool = []cloudprovider.ICloudProject{} + for i := 0; i < len(pools); i++ { + p := NewResourcePool(dc.manager, &pools[i], dc) + rpPath := p.GetPath() + if utils.IsInStringArray("Resources", rpPath) && rpPath[len(rpPath)-1] != "Resources" { + dc.iresoucePool = append(dc.iresoucePool, p) + } + } + } + return nil +} + func (dc *SDatacenter) scanHosts() error { if dc.ihosts == nil { var hosts []mo.HostSystem @@ -88,6 +109,14 @@ func (dc *SDatacenter) scanHosts() error { return nil } +func (dc *SDatacenter) GetResourcePools() ([]cloudprovider.ICloudProject, error) { + err := dc.scanResourcePool() + if err != nil { + return nil, errors.Wrap(err, "dc.scanResourcePool") + } + return dc.iresoucePool, nil +} + func (dc *SDatacenter) GetIHosts() ([]cloudprovider.ICloudHost, error) { err := dc.scanHosts() if err != nil { diff --git a/pkg/multicloud/esxi/manager.go b/pkg/multicloud/esxi/manager.go index cf99a06da6..ed8e7f1981 100644 --- a/pkg/multicloud/esxi/manager.go +++ b/pkg/multicloud/esxi/manager.go @@ -418,6 +418,22 @@ func findDatacenterByMoId(dcs []*SDatacenter, dcId string) (*SDatacenter, error) return nil, cloudprovider.ErrNotFound } +func (cli *SESXiClient) GetIProjects() ([]cloudprovider.ICloudProject, error) { + dcs, err := cli.GetDatacenters() + if err != nil { + return nil, errors.Wrap(err, "GetDatacenters") + } + ret := []cloudprovider.ICloudProject{} + for i := 0; i < len(dcs); i++ { + iprojects, err := dcs[i].GetResourcePools() + if err != nil { + return nil, errors.Wrap(err, "GetResourcePools") + } + ret = append(ret, iprojects...) + } + return ret, nil +} + func (cli *SESXiClient) FindHostByMoId(moId string) (cloudprovider.ICloudHost, error) { dcs, err := cli.GetDatacenters() if err != nil { @@ -492,7 +508,7 @@ func (cli *SESXiClient) IsValid() bool { func (cli *SESXiClient) GetCapabilities() []string { caps := []string{ - // cloudprovider.CLOUD_CAPABILITY_PROJECT, + cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, // cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, diff --git a/pkg/multicloud/esxi/provider/provider.go b/pkg/multicloud/esxi/provider/provider.go index 31a55308af..a70a3fccbc 100644 --- a/pkg/multicloud/esxi/provider/provider.go +++ b/pkg/multicloud/esxi/provider/provider.go @@ -186,7 +186,7 @@ func (self *SESXiProvider) GetOnPremiseIRegion() (cloudprovider.ICloudRegion, er } func (self *SESXiProvider) GetIProjects() ([]cloudprovider.ICloudProject, error) { - return nil, cloudprovider.ErrNotSupported + return self.client.GetIProjects() } func (self *SESXiProvider) GetStorageClasses(regionId string) []string { diff --git a/pkg/multicloud/esxi/resourcepool.go b/pkg/multicloud/esxi/resourcepool.go index 5717c7e08e..a7719c38fc 100644 --- a/pkg/multicloud/esxi/resourcepool.go +++ b/pkg/multicloud/esxi/resourcepool.go @@ -14,14 +14,32 @@ package esxi -import "github.com/vmware/govmomi/vim25/mo" +import ( + "github.com/vmware/govmomi/vim25/mo" + + "yunion.io/x/onecloud/pkg/multicloud" +) var RESOURCEPOOL_PROPS = []string{"name", "parent"} type SResourcePool struct { + multicloud.SResourceBase SManagedObject } +func (pool *SResourcePool) GetGlobalId() string { + return pool.GetId() +} + +func (pool *SResourcePool) GetStatus() string { + return "" +} + +func (pool *SResourcePool) GetName() string { + path := pool.GetPath() + return path[len(path)-1] +} + func NewResourcePool(manager *SESXiClient, rp *mo.ResourcePool, dc *SDatacenter) *SResourcePool { return &SResourcePool{SManagedObject: newManagedObject(manager, rp, dc)} } diff --git a/pkg/multicloud/esxi/shell/resourcepool.go b/pkg/multicloud/esxi/shell/resourcepool.go new file mode 100644 index 0000000000..bed8933aea --- /dev/null +++ b/pkg/multicloud/esxi/shell/resourcepool.go @@ -0,0 +1,38 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package shell + +import ( + "yunion.io/x/onecloud/pkg/multicloud/esxi" + "yunion.io/x/onecloud/pkg/util/shellutils" +) + +func init() { + type ResourcePoolListOptions struct { + DATACENTER string `help:"List resource pool in datacenter"` + } + shellutils.R(&ResourcePoolListOptions{}, "resource-pool-list", "List all resource pools", func(cli *esxi.SESXiClient, args *ResourcePoolListOptions) error { + dc, err := cli.FindDatacenterByMoId(args.DATACENTER) + if err != nil { + return err + } + pools, err := dc.GetResourcePools() + if err != nil { + return err + } + printList(pools, nil) + return nil + }) +} diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index bfd1434b19..9adaa95037 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -954,6 +954,13 @@ func (self *SVirtualMachine) Renew(bc billing.SBillingCycle) error { } func (self *SVirtualMachine) GetProjectId() string { + pool, err := self.getResourcePool() + if err != nil { + return "" + } + if pool != nil { + return pool.GetId() + } return "" } diff --git a/pkg/multicloud/huawei/huawei.go b/pkg/multicloud/huawei/huawei.go index da0cb2baa7..01758c05bd 100644 --- a/pkg/multicloud/huawei/huawei.go +++ b/pkg/multicloud/huawei/huawei.go @@ -460,7 +460,7 @@ func (self *SHuaweiClient) GetAccessEnv() string { func (self *SHuaweiClient) GetCapabilities() []string { caps := []string{ - // cloudprovider.CLOUD_CAPABILITY_PROJECT, + cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER,