mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
修复实例规格列表缓存key错误&修复cloudregion manager过滤查询错误
This commit is contained in:
@@ -929,16 +929,12 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc
|
||||
}
|
||||
managerStr, _ := query.GetString("manager")
|
||||
if len(managerStr) > 0 {
|
||||
providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
|
||||
} else {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
}
|
||||
provider := providerObj.(*SCloudprovider)
|
||||
q = q.Equals("id", provider.CloudaccountId)
|
||||
cpr := CloudproviderRegionManager.Query().SubQuery()
|
||||
sq := cpr.Query(cpr.Field("cloudregion_id"))
|
||||
sq = sq.Filter(sqlchemy.Equals(cpr.Field("cloudprovider_id"), managerStr))
|
||||
sq = sq.Filter(sqlchemy.IsTrue(cpr.Field("enabled")))
|
||||
|
||||
q = q.In("id", sq.SubQuery())
|
||||
}
|
||||
|
||||
cloudEnvStr, _ := query.GetString("cloud_env")
|
||||
|
||||
@@ -17,9 +17,7 @@ package models
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/util/compare"
|
||||
@@ -445,21 +443,12 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch
|
||||
|
||||
managerStr, _ := query.GetString("manager")
|
||||
if len(managerStr) > 0 {
|
||||
managerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
|
||||
} else {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
}
|
||||
manager := managerObj.(*SCloudprovider)
|
||||
q = q.Equals("provider", manager.Provider)
|
||||
if manager.Provider == api.CLOUD_PROVIDER_HUAWEI {
|
||||
region := strings.Split(manager.Name, "_")[0]
|
||||
prefix := api.CLOUD_PROVIDER_HUAWEI + "/" + region
|
||||
q = q.Startswith("external_id", prefix)
|
||||
}
|
||||
cpr := CloudproviderRegionManager.Query().SubQuery()
|
||||
sq := cpr.Query(cpr.Field("cloudregion_id"))
|
||||
sq = sq.Filter(sqlchemy.Equals(cpr.Field("cloudprovider_id"), managerStr))
|
||||
sq = sq.Filter(sqlchemy.IsTrue(cpr.Field("enabled")))
|
||||
|
||||
q = q.In("id", sq.SubQuery())
|
||||
}
|
||||
accountStr, _ := query.GetString("account")
|
||||
if len(accountStr) > 0 {
|
||||
|
||||
@@ -16,6 +16,7 @@ package models
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"math"
|
||||
@@ -23,6 +24,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -473,7 +475,7 @@ func providerFilter(q *sqlchemy.SQuery, provider string, public_cloud bool) *sql
|
||||
if provider == "all" {
|
||||
// provider 参数为all时。表示查询所有instance type.
|
||||
return q
|
||||
} else if len(provider) > 0 {
|
||||
} else if len(provider) > 0 && !utils.IsInStringArray(provider, []string{api.CLOUD_PROVIDER_ONECLOUD, api.CLOUD_PROVIDER_VMWARE, "kvm"}) {
|
||||
q = q.Equals("provider", provider)
|
||||
} else if public_cloud {
|
||||
q = q.IsNotEmpty("provider")
|
||||
@@ -488,17 +490,27 @@ func providerFilter(q *sqlchemy.SQuery, provider string, public_cloud bool) *sql
|
||||
return q
|
||||
}
|
||||
|
||||
func queryCacheKey(prefix string, query jsonutils.JSONObject) string {
|
||||
_ret := md5.Sum([]byte(query.QueryString()))
|
||||
return prefix + fmt.Sprintf("%x", _ret)
|
||||
}
|
||||
|
||||
func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
specsKey := "InstanceSpecs"
|
||||
specsKey := queryCacheKey("InstanceSpecs", query)
|
||||
v := Cache.Get(specsKey)
|
||||
if v != nil {
|
||||
return v.(*jsonutils.JSONDict), nil
|
||||
if cacheRet, ok := v.(*jsonutils.JSONDict); ok {
|
||||
return cacheRet, nil
|
||||
}
|
||||
}
|
||||
|
||||
q := self.Query()
|
||||
// 未明确指定provider或者public_cloud时,默认查询私有云
|
||||
provider, _ := query.GetString("provider")
|
||||
provider := normalizeProvider(jsonutils.GetAnyString(query, []string{"provider"}))
|
||||
public_cloud, _ := query.Bool("public_cloud")
|
||||
if utils.IsInStringArray(provider, cloudprovider.GetPublicProviders()) {
|
||||
public_cloud = true
|
||||
}
|
||||
q = providerFilter(q, provider, public_cloud)
|
||||
q = excludeSkus(q)
|
||||
|
||||
@@ -571,8 +583,8 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use
|
||||
|
||||
r_obj := jsonutils.Marshal(&cpu_mems_mb)
|
||||
ret.Add(r_obj, "cpu_mems_mb")
|
||||
// cache
|
||||
Cache.Set(specsKey, ret)
|
||||
// cache 1min
|
||||
Cache.Set(specsKey, ret, time.Now().Add(60*time.Second))
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
@@ -709,6 +721,9 @@ func (self *SServerSku) GetZoneExternalId() (string, error) {
|
||||
func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
|
||||
provider := normalizeProvider(jsonutils.GetAnyString(query, []string{"provider"}))
|
||||
public_cloud, _ := query.Bool("public_cloud")
|
||||
if utils.IsInStringArray(provider, cloudprovider.GetPublicProviders()) {
|
||||
public_cloud = true
|
||||
}
|
||||
queryDict := query.(*jsonutils.JSONDict)
|
||||
// 手动处理provider查询
|
||||
queryDict.Remove("provider")
|
||||
|
||||
Reference in New Issue
Block a user