From 79b6def3c3aea6a489bf2fd94f68cf8ed0147691 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 10 Mar 2020 16:33:35 +0800 Subject: [PATCH] fix: sql query errors for missing manager_id and cloudregion_id --- pkg/compute/models/cloudregions.go | 7 +++++-- pkg/compute/models/loadbalancers.go | 14 ++++++++++++-- pkg/lbagent/models/reflect.go | 12 +++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 04caa9e17a..ad6d56f77c 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -191,9 +191,12 @@ func (self *SCloudregion) GetDBInstanceBackups(provider *SCloudprovider, instanc func (self *SCloudregion) GetElasticcaches(provider *SCloudprovider) ([]SElasticcache, error) { instances := []SElasticcache{} // .IsFalse("pending_deleted") - q := ElasticcacheManager.Query().Equals("cloudregion_id", self.Id) + vpcs := VpcManager.Query().SubQuery() + q := ElasticcacheManager.Query() + q = q.Join(vpcs, sqlchemy.Equals(q.Field("vpc_id"), vpcs.Field("id"))) + q = q.Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), self.Id)) if provider != nil { - q = q.Equals("manager_id", provider.Id) + q = q.Filter(sqlchemy.Equals(vpcs.Field("manager_id"), provider.Id)) } err := db.FetchModelObjects(ElasticcacheManager, q, &instances) if err != nil { diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index a941265dd0..94c5f7f03e 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -590,7 +590,12 @@ func (lb *SLoadbalancer) Delete(ctx context.Context, userCred mcclient.TokenCred func (man *SLoadbalancerManager) getLoadbalancersByRegion(region *SCloudregion, provider *SCloudprovider) ([]SLoadbalancer, error) { lbs := []SLoadbalancer{} - q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id).IsFalse("pending_deleted") + vpcs := VpcManager.Query().SubQuery() + q := man.Query() + q = q.Join(vpcs, sqlchemy.Equals(q.Field("vpc_id"), vpcs.Field("id"))) + q = q.Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.Id)) + q = q.Filter(sqlchemy.Equals(vpcs.Field("manager_id"), provider.Id)) + q = q.IsFalse("pending_deleted") if err := db.FetchModelObjects(man, q, &lbs); err != nil { log.Errorf("failed to get lbs for region: %v provider: %v error: %v", region, provider, err) return nil, err @@ -914,7 +919,12 @@ func (manager *SLoadbalancerManager) GetResourceCount() ([]db.SProjectResourceCo func (manager *SLoadbalancerManager) FetchByExternalId(providerId string, extId string) (*SLoadbalancer, error) { ret := []SLoadbalancer{} - q := manager.Query().Equals("manager_id", providerId).Equals("external_id", extId) + vpcs := VpcManager.Query().SubQuery() + q := manager.Query() + q = q.Join(vpcs, sqlchemy.Equals(q.Field("vpc_id"), vpcs.Field("id"))) + q = q.Filter(sqlchemy.Equals(vpcs.Field("manager_id"), providerId)) + q = q.Equals("external_id", extId) + q = q.IsFalse("pending_deleted") err := db.FetchModelObjects(manager, q, &ret) if err != nil { return nil, err diff --git a/pkg/lbagent/models/reflect.go b/pkg/lbagent/models/reflect.go index 83332412d1..0fc70d4828 100644 --- a/pkg/lbagent/models/reflect.go +++ b/pkg/lbagent/models/reflect.go @@ -100,17 +100,19 @@ func GetModels(opts *GetModelsOptions) error { return newTime, nil } + isManaged := false listOptions := options.BaseListOptions{ Admin: options.Bool(true), Details: options.Bool(true), Filter: []string{ minUpdatedAtFilter(minUpdatedAt), // order matters, filter.0 - "manager_id.isnullorempty()", // len(manager_id) > 0 is for pubcloud objects + // "manager_id.isnullorempty()", // len(manager_id) > 0 is for pubcloud objects }, - OrderBy: []string{"updated_at", "id"}, - Order: "asc", - Limit: options.Int(opts.BatchListSize), - Offset: options.Int(0), + OrderBy: []string{"updated_at", "id"}, + Order: "asc", + IsManaged: &isManaged, + Limit: options.Int(opts.BatchListSize), + Offset: options.Int(0), } if !minUpdatedAt.Equal(PseudoZeroTime) { // Only fetching pending deletes when we are doing incremental fetch