diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 634ccc3621..8ed9896dd6 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -510,9 +510,9 @@ func usableFilter(q *sqlchemy.SQuery, public_cloud bool) (*sqlchemy.SQuery, erro providerTable := usableCloudProviders().SubQuery() providerRegionTable := CloudproviderRegionManager.Query().SubQuery() - subq := providerRegionTable.Query(sqlchemy.DISTINCT("cloudregion_id", providerRegionTable.Field("cloudregion_id"))) - subq = subq.Join(providerTable, sqlchemy.Equals(providerRegionTable.Field("cloudprovider_id"), providerTable.Field("id"))) - q = q.Filter(sqlchemy.In(q.Field("cloudregion_id"), subq.SubQuery())) + _subq := providerRegionTable.Query(sqlchemy.DISTINCT("cloudregion_id", providerRegionTable.Field("cloudregion_id"))) + subq := _subq.Join(providerTable, sqlchemy.Equals(providerRegionTable.Field("cloudprovider_id"), providerTable.Field("id"))).SubQuery() + q.Join(subq, sqlchemy.Equals(q.Field("cloudregion_id"), subq.Field("cloudregion_id"))) } // 过滤出network usable的sku @@ -701,10 +701,12 @@ func (manager *SServerSkuManager) ListItemFilter( cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { publicCloud = true - q = q.Filter(sqlchemy.In(q.Field("provider"), CloudproviderManager.GetPublicProviderProvidersQuery())) + pq := CloudproviderManager.GetPublicProviderProvidersQuery() + q = q.Join(pq, sqlchemy.Equals(q.Field("provider"), pq.Field("provider"))) } if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { - q = q.Filter(sqlchemy.In(q.Field("provider"), CloudproviderManager.GetPrivateProviderProvidersQuery())) + pq := CloudproviderManager.GetPrivateProviderProvidersQuery() + q = q.Join(pq, sqlchemy.Equals(q.Field("provider"), pq.Field("provider"))) } if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { q = q.Filter( diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 92f92b23fc..279ab1b21c 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -560,7 +560,7 @@ func NetworkUsableZoneIds(usableNet, usableVpc bool, query *api.ZoneListInput) ( if err != nil { return nil, errors.Wrap(err, "zoneUsableVpc") } - ret, err := usableZoneQ1(vpcs, usableNet) + r1, err := usableZoneQ1(vpcs, usableNet) if err != nil { return nil, errors.Wrap(err, "usableZoneQ1") } @@ -569,7 +569,16 @@ func NetworkUsableZoneIds(usableNet, usableVpc bool, query *api.ZoneListInput) ( return nil, errors.Wrap(err, "usableZoneQ2") } - ret = append(ret, r2...) + r1 = append(r1, r2...) + // remove dupliates + ret := make([]string, 0) + rm := make(map[string]bool) + for _, zone := range r1 { + if _, ok := rm[zone]; !ok { + rm[zone] = true + ret = append(ret, zone) + } + } return ret, nil }