fix(region): mongodb zone&network sync fix

This commit is contained in:
Qu Xuan
2021-08-13 11:54:32 +08:00
parent 391b792064
commit aa493f6c84
6 changed files with 91 additions and 14 deletions
+1
View File
@@ -55,6 +55,7 @@ type MongoDBListInput struct {
type MongoDBDetails struct {
apis.VirtualResourceDetails
CloudregionResourceInfo
ZoneResourceInfoBase
ManagedResourceInfo
VpcResourceInfoBase
+24
View File
@@ -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,
+23
View File
@@ -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)
}
+33 -9
View File
@@ -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
}
}
+1 -5
View File
@@ -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 {
+9
View File
@@ -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
})
}