diff --git a/pkg/apis/compute/guest_const.go b/pkg/apis/compute/guest_const.go index 172e8d5c9d..a4aed0b52e 100644 --- a/pkg/apis/compute/guest_const.go +++ b/pkg/apis/compute/guest_const.go @@ -133,7 +133,8 @@ const ( var VM_RUNNING_STATUS = []string{VM_START_START, VM_STARTING, VM_RUNNING, VM_BLOCK_STREAM} var VM_CREATING_STATUS = []string{VM_CREATE_NETWORK, VM_CREATE_DISK, VM_START_DEPLOY, VM_DEPLOYING} -var HYPERVISORS = []string{HYPERVISOR_KVM, +var HYPERVISORS = []string{ + HYPERVISOR_KVM, HYPERVISOR_BAREMETAL, HYPERVISOR_ESXI, HYPERVISOR_CONTAINER, @@ -147,6 +148,12 @@ var HYPERVISORS = []string{HYPERVISOR_KVM, HYPERVISOR_ZSTACK, } +var ONECLOUD_HYPERVISORS = []string{ + HYPERVISOR_BAREMETAL, + HYPERVISOR_KVM, + HYPERVISOR_CONTAINER, +} + var PUBLIC_CLOUD_HYPERVISORS = []string{ HYPERVISOR_ALIYUN, HYPERVISOR_AWS, diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index f4119bec5c..d3dbc23815 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -35,6 +35,7 @@ import ( type SCapabilities struct { Hypervisors []string `json:",allowempty"` + Brands []string `json:",allowempty"` ResourceTypes []string `json:",allowempty"` StorageTypes []string `json:",allowempty"` DataStorageTypes []string `json:",allowempty"` @@ -75,6 +76,7 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que domainId = "" } capa.Hypervisors = getHypervisors(region, zone, domainId) + capa.Brands = getBrands(region, zone, domainId, capa.Hypervisors) capa.ResourceTypes = getResourceTypes(region, zone, domainId) capa.StorageTypes = getStorageTypes(region, zone, true, domainId) capa.DataStorageTypes = getStorageTypes(region, zone, false, domainId) @@ -125,6 +127,47 @@ func getDomainManagerSubq(domainId string) *sqlchemy.SSubQuery { return q.SubQuery() } +func getBrands(region *SCloudregion, zone *SZone, domainId string, hypervisors []string) []string { + q := CloudaccountManager.Query("brand").IsTrue("enabled") + if zone != nil { + region = zone.GetRegion() + } + if region != nil { + providers := CloudproviderManager.Query().SubQuery() + providerregions := CloudproviderRegionManager.Query().SubQuery() + q = q.Join(providers, sqlchemy.Equals(q.Field("id"), providers.Field("cloudaccount_id"))) + q = q.Join(providerregions, sqlchemy.Equals(providers.Field("id"), providerregions.Field("cloudprovider_id"))) + q = q.Filter(sqlchemy.Equals(providerregions.Field("region_id"), region.Id)) + } + if len(domainId) > 0 { + q = q.Filter(sqlchemy.OR( + sqlchemy.IsTrue(q.Field("is_public")), + sqlchemy.Equals(q.Field("domain_id"), domainId), + )) + } + q = q.Distinct() + rows, err := q.Rows() + if err != nil { + return 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) + } + } + for _, hyper := range api.ONECLOUD_HYPERVISORS { + if utils.IsInStringArray(hyper, hypervisors) { + brands = append(brands, api.CLOUD_PROVIDER_ONECLOUD) + break + } + } + return brands +} + func getHypervisors(region *SCloudregion, zone *SZone, domainId string) []string { q := HostManager.Query("host_type", "manager_id") if region != nil {