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 }