diff --git a/pkg/cloudprovider/consts.go b/pkg/cloudprovider/consts.go index 039faf9759..e8120b1566 100644 --- a/pkg/cloudprovider/consts.go +++ b/pkg/cloudprovider/consts.go @@ -41,6 +41,8 @@ const ( ) const ( + READ_ONLY_SUFFIX = ".readonly" + CLOUD_CAPABILITY_PROJECT = "project" CLOUD_CAPABILITY_COMPUTE = "compute" CLOUD_CAPABILITY_NETWORK = "network" diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index 51858abbe9..85cba31c2e 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -18,6 +18,7 @@ import ( "context" "database/sql" "fmt" + "strings" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -37,17 +38,20 @@ import ( ) type SCapabilities struct { - Hypervisors []string `json:",allowempty"` - Brands []string `json:",allowempty"` - DisabledBrands []string `json:",allowempty"` - ComputeEngineBrands []string `json:",allowempty"` - DisabledComputeEngineBrands []string `json:",allowempty"` - RdsEngineBrands []string `json:",allowempty"` - RedisEngineBrands []string `json:",allowempty"` - LoadbalancerEngineBrands []string `json:",allowempty"` - DisabledRdsEngineBrands []string `json:",allowempty"` - CloudIdBrands []string `json:",allowempty"` - DisabledCloudIdBrands []string `json:",allowempty"` + Hypervisors []string `json:",allowempty"` + + Brands []string `json:",allowempty"` + DisabledBrands []string `json:",allowempty"` + ComputeEngineBrands []string `json:",allowempty"` + DisabledComputeEngineBrands []string `json:",allowempty"` + RdsEngineBrands []string `json:",allowempty"` + DisabledRdsEngineBrands []string `json:",allowempty"` + RedisEngineBrands []string `json:",allowempty"` + DisabledRedisEngineBrands []string `json:",allowempty"` + LoadbalancerEngineBrands []string `json:",allowempty"` + DisabledLoadbalancerEngineBrands []string `json:",allowempty"` + CloudIdBrands []string `json:",allowempty"` + DisabledCloudIdBrands []string `json:",allowempty"` // 支持SAML 2.0 SamlAuthBrands []string `json:",allowempty"` DisabledSamlAuthBrands []string `json:",allowempty"` @@ -60,21 +64,53 @@ type SCapabilities struct { CdnBrands []string `json:",allowempty"` DisabledCdnBrands []string `json:",allowempty"` PublicIpBrands []string `json:",allowempty"` + DisabledPublicIpBrands []string `json:",allowempty"` NetworkManageBrands []string `json:",allowempty"` DisabledNetworkManageBrands []string `json:",allowempty"` ObjectStorageBrands []string `json:",allowempty"` DisabledObjectStorageBrands []string `json:",allowempty"` - ResourceTypes []string `json:",allowempty"` - StorageTypes []string `json:",allowempty"` // going to remove on 2.14 - DataStorageTypes []string `json:",allowempty"` // going to remove on 2.14 - GPUModels []string `json:",allowempty"` - HostCpuArchs []string `json:",allowempty"` // x86_64 aarch64 - MinNicCount int - MaxNicCount int - MinDataDiskCount int - MaxDataDiskCount int - SchedPolicySupport bool - Usable bool + + ReadOnlyBrands []string `json:",allowempty"` + ReadOnlyDisabledBrands []string `json:",allowempty"` + ReadOnlyComputeEngineBrands []string `json:",allowempty"` + ReadOnlyDisabledComputeEngineBrands []string `json:",allowempty"` + ReadOnlyRdsEngineBrands []string `json:",allowempty"` + ReadOnlyDisabledRdsEngineBrands []string `json:",allowempty"` + ReadOnlyRedisEngineBrands []string `json:",allowempty"` + ReadOnlyDisabledRedisEngineBrands []string `json:",allowempty"` + ReadOnlyLoadbalancerEngineBrands []string `json:",allowempty"` + ReadOnlyDisabledLoadbalancerEngineBrands []string `json:",allowempty"` + ReadOnlyCloudIdBrands []string `json:",allowempty"` + ReadOnlyDisabledCloudIdBrands []string `json:",allowempty"` + // 支持SAML 2.0 + ReadOnlySamlAuthBrands []string `json:",allowempty"` + ReadOnlyDisabledSamlAuthBrands []string `json:",allowempty"` + ReadOnlyNatBrands []string `json:",allowempty"` + ReadOnlyDisabledNatBrands []string `json:",allowempty"` + ReadOnlyNasBrands []string `json:",allowempty"` + ReadOnlyDisabledNasBrands []string `json:",allowempty"` + ReadOnlyWafBrands []string `json:",allowempty"` + ReadOnlyDisabledWafBrands []string `json:",allowempty"` + ReadOnlyCdnBrands []string `json:",allowempty"` + ReadOnlyDisabledCdnBrands []string `json:",allowempty"` + ReadOnlyPublicIpBrands []string `json:",allowempty"` + ReadOnlyDisabledPublicIpBrands []string `json:",allowempty"` + ReadOnlyNetworkManageBrands []string `json:",allowempty"` + ReadOnlyDisabledNetworkManageBrands []string `json:",allowempty"` + ReadOnlyObjectStorageBrands []string `json:",allowempty"` + ReadOnlyDisabledObjectStorageBrands []string `json:",allowempty"` + + ResourceTypes []string `json:",allowempty"` + StorageTypes []string `json:",allowempty"` // going to remove on 2.14 + DataStorageTypes []string `json:",allowempty"` // going to remove on 2.14 + GPUModels []string `json:",allowempty"` + HostCpuArchs []string `json:",allowempty"` // x86_64 aarch64 + MinNicCount int + MaxNicCount int + MinDataDiskCount int + MaxDataDiskCount int + SchedPolicySupport bool + Usable bool // Deprecated PublicNetworkCount int @@ -295,20 +331,24 @@ func getDBInstanceInfo(region *SCloudregion, zone *SZone) map[string]map[string] // set all brands, compute engine brands, network manage brands, object storage brands func getBrands(region *SCloudregion, zone *SZone, domainId string, capa *SCapabilities) { - capa.Brands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, "") - capa.ComputeEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_COMPUTE) - capa.RdsEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_RDS) - capa.RedisEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_CACHE) - capa.NetworkManageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_NETWORK) - capa.ObjectStorageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) - capa.CloudIdBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_CLOUDID) - capa.PublicIpBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_PUBLIC_IP) - capa.LoadbalancerEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER) - capa.SamlAuthBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_SAML_AUTH) - capa.NatBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_NAT) - capa.NasBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_NAS) - capa.WafBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_WAF) - capa.CdnBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_CDN) + brands, err := CloudaccountManager.getBrandsOfCapability(region, zone, domainId) + if err != nil { + log.Errorf("getBrandsOfCapability: %v", err) + } + brandMaps := map[string]map[string]bool{} + for _, brand := range brands { + _, ok := brandMaps[brand.Brand] + if !ok { + brandMaps[brand.Brand] = map[string]bool{} + } + _, ok = brandMaps[brand.Brand][brand.Capability] + if !ok { + brandMaps[brand.Brand][brand.Capability] = brand.Enabled + } + if brand.Enabled { + brandMaps[brand.Brand][brand.Capability] = true + } + } if utils.IsInStringArray(api.HYPERVISOR_KVM, capa.Hypervisors) || utils.IsInStringArray(api.HYPERVISOR_BAREMETAL, capa.Hypervisors) { capa.Brands = append(capa.Brands, api.ONECLOUD_BRAND_ONECLOUD) @@ -319,19 +359,72 @@ func getBrands(region *SCloudregion, zone *SZone, domainId string, capa *SCapabi capa.LoadbalancerEngineBrands = append(capa.LoadbalancerEngineBrands, api.ONECLOUD_BRAND_ONECLOUD) } - capa.NetworkManageBrands = append(capa.NetworkManageBrands, api.ONECLOUD_BRAND_ONECLOUD) + var appendBrand = func(enabled *[]string, disabled *[]string, readOnlyEnabled *[]string, readOnlyDisabled *[]string, brand, capability string, isEnable, readOnly bool) { + if readOnly { + if isEnable { + *readOnlyEnabled = append(*readOnlyEnabled, brand) + if capability == cloudprovider.CLOUD_CAPABILITY_COMPUTE && !utils.IsInStringArray(brand, capa.ReadOnlyBrands) { + capa.ReadOnlyBrands = append(capa.ReadOnlyBrands, brand) + } + } else { + *readOnlyDisabled = append(*readOnlyDisabled, brand) + if capability == cloudprovider.CLOUD_CAPABILITY_COMPUTE && !utils.IsInStringArray(brand, capa.ReadOnlyDisabledBrands) { + capa.ReadOnlyDisabledBrands = append(capa.ReadOnlyDisabledBrands, brand) + } + } + } else { + if isEnable { + *enabled = append(*enabled, brand) + if capability == cloudprovider.CLOUD_CAPABILITY_COMPUTE && !utils.IsInStringArray(brand, capa.Brands) { + capa.Brands = append(capa.Brands, brand) + } + } else { + *disabled = append(*disabled, brand) + if capability == cloudprovider.CLOUD_CAPABILITY_COMPUTE && !utils.IsInStringArray(brand, capa.DisabledBrands) { + capa.DisabledBrands = append(capa.DisabledBrands, brand) + } + } + } + } - capa.DisabledBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, "") - capa.DisabledComputeEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_COMPUTE) - capa.DisabledRdsEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_RDS) - capa.DisabledNetworkManageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_NETWORK) - capa.DisabledObjectStorageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) - capa.DisabledCloudIdBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_CLOUDID) - capa.DisabledSamlAuthBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_SAML_AUTH) - capa.DisabledNatBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_NAT) - capa.DisabledNasBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_NAS) - capa.DisabledNasBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_WAF) - capa.DisabledCdnBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_CDN) + for brand, info := range brandMaps { + for capability, enabled := range info { + readOnly := false + if strings.HasSuffix(capability, cloudprovider.READ_ONLY_SUFFIX) { + readOnly = true + capability = strings.TrimSuffix(capability, cloudprovider.READ_ONLY_SUFFIX) + } + switch capability { + case cloudprovider.CLOUD_CAPABILITY_COMPUTE: + appendBrand(&capa.ComputeEngineBrands, &capa.DisabledComputeEngineBrands, &capa.ReadOnlyComputeEngineBrands, &capa.ReadOnlyDisabledComputeEngineBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_RDS: + appendBrand(&capa.RdsEngineBrands, &capa.DisabledRdsEngineBrands, &capa.ReadOnlyRdsEngineBrands, &capa.ReadOnlyDisabledRdsEngineBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_CACHE: + appendBrand(&capa.RedisEngineBrands, &capa.DisabledRedisEngineBrands, &capa.ReadOnlyRedisEngineBrands, &capa.ReadOnlyDisabledRedisEngineBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_NETWORK: + appendBrand(&capa.NetworkManageBrands, &capa.DisabledNetworkManageBrands, &capa.ReadOnlyNetworkManageBrands, &capa.ReadOnlyDisabledNetworkManageBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE: + appendBrand(&capa.ObjectStorageBrands, &capa.DisabledObjectStorageBrands, &capa.ReadOnlyObjectStorageBrands, &capa.ReadOnlyDisabledObjectStorageBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_CLOUDID: + appendBrand(&capa.CloudIdBrands, &capa.DisabledCloudIdBrands, &capa.ReadOnlyCloudIdBrands, &capa.ReadOnlyDisabledCloudIdBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_PUBLIC_IP: + appendBrand(&capa.PublicIpBrands, &capa.DisabledPublicIpBrands, &capa.ReadOnlyPublicIpBrands, &capa.ReadOnlyDisabledPublicIpBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_LOADBALANCER: + appendBrand(&capa.LoadbalancerEngineBrands, &capa.DisabledLoadbalancerEngineBrands, &capa.ReadOnlyLoadbalancerEngineBrands, &capa.ReadOnlyDisabledLoadbalancerEngineBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_SAML_AUTH: + appendBrand(&capa.SamlAuthBrands, &capa.DisabledSamlAuthBrands, &capa.ReadOnlySamlAuthBrands, &capa.ReadOnlyDisabledSamlAuthBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_NAT: + appendBrand(&capa.NatBrands, &capa.DisabledNatBrands, &capa.ReadOnlyNatBrands, &capa.ReadOnlyDisabledNatBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_NAS: + appendBrand(&capa.NasBrands, &capa.DisabledNasBrands, &capa.ReadOnlyNasBrands, &capa.ReadOnlyDisabledNasBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_WAF: + appendBrand(&capa.WafBrands, &capa.DisabledWafBrands, &capa.ReadOnlyWafBrands, &capa.ReadOnlyDisabledWafBrands, brand, capability, enabled, readOnly) + case cloudprovider.CLOUD_CAPABILITY_CDN: + appendBrand(&capa.CdnBrands, &capa.DisabledCdnBrands, &capa.ReadOnlyCdnBrands, &capa.ReadOnlyDisabledCdnBrands, brand, capability, enabled, readOnly) + default: + } + } + } return } diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index feec1698c5..65fd2e3196 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -2509,16 +2509,9 @@ func (manager *SCloudaccountManager) queryCloudAccountByCapability(region *SClou providers := CloudproviderManager.Query().SubQuery() q := manager.Query() q = q.Join(providers, sqlchemy.Equals(q.Field("id"), providers.Field("cloudaccount_id"))) - if len(capability) > 0 { - cloudproviderCapabilities := CloudproviderCapabilityManager.Query().SubQuery() - q = q.Join(cloudproviderCapabilities, sqlchemy.Equals(providers.Field("id"), cloudproviderCapabilities.Field("cloudprovider_id"))) - q = q.Filter(sqlchemy.Equals(cloudproviderCapabilities.Field("capability"), capability)) - } - if enabled.IsTrue() { - q = q.IsTrue("enabled") - } else if enabled.IsFalse() { - q = q.IsFalse("enabled") - } + cloudproviderCapabilities := CloudproviderCapabilityManager.Query().SubQuery() + q = q.Join(cloudproviderCapabilities, sqlchemy.Equals(providers.Field("id"), cloudproviderCapabilities.Field("cloudprovider_id"))) + q = q.Filter(sqlchemy.Equals(cloudproviderCapabilities.Field("capability"), capability)) if zone != nil { region, _ = zone.GetRegion() } @@ -2529,42 +2522,54 @@ func (manager *SCloudaccountManager) queryCloudAccountByCapability(region *SClou } if len(domainId) > 0 { q = manager.filterByDomainId(q, domainId) - /*q = q.Filter(sqlchemy.OR( - sqlchemy.AND( - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), - sqlchemy.Equals(q.Field("domain_id"), domainId), - ), - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), - sqlchemy.AND( - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), - sqlchemy.Equals(providers.Field("domain_id"), domainId), - ), - ))*/ } return q } -func (manager *SCloudaccountManager) getBrandsOfCapability(region *SCloudregion, zone *SZone, domainId string, enabled tristate.TriState, capability string) ([]string, error) { - subq := manager.queryCloudAccountByCapability(region, zone, domainId, enabled, capability).SubQuery() - q := subq.Query(subq.Field("brand")).Distinct() - rows, err := q.Rows() - if err != nil { - if errors.Cause(err) != sql.ErrNoRows { - return nil, errors.Wrap(err, "rows") - } - return []string{}, nil +type sBrandCapability struct { + Brand string + Enabled bool + Capability string +} + +func (manager *SCloudaccountManager) getBrandsOfCapability(region *SCloudregion, zone *SZone, domainId string) ([]sBrandCapability, error) { + accounts := manager.Query("id", "enabled", "brand") + if len(domainId) > 0 { + accounts = manager.filterByDomainId(accounts, domainId) } - ret := make([]string, 0) - defer rows.Close() - for rows.Next() { - var brand string - err := rows.Scan(&brand) + + accountSQ := accounts.SubQuery() + providers := CloudproviderManager.Query().SubQuery() + q := CloudproviderCapabilityManager.Query("capability") + + q.AppendField(accountSQ.Field("enabled")) + q.AppendField(accountSQ.Field("brand")) + + q = q.Join(providers, sqlchemy.Equals(q.Field("cloudprovider_id"), providers.Field("id"))) + q = q.Join(accountSQ, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountSQ.Field("id"))) + + if zone != nil { + var err error + region, err = zone.GetRegion() if err != nil { - return nil, errors.Wrap(err, "rows.Scan") + return nil, errors.Wrapf(err, "GetRegion") } - ret = append(ret, brand) } - return ret, nil + if region != nil { + providerregions := CloudproviderRegionManager.Query().SubQuery() + q = q.Join(providerregions, sqlchemy.Equals(q.Field("cloudprovider_id"), providerregions.Field("cloudprovider_id"))).Filter( + sqlchemy.Equals(providerregions.Field("cloudregion_id"), region.Id), + ) + } + + q = q.Distinct() + + result := []sBrandCapability{} + err := q.All(&result) + if err != nil { + return nil, errors.Wrapf(err, "q.All") + } + return result, nil } func (account *SCloudaccount) getAccountShareInfo() apis.SAccountShareInfo { diff --git a/pkg/compute/models/cloudprovidercapacities.go b/pkg/compute/models/cloudprovidercapacities.go index cda6762c1f..5ae21a3f8f 100644 --- a/pkg/compute/models/cloudprovidercapacities.go +++ b/pkg/compute/models/cloudprovidercapacities.go @@ -70,6 +70,7 @@ func (manager *SCloudproviderCapabilityManager) setRegionCapabilities(ctx contex if err != nil { return errors.Wrap(err, "manager.getCapabilities") } + oldCapas := stringutils2.NewSortedStrings(oldCapabilities) newCapas := stringutils2.NewSortedStrings(capabilities) deleted, _, added := stringutils2.Split(oldCapas, newCapas) diff --git a/pkg/multicloud/aliyun/aliyun.go b/pkg/multicloud/aliyun/aliyun.go index d5ae484e66..39432fcc81 100644 --- a/pkg/multicloud/aliyun/aliyun.go +++ b/pkg/multicloud/aliyun/aliyun.go @@ -689,9 +689,9 @@ func (region *SAliyunClient) GetCapabilities() []string { cloudprovider.CLOUD_CAPABILITY_NAT, cloudprovider.CLOUD_CAPABILITY_NAS, cloudprovider.CLOUD_CAPABILITY_WAF, - cloudprovider.CLOUD_CAPABILITY_MONGO_DB, - cloudprovider.CLOUD_CAPABILITY_ES, - cloudprovider.CLOUD_CAPABILITY_KAFKA, + cloudprovider.CLOUD_CAPABILITY_MONGO_DB + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_ES + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_KAFKA + cloudprovider.READ_ONLY_SUFFIX, } return caps } diff --git a/pkg/multicloud/aws/aws.go b/pkg/multicloud/aws/aws.go index b64990bb5b..05071d8d9d 100644 --- a/pkg/multicloud/aws/aws.go +++ b/pkg/multicloud/aws/aws.go @@ -600,8 +600,8 @@ func (self *SAwsClient) GetCapabilities() []string { cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, - cloudprovider.CLOUD_CAPABILITY_RDS, - cloudprovider.CLOUD_CAPABILITY_CACHE, + cloudprovider.CLOUD_CAPABILITY_RDS + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_CACHE + cloudprovider.READ_ONLY_SUFFIX, // cloudprovider.CLOUD_CAPABILITY_EVENT, cloudprovider.CLOUD_CAPABILITY_CLOUDID, cloudprovider.CLOUD_CAPABILITY_DNSZONE, diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index c20c6e86bd..0a59426505 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -985,16 +985,16 @@ func (self *SAzureClient) GetCapabilities() []string { cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, cloudprovider.CLOUD_CAPABILITY_NETWORK, - cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, + cloudprovider.CLOUD_CAPABILITY_LOADBALANCER + cloudprovider.READ_ONLY_SUFFIX, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, - cloudprovider.CLOUD_CAPABILITY_RDS, - cloudprovider.CLOUD_CAPABILITY_CACHE, + cloudprovider.CLOUD_CAPABILITY_RDS + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_CACHE + cloudprovider.READ_ONLY_SUFFIX, cloudprovider.CLOUD_CAPABILITY_EVENT, cloudprovider.CLOUD_CAPABILITY_CLOUDID, cloudprovider.CLOUD_CAPABILITY_SAML_AUTH, cloudprovider.CLOUD_CAPABILITY_WAF, - cloudprovider.CLOUD_CAPABILITY_CACHE, - cloudprovider.CLOUD_CAPABILITY_APP, + cloudprovider.CLOUD_CAPABILITY_CACHE + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_APP + cloudprovider.READ_ONLY_SUFFIX, } return caps } diff --git a/pkg/multicloud/cloudpods/cloudpods.go b/pkg/multicloud/cloudpods/cloudpods.go index 1a94403ba6..04a5b83092 100644 --- a/pkg/multicloud/cloudpods/cloudpods.go +++ b/pkg/multicloud/cloudpods/cloudpods.go @@ -237,7 +237,7 @@ func (self *SCloudpodsClient) GetRegions() ([]SRegion, error) { func (self *SCloudpodsClient) GetCapabilities() []string { return []string{ - cloudprovider.CLOUD_CAPABILITY_PROJECT, + cloudprovider.CLOUD_CAPABILITY_PROJECT + cloudprovider.READ_ONLY_SUFFIX, cloudprovider.CLOUD_CAPABILITY_COMPUTE, cloudprovider.CLOUD_CAPABILITY_NETWORK, } diff --git a/pkg/multicloud/ecloud/client.go b/pkg/multicloud/ecloud/client.go index df158a758b..19277f1069 100644 --- a/pkg/multicloud/ecloud/client.go +++ b/pkg/multicloud/ecloud/client.go @@ -144,8 +144,8 @@ func (ec *SEcloudClient) GetRegionById(id string) (*SRegion, error) { func (ec *SEcloudClient) GetCapabilities() []string { caps := []string{ - cloudprovider.CLOUD_CAPABILITY_COMPUTE, - cloudprovider.CLOUD_CAPABILITY_NETWORK, + cloudprovider.CLOUD_CAPABILITY_COMPUTE + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_NETWORK + cloudprovider.READ_ONLY_SUFFIX, } return caps } diff --git a/pkg/multicloud/jdcloud/provider/provider.go b/pkg/multicloud/jdcloud/provider/provider.go index f05f56e549..164df52fdd 100644 --- a/pkg/multicloud/jdcloud/provider/provider.go +++ b/pkg/multicloud/jdcloud/provider/provider.go @@ -211,10 +211,14 @@ func (p *SJdcloudProvider) GetCloudRegionExternalIdPrefix() string { } func (p *SJdcloudProvider) GetCapabilities() []string { + iRegions := p.GetIRegions() + if len(iRegions) > 0 { + return iRegions[0].GetCapabilities() + } caps := []string{ - cloudprovider.CLOUD_CAPABILITY_COMPUTE, - cloudprovider.CLOUD_CAPABILITY_NETWORK, - cloudprovider.CLOUD_CAPABILITY_RDS, + cloudprovider.CLOUD_CAPABILITY_COMPUTE + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_NETWORK + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_RDS + cloudprovider.READ_ONLY_SUFFIX, } return caps } diff --git a/pkg/multicloud/jdcloud/region.go b/pkg/multicloud/jdcloud/region.go index 114ec31193..71508c5485 100644 --- a/pkg/multicloud/jdcloud/region.go +++ b/pkg/multicloud/jdcloud/region.go @@ -337,7 +337,8 @@ func (r *SRegion) GetProvider() string { func (r *SRegion) GetCapabilities() []string { return []string{ - cloudprovider.CLOUD_CAPABILITY_COMPUTE, - cloudprovider.CLOUD_CAPABILITY_NETWORK, + cloudprovider.CLOUD_CAPABILITY_COMPUTE + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_NETWORK + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_RDS + cloudprovider.READ_ONLY_SUFFIX, } } diff --git a/pkg/multicloud/qcloud/qcloud.go b/pkg/multicloud/qcloud/qcloud.go index 32fd908553..6a9cebfd57 100644 --- a/pkg/multicloud/qcloud/qcloud.go +++ b/pkg/multicloud/qcloud/qcloud.go @@ -1097,10 +1097,10 @@ func (self *SQcloudClient) GetCapabilities() []string { cloudprovider.CLOUD_CAPABILITY_PUBLIC_IP, cloudprovider.CLOUD_CAPABILITY_INTERVPCNETWORK, cloudprovider.CLOUD_CAPABILITY_SAML_AUTH, - cloudprovider.CLOUD_CAPABILITY_MONGO_DB, - cloudprovider.CLOUD_CAPABILITY_ES, - cloudprovider.CLOUD_CAPABILITY_KAFKA, - cloudprovider.CLOUD_CAPABILITY_CDN, + cloudprovider.CLOUD_CAPABILITY_MONGO_DB + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_ES + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_KAFKA + cloudprovider.READ_ONLY_SUFFIX, + cloudprovider.CLOUD_CAPABILITY_CDN + cloudprovider.READ_ONLY_SUFFIX, } return caps }