From 59dd8a0e29ba89587f10e6fe48553fdac629e70e Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Sat, 10 Oct 2020 16:29:41 +0800 Subject: [PATCH] eip: create by BgpType --- pkg/apis/compute/elasticip.go | 3 +++ pkg/compute/regiondrivers/kvm.go | 41 +++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/pkg/apis/compute/elasticip.go b/pkg/apis/compute/elasticip.go index ab432b3b1e..3f82b79a2a 100644 --- a/pkg/apis/compute/elasticip.go +++ b/pkg/apis/compute/elasticip.go @@ -67,6 +67,9 @@ type SElasticipCreateInput struct { // 子网Id // 私有云创建此参数必传,例如Openstack, ZStack NetworkId string `json:"network_id"` + + // description: BgpType for the new eip + BgpType string `json:"bgp_type"` } type ElasticipDetails struct { diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index cea94dbb0b..eb5f6beac8 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -898,17 +898,40 @@ func (self *SKVMRegionDriver) RequestDeleteVpc(ctx context.Context, userCred mcc } func (self *SKVMRegionDriver) ValidateCreateEipData(ctx context.Context, userCred mcclient.TokenCredential, input *api.SElasticipCreateInput) error { - if len(input.NetworkId) == 0 { - return httperrors.NewMissingParameterError("network_id") - } - _network, err := models.NetworkManager.FetchByIdOrName(userCred, input.NetworkId) - if err != nil { - if err == sql.ErrNoRows { - return httperrors.NewResourceNotFoundError2("network", input.NetworkId) + var network *models.SNetwork + if input.NetworkId != "" { + _network, err := models.NetworkManager.FetchByIdOrName(userCred, input.NetworkId) + if err != nil { + if err == sql.ErrNoRows { + return httperrors.NewResourceNotFoundError2("network", input.NetworkId) + } + return httperrors.NewGeneralError(err) } - return httperrors.NewGeneralError(err) + network = _network.(*models.SNetwork) + input.BgpType = network.BgpType + } else if input.BgpType != "" { + q := models.NetworkManager.Query(). + Equals("server_type", api.NETWORK_TYPE_EIP). + Equals("bgp_type", input.BgpType) + var nets []models.SNetwork + if err := db.FetchModelObjects(models.NetworkManager, q, &nets); err != nil { + return err + } + for i := range nets { + net := &nets[i] + cnt, _ := net.GetFreeAddressCount() + if cnt > 0 { + network = net + input.NetworkId = net.Id + break + } + } + if network == nil { + return httperrors.NewNotFoundError("no available eip network from BgpType %s", input.BgpType) + } + } else { + return httperrors.NewMissingParameterError("network_id, isp") } - network := _network.(*models.SNetwork) if network.ServerType != api.NETWORK_TYPE_EIP { return httperrors.NewInputParameterError("bad network type %q, want %q", network.ServerType, api.NETWORK_TYPE_EIP) }