From 912bf5c699f4d27c2e802dc27491ab8008e71213 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 27 Apr 2020 02:10:23 +0800 Subject: [PATCH] fix: cloud-account/provider usage not accurate --- pkg/compute/models/buckets.go | 2 +- pkg/compute/models/dbinstances.go | 2 +- pkg/compute/models/disks.go | 2 +- pkg/compute/models/elasticcache_instances.go | 2 +- pkg/compute/models/elasticips.go | 2 +- pkg/compute/models/filters.go | 2 +- pkg/compute/models/guestnetworks.go | 2 +- pkg/compute/models/loadbalancernetworks.go | 2 +- pkg/compute/models/loadbalancers.go | 2 +- pkg/compute/models/snapshots.go | 2 +- pkg/compute/models/usage.go | 2 +- pkg/compute/models/vpcs.go | 2 +- pkg/compute/models/wires.go | 4 ++-- pkg/compute/usages/handler.go | 10 ++++++---- 14 files changed, 20 insertions(+), 18 deletions(-) diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 88a19e4e67..09de12717b 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -1196,7 +1196,7 @@ func (manager *SBucketManager) usageQByCloudEnv(q *sqlchemy.SQuery, providers [] } func (manager *SBucketManager) usageQByRanges(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel) *sqlchemy.SQuery { - return rangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) + return RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) } func (manager *SBucketManager) usageQ(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) *sqlchemy.SQuery { diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index 3c4506dd10..5f0113681f 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -1611,7 +1611,7 @@ func (man *SDBInstanceManager) TotalCount( q := man.Query() 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")) + q = RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) return q.CountWithError() } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 1bc67c94ea..7ac896efa0 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -1539,7 +1539,7 @@ func totalDiskSize( storages := StorageManager.Query().SubQuery() q = q.Join(storages, sqlchemy.Equals(storages.Field("id"), disks.Field("storage_id"))) q = CloudProviderFilter(q, storages.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, nil, storages.Field("zone_id"), storages.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, nil, storages.Field("zone_id"), storages.Field("manager_id")) if len(hypervisors) > 0 { hoststorages := HoststorageManager.Query().SubQuery() hosts := HostManager.Query().SubQuery() diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index 67decf3e09..1c383b99dc 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -1449,7 +1449,7 @@ func (man *SElasticcacheManager) TotalCount( q = q.Join(vpcs, sqlchemy.Equals(q.Field("vpc_id"), vpcs.Field("id"))) q = scopeOwnerIdFilter(q, scope, ownerId) q = CloudProviderFilter(q, vpcs.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, vpcs.Field("cloudregion_id"), nil, vpcs.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, vpcs.Field("cloudregion_id"), nil, vpcs.Field("manager_id")) return q.CountWithError() } diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index fe713905d3..4208be1cc7 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -1349,7 +1349,7 @@ func (manager *SElasticipManager) usageQByCloudEnv(q *sqlchemy.SQuery, providers } func (manager *SElasticipManager) usageQByRanges(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel) *sqlchemy.SQuery { - return rangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) + return RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) } func (manager *SElasticipManager) usageQ(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) *sqlchemy.SQuery { diff --git a/pkg/compute/models/filters.go b/pkg/compute/models/filters.go index 1fbefcdc3b..450194d7f1 100644 --- a/pkg/compute/models/filters.go +++ b/pkg/compute/models/filters.go @@ -22,7 +22,7 @@ import ( "yunion.io/x/onecloud/pkg/util/rbacutils" ) -func rangeObjectsFilter(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, regionField sqlchemy.IQueryField, zoneField sqlchemy.IQueryField, managerField sqlchemy.IQueryField) *sqlchemy.SQuery { +func RangeObjectsFilter(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, regionField sqlchemy.IQueryField, zoneField sqlchemy.IQueryField, managerField sqlchemy.IQueryField) *sqlchemy.SQuery { for _, rangeObj := range rangeObjs { q = rangeObjFilter(q, rangeObj, regionField, zoneField, managerField) } diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index 0dc9cd07ac..ae2b9e1ece 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -652,7 +652,7 @@ func totalGuestNicCount( q = q.Join(hosts, sqlchemy.Equals(guests.Field("host_id"), hosts.Field("id"))) q = CloudProviderFilter(q, hosts.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, nil, hosts.Field("zone_id"), hosts.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, nil, hosts.Field("zone_id"), hosts.Field("manager_id")) switch scope { case rbacutils.ScopeSystem: diff --git a/pkg/compute/models/loadbalancernetworks.go b/pkg/compute/models/loadbalancernetworks.go index a02e5612f4..55a3aa24d0 100644 --- a/pkg/compute/models/loadbalancernetworks.go +++ b/pkg/compute/models/loadbalancernetworks.go @@ -293,7 +293,7 @@ func totalLBNicCount( case rbacutils.ScopeProject: q = q.Filter(sqlchemy.Equals(lbs.Field("tenant_id"), ownerId.GetProjectId())) } - q = rangeObjectsFilter(q, rangeObjs, nil, lbs.Field("zone_id"), lbs.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, nil, lbs.Field("zone_id"), lbs.Field("manager_id")) q = CloudProviderFilter(q, lbs.Field("manager_id"), providers, brands, cloudEnv) return q.CountWithError() } diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index dbd012be5e..b8153385b2 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -1067,7 +1067,7 @@ func (man *SLoadbalancerManager) TotalCount( q := man.Query() q = scopeOwnerIdFilter(q, scope, ownerId) q = CloudProviderFilter(q, q.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, nil, q.Field("zone_id"), q.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, nil, q.Field("zone_id"), q.Field("manager_id")) return q.CountWithError() } diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 035b86c250..3e786e60d8 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -816,7 +816,7 @@ func TotalSnapshotCount(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityPr q = q.Equals("tenant_id", ownerId.GetProjectId()) } - q = rangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) q = CloudProviderFilter(q, q.Field("manager_id"), providers, brands, cloudEnv) q = q.Equals("created_by", api.SNAPSHOT_MANUAL) q = q.Equals("fake_deleted", false) diff --git a/pkg/compute/models/usage.go b/pkg/compute/models/usage.go index 1d2c1aacfb..2453188ead 100644 --- a/pkg/compute/models/usage.go +++ b/pkg/compute/models/usage.go @@ -44,6 +44,6 @@ func AttachUsageQuery( } } q = CloudProviderFilter(q, hosts.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, nil, hosts.Field("zone_id"), hosts.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, nil, hosts.Field("zone_id"), hosts.Field("manager_id")) return q } diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 82ce834bd4..4cd55c8f2d 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -1084,7 +1084,7 @@ func (manager *SVpcManager) totalCount( q = q.Equals("domain_id", ownerId.GetProjectDomainId()) } q = CloudProviderFilter(q, q.Field("manager_id"), providers, brands, cloudEnv) - q = rangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) + q = RangeObjectsFilter(q, rangeObjs, q.Field("cloudregion_id"), nil, q.Field("manager_id")) cnt, _ := q.CountWithError() diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index 8d1dac7e4b..ef7cbb3e47 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -450,7 +450,7 @@ func (manager *SWireManager) totalCountQ( hostsQ = CloudProviderFilter(hostsQ, hostsQ.Field("manager_id"), providers, brands, cloudEnv) } if len(rangeObjs) > 0 { - hostsQ = rangeObjectsFilter(hostsQ, rangeObjs, nil, hostsQ.Field("zone_id"), hostsQ.Field("manager_id")) + hostsQ = RangeObjectsFilter(hostsQ, rangeObjs, nil, hostsQ.Field("zone_id"), hostsQ.Field("manager_id")) } hosts := hostsQ.SubQuery() groups := filterByScopeOwnerId(GroupManager.Query(), scope, ownerId).SubQuery() @@ -459,7 +459,7 @@ func (manager *SWireManager) totalCountQ( lbsQ = CloudProviderFilter(lbsQ, lbsQ.Field("manager_id"), providers, brands, cloudEnv) } if len(rangeObjs) > 0 { - lbsQ = rangeObjectsFilter(lbsQ, rangeObjs, lbsQ.Field("cloudregion_id"), lbsQ.Field("zone_id"), lbsQ.Field("manager_id")) + lbsQ = RangeObjectsFilter(lbsQ, rangeObjs, lbsQ.Field("cloudregion_id"), lbsQ.Field("zone_id"), lbsQ.Field("manager_id")) } lbs := lbsQ.SubQuery() diff --git a/pkg/compute/usages/handler.go b/pkg/compute/usages/handler.go index eb596558de..36e776c51f 100644 --- a/pkg/compute/usages/handler.go +++ b/pkg/compute/usages/handler.go @@ -199,8 +199,8 @@ func ReportCloudRegionUsage(scope rbacutils.TRbacScope, userCred mcclient.IIdent } func getSystemGeneralUsage(userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string) (Usage, error) { - count := RegionUsage(providers, brands, cloudEnv) - zone := ZoneUsage(providers, brands, cloudEnv) + count := RegionUsage(rangeObjs, providers, brands, cloudEnv) + zone := ZoneUsage(rangeObjs, providers, brands, cloudEnv) count.Include(zone) var pmemTotal float64 @@ -462,12 +462,13 @@ func ReportGeneralUsage( return } -func RegionUsage(providers []string, brands []string, cloudEnv string) Usage { +func RegionUsage(rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) Usage { q := models.CloudregionManager.Query() if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 { subq := models.VpcManager.Query("cloudregion_id") subq = models.CloudProviderFilter(subq, subq.Field("manager_id"), providers, brands, cloudEnv) + subq = models.RangeObjectsFilter(subq, rangeObjs, nil, nil, subq.Field("manager_id")) q = q.In("id", subq.SubQuery()) } @@ -476,12 +477,13 @@ func RegionUsage(providers []string, brands []string, cloudEnv string) Usage { return count } -func ZoneUsage(providers []string, brands []string, cloudEnv string) Usage { +func ZoneUsage(rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) Usage { q := models.ZoneManager.Query() if len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 { subq := models.HostManager.Query("zone_id") subq = models.CloudProviderFilter(subq, subq.Field("manager_id"), providers, brands, cloudEnv) + subq = models.RangeObjectsFilter(subq, rangeObjs, nil, nil, subq.Field("manager_id")) q = q.In("id", subq.SubQuery()) }