diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index f6bb60b5db..04b59f4662 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -1016,7 +1016,7 @@ func (self *SElasticip) PerformAssociate(ctx context.Context, userCred mcclient. // IMPORTANT: this serves as a guard against a guest to have multiple // associated elastic_ips seip, _ := server.GetEipOrPublicIp() - if seip != nil { + if seip != nil && (seip.Mode == api.EIP_MODE_STANDALONE_EIP || seip.GetProviderName() != api.CLOUD_PROVIDER_AWS) { return input, httperrors.NewInvalidStatusError("instance is already associated with eip") } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index a2c03078cb..c1d3a20317 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -314,6 +314,7 @@ func (manager *SGuestManager) ListItemFilter( } } + var eipMode string usableServerForEipFilter := query.UsableServerForEip if len(usableServerForEipFilter) > 0 { eipObj, err := ElasticipManager.FetchByIdOrName(userCred, usableServerForEipFilter) @@ -325,6 +326,10 @@ func (manager *SGuestManager) ListItemFilter( } eip := eipObj.(*SElasticip) + if eip.GetProviderName() == api.CLOUD_PROVIDER_AWS { + eipMode = api.EIP_MODE_STANDALONE_EIP + } + if len(eip.NetworkId) > 0 { sq := GuestnetworkManager.Query("guest_id").Equals("network_id", eip.NetworkId).SubQuery() q = q.NotIn("id", sq) @@ -405,6 +410,9 @@ func (manager *SGuestManager) ListItemFilter( eips := ElasticipManager.Query().SubQuery() sq := eips.Query(eips.Field("associate_id")).Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER) sq = sq.IsNotNull("associate_id").IsNotEmpty("associate_id") + if len(eipMode) > 0 { + sq = sq.Equals("mode", eipMode) + } if withEip { q = q.In("id", sq)