From aa493f6c8436153d9de9fa0fad354e397901f20a Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Fri, 13 Aug 2021 11:21:16 +0800 Subject: [PATCH] fix(region): mongodb zone&network sync fix --- pkg/apis/compute/mongodb.go | 1 + pkg/compute/models/cloudregionresource.go | 24 +++++++++++++ pkg/compute/models/cloudregions.go | 23 +++++++++++++ pkg/compute/models/mongodb.go | 42 ++++++++++++++++++----- pkg/multicloud/qcloud/mongodb.go | 6 +--- pkg/multicloud/qcloud/shell/mongodb.go | 9 +++++ 6 files changed, 91 insertions(+), 14 deletions(-) diff --git a/pkg/apis/compute/mongodb.go b/pkg/apis/compute/mongodb.go index c2e1b4206d..e45cba05ec 100644 --- a/pkg/apis/compute/mongodb.go +++ b/pkg/apis/compute/mongodb.go @@ -55,6 +55,7 @@ type MongoDBListInput struct { type MongoDBDetails struct { apis.VirtualResourceDetails CloudregionResourceInfo + ZoneResourceInfoBase ManagedResourceInfo VpcResourceInfoBase diff --git a/pkg/compute/models/cloudregionresource.go b/pkg/compute/models/cloudregionresource.go index 311051763e..3f72dde9cb 100644 --- a/pkg/compute/models/cloudregionresource.go +++ b/pkg/compute/models/cloudregionresource.go @@ -26,6 +26,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/stringutils2" @@ -60,6 +61,29 @@ func (self *SCloudregionResourceBase) GetRegion() *SCloudregion { return region.(*SCloudregion) } +func (self *SCloudregionResourceBase) GetZoneBySuffix(suffix string) (*SZone, error) { + sq := ZoneManager.Query().SubQuery() + q := sq.Query().Filter( + sqlchemy.AND( + sqlchemy.Equals(sq.Field("cloudregion_id"), self.CloudregionId), + sqlchemy.Endswith(sq.Field("external_id"), suffix), + ), + ) + count, err := q.CountWithError() + if err != nil { + return nil, err + } + if count == 0 { + return nil, errors.Wrapf(cloudprovider.ErrNotFound, suffix) + } + if count > 1 { + return nil, errors.Wrapf(cloudprovider.ErrDuplicateId, suffix) + } + zone := &SZone{} + zone.SetModelManager(ZoneManager, zone) + return zone, q.First(zone) +} + func (manager *SCloudregionResourceBaseManager) FetchCustomizeColumns( ctx context.Context, userCred mcclient.TokenCredential, diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index bc139ea3ac..ff81fb5242 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -162,6 +162,29 @@ func (self *SCloudregion) GetZones() ([]SZone, error) { return zones, nil } +func (self *SCloudregion) GetZoneBySuffix(suffix string) (*SZone, error) { + sq := ZoneManager.Query().SubQuery() + q := sq.Query().Filter( + sqlchemy.AND( + sqlchemy.Equals(sq.Field("cloudregion_id"), self.Id), + sqlchemy.Endswith(sq.Field("external_id"), suffix), + ), + ) + count, err := q.CountWithError() + if err != nil { + return nil, err + } + if count == 0 { + return nil, errors.Wrapf(cloudprovider.ErrNotFound, suffix) + } + if count > 1 { + return nil, errors.Wrapf(cloudprovider.ErrDuplicateId, suffix) + } + zone := &SZone{} + zone.SetModelManager(ZoneManager, zone) + return zone, q.First(zone) +} + func (self *SCloudregion) GetGuestCount() (int, error) { return self.getGuestCountInternal(false) } diff --git a/pkg/compute/models/mongodb.go b/pkg/compute/models/mongodb.go index b3a37ce055..544f5f1187 100644 --- a/pkg/compute/models/mongodb.go +++ b/pkg/compute/models/mongodb.go @@ -17,7 +17,6 @@ package models import ( "context" "fmt" - "strings" "time" "yunion.io/x/jsonutils" @@ -247,9 +246,9 @@ func (manager *SMongoDBManager) FetchCustomizeColumns( manRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) regRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) - rdsIds := make([]string, len(rows)) vpcIds := make([]string, len(rows)) netIds := make([]string, len(rows)) + zoneIds := make([]string, len(rows)) for i := range rows { rows[i] = api.MongoDBDetails{ VirtualResourceDetails: virtRows[i], @@ -257,9 +256,9 @@ func (manager *SMongoDBManager) FetchCustomizeColumns( CloudregionResourceInfo: regRows[i], } instance := objs[i].(*SMongoDB) - rdsIds[i] = instance.Id vpcIds[i] = instance.VpcId netIds[i] = instance.NetworkId + zoneIds[i] = instance.ZoneId } vpcs := make(map[string]SVpc) @@ -275,12 +274,18 @@ func (manager *SMongoDBManager) FetchCustomizeColumns( return rows } + zoneMaps, err := db.FetchIdNameMap2(ZoneManager, zoneIds) + if err != nil { + return rows + } + for i := range rows { if vpc, ok := vpcs[vpcIds[i]]; ok { rows[i].Vpc = vpc.Name rows[i].VpcExtId = vpc.ExternalId } rows[i].Network, _ = netMaps[netIds[i]] + rows[i].Zone, _ = zoneMaps[zoneIds[i]] } return rows @@ -497,6 +502,28 @@ func (self *SMongoDB) SyncWithCloudMongoDB(ctx context.Context, userCred mcclien } } + if networkId := ext.GetNetworkId(); len(networkId) > 0 { + network, err := db.FetchByExternalIdAndManagerId(NetworkManager, networkId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery { + wire := WireManager.Query().SubQuery() + vpc := VpcManager.Query().SubQuery() + return q.Join(wire, sqlchemy.Equals(wire.Field("id"), q.Field("wire_id"))). + Join(vpc, sqlchemy.Equals(vpc.Field("id"), wire.Field("vpc_id"))). + Filter(sqlchemy.Equals(vpc.Field("manager_id"), self.ManagerId)) + }) + if err == nil { + self.NetworkId = network.GetId() + } + } + + if zoneId := ext.GetZoneId(); len(zoneId) > 0 { + zone, err := self.GetZoneBySuffix(zoneId) + if err != nil { + log.Errorf("find zone %s error: %v", zoneId, err) + } else { + self.ZoneId = zone.Id + } + } + return nil }) if err != nil { @@ -531,12 +558,9 @@ func (self *SCloudregion) newFromCloudMongoDB(ctx context.Context, userCred mccl ins.ReplicationNum = ext.GetReplicationNum() if zoneId := ext.GetZoneId(); len(zoneId) > 0 { - zones, _ := self.GetZones() - for _, zone := range zones { - if strings.HasSuffix(zone.ExternalId, zoneId) { - ins.ZoneId = zone.Id - break - } + zone, err := self.GetZoneBySuffix(zoneId) + if err == nil { + ins.ZoneId = zone.Id } } diff --git a/pkg/multicloud/qcloud/mongodb.go b/pkg/multicloud/qcloud/mongodb.go index e394f59063..3cc71ded60 100644 --- a/pkg/multicloud/qcloud/mongodb.go +++ b/pkg/multicloud/qcloud/mongodb.go @@ -176,11 +176,7 @@ func (self *SMongoDB) GetDiskSizeMb() int { } func (self *SMongoDB) GetZoneId() string { - zone, err := self.region.getZoneById(self.Zone) - if err != nil { - return "" - } - return zone.GetGlobalId() + return self.Zone } func (self *SMongoDB) GetBillingType() string { diff --git a/pkg/multicloud/qcloud/shell/mongodb.go b/pkg/multicloud/qcloud/shell/mongodb.go index 66beb5a982..5f68bdbadd 100644 --- a/pkg/multicloud/qcloud/shell/mongodb.go +++ b/pkg/multicloud/qcloud/shell/mongodb.go @@ -50,4 +50,13 @@ func init() { return cli.DeleteMongoDB(args.ID) }) + shellutils.R(&MongoDBIdOptions{}, "mongodb-backup-list", "List mongodb backups", func(cli *qcloud.SRegion, args *MongoDBIdOptions) error { + backups, err := cli.GetMongoDBBackups(args.ID) + if err != nil { + return err + } + printList(backups, 0, 0, 0, []string{}) + return nil + }) + }