diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index 079cd574fd..8371bcfe2e 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -1642,17 +1642,31 @@ func (manager *SDBInstanceManager) newFromCloudDBInstance(ctx context.Context, u return &instance, nil } +type SRdsCountStat struct { + TotalRdsCount int + TotalCpuCount int + TotalMemSizeMb int +} + func (man *SDBInstanceManager) TotalCount( scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, -) (int, error) { - q := man.Query() +) (SRdsCountStat, error) { + sq := man.Query().SubQuery() + q := sq.Query(sqlchemy.COUNT("total_rds_count"), + sqlchemy.SUM("total_cpu_count", sq.Field("vcpu_count")), + sqlchemy.SUM("total_mem_size_mb", sq.Field("vmem_size_mb"))) + q = scopeOwnerIdFilter(q, scope, ownerId) q = CloudProviderFilter(q, q.Field("manager_id"), providers, brands, cloudEnv) q = RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id"), nil, nil) - return q.CountWithError() + + stat := SRdsCountStat{} + row := q.Row() + err := q.Row2Struct(row, &stat) + return stat, err } func (dbinstance *SDBInstance) GetQuotaKeys() quotas.IQuotaKeys { diff --git a/pkg/compute/models/regionquota.go b/pkg/compute/models/regionquota.go index 53af1cab66..c7362ff6f8 100644 --- a/pkg/compute/models/regionquota.go +++ b/pkg/compute/models/regionquota.go @@ -196,7 +196,8 @@ func (self *SRegionQuota) FetchUsage(ctx context.Context) error { self.ObjectGB = int(bucketUsage.Bytes / 1000 / 1000 / 1000) self.ObjectCnt = bucketUsage.Objects - self.Rds, _ = DBInstanceManager.TotalCount(scope, ownerId, rangeObjs, providers, brands, regionKeys.CloudEnv) + rdsUsage, _ := DBInstanceManager.TotalCount(scope, ownerId, rangeObjs, providers, brands, regionKeys.CloudEnv) + self.Rds = rdsUsage.TotalRdsCount self.Cache, _ = ElasticcacheManager.TotalCount(scope, ownerId, rangeObjs, providers, brands, regionKeys.CloudEnv) self.Loadbalancer, _ = LoadbalancerManager.TotalCount(scope, ownerId, rangeObjs, providers, brands, regionKeys.CloudEnv) diff --git a/pkg/compute/usages/handler.go b/pkg/compute/usages/handler.go index fe71d626ae..d5b8a23c4d 100644 --- a/pkg/compute/usages/handler.go +++ b/pkg/compute/usages/handler.go @@ -874,7 +874,9 @@ func LoadbalancerUsage(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityPro func DBInstanceUsage(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) Usage { cnt, _ := models.DBInstanceManager.TotalCount(scope, ownerId, rangeObjs, providers, brands, cloudEnv) count := make(map[string]interface{}) - count[getKey(scope, "rds")] = cnt + count[getKey(scope, "rds")] = cnt.TotalRdsCount + count[getKey(scope, "rds.cpu")] = cnt.TotalCpuCount + count[getKey(scope, "rds.memory")] = cnt.TotalMemSizeMb return count }