From fcd33468aac623bc442e00c9dae10e0968339990 Mon Sep 17 00:00:00 2001 From: ioito Date: Tue, 31 May 2022 12:15:06 +0800 Subject: [PATCH] fix(region): lb eip api fix --- pkg/compute/models/loadbalancers.go | 31 ++++++++++++++++++++++++++++- pkg/compute/regiondrivers/kvm.go | 13 ++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 3733822b64..06ad4c2cd6 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -228,7 +228,6 @@ func (man *SLoadbalancerManager) ListItemFilter( q.Join(nq, sqlchemy.Equals(nq.Field("id"), gnq.Field("network_id"))) q.Join(wq, sqlchemy.Equals(wq.Field("id"), nq.Field("wire_id"))) q.Join(vq, sqlchemy.Equals(vq.Field("id"), wq.Field("vpc_id"))) - q.Filter(sqlchemy.IsNullOrEmpty(gnq.Field("eip_id"))) q.Filter(sqlchemy.NotEquals(vq.Field("id"), api.DEFAULT_VPC_ID)) // vpc provider thing will be handled ok below } @@ -1563,7 +1562,11 @@ func (lb *SLoadbalancer) IsEipAssociable() error { return nil } +// 绑定弹性公网IP, 仅支持kvm func (lb *SLoadbalancer) PerformAssociateEip(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.LoadbalancerAssociateEipInput) (jsonutils.JSONObject, error) { + if lb.IsManaged() { + return nil, httperrors.NewUnsupportOperationError("not support managed lb") + } err := lb.IsEipAssociable() if err != nil { return nil, httperrors.NewGeneralError(err) @@ -1630,10 +1633,24 @@ func (lb *SLoadbalancer) PerformAssociateEip(ctx context.Context, userCred mccli return nil, errors.Wrap(err, "AssociateLoadbalancer") } + _, err = db.Update(lb, func() error { + lb.Address = eip.IpAddr + lb.AddressType = api.LB_ADDR_TYPE_INTERNET + return nil + }) + if err != nil { + return nil, errors.Wrap(err, "set loadbalancer address") + } + return nil, nil } +// 解绑弹性公网IP,仅支持kvm func (lb *SLoadbalancer) PerformDissociateEip(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.LoadbalancerDissociateEipInput) (jsonutils.JSONObject, error) { + if lb.IsManaged() { + return nil, httperrors.NewUnsupportOperationError("not support managed lb") + } + eip, err := lb.GetEip() if err != nil { log.Errorf("Fail to get Eip %s", err) @@ -1648,6 +1665,18 @@ func (lb *SLoadbalancer) PerformDissociateEip(ctx context.Context, userCred mccl return nil, errors.Wrap(err, "eip is not accessible") } + lbnet, err := LoadbalancernetworkManager.FetchFirstByLbId(ctx, lb.Id) + if err != nil { + return nil, errors.Wrapf(err, "LoadbalancernetworkManager.FetchFirstByLbId(%s)", lb.Id) + } + if _, err := db.Update(lb, func() error { + lb.Address = lbnet.IpAddr + lb.AddressType = api.LB_ADDR_TYPE_INTRANET + return nil + }); err != nil { + return nil, errors.Wrapf(err, "db.Update") + } + autoDelete := (input.AudoDelete != nil && *input.AudoDelete) err = lb.DeleteEip(ctx, userCred, autoDelete) if err != nil { diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index 9c49527395..1ec1fb4c5c 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -797,6 +797,7 @@ func (self *SKVMRegionDriver) RequestCreateLoadbalancer(ctx context.Context, use return nil, errors.Wrapf(err, "db.Update") } // bind eip + eipAddr := "" eipId, _ := task.GetParams().GetString("eip_id") eipBw, _ := task.GetParams().Int("eip_bw") if eipBw > 0 && len(eipId) == 0 { @@ -820,6 +821,7 @@ func (self *SKVMRegionDriver) RequestCreateLoadbalancer(ctx context.Context, use log.Errorf("NewEipForVMOnHost fail %s", err) quotas.CancelPendingUsage(ctx, userCred, eipPendingUsage, eipPendingUsage, false) } else { + eipAddr = eip.IpAddr opts := api.ElasticipAssociateInput{ InstanceId: lb.Id, InstanceExternalId: lb.ExternalId, @@ -841,8 +843,19 @@ func (self *SKVMRegionDriver) RequestCreateLoadbalancer(ctx context.Context, use if err != nil { return nil, errors.Wrapf(err, "eip.AssociateLoadbalancer") } + eipAddr = eip.IpAddr } + if len(eipAddr) > 0 { + _, err = db.Update(lb, func() error { + lb.Address = eipAddr + lb.AddressType = api.LB_ADDR_TYPE_INTERNET + return nil + }) + if err != nil { + return nil, errors.Wrap(err, "set loadbalancer address") + } + } return nil, nil }) return nil