diff --git a/pkg/compute/models/elasticcache_accounts.go b/pkg/compute/models/elasticcache_accounts.go index a1180a4d5b..200f4576a4 100644 --- a/pkg/compute/models/elasticcache_accounts.go +++ b/pkg/compute/models/elasticcache_accounts.go @@ -437,6 +437,22 @@ func (self *SElasticcacheAccount) StartResetPasswordTask(ctx context.Context, us return nil } +func (self *SElasticcacheAccount) AllowGetDetailsLoginInfo(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { + return db.IsAdminAllowGetSpec(userCred, self, "login-info") +} + +func (self *SElasticcacheAccount) GetDetailsLoginInfo(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { + password, err := self.GetDecodedPassword() + if err != nil { + return nil, err + } + + ret := jsonutils.NewDict() + ret.Add(jsonutils.NewString(self.Name), "username") + ret.Add(jsonutils.NewString(password), "password") + return ret, nil +} + func (self *SElasticcacheAccount) ValidatePurgeCondition(ctx context.Context) error { return nil } diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 2226df2aca..27de4dc3c5 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -23,9 +23,11 @@ import ( "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis/billing" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" + "yunion.io/x/onecloud/pkg/cloudcommon/policy" "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/stringutils2" @@ -154,8 +156,17 @@ func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *s if usable, _ := query.Bool("usable"); usable { q = usableFilter(q, true) - q = q.NotEquals("postpaid_status", api.SkuStatusSoldout) - q = q.NotEquals("prepaid_status", api.SkuStatusSoldout) + sq := sqlchemy.OR(sqlchemy.Equals(q.Field("prepaid_status"), api.SkuStatusAvailable), sqlchemy.Equals(q.Field("postpaid_status"), api.SkuStatusAvailable)) + q = q.Filter(sq) + } + + if b, _ := query.GetString("billing_type"); len(b) > 0 { + switch b { + case billing.BILLING_TYPE_POSTPAID: + q = q.Equals("postpaid_status", api.SkuStatusAvailable) + case billing.BILLING_TYPE_PREPAID: + q = q.Equals("prepaid_status", api.SkuStatusAvailable) + } } q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ @@ -172,6 +183,16 @@ func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *s q = q.Join(regionTable, sqlchemy.Equals(regionTable.Field("id"), q.Field("cloudregion_id"))).Filter(sqlchemy.Equals(regionTable.Field("city"), city)) } + // 按区间查询内存, 避免0.75G这样的套餐不好过滤 + memSizeMB, _ := query.Int("memory_size_mb") + if memSizeMB > 0 { + s, e := intervalMem(int(memSizeMB)) + q.GT("memory_size_mb", s) + q.LE("memory_size_mb", e) + queryDict := query.(*jsonutils.JSONDict) + queryDict.Remove("memory_size_mb") + } + return q, err } @@ -275,7 +296,12 @@ func (manager *SElasticcacheSkuManager) AllowGetPropertyInstanceSpecs(ctx contex func (manager *SElasticcacheSkuManager) GetPropertyInstanceSpecs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { q := manager.Query("memory_size_mb") - q, err := manager.ListItemFilter(ctx, q, userCred, query) + q, err := db.ListItemQueryFilters(manager, ctx, q, userCred, query, policy.PolicyActionList) + if err != nil { + return nil, err + } + + q, err = manager.ListItemFilter(ctx, q, userCred, query) if err != nil { return nil, err } @@ -293,11 +319,12 @@ func (manager *SElasticcacheSkuManager) GetPropertyInstanceSpecs(ctx context.Con var ms int err := rows.Scan(&ms) if err == nil { - if _, exist := mems[ms]; !exist { + m := roundMem(ms) + if _, exist := mems[m]; !exist { if ms > 0 { - mems_mb.Add(jsonutils.NewInt(int64(ms))) + mems_mb.Add(jsonutils.NewInt(int64(m))) } - mems[ms] = true + mems[m] = true } } else { log.Debugf("SElasticcacheSkuManager.GetPropertyInstanceSpecs %s", err) @@ -315,7 +342,12 @@ func (manager *SElasticcacheSkuManager) AllowGetPropertyCapability(ctx context.C func (manager *SElasticcacheSkuManager) GetPropertyCapability(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { q := manager.Query("engine", "engine_version", "local_category", "node_type", "performance_type") - q, err := manager.ListItemFilter(ctx, q, userCred, query) + q, err := db.ListItemQueryFilters(manager, ctx, q, userCred, query, policy.PolicyActionList) + if err != nil { + return nil, err + } + + q, err = manager.ListItemFilter(ctx, q, userCred, query) if err != nil { return nil, err } diff --git a/pkg/compute/models/zoneresource.go b/pkg/compute/models/zoneresource.go index 55b2e19b7b..499b925594 100644 --- a/pkg/compute/models/zoneresource.go +++ b/pkg/compute/models/zoneresource.go @@ -46,6 +46,7 @@ func (self *SZoneResourceBase) GetCustomizeColumns(ctx context.Context, userCred info["region"] = region.GetName() info["region_id"] = region.GetId() if len(region.ExternalId) > 0 { + info["region_external_id"] = region.ExternalId info["region_ext_id"] = fetchExternalId(region.ExternalId) } } diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index af24bb4ce1..6b6629be94 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -577,6 +577,17 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu iconditions := NetworkUsableZoneQueries(q.Field("id"), usableNet, usableVpc) q = q.Filter(sqlchemy.OR(iconditions...)) q = q.Equals("status", api.ZONE_ENABLE) + + service, _ := query.GetString("service") + switch service { + case ElasticcacheManager.KeywordPlural(): + q2 := ElasticcacheSkuManager.Query("zone_id").Distinct() + statusFilter := sqlchemy.OR(sqlchemy.Equals(q2.Field("prepaid_status"), api.SkuStatusAvailable), sqlchemy.Equals(q2.Field("postpaid_status"), api.SkuStatusAvailable)) + skusSQ := q2.Filter(statusFilter).SubQuery() + q = q.In("id", skusSQ) + default: + break + } } managerStr, _ := query.GetString("manager")