diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 44e82a8c5d..de8efb06e9 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -757,7 +757,9 @@ type ICloudDBInstance interface { GetConnectionStr() string GetInternalConnectionStr() string - GetIZoneId() string + GetZone1Id() string + GetZone2Id() string + GetZone3Id() string GetIVpcId() string GetDBNetwork() (*SDBInstanceNetwork, error) diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index 2cf3ebb4e0..402e84589c 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -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) diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index 4b7db155dc..47f113bd93 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -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 { diff --git a/pkg/multicloud/aliyun/dbinstance.go b/pkg/multicloud/aliyun/dbinstance.go index 67e51392d8..97797ed539 100644 --- a/pkg/multicloud/aliyun/dbinstance.go +++ b/pkg/multicloud/aliyun/dbinstance.go @@ -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) { diff --git a/pkg/multicloud/aws/dbinstance.go b/pkg/multicloud/aws/dbinstance.go index dcf11e7c26..bde30e4dc2 100644 --- a/pkg/multicloud/aws/dbinstance.go +++ b/pkg/multicloud/aws/dbinstance.go @@ -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 { diff --git a/pkg/multicloud/google/dbinstance.go b/pkg/multicloud/google/dbinstance.go index 4bce6482d3..38f6633546 100644 --- a/pkg/multicloud/google/dbinstance.go +++ b/pkg/multicloud/google/dbinstance.go @@ -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 { diff --git a/pkg/multicloud/huawei/dbinstance.go b/pkg/multicloud/huawei/dbinstance.go index cf95dbc2f4..bb11bc2880 100644 --- a/pkg/multicloud/huawei/dbinstance.go +++ b/pkg/multicloud/huawei/dbinstance.go @@ -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 {