From e6af8ad2c43da2c3c3747e4241ddf6c400f67f58 Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 22 Oct 2020 15:38:48 +0800 Subject: [PATCH 1/3] qcloud elb support multi zones --- pkg/apis/compute/loadbalancer.go | 4 ++++ pkg/cloudprovider/loadbalancer.go | 1 + pkg/compute/models/loadbalancers.go | 16 ++++++++++++++++ pkg/compute/regiondrivers/qcloud.go | 5 +++++ pkg/multicloud/qcloud/region.go | 9 +++++++++ 5 files changed, 35 insertions(+) diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index cb8681032e..bd82da1911 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -252,6 +252,10 @@ type LoadbalancerCreateInput struct { // LB的其他配置信息 LBInfo jsonutils.JSONObject `json:"lb_info"` + // 从可用区1 + // required: false + Zone1 string `json:"zone_1"` + // SLoadbalancer VpcResourceInput diff --git a/pkg/cloudprovider/loadbalancer.go b/pkg/cloudprovider/loadbalancer.go index 8861ce9528..3740477d70 100644 --- a/pkg/cloudprovider/loadbalancer.go +++ b/pkg/cloudprovider/loadbalancer.go @@ -19,6 +19,7 @@ import "yunion.io/x/onecloud/pkg/util/billing" type SLoadbalancer struct { Name string ZoneID string + SlaveZoneID string VpcID string NetworkIDs []string EipID string // eip id diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 6e2db9b9f1..9bb836a682 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -96,6 +96,9 @@ type SLoadbalancer struct { SLoadbalancerRateLimiter + // 备可用区 + Zone1 string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional" update:"user" json:"zone_1"` + // IP地址 Address string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"optional" json:"address"` // 地址类型 @@ -448,6 +451,19 @@ func (lb *SLoadbalancer) GetCreateLoadbalancerParams(iRegion cloudprovider.IClou } params.ZoneID = iZone.GetId() } + + if len(lb.Zone1) > 0 { + z1 := ZoneManager.FetchZoneById(lb.Zone1) + if z1 == nil { + return nil, fmt.Errorf("failed to find zone 1 for lb %s", lb.Name) + } + iZone, err := iRegion.GetIZoneById(z1.ExternalId) + if err != nil { + return nil, errors.Wrap(err, "GetIZoneById") + } + params.SlaveZoneID = iZone.GetId() + } + if lb.ChargeType == api.LB_CHARGE_TYPE_BY_BANDWIDTH { params.EgressMbps = lb.EgressMbps } diff --git a/pkg/compute/regiondrivers/qcloud.go b/pkg/compute/regiondrivers/qcloud.go index f8e7030e20..903cf76bfc 100644 --- a/pkg/compute/regiondrivers/qcloud.go +++ b/pkg/compute/regiondrivers/qcloud.go @@ -72,6 +72,7 @@ func (self *SQcloudRegionDriver) GetProvider() string { func (self *SQcloudRegionDriver) ValidateCreateLoadbalancerData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { zoneV := validators.NewModelIdOrNameValidator("zone", "zone", ownerId) + zone1V := validators.NewModelIdOrNameValidator("zone_1", "zone", ownerId) vpcV := validators.NewModelIdOrNameValidator("vpc", "vpc", ownerId) managerIdV := validators.NewModelIdOrNameValidator("manager", "cloudprovider", ownerId) addressTypeV := validators.NewStringChoicesValidator("address_type", api.LB_ADDR_TYPES) @@ -81,6 +82,7 @@ func (self *SQcloudRegionDriver) ValidateCreateLoadbalancerData(ctx context.Cont "address_type": addressTypeV.Default(api.LB_ADDR_TYPE_INTRANET), "vpc": vpcV, "zone": zoneV, + "zone_1": zone1V.Optional(true), "manager": managerIdV, } @@ -111,6 +113,9 @@ func (self *SQcloudRegionDriver) ValidateCreateLoadbalancerData(ctx context.Cont return nil, fmt.Errorf("getting region failed") } + if zone1V.Model != nil && len(zone1V.Model.GetId()) > 0 && addressTypeV.Value == api.LB_ADDR_TYPE_INTERNET { + data.Set("zone_1", jsonutils.NewString(zone1V.Model.GetId())) + } data.Set("network_type", jsonutils.NewString(api.LB_NETWORK_TYPE_VPC)) data.Set("cloudregion_id", jsonutils.NewString(region.GetId())) return self.SManagedVirtualizationRegionDriver.ValidateCreateLoadbalancerData(ctx, userCred, ownerId, data) diff --git a/pkg/multicloud/qcloud/region.go b/pkg/multicloud/qcloud/region.go index 83b2f19633..f598d3f9e2 100644 --- a/pkg/multicloud/qcloud/region.go +++ b/pkg/multicloud/qcloud/region.go @@ -176,6 +176,7 @@ func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalanc LoadBalancerType := "INTERNAL" if loadbalancer.AddressType == api.LB_ADDR_TYPE_INTERNET { LoadBalancerType = "OPEN" + } params := map[string]string{ "LoadBalancerType": LoadBalancerType, @@ -189,6 +190,14 @@ func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalanc if loadbalancer.AddressType != api.LB_ADDR_TYPE_INTERNET { params["SubnetId"] = loadbalancer.NetworkIDs[0] + } else { + // 公网类型ELB可支持多可用区 + if len(loadbalancer.ZoneID) > 0 { + params["MasterZoneId"] = loadbalancer.ZoneID + if len(loadbalancer.SlaveZoneID) > 0 { + params["ZoneId"] = loadbalancer.SlaveZoneID + } + } } resp, err := self.clbRequest("CreateLoadBalancer", params) From 69e0ae9dedffa79ac62226d8f1112428bc9a65bf Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 22 Oct 2020 15:51:32 +0800 Subject: [PATCH 2/3] climc lb-create add parameter zone1 --- pkg/mcclient/options/loadbalancers.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/mcclient/options/loadbalancers.go b/pkg/mcclient/options/loadbalancers.go index a17ba7d230..1bbbcfcc76 100644 --- a/pkg/mcclient/options/loadbalancers.go +++ b/pkg/mcclient/options/loadbalancers.go @@ -23,6 +23,7 @@ type LoadbalancerCreateOptions struct { ChargeType string `choices:"traffic|bandwidth"` Bandwidth int Zone string + Zone1 string `json:"zone_1" help:"slave zone 1"` Cluster string `json:"cluster_id"` Manager string } From f86dc52e90a1fcb1e6e7deef5fd30b7d21cfc03c Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 22 Oct 2020 16:01:42 +0800 Subject: [PATCH 3/3] qcloud elb supplort multi zones --- pkg/multicloud/qcloud/region.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/multicloud/qcloud/region.go b/pkg/multicloud/qcloud/region.go index f598d3f9e2..2ae14b9293 100644 --- a/pkg/multicloud/qcloud/region.go +++ b/pkg/multicloud/qcloud/region.go @@ -193,9 +193,10 @@ func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalanc } else { // 公网类型ELB可支持多可用区 if len(loadbalancer.ZoneID) > 0 { - params["MasterZoneId"] = loadbalancer.ZoneID if len(loadbalancer.SlaveZoneID) > 0 { - params["ZoneId"] = loadbalancer.SlaveZoneID + params["MasterZoneId"] = loadbalancer.ZoneID + } else { + params["ZoneId"] = loadbalancer.ZoneID } } }