mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
fix(region): qcloud lb support bandwidth
This commit is contained in:
@@ -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 (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user