From b9a45c8bb26ba4bdf75a14c7da4fcd9e7863d9cf Mon Sep 17 00:00:00 2001 From: tangbin Date: Thu, 16 Jul 2020 20:25:16 +0800 Subject: [PATCH] sync classic redis fix --- pkg/compute/models/elasticcache_instances.go | 56 +++++++++++++------- pkg/compute/models/guests.go | 3 +- pkg/compute/models/skus_tools.go | 2 +- pkg/compute/models/vpcs.go | 9 ++-- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index 7c1480e388..f61ce575c8 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -566,7 +566,6 @@ func (manager *SElasticcacheManager) newFromCloudElasticcache(ctx context.Contex instance.Engine = extInstance.GetEngine() instance.EngineVersion = extInstance.GetEngineVersion() - instance.NetworkType = extInstance.GetNetworkType() instance.PrivateDNS = extInstance.GetPrivateDNS() instance.PrivateIpAddr = extInstance.GetPrivateIpAddr() instance.PrivateConnectPort = extInstance.GetPrivateConnectPort() @@ -577,36 +576,57 @@ func (manager *SElasticcacheManager) newFromCloudElasticcache(ctx context.Contex instance.MaintainEndTime = extInstance.GetMaintainEndTime() instance.AuthMode = extInstance.GetAuthMode() + var zone *SZone if zoneId := extInstance.GetZoneId(); len(zoneId) > 0 { - zone, err := db.FetchByExternalId(ZoneManager, zoneId) + _zone, err := db.FetchByExternalId(ZoneManager, zoneId) if err != nil { return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchZoneId") } - instance.ZoneId = zone.GetId() + instance.ZoneId = _zone.GetId() + zone = _zone.(*SZone) } - if vpcId := extInstance.GetVpcId(); len(vpcId) > 0 { - vpc, err := db.FetchByExternalIdAndManagerId(VpcManager, vpcId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery { - return q.Equals("manager_id", provider.Id) - }) + instance.NetworkType = extInstance.GetNetworkType() + if instance.NetworkType == api.LB_NETWORK_TYPE_CLASSIC { + vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(ctx, region) if err != nil { - return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchVpcId") + return nil, errors.Wrap(err, "NewVpcForClassicNetwork") } instance.VpcId = vpc.GetId() - } - if networkId := extInstance.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"), provider.Id)) - }) + wire, err := WireManager.GetOrCreateWireForClassicNetwork(ctx, vpc, zone) if err != nil { - return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchNetworkId") + return nil, errors.Wrap(err, "NewWireForClassicNetwork") + } + network, err := NetworkManager.GetOrCreateClassicNetwork(ctx, wire) + if err != nil { + return nil, errors.Wrap(err, "GetOrCreateClassicNetwork") } instance.NetworkId = network.GetId() + } else { + if vpcId := extInstance.GetVpcId(); len(vpcId) > 0 { + vpc, err := db.FetchByExternalIdAndManagerId(VpcManager, vpcId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery { + return q.Equals("manager_id", provider.Id) + }) + if err != nil { + return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchVpcId") + } + instance.VpcId = vpc.GetId() + } + + if networkId := extInstance.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"), provider.Id)) + }) + if err != nil { + return nil, errors.Wrapf(err, "newFromCloudElasticcache.FetchNetworkId") + } + instance.NetworkId = network.GetId() + } } if createdAt := extInstance.GetCreatedAt(); !createdAt.IsZero() { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index d8e09b6428..4c4f0d9969 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -2732,7 +2732,8 @@ func getCloudNicNetwork(ctx context.Context, vnic cloudprovider.ICloudNic, host vnet := vnic.GetINetwork() if vnet == nil { if vnic.InClassicNetwork() { - vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(ctx, host) + region := host.GetRegion() + vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(ctx, region) if err != nil { return nil, errors.Wrap(err, "NewVpcForClassicNetwork") } diff --git a/pkg/compute/models/skus_tools.go b/pkg/compute/models/skus_tools.go index a023ae24e8..fc1da233c2 100644 --- a/pkg/compute/models/skus_tools.go +++ b/pkg/compute/models/skus_tools.go @@ -289,7 +289,7 @@ func SyncElasticCacheSkus(ctx context.Context, userCred mcclient.TokenCredential // 同步Region elasticcache sku列表. func SyncElasticCacheSkusByRegion(ctx context.Context, userCred mcclient.TokenCredential, region *SCloudregion) error { - if region.GetDriver().IsSupportedElasticcache() { + if !region.GetDriver().IsSupportedElasticcache() { notes := fmt.Sprintf("SyncElasticCacheSkusByRegion %s not support elasticcache", region.Name) log.Infof(notes) return nil diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index f10792531b..3c96395067 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -191,12 +191,11 @@ func (manager *SVpcManager) getVpcExternalIdForClassicNetwork(regionId, cloudpro return fmt.Sprintf("%s-%s", regionId, cloudproviderId) } -func (manager *SVpcManager) GetOrCreateVpcForClassicNetwork(ctx context.Context, host *SHost) (*SVpc, error) { - region := host.GetRegion() - cloudprovider := host.GetCloudprovider() +func (manager *SVpcManager) GetOrCreateVpcForClassicNetwork(ctx context.Context, region *SCloudregion) (*SVpc, error) { + cloudprovider := region.GetCloudprovider() externalId := manager.getVpcExternalIdForClassicNetwork(region.Id, cloudprovider.Id) _vpc, err := db.FetchByExternalIdAndManagerId(manager, externalId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery { - return q.Equals("manager_id", host.ManagerId) + return q.Equals("manager_id", region.ManagerId) }) if err == nil { return _vpc.(*SVpc), nil @@ -213,7 +212,7 @@ func (manager *SVpcManager) GetOrCreateVpcForClassicNetwork(ctx context.Context, vpc.SetEnabled(false) vpc.Status = api.VPC_STATUS_UNAVAILABLE vpc.ExternalId = externalId - vpc.ManagerId = host.ManagerId + vpc.ManagerId = region.ManagerId err = manager.TableSpec().Insert(ctx, vpc) if err != nil { return nil, errors.Wrap(err, "Insert vpc for classic network")