diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 05be311057..6a1514110a 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -55,6 +55,9 @@ type ICloudProviderFactory interface { NeedSyncSkuFromCloud() bool IsSupportObjectStorage() bool + IsSupportComputeEngine() bool + IsSupportNetworkManage() bool + IsCloudeventRegional() bool GetMaxCloudEventSyncDays() int GetMaxCloudEventKeepDays() int @@ -258,6 +261,14 @@ func (factory *SPremiseBaseProviderFactory) NeedSyncSkuFromCloud() bool { return false } +func (factory *SPremiseBaseProviderFactory) IsSupportComputeEngine() bool { + return true +} + +func (factory *SPremiseBaseProviderFactory) IsSupportNetworkManage() bool { + return false +} + type SPublicCloudBaseProviderFactor struct { baseProviderFactory } @@ -278,6 +289,14 @@ func (factory *SPublicCloudBaseProviderFactor) NeedSyncSkuFromCloud() bool { return false } +func (factory *SPublicCloudBaseProviderFactor) IsSupportComputeEngine() bool { + return true +} + +func (factory *SPublicCloudBaseProviderFactor) IsSupportNetworkManage() bool { + return true +} + type SPrivateCloudBaseProviderFactor struct { baseProviderFactory } @@ -297,3 +316,11 @@ func (factory *SPrivateCloudBaseProviderFactor) IsSupportObjectStorage() bool { func (factory *SPrivateCloudBaseProviderFactor) NeedSyncSkuFromCloud() bool { return true } + +func (factory *SPrivateCloudBaseProviderFactor) IsSupportComputeEngine() bool { + return true +} + +func (factory *SPrivateCloudBaseProviderFactor) IsSupportNetworkManage() bool { + return true +} diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index d6d4deac62..1e9bebf0de 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -20,6 +20,7 @@ import ( "fmt" "yunion.io/x/jsonutils" + "yunion.io/x/log" "yunion.io/x/pkg/tristate" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -34,21 +35,24 @@ import ( ) type SCapabilities struct { - Hypervisors []string `json:",allowempty"` - Brands []string `json:",allowempty"` - ResourceTypes []string `json:",allowempty"` - StorageTypes []string `json:",allowempty"` - DataStorageTypes []string `json:",allowempty"` - GPUModels []string `json:",allowempty"` - MinNicCount int - MaxNicCount int - MinDataDiskCount int - MaxDataDiskCount int - SchedPolicySupport bool - Usable bool - PublicNetworkCount int - DBInstance map[string]map[string]map[string][]string //map[engine][engineVersion][category][]{storage_type} - Specs jsonutils.JSONObject + Hypervisors []string `json:",allowempty"` + Brands []string `json:",allowempty"` + ComputeEngineBrands []string `json:",allowempty"` + NetworkManageBrands []string `json:",allowempty"` + ObjectStorageBrands []string `json:",allowempty"` + ResourceTypes []string `json:",allowempty"` + StorageTypes []string `json:",allowempty"` + DataStorageTypes []string `json:",allowempty"` + GPUModels []string `json:",allowempty"` + MinNicCount int + MaxNicCount int + MinDataDiskCount int + MaxDataDiskCount int + SchedPolicySupport bool + Usable bool + PublicNetworkCount int + DBInstance map[string]map[string]map[string][]string //map[engine][engineVersion][category][]{storage_type} + Specs jsonutils.JSONObject } func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, region *SCloudregion, zone *SZone) (SCapabilities, error) { @@ -77,7 +81,8 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que domainId = "" } capa.Hypervisors = getHypervisors(region, zone, domainId) - capa.Brands = getBrands(region, zone, domainId, capa.Hypervisors) + var a, c, n, o = getBrands(region, zone, domainId, capa.Hypervisors) + capa.Brands, capa.ComputeEngineBrands, capa.NetworkManageBrands, capa.ObjectStorageBrands = a, c, n, o capa.ResourceTypes = getResourceTypes(region, zone, domainId) capa.StorageTypes = getStorageTypes(region, zone, true, domainId) capa.DataStorageTypes = getStorageTypes(region, zone, false, domainId) @@ -92,7 +97,6 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que if query == nil { query = jsonutils.NewDict() } - var err error if region != nil { query.(*jsonutils.JSONDict).Add(jsonutils.NewString(region.GetId()), "region") } @@ -102,6 +106,7 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que if len(domainId) > 0 { query.(*jsonutils.JSONDict).Add(jsonutils.NewString(domainId), "domain_id") } + var err error serverType := jsonutils.GetAnyString(query, []string{"host_type", "server_type"}) publicNetworkCount, _ := getNetworkPublicCount(region, zone, domainId, serverType) capa.PublicNetworkCount = publicNetworkCount @@ -171,8 +176,10 @@ func getDBInstanceInfo(region *SCloudregion, zone *SZone) map[string]map[string] return result } -func getBrands(region *SCloudregion, zone *SZone, domainId string, hypervisors []string) []string { - q := CloudaccountManager.Query("brand").IsTrue("enabled") +// return all brands, compute engine brands, network manage brands, object storage brands +func getBrands(region *SCloudregion, zone *SZone, domainId string, hypervisors []string, +) ([]string, []string, []string, []string) { + q := CloudaccountManager.Query().IsTrue("enabled") if zone != nil { region = zone.GetRegion() } @@ -189,27 +196,61 @@ func getBrands(region *SCloudregion, zone *SZone, domainId string, hypervisors [ sqlchemy.Equals(q.Field("domain_id"), domainId), )) } - q = q.Distinct() - rows, err := q.Rows() + cloudAccounts := make([]SCloudaccount, 0) + err := q.GroupBy("brand").All(&cloudAccounts) if err != nil { - return nil + log.Errorf("get brands failed %s", err) + return nil, nil, nil, nil } - defer rows.Close() - brands := make([]string, 0) - for rows.Next() { - var brand string - rows.Scan(&brand) - if len(brand) > 0 { - brands = append(brands, brand) + + var ( + brands []string = make([]string, 0) + computeEngineBrands []string + networkManageBrands []string + objectStorageBrands []string + ) + for i := 0; i < len(cloudAccounts); i++ { + brands = append(brands, cloudAccounts[i].Brand) + factory, err := cloudAccounts[i].GetProviderFactory() + if err != nil { + log.Errorln(err) + continue + } + if factory.IsSupportComputeEngine() { + if computeEngineBrands == nil { + computeEngineBrands = make([]string, 0) + } + computeEngineBrands = append(computeEngineBrands, cloudAccounts[i].Brand) + } + if factory.IsSupportNetworkManage() { + if networkManageBrands == nil { + networkManageBrands = make([]string, 0) + } + networkManageBrands = append(networkManageBrands, cloudAccounts[i].Brand) + } + if factory.IsSupportObjectStorage() { + if objectStorageBrands == nil { + objectStorageBrands = make([]string, 0) + } + objectStorageBrands = append(objectStorageBrands, cloudAccounts[i].Brand) } } + for _, hyper := range api.ONECLOUD_HYPERVISORS { if utils.IsInStringArray(hyper, hypervisors) { brands = append(brands, api.CLOUD_PROVIDER_ONECLOUD) + if computeEngineBrands == nil { + computeEngineBrands = make([]string, 0) + } + computeEngineBrands = append(computeEngineBrands, api.CLOUD_PROVIDER_ONECLOUD) + if networkManageBrands == nil { + networkManageBrands = make([]string, 0) + } + networkManageBrands = append(networkManageBrands, api.CLOUD_PROVIDER_ONECLOUD) break } } - return brands + return brands, computeEngineBrands, networkManageBrands, objectStorageBrands } func getHypervisors(region *SCloudregion, zone *SZone, domainId string) []string { diff --git a/pkg/multicloud/objectstore/provider/provider.go b/pkg/multicloud/objectstore/provider/provider.go index d826ccd0a2..faaa0a901e 100644 --- a/pkg/multicloud/objectstore/provider/provider.go +++ b/pkg/multicloud/objectstore/provider/provider.go @@ -42,6 +42,10 @@ func (factory *SObjectStoreProviderFactory) IsSupportObjectStorage() bool { return true } +func (factory *SObjectStoreProviderFactory) IsSupportComputeEngine() bool { + return false +} + func (self *SObjectStoreProviderFactory) ValidateCreateCloudaccountData(ctx context.Context, userCred mcclient.TokenCredential, input *api.CloudaccountCreateInput) error { if len(input.AccessKeyId) == 0 { return httperrors.NewMissingParameterError("access_key_id")