fix(region): qcloud lb support bandwidth

This commit is contained in:
ioito
2021-12-31 15:46:16 +08:00
parent 48ca832cb6
commit d579f484d3
5 changed files with 83 additions and 31 deletions
-2
View File
@@ -402,13 +402,11 @@ var LB_BACKEND_ROLES = choices.NewChoices(
const (
LB_CHARGE_TYPE_BY_TRAFFIC = "traffic"
LB_CHARGE_TYPE_BY_BANDWIDTH = "bandwidth"
LB_CHARGE_TYPE_POSTPAID = "postpaid"
)
var LB_CHARGE_TYPES = choices.NewChoices(
LB_CHARGE_TYPE_BY_TRAFFIC,
LB_CHARGE_TYPE_BY_BANDWIDTH,
LB_CHARGE_TYPE_POSTPAID,
)
const (
+1 -1
View File
@@ -270,7 +270,7 @@ func (self *SLoadbalancer) GetLoadbalancerSpec() string {
}
func (self *SLoadbalancer) GetChargeType() string {
return api.LB_CHARGE_TYPE_POSTPAID
return api.LB_CHARGE_TYPE_BY_TRAFFIC
}
func (self *SLoadbalancer) GetEgressMbps() int {
+1 -1
View File
@@ -215,7 +215,7 @@ func (self *SLoadbalancer) GetLoadbalancerSpec() string {
}
func (self *SLoadbalancer) GetChargeType() string {
return api.LB_CHARGE_TYPE_POSTPAID
return api.LB_CHARGE_TYPE_BY_TRAFFIC
}
func (self *SLoadbalancer) GetEgressMbps() int {
+27 -20
View File
@@ -56,24 +56,28 @@ type SLoadbalancer struct {
multicloud.QcloudTags
region *SRegion
Status int64 `json:"Status"` // 0:创建中,1:正常运行
Domain string `json:"Domain"`
VpcID string `json:"VpcId"`
Log string `json:"Log"`
ProjectID int64 `json:"ProjectId"`
Snat bool `json:"Snat"`
LoadBalancerID string `json:"LoadBalancerId"`
LoadBalancerVips []string `json:"LoadBalancerVips"`
LoadBalancerType string `json:"LoadBalancerType"` // 负载均衡实例的网络类型: OPEN:公网属性, INTERNAL:内网属性。
LoadBalancerName string `json:"LoadBalancerName"`
Forward LB_TYPE `json:"Forward"` // 应用型负载均衡标识,1:应用型负载均衡,0:传统型的负载均衡。
StatusTime time.Time `json:"StatusTime"`
OpenBGP int64 `json:"OpenBgp"` // 高防 LB 的标识,1:高防负载均衡 0:非高防负载均衡。
CreateTime time.Time `json:"CreateTime"`
Isolation int64 `json:"Isolation"` // 0:表示未被隔离,1:表示被隔离。
SubnetId string `json:"SubnetId"`
BackupZoneSet []ZoneSet `json:"BackupZoneSet"`
MasterZone ZoneSet `json:"MasterZone"`
Status int64 `json:"Status"` // 0:创建中,1:正常运行
Domain string `json:"Domain"`
VpcID string `json:"VpcId"`
Log string `json:"Log"`
ProjectID int64 `json:"ProjectId"`
Snat bool `json:"Snat"`
LoadBalancerID string `json:"LoadBalancerId"`
LoadBalancerVips []string `json:"LoadBalancerVips"`
LoadBalancerType string `json:"LoadBalancerType"` // 负载均衡实例的网络类型: OPEN:公网属性, INTERNAL:内网属性。
LoadBalancerName string `json:"LoadBalancerName"`
Forward LB_TYPE `json:"Forward"` // 应用型负载均衡标识,1:应用型负载均衡,0:传统型的负载均衡。
StatusTime time.Time `json:"StatusTime"`
OpenBGP int64 `json:"OpenBgp"` // 高防 LB 的标识,1:高防负载均衡 0:非高防负载均衡。
CreateTime time.Time `json:"CreateTime"`
Isolation int64 `json:"Isolation"` // 0:表示未被隔离,1:表示被隔离。
SubnetId string `json:"SubnetId"`
BackupZoneSet []ZoneSet `json:"BackupZoneSet"`
MasterZone ZoneSet `json:"MasterZone"`
NetworkAttributes struct {
InternetChargeType string
InternetMaxBandwidthOut int
}
}
type ZoneSet struct {
@@ -87,11 +91,14 @@ func (self *SLoadbalancer) GetLoadbalancerSpec() string {
}
func (self *SLoadbalancer) GetChargeType() string {
return api.LB_CHARGE_TYPE_POSTPAID
if len(self.NetworkAttributes.InternetChargeType) > 0 && self.NetworkAttributes.InternetChargeType != "TRAFFIC_POSTPAID_BY_HOUR" {
return api.LB_CHARGE_TYPE_BY_BANDWIDTH
}
return api.LB_CHARGE_TYPE_BY_TRAFFIC
}
func (self *SLoadbalancer) GetEgressMbps() int {
return 0
return self.NetworkAttributes.InternetMaxBandwidthOut
}
// https://cloud.tencent.com/document/product/214/30689
+54 -7
View File
@@ -21,6 +21,7 @@ import (
"strings"
"time"
sdkerrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
"github.com/tencentyun/cos-go-sdk-v5"
"yunion.io/x/jsonutils"
@@ -130,17 +131,52 @@ func (self *SRegion) GetILoadBalancerAclById(aclId string) (cloudprovider.ICloud
// todo: 1. 支持跨地域绑定负载均衡 及 https://cloud.tencent.com/document/product/214/12014
// todo: 2. 支持指定Project。 ProjectId可以通过 DescribeProject 接口获取。不填则属于默认项目。
func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalancer) (cloudprovider.ICloudLoadbalancer, error) {
LoadBalancerType := "INTERNAL"
if loadbalancer.AddressType == api.LB_ADDR_TYPE_INTERNET {
LoadBalancerType = "OPEN"
}
params := map[string]string{
"LoadBalancerType": LoadBalancerType,
"LoadBalancerName": loadbalancer.Name,
"VpcId": loadbalancer.VpcID,
}
LoadBalancerType := "INTERNAL"
if loadbalancer.AddressType == api.LB_ADDR_TYPE_INTERNET {
LoadBalancerType = "OPEN"
switch loadbalancer.ChargeType {
case api.LB_CHARGE_TYPE_BY_BANDWIDTH:
pkgs, _, err := self.GetBandwidthPackages([]string{}, 0, 50)
if err != nil {
return nil, errors.Wrapf(err, "GetBandwidthPackages")
}
bps := loadbalancer.EgressMbps
if bps == 0 {
bps = 200
}
if len(pkgs) > 0 {
pkgId := pkgs[0].BandwidthPackageId
for _, pkg := range pkgs {
if len(pkg.ResourceSet) < 100 {
pkgId = pkg.BandwidthPackageId
break
}
}
params["BandwidthPackageId"] = pkgId
params["InternetAccessible.InternetChargeType"] = "BANDWIDTH_PACKAGE"
params["InternetAccessible.InternetMaxBandwidthOut"] = "2048"
} else {
params["InternetAccessible.InternetChargeType"] = "BANDWIDTH_POSTPAID_BY_HOUR"
params["InternetAccessible.InternetMaxBandwidthOut"] = fmt.Sprintf("%d", bps)
}
default:
bps := loadbalancer.EgressMbps
if bps == 0 {
bps = 200
}
params["InternetAccessible.InternetChargeType"] = "TRAFFIC_POSTPAID_BY_HOUR"
params["InternetAccessible.InternetMaxBandwidthOut"] = fmt.Sprintf("%d", bps)
}
}
params["LoadBalancerType"] = LoadBalancerType
if len(loadbalancer.ProjectId) > 0 {
params["ProjectId"] = loadbalancer.ProjectId
}
@@ -164,7 +200,18 @@ func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalanc
i++
}
resp, err := self.clbRequest("CreateLoadBalancer", params)
resp, err := func() (jsonutils.JSONObject, error) {
_resp, err := self.clbRequest("CreateLoadBalancer", params)
if err != nil {
// 兼容不支持指定zone的账号
if e, ok := err.(*sdkerrors.TencentCloudSDKError); ok && e.Code == "InvalidParameterValue" {
delete(params, "ZoneId")
delete(params, "MasterZoneId")
return self.clbRequest("CreateLoadBalancer", params)
}
}
return _resp, err
}()
if err != nil {
return nil, err
}