yunion.io/x/cloudmux@v0.3.10-0-alpha.1/pkg/multicloud/aliyun/loadbalancerhttplistener.go (about)

     1  // Copyright 2019 Yunion
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package aliyun
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  
    21  	"yunion.io/x/jsonutils"
    22  
    23  	api "yunion.io/x/cloudmux/pkg/apis/compute"
    24  	"yunion.io/x/cloudmux/pkg/cloudprovider"
    25  	"yunion.io/x/cloudmux/pkg/multicloud"
    26  )
    27  
    28  type SLoadbalancerHTTPListener struct {
    29  	multicloud.SResourceBase
    30  	multicloud.SLoadbalancerRedirectBase
    31  	AliyunTags
    32  	lb *SLoadbalancer
    33  
    34  	ListenerPort      int    //	负载均衡实例前端使用的端口。
    35  	BackendServerPort int    //	负载均衡实例后端使用的端口。
    36  	Bandwidth         int    //	监听的带宽峰值。
    37  	Status            string //	当前监听的状态。取值:starting | running | configuring | stopping | stopped
    38  	Description       string
    39  
    40  	XForwardedFor       string //	是否开启通过X-Forwarded-For头字段获取访者真实IP。
    41  	XForwardedFor_SLBIP string //	是否通过SLB-IP头字段获取客户端请求的真实IP。
    42  	XForwardedFor_SLBID string //	是否通过SLB-ID头字段获取负载均衡实例ID。
    43  	XForwardedFor_proto string //	是否通过X-Forwarded-Proto头字段获取负载均衡实例的监听协议。
    44  	Scheduler           string //	调度算法。
    45  	StickySession       string //	是否开启会话保持。
    46  	StickySessionType   string //	cookie的处理方式。
    47  	CookieTimeout       int    //	Cookie超时时间。
    48  	Cookie              string //	服务器上配置的cookie。
    49  	AclStatus           string //	是否开启访问控制功能。取值:on | off(默认值)
    50  
    51  	AclType string //	访问控制类型:
    52  	//white: 仅转发来自所选访问控制策略组中设置的IP地址或地址段的请求,白名单适用于应用只允许特定IP访问的场景。
    53  	//设置白名单存在一定业务风险。一旦设置白名单,就只有白名单中的IP可以访问负载均衡监听。如果开启了白名单访问,但访问策略组中没有添加任何IP,则负载均衡监听会转发全部请求。
    54  
    55  	//black: 来自所选访问控制策略组中设置的IP地址或地址段的所有请求都不会转发,黑名单适用于应用只限制某些特定IP访问的场景。
    56  	//如果开启了黑名单访问,但访问策略组中没有添加任何IP,则负载均衡监听会转发全部请求。
    57  
    58  	//当AclStatus参数的值为on时,该参数必选。
    59  
    60  	AclId string //	监听绑定的访问策略组ID。当AclStatus参数的值为on时,该参数必选。
    61  
    62  	HealthCheck            string //	是否开启健康检查。
    63  	HealthCheckDomain      string //	用于健康检查的域名。
    64  	HealthCheckURI         string //	用于健康检查的URI。
    65  	HealthyThreshold       int    //	健康检查阈值。
    66  	UnhealthyThreshold     int    //	不健康检查阈值。
    67  	HealthCheckTimeout     int    //	每次健康检查响应的最大超时间,单位为秒。
    68  	HealthCheckInterval    int    //	健康检查的时间间隔,单位为秒。
    69  	HealthCheckHttpCode    string //	健康检查正常的HTTP状态码。
    70  	HealthCheckConnectPort int    //	健康检查的端口。
    71  	Gzip                   string //	是否开启Gzip压缩。
    72  	EnableHttp2            string //	是否开启HTTP/2特性。取值:on(默认值)|off
    73  
    74  	Rules           Rules  //监听下的转发规则列表,具体请参见RuleList。
    75  	ForwardPort     int    //	HTTP至HTTPS的监听转发端口。暂时只支持将HTTP 80访问重定向转发至HTTPS 443。 说明 如果 ListenerForward的值为 off,该参数不显示。
    76  	ListenerForward string //	表示是否开启HTTP至HTTPS的监听转发。on:表示开启 off:表示未开启
    77  	VServerGroupId  string // 绑定的服务器组ID
    78  }
    79  
    80  func (listener *SLoadbalancerHTTPListener) GetName() string {
    81  	if len(listener.Description) == 0 {
    82  		listener.Refresh()
    83  	}
    84  	if len(listener.Description) > 0 {
    85  		return listener.Description
    86  	}
    87  	return fmt.Sprintf("HTTP:%d", listener.ListenerPort)
    88  }
    89  
    90  func (listerner *SLoadbalancerHTTPListener) GetId() string {
    91  	return fmt.Sprintf("%s/%d", listerner.lb.LoadBalancerId, listerner.ListenerPort)
    92  }
    93  
    94  func (listerner *SLoadbalancerHTTPListener) GetGlobalId() string {
    95  	return listerner.GetId()
    96  }
    97  
    98  func (listerner *SLoadbalancerHTTPListener) GetStatus() string {
    99  	switch listerner.Status {
   100  	case "starting", "running":
   101  		return api.LB_STATUS_ENABLED
   102  	case "configuring", "stopping", "stopped":
   103  		return api.LB_STATUS_DISABLED
   104  	default:
   105  		return api.LB_STATUS_UNKNOWN
   106  	}
   107  }
   108  
   109  func (listerner *SLoadbalancerHTTPListener) IsEmulated() bool {
   110  	return false
   111  }
   112  
   113  func (listerner *SLoadbalancerHTTPListener) GetEgressMbps() int {
   114  	if listerner.Bandwidth < 1 {
   115  		return 0
   116  	}
   117  	return listerner.Bandwidth
   118  }
   119  
   120  func (listerner *SLoadbalancerHTTPListener) Refresh() error {
   121  	lis, err := listerner.lb.region.GetLoadbalancerHTTPListener(listerner.lb.LoadBalancerId, listerner.ListenerPort)
   122  	if err != nil {
   123  		return err
   124  	}
   125  	return jsonutils.Update(listerner, lis)
   126  }
   127  
   128  func (listerner *SLoadbalancerHTTPListener) GetListenerType() string {
   129  	return "http"
   130  }
   131  
   132  func (listerner *SLoadbalancerHTTPListener) GetListenerPort() int {
   133  	return listerner.ListenerPort
   134  }
   135  
   136  func (listerner *SLoadbalancerHTTPListener) GetBackendGroupId() string {
   137  	if len(listerner.VServerGroupId) == 0 {
   138  		listerner.Refresh()
   139  	}
   140  	return listerner.VServerGroupId
   141  }
   142  
   143  func (listerner *SLoadbalancerHTTPListener) GetBackendServerPort() int {
   144  	return listerner.BackendServerPort
   145  }
   146  
   147  func (listerner *SLoadbalancerHTTPListener) GetScheduler() string {
   148  	return listerner.Scheduler
   149  }
   150  
   151  func (listerner *SLoadbalancerHTTPListener) GetAclStatus() string {
   152  	return listerner.AclStatus
   153  }
   154  
   155  func (listerner *SLoadbalancerHTTPListener) GetAclType() string {
   156  	return listerner.AclType
   157  }
   158  
   159  func (listerner *SLoadbalancerHTTPListener) GetAclId() string {
   160  	return listerner.AclId
   161  }
   162  
   163  func (listerner *SLoadbalancerHTTPListener) GetHealthCheck() string {
   164  	return listerner.HealthCheck
   165  }
   166  
   167  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckType() string {
   168  	return api.LB_HEALTH_CHECK_HTTP
   169  }
   170  
   171  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckDomain() string {
   172  	return listerner.HealthCheckDomain
   173  }
   174  
   175  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckURI() string {
   176  	return listerner.HealthCheckURI
   177  }
   178  
   179  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckCode() string {
   180  	return listerner.HealthCheckHttpCode
   181  }
   182  
   183  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckRise() int {
   184  	return listerner.HealthyThreshold
   185  }
   186  
   187  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckFail() int {
   188  	return listerner.UnhealthyThreshold
   189  }
   190  
   191  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckTimeout() int {
   192  	return listerner.HealthCheckTimeout
   193  }
   194  
   195  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckInterval() int {
   196  	return listerner.HealthCheckInterval
   197  }
   198  
   199  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckReq() string {
   200  	return ""
   201  }
   202  
   203  func (listerner *SLoadbalancerHTTPListener) GetHealthCheckExp() string {
   204  	return ""
   205  }
   206  
   207  func (listerner *SLoadbalancerHTTPListener) GetStickySession() string {
   208  	return listerner.StickySession
   209  }
   210  
   211  func (listerner *SLoadbalancerHTTPListener) GetStickySessionType() string {
   212  	return listerner.StickySessionType
   213  }
   214  
   215  func (listerner *SLoadbalancerHTTPListener) GetStickySessionCookie() string {
   216  	return listerner.Cookie
   217  }
   218  
   219  func (listerner *SLoadbalancerHTTPListener) GetStickySessionCookieTimeout() int {
   220  	return listerner.CookieTimeout
   221  }
   222  
   223  func (listerner *SLoadbalancerHTTPListener) XForwardedForEnabled() bool {
   224  	if listerner.XForwardedFor == "on" {
   225  		return true
   226  	}
   227  	return false
   228  }
   229  
   230  func (listerner *SLoadbalancerHTTPListener) GzipEnabled() bool {
   231  	if listerner.Gzip == "on" {
   232  		return true
   233  	}
   234  	return false
   235  }
   236  
   237  func (listerner *SLoadbalancerHTTPListener) GetCertificateId() string {
   238  	return ""
   239  }
   240  
   241  func (listerner *SLoadbalancerHTTPListener) GetTLSCipherPolicy() string {
   242  	return ""
   243  }
   244  
   245  func (listerner *SLoadbalancerHTTPListener) HTTP2Enabled() bool {
   246  	if listerner.EnableHttp2 == "on" {
   247  		return true
   248  	}
   249  	return false
   250  }
   251  
   252  func (listerner *SLoadbalancerHTTPListener) GetILoadbalancerListenerRules() ([]cloudprovider.ICloudLoadbalancerListenerRule, error) {
   253  	rules, err := listerner.lb.region.GetLoadbalancerListenerRules(listerner.lb.LoadBalancerId, listerner.ListenerPort)
   254  	if err != nil {
   255  		return nil, err
   256  	}
   257  	iRules := []cloudprovider.ICloudLoadbalancerListenerRule{}
   258  	for i := 0; i < len(rules); i++ {
   259  		rules[i].httpListener = listerner
   260  		iRules = append(iRules, &rules[i])
   261  	}
   262  	return iRules, nil
   263  }
   264  
   265  func (region *SRegion) GetLoadbalancerHTTPListener(loadbalancerId string, listenerPort int) (*SLoadbalancerHTTPListener, error) {
   266  	params := map[string]string{}
   267  	params["RegionId"] = region.RegionId
   268  	params["LoadBalancerId"] = loadbalancerId
   269  	params["ListenerPort"] = fmt.Sprintf("%d", listenerPort)
   270  	body, err := region.lbRequest("DescribeLoadBalancerHTTPListenerAttribute", params)
   271  	if err != nil {
   272  		return nil, err
   273  	}
   274  	listener := SLoadbalancerHTTPListener{}
   275  	return &listener, body.Unmarshal(&listener)
   276  }
   277  
   278  func (region *SRegion) DeleteLoadbalancerListener(loadbalancerId string, listenerPort int) error {
   279  	params := map[string]string{}
   280  	params["RegionId"] = region.RegionId
   281  	params["LoadBalancerId"] = loadbalancerId
   282  	params["ListenerPort"] = fmt.Sprintf("%d", listenerPort)
   283  	_, err := region.lbRequest("DeleteLoadBalancerListener", params)
   284  	return err
   285  }
   286  
   287  func (region *SRegion) CreateLoadbalancerHTTPListener(lb *SLoadbalancer, listener *cloudprovider.SLoadbalancerListener) (cloudprovider.ICloudLoadbalancerListener, error) {
   288  	params := region.constructBaseCreateListenerParams(lb, listener)
   289  	params = region.constructHTTPCreateListenerParams(params, listener)
   290  	_, err := region.lbRequest("CreateLoadBalancerHTTPListener", params)
   291  	if err != nil {
   292  		return nil, err
   293  	}
   294  	iListener, err := region.GetLoadbalancerHTTPListener(lb.LoadBalancerId, listener.ListenerPort)
   295  	if err != nil {
   296  		return nil, err
   297  	}
   298  	iListener.lb = lb
   299  	return iListener, nil
   300  }
   301  
   302  func (listerner *SLoadbalancerHTTPListener) Delete(ctx context.Context) error {
   303  	return listerner.lb.region.DeleteLoadbalancerListener(listerner.lb.LoadBalancerId, listerner.ListenerPort)
   304  }
   305  
   306  func (listerner *SLoadbalancerHTTPListener) CreateILoadBalancerListenerRule(rule *cloudprovider.SLoadbalancerListenerRule) (cloudprovider.ICloudLoadbalancerListenerRule, error) {
   307  	_rule := &SLoadbalancerListenerRule{
   308  		Domain:   rule.Domain,
   309  		Url:      rule.Path,
   310  		RuleName: rule.Name,
   311  	}
   312  	if len(rule.BackendGroupID) > 0 { //&& rule.BackendGroupType == api.LB_BACKENDGROUP_TYPE_NORMAL {
   313  		_rule.VServerGroupId = rule.BackendGroupID
   314  	}
   315  	listenerRule, err := listerner.lb.region.CreateLoadbalancerListenerRule(listerner.ListenerPort, listerner.lb.LoadBalancerId, _rule)
   316  	if err != nil {
   317  		return nil, err
   318  	}
   319  	listenerRule.httpListener = listerner
   320  	return listenerRule, nil
   321  }
   322  
   323  func (listerner *SLoadbalancerHTTPListener) GetILoadBalancerListenerRuleById(ruleId string) (cloudprovider.ICloudLoadbalancerListenerRule, error) {
   324  	rule, err := listerner.lb.region.GetLoadbalancerListenerRule(ruleId)
   325  	if err != nil {
   326  		return nil, err
   327  	}
   328  	rule.httpListener = listerner
   329  	return rule, nil
   330  }
   331  
   332  func (region *SRegion) startListener(listenerPort int, loadbalancerId string) error {
   333  	params := map[string]string{}
   334  	params["RegionId"] = region.RegionId
   335  	params["LoadBalancerId"] = loadbalancerId
   336  	params["ListenerPort"] = fmt.Sprintf("%d", listenerPort)
   337  	_, err := region.lbRequest("StartLoadBalancerListener", params)
   338  	return err
   339  }
   340  
   341  func (region *SRegion) stopListener(listenerPort int, loadbalancerId string) error {
   342  	params := map[string]string{}
   343  	params["RegionId"] = region.RegionId
   344  	params["LoadBalancerId"] = loadbalancerId
   345  	params["ListenerPort"] = fmt.Sprintf("%d", listenerPort)
   346  	_, err := region.lbRequest("StopLoadBalancerListener", params)
   347  	return err
   348  }
   349  
   350  func (listerner *SLoadbalancerHTTPListener) Start() error {
   351  	return listerner.lb.region.startListener(listerner.ListenerPort, listerner.lb.LoadBalancerId)
   352  }
   353  
   354  func (listerner *SLoadbalancerHTTPListener) Stop() error {
   355  	return listerner.lb.region.stopListener(listerner.ListenerPort, listerner.lb.LoadBalancerId)
   356  }
   357  
   358  func (region *SRegion) SyncLoadbalancerHTTPListener(lb *SLoadbalancer, listener *cloudprovider.SLoadbalancerListener) error {
   359  	params := region.constructBaseCreateListenerParams(lb, listener)
   360  	params = region.constructHTTPCreateListenerParams(params, listener)
   361  	_, err := region.lbRequest("SetLoadBalancerHTTPListenerAttribute", params)
   362  	return err
   363  }
   364  
   365  func (listerner *SLoadbalancerHTTPListener) Sync(ctx context.Context, lblis *cloudprovider.SLoadbalancerListener) error {
   366  	return listerner.lb.region.SyncLoadbalancerHTTPListener(listerner.lb, lblis)
   367  }
   368  
   369  func (listerner *SLoadbalancerHTTPListener) GetProjectId() string {
   370  	return listerner.lb.GetProjectId()
   371  }
   372  
   373  func (listerner *SLoadbalancerHTTPListener) GetClientIdleTimeout() int {
   374  	return 0
   375  }
   376  
   377  func (listerner *SLoadbalancerHTTPListener) GetBackendConnectTimeout() int {
   378  	return 0
   379  }