修复实例规格列表缓存key错误&修复cloudregion manager过滤查询错误

This commit is contained in:
TangBin
2019-04-20 12:02:56 +08:00
parent a31e8172a1
commit 97033be097
3 changed files with 33 additions and 33 deletions
+6 -10
View File
@@ -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")
+6 -17
View File
@@ -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 {
+21 -6
View File
@@ -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")