mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix(region): mongodb zone&network sync fix
This commit is contained in:
@@ -55,6 +55,7 @@ type MongoDBListInput struct {
|
||||
type MongoDBDetails struct {
|
||||
apis.VirtualResourceDetails
|
||||
CloudregionResourceInfo
|
||||
ZoneResourceInfoBase
|
||||
ManagedResourceInfo
|
||||
|
||||
VpcResourceInfoBase
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user