diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index dc0d5b9b44..f3baaa3f79 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -183,6 +183,8 @@ type LoadbalancerDetails struct { // 公网IP地址 Eip string `json:"eip"` + EipId string `json:"eip_id"` + // 公网IP地址类型: 弹性、非弹性 // example: public_ip EipMode string `json:"eip_mode"` diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 2a2fa1f059..53e4d23c16 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -699,6 +699,7 @@ func (lb *SLoadbalancer) getMoreDetails(out api.LoadbalancerDetails) (api.Loadba if eip != nil { out.Eip = eip.IpAddr out.EipMode = eip.Mode + out.EipId = eip.Id } if lb.BackendGroupId != "" { diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index 6eb9caa738..b6cee06196 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -195,6 +195,25 @@ func (self *SKVMRegionDriver) ValidateCreateLoadbalancerData(ctx context.Context if vpc.Id == api.DEFAULT_VPC_ID { lbNetworkType = api.LB_NETWORK_TYPE_CLASSIC } + eipId, _ := data.GetString("eip") + if len(eipId) > 0 { + _eip, err := validators.ValidateModel(userCred, models.ElasticipManager, &eipId) + if err != nil { + return nil, err + } + eip := _eip.(*models.SElasticip) + if eip.CloudregionId != region.GetId() { + return nil, httperrors.NewInputParameterError("lb region %s does not match eip region %s ", + region.GetId(), eip.CloudregionId) + } + if eip.Status != api.EIP_STATUS_READY { + return nil, httperrors.NewInvalidStatusError("eip %s status not ready", eip.Name) + } + if len(eip.AssociateType) > 0 { + return nil, httperrors.NewInvalidStatusError("eip %s alread associate %s", eip.Name, eip.AssociateType) + } + data.Set("eip_id", jsonutils.NewString(eip.Id)) + } data.Set("cloudregion_id", jsonutils.NewString(region.GetId())) data.Set("zone_id", jsonutils.NewString(zone.GetId())) @@ -773,7 +792,24 @@ func (self *SKVMRegionDriver) RequestCreateLoadbalancer(ctx context.Context, use } return nil }) - return nil, err + if err != nil { + return nil, errors.Wrapf(err, "db.Update") + } + // bind eip + eipId, _ := task.GetParams().GetString("eip_id") + if len(eipId) > 0 { + _eip, err := models.ElasticipManager.FetchById(eipId) + if err != nil { + return nil, errors.Wrapf(err, "ElasticipManager.FetchById(%s)", eipId) + } + eip := _eip.(*models.SElasticip) + err = eip.AssociateLoadbalancer(ctx, userCred, lb) + if err != nil { + return nil, errors.Wrapf(err, "eip.AssociateLoadbalancer") + } + } + + return nil, nil }) return nil }