mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #6352 from ioito/hotfix/qx-rds-sync-optimized
fix: 优化rds zone同步逻辑
This commit is contained in:
@@ -757,7 +757,9 @@ type ICloudDBInstance interface {
|
||||
|
||||
GetConnectionStr() string
|
||||
GetInternalConnectionStr() string
|
||||
GetIZoneId() string
|
||||
GetZone1Id() string
|
||||
GetZone2Id() string
|
||||
GetZone3Id() string
|
||||
GetIVpcId() string
|
||||
|
||||
GetDBNetwork() (*SDBInstanceNetwork, error)
|
||||
|
||||
@@ -132,9 +132,6 @@ type SDBInstance struct {
|
||||
Zone2 string `width:"36" charset:"ascii" nullable:"false" create:"optional" list:"user"`
|
||||
// 可用区3
|
||||
Zone3 string `width:"36" charset:"ascii" nullable:"false" create:"optional" list:"user"`
|
||||
|
||||
// 可用区Id(对应公有云的可用区Id)
|
||||
ZoneId string `width:"36" charset:"ascii" nullable:"false" create:"optional"`
|
||||
}
|
||||
|
||||
func (manager *SDBInstanceManager) GetContextManagers() [][]db.IModelManager {
|
||||
@@ -545,14 +542,6 @@ func (self *SDBInstance) GetVpc() (*SVpc, error) {
|
||||
return vpc.(*SVpc), nil
|
||||
}
|
||||
|
||||
func (self *SDBInstance) GetZone() (*SZone, error) {
|
||||
zone, err := ZoneManager.FetchById(self.ZoneId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return zone.(*SZone), nil
|
||||
}
|
||||
|
||||
func (self *SDBInstance) GetNetwork() (*SNetwork, error) {
|
||||
dbnet := DBInstanceNetworkManager.Query().SubQuery()
|
||||
q := NetworkManager.Query()
|
||||
@@ -1348,7 +1337,7 @@ func (self *SDBInstance) ValidateDeleteCondition(ctx context.Context) error {
|
||||
func (self *SDBInstance) GetDBInstanceSkuQuery() *sqlchemy.SQuery {
|
||||
q := DBInstanceSkuManager.Query().Equals("storage_type", self.StorageType).Equals("category", self.Category).
|
||||
Equals("cloudregion_id", self.CloudregionId).Equals("engine", self.Engine).Equals("engine_version", self.EngineVersion)
|
||||
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3, "zone_id": self.ZoneId} {
|
||||
for k, v := range map[string]string{"zone1": self.Zone1, "zone2": self.Zone2, "zone3": self.Zone3} {
|
||||
if len(v) > 0 {
|
||||
q = q.Equals(k, v)
|
||||
}
|
||||
@@ -1451,6 +1440,30 @@ func (self *SDBInstance) SetZoneInfo(ctx context.Context, userCred mcclient.Toke
|
||||
return err
|
||||
}
|
||||
|
||||
func (self *SDBInstance) SetZoneIds(extInstance cloudprovider.ICloudDBInstance) {
|
||||
zone1 := extInstance.GetZone1Id()
|
||||
if len(zone1) > 0 {
|
||||
zone, _ := db.FetchByExternalId(ZoneManager, zone1)
|
||||
if zone != nil {
|
||||
self.Zone1 = zone.GetId()
|
||||
}
|
||||
}
|
||||
zone2 := extInstance.GetZone2Id()
|
||||
if len(zone2) > 0 {
|
||||
zone, _ := db.FetchByExternalId(ZoneManager, zone2)
|
||||
if zone != nil {
|
||||
self.Zone2 = zone.GetId()
|
||||
}
|
||||
}
|
||||
zone3 := extInstance.GetZone3Id()
|
||||
if len(zone3) > 0 {
|
||||
zone, _ := db.FetchByExternalId(ZoneManager, zone3)
|
||||
if zone != nil {
|
||||
self.Zone3 = zone.GetId()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SDBInstance) SyncWithCloudDBInstance(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, extInstance cloudprovider.ICloudDBInstance) error {
|
||||
diff, err := db.UpdateWithLock(ctx, self, func() error {
|
||||
self.Engine = extInstance.GetEngine()
|
||||
@@ -1461,22 +1474,22 @@ func (self *SDBInstance) SyncWithCloudDBInstance(ctx context.Context, userCred m
|
||||
self.DiskSizeGB = extInstance.GetDiskSizeGB()
|
||||
self.StorageType = extInstance.GetStorageType()
|
||||
self.Status = extInstance.GetStatus()
|
||||
self.Port = extInstance.GetPort()
|
||||
|
||||
self.ConnectionStr = extInstance.GetConnectionStr()
|
||||
self.InternalConnectionStr = extInstance.GetInternalConnectionStr()
|
||||
|
||||
self.MaintainTime = extInstance.GetMaintainTime()
|
||||
|
||||
self.ZoneId = extInstance.GetIZoneId()
|
||||
err := self.setZoneInfo()
|
||||
if err != nil {
|
||||
log.Errorf("failed to set zone info for dbinstance %s(%s) error: %v", self.Name, self.Id, err)
|
||||
}
|
||||
self.SetZoneIds(extInstance)
|
||||
|
||||
if createdAt := extInstance.GetCreatedAt(); !createdAt.IsZero() {
|
||||
self.CreatedAt = createdAt
|
||||
}
|
||||
|
||||
if expiredAt := extInstance.GetExpiredAt(); !expiredAt.IsZero() {
|
||||
self.ExpiredAt = expiredAt
|
||||
}
|
||||
|
||||
if len(self.VpcId) == 0 {
|
||||
if vpcId := extInstance.GetIVpcId(); len(vpcId) > 0 {
|
||||
vpc, err := db.FetchByExternalId(VpcManager, vpcId)
|
||||
@@ -1545,11 +1558,7 @@ func (manager *SDBInstanceManager) newFromCloudDBInstance(ctx context.Context, u
|
||||
instance.InternalConnectionStr = extInstance.GetInternalConnectionStr()
|
||||
|
||||
instance.MaintainTime = extInstance.GetMaintainTime()
|
||||
instance.ZoneId = extInstance.GetIZoneId()
|
||||
err = instance.setZoneInfo()
|
||||
if err != nil {
|
||||
log.Errorf("failed to set zone info for dbinstance %s error: %v", instance.ExternalId, err)
|
||||
}
|
||||
instance.SetZoneIds(extInstance)
|
||||
|
||||
if secgroupId := extInstance.GetSecurityGroupId(); len(secgroupId) > 0 {
|
||||
q := SecurityGroupCacheManager.Query().Equals("manager_id", provider.Id).Equals("external_id", secgroupId)
|
||||
|
||||
@@ -1665,37 +1665,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateDBInstance(ctx cont
|
||||
log.Errorf("timeout for waiting dbinstance running error: %v", err)
|
||||
}
|
||||
|
||||
dbinstance.ZoneId = idbinstance.GetIZoneId()
|
||||
err = dbinstance.SetZoneInfo(ctx, userCred)
|
||||
if err != nil {
|
||||
log.Errorf("failed to set dbinstance %s(%s) zoneInfo from cloud dbinstance: %v", dbinstance.Name, dbinstance.Id, err)
|
||||
}
|
||||
|
||||
_, err = db.Update(dbinstance, func() error {
|
||||
dbinstance.Engine = idbinstance.GetEngine()
|
||||
dbinstance.EngineVersion = idbinstance.GetEngineVersion()
|
||||
dbinstance.StorageType = idbinstance.GetStorageType()
|
||||
dbinstance.DiskSizeGB = idbinstance.GetDiskSizeGB()
|
||||
dbinstance.Category = idbinstance.GetCategory()
|
||||
dbinstance.VcpuCount = idbinstance.GetVcpuCount()
|
||||
dbinstance.VmemSizeMb = idbinstance.GetVmemSizeMB()
|
||||
dbinstance.InstanceType = idbinstance.GetInstanceType()
|
||||
dbinstance.ConnectionStr = idbinstance.GetConnectionStr()
|
||||
dbinstance.InternalConnectionStr = idbinstance.GetInternalConnectionStr()
|
||||
dbinstance.MaintainTime = idbinstance.GetMaintainTime()
|
||||
dbinstance.Port = idbinstance.GetPort()
|
||||
|
||||
if createdAt := idbinstance.GetCreatedAt(); !createdAt.IsZero() {
|
||||
dbinstance.CreatedAt = idbinstance.GetCreatedAt()
|
||||
}
|
||||
if expiredAt := idbinstance.GetExpiredAt(); !expiredAt.IsZero() {
|
||||
dbinstance.ExpiredAt = expiredAt
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorf("failed to update dbinstance conf: %v", err)
|
||||
}
|
||||
dbinstance.SyncWithCloudDBInstance(ctx, userCred, dbinstance.GetCloudprovider(), idbinstance)
|
||||
|
||||
network, err := idbinstance.GetDBNetwork()
|
||||
if err != nil {
|
||||
|
||||
@@ -259,8 +259,43 @@ func (rds *SDBInstance) Refresh() error {
|
||||
return jsonutils.Update(rds, instance)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIZoneId() string {
|
||||
return rds.ZoneId
|
||||
func (rds *SDBInstance) getZoneId(index int) string {
|
||||
zoneId := rds.getZone(index)
|
||||
if len(zoneId) > 0 {
|
||||
zone, err := rds.region.getZoneById(zoneId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to found zone %s for rds %s", zoneId, rds.GetName())
|
||||
return ""
|
||||
}
|
||||
return zone.GetGlobalId()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone1Id() string {
|
||||
return rds.getZoneId(1)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone2Id() string {
|
||||
return rds.getZoneId(2)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone3Id() string {
|
||||
return rds.getZoneId(3)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) getZone(index int) string {
|
||||
zoneStr := strings.Replace(rds.ZoneId, ")", "", -1)
|
||||
zoneInfo := strings.Split(zoneStr, ",")
|
||||
if len(zoneInfo) < index {
|
||||
return ""
|
||||
}
|
||||
zone := zoneInfo[index-1]
|
||||
zoneCode := zone[len(zone)-1]
|
||||
if strings.HasPrefix(rds.ZoneId, fmt.Sprintf("%s-", rds.RegionId)) {
|
||||
return fmt.Sprintf("%s-%s", rds.RegionId, string(zoneCode))
|
||||
}
|
||||
return fmt.Sprintf("%s%s", rds.RegionId, string(zoneCode))
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetDBNetwork() (*cloudprovider.SDBInstanceNetwork, error) {
|
||||
|
||||
@@ -232,7 +232,7 @@ func (region *SRegion) GetDBInstance(instanceId string) (*SDBInstance, error) {
|
||||
return nil, cloudprovider.ErrDuplicateId
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIZoneId() string {
|
||||
func (rds *SDBInstance) GetZone1Id() string {
|
||||
if len(rds.AvailabilityZone) > 0 {
|
||||
zone, err := rds.region.getZoneById(rds.AvailabilityZone)
|
||||
if err != nil {
|
||||
@@ -244,6 +244,14 @@ func (rds *SDBInstance) GetIZoneId() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone2Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone3Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIDBInstanceAccounts() ([]cloudprovider.ICloudDBInstanceAccount, error) {
|
||||
accounts := []cloudprovider.ICloudDBInstanceAccount{}
|
||||
if len(rds.MasterUsername) > 0 {
|
||||
|
||||
@@ -352,8 +352,21 @@ func (rds *SDBInstance) GetInternalConnectionStr() string {
|
||||
return strings.Join(ret, ",")
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIZoneId() string {
|
||||
return rds.GceZone
|
||||
func (rds *SDBInstance) GetZone1Id() string {
|
||||
zone, err := rds.region.GetZone(rds.GceZone)
|
||||
if err != nil {
|
||||
log.Errorf("failed to found rds %s zone %s", rds.Name, rds.GceZone)
|
||||
return ""
|
||||
}
|
||||
return zone.GetGlobalId()
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone2Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone3Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIVpcId() string {
|
||||
|
||||
@@ -17,7 +17,6 @@ package huawei
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
@@ -284,16 +283,30 @@ func (rds *SDBInstance) Refresh() error {
|
||||
return jsonutils.Update(rds, instance)
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetIZoneId() string {
|
||||
zones := []string{}
|
||||
func (rds *SDBInstance) GetZone1Id() string {
|
||||
return rds.GetZoneIdByRole("master")
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZoneIdByRole(role string) string {
|
||||
for _, node := range rds.Nodes {
|
||||
if node.Role == "master" {
|
||||
zones = append([]string{node.AvailabilityZone}, zones...)
|
||||
} else if node.Role == "slave" {
|
||||
zones = append(zones, node.AvailabilityZone)
|
||||
if node.Role == role {
|
||||
zone, err := rds.region.getZoneById(node.AvailabilityZone)
|
||||
if err != nil {
|
||||
log.Errorf("failed to found zone %s for rds %s error: %v", node.AvailabilityZone, rds.Name, err)
|
||||
return ""
|
||||
}
|
||||
return zone.GetGlobalId()
|
||||
}
|
||||
}
|
||||
return strings.Join(zones, ",")
|
||||
return ""
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone2Id() string {
|
||||
return rds.GetZoneIdByRole("slave")
|
||||
}
|
||||
|
||||
func (rds *SDBInstance) GetZone3Id() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
type SRdsNetwork struct {
|
||||
|
||||
Reference in New Issue
Block a user