165 lines
3.6 KiB
Go
165 lines
3.6 KiB
Go
package alicloud
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/denverdino/aliyungo/slb"
|
|
)
|
|
|
|
type Listener struct {
|
|
slb.HTTPListenerType
|
|
|
|
InstancePort int
|
|
LoadBalancerPort int
|
|
Protocol string
|
|
//tcp & udp
|
|
PersistenceTimeout int
|
|
|
|
//https
|
|
SSLCertificateId string
|
|
|
|
//tcp
|
|
HealthCheckType slb.HealthCheckType
|
|
|
|
//api interface: http & https is HealthCheckTimeout, tcp & udp is HealthCheckConnectTimeout
|
|
HealthCheckConnectTimeout int
|
|
}
|
|
|
|
type ListenerErr struct {
|
|
ErrType string
|
|
Err error
|
|
}
|
|
|
|
func (e *ListenerErr) Error() string {
|
|
return e.ErrType + " " + e.Err.Error()
|
|
|
|
}
|
|
|
|
const (
|
|
HealthCheckErrType = "healthCheckErrType"
|
|
StickySessionErrType = "stickySessionErrType"
|
|
CookieTimeOutErrType = "cookieTimeoutErrType"
|
|
CookieErrType = "cookieErrType"
|
|
)
|
|
|
|
// Takes the result of flatmap.Expand for an array of listeners and
|
|
// returns ELB API compatible objects
|
|
func expandListeners(configured []interface{}) ([]*Listener, error) {
|
|
listeners := make([]*Listener, 0, len(configured))
|
|
|
|
// Loop over our configured listeners and create
|
|
// an array of aws-sdk-go compatabile objects
|
|
for _, lRaw := range configured {
|
|
data := lRaw.(map[string]interface{})
|
|
|
|
ip := data["instance_port"].(int)
|
|
lp := data["lb_port"].(int)
|
|
l := &Listener{
|
|
InstancePort: ip,
|
|
LoadBalancerPort: lp,
|
|
Protocol: data["lb_protocol"].(string),
|
|
}
|
|
|
|
l.Bandwidth = data["bandwidth"].(int)
|
|
|
|
if v, ok := data["scheduler"]; ok {
|
|
l.Scheduler = slb.SchedulerType(v.(string))
|
|
}
|
|
|
|
if v, ok := data["ssl_certificate_id"]; ok {
|
|
l.SSLCertificateId = v.(string)
|
|
}
|
|
|
|
if v, ok := data["sticky_session"]; ok {
|
|
l.StickySession = slb.FlagType(v.(string))
|
|
}
|
|
|
|
if v, ok := data["sticky_session_type"]; ok {
|
|
l.StickySessionType = slb.StickySessionType(v.(string))
|
|
}
|
|
|
|
if v, ok := data["cookie_timeout"]; ok {
|
|
l.CookieTimeout = v.(int)
|
|
}
|
|
|
|
if v, ok := data["cookie"]; ok {
|
|
l.Cookie = v.(string)
|
|
}
|
|
|
|
if v, ok := data["persistence_timeout"]; ok {
|
|
l.PersistenceTimeout = v.(int)
|
|
}
|
|
|
|
if v, ok := data["health_check"]; ok {
|
|
l.HealthCheck = slb.FlagType(v.(string))
|
|
}
|
|
|
|
if v, ok := data["health_check_type"]; ok {
|
|
l.HealthCheckType = slb.HealthCheckType(v.(string))
|
|
}
|
|
|
|
if v, ok := data["health_check_domain"]; ok {
|
|
l.HealthCheckDomain = v.(string)
|
|
}
|
|
|
|
if v, ok := data["health_check_uri"]; ok {
|
|
l.HealthCheckURI = v.(string)
|
|
}
|
|
|
|
if v, ok := data["health_check_connect_port"]; ok {
|
|
l.HealthCheckConnectPort = v.(int)
|
|
}
|
|
|
|
if v, ok := data["healthy_threshold"]; ok {
|
|
l.HealthyThreshold = v.(int)
|
|
}
|
|
|
|
if v, ok := data["unhealthy_threshold"]; ok {
|
|
l.UnhealthyThreshold = v.(int)
|
|
}
|
|
|
|
if v, ok := data["health_check_timeout"]; ok {
|
|
l.HealthCheckTimeout = v.(int)
|
|
}
|
|
|
|
if v, ok := data["health_check_interval"]; ok {
|
|
l.HealthCheckInterval = v.(int)
|
|
}
|
|
|
|
if v, ok := data["health_check_http_code"]; ok {
|
|
l.HealthCheckHttpCode = slb.HealthCheckHttpCodeType(v.(string))
|
|
}
|
|
|
|
var valid bool
|
|
if l.SSLCertificateId != "" {
|
|
// validate the protocol is correct
|
|
for _, p := range []string{"https", "ssl"} {
|
|
if strings.ToLower(l.Protocol) == p {
|
|
valid = true
|
|
}
|
|
}
|
|
} else {
|
|
valid = true
|
|
}
|
|
|
|
if valid {
|
|
listeners = append(listeners, l)
|
|
} else {
|
|
return nil, fmt.Errorf("[ERR] SLB Listener: ssl_certificate_id may be set only when protocol is 'https' or 'ssl'")
|
|
}
|
|
}
|
|
|
|
return listeners, nil
|
|
}
|
|
|
|
func expandBackendServers(list []interface{}) []slb.BackendServerType {
|
|
result := make([]slb.BackendServerType, 0, len(list))
|
|
for _, i := range list {
|
|
if i.(string) != "" {
|
|
result = append(result, slb.BackendServerType{ServerId: i.(string), Weight: 100})
|
|
}
|
|
}
|
|
return result
|
|
}
|