in alibabacloudstack/resource_apsarastack_slb_listener.go [455:730]
func resourceAlibabacloudStackSlbListenerUpdate(d *schema.ResourceData, meta interface{}) error {
proto := d.Get("protocol").(string)
lb_id := d.Get("load_balancer_id").(string)
frontend := d.Get("frontend_port").(int)
d.SetId(lb_id + ":" + proto + ":" + strconv.Itoa(frontend))
client := meta.(*connectivity.AlibabacloudStackClient)
protocol := Protocol(d.Get("protocol").(string))
commonRequest, err := buildListenerCommonArgs(d, meta)
if err != nil {
return errmsgs.WrapError(err)
}
commonRequest.ApiName = fmt.Sprintf("SetLoadBalancer%sListenerAttribute", strings.ToUpper(string(protocol)))
update := false
if d.HasChange("description") {
update = true
}
if d.HasChange("scheduler") {
commonRequest.QueryParams["Scheduler"] = d.Get("scheduler").(string)
update = true
}
if d.HasChange("server_group_id") {
serverGroupId := d.Get("server_group_id").(string)
if serverGroupId != "" {
commonRequest.QueryParams["VServerGroup"] = string(OnFlag)
commonRequest.QueryParams["VServerGroupId"] = d.Get("server_group_id").(string)
} else {
commonRequest.QueryParams["VServerGroup"] = string(OffFlag)
}
update = true
}
if d.HasChange("master_slave_server_group_id") {
serverGroupId := d.Get("master_slave_server_group_id").(string)
if serverGroupId != "" {
commonRequest.QueryParams["MasterSlaveServerGroup"] = string(OnFlag)
commonRequest.QueryParams["MasterSlaveServerGroupId"] = d.Get("master_slave_server_group_id").(string)
} else {
commonRequest.QueryParams["MasterSlaveServerGroup"] = string(OffFlag)
}
update = true
}
if d.HasChange("bandwidth") {
commonRequest.QueryParams["Bandwidth"] = strconv.Itoa(d.Get("bandwidth").(int))
update = true
}
if d.HasChange("acl_status") {
commonRequest.QueryParams["AclStatus"] = d.Get("acl_status").(string)
update = true
}
if d.HasChange("acl_type") {
commonRequest.QueryParams["AclType"] = d.Get("acl_type").(string)
update = true
}
if d.HasChange("acl_id") {
commonRequest.QueryParams["AclId"] = d.Get("acl_id").(string)
update = true
}
httpArgs, err := buildHttpListenerArgs(d, commonRequest)
if (protocol == Https || protocol == Http) && err != nil {
return errmsgs.WrapError(err)
}
// http https
if d.HasChange("sticky_session") {
update = true
}
if d.HasChange("sticky_session_type") {
update = true
}
if d.HasChange("cookie_timeout") {
update = true
}
if d.HasChange("cookie") {
update = true
}
if d.HasChange("health_check") {
update = true
}
//d.SetPartial("gzip")
if d.Get("gzip").(bool) {
httpArgs.QueryParams["Gzip"] = string(OnFlag)
} else {
httpArgs.QueryParams["Gzip"] = string(OffFlag)
}
//d.SetPartial("x_forwarded_for")
if len(d.Get("x_forwarded_for").([]interface{})) > 0 && (d.Get("protocol").(string) == "http" || d.Get("protocol").(string) == "https") {
xff := d.Get("x_forwarded_for").([]interface{})[0].(map[string]interface{})
if xff["retrive_slb_ip"].(bool) {
httpArgs.QueryParams["XForwardedFor_SLBIP"] = string(OnFlag)
} else {
httpArgs.QueryParams["XForwardedFor_SLBIP"] = string(OffFlag)
}
if xff["retrive_slb_id"].(bool) {
httpArgs.QueryParams["XForwardedFor_SLBID"] = string(OnFlag)
} else {
httpArgs.QueryParams["XForwardedFor_SLBID"] = string(OffFlag)
}
if xff["retrive_slb_proto"].(bool) {
httpArgs.QueryParams["XForwardedFor_proto"] = string(OnFlag)
} else {
httpArgs.QueryParams["XForwardedFor_proto"] = string(OffFlag)
}
}
if d.HasChanges("gzip", "x_forwarded_for") {
update = true
}
if d.HasChange("health_check_method") {
update = true
}
// http https tcp udp and health_check=on
if d.HasChange("unhealthy_threshold") {
commonRequest.QueryParams["UnhealthyThreshold"] = string(requests.NewInteger(d.Get("unhealthy_threshold").(int)))
update = true
}
if d.HasChange("healthy_threshold") {
commonRequest.QueryParams["HealthyThreshold"] = string(requests.NewInteger(d.Get("healthy_threshold").(int)))
update = true
}
if d.HasChange("health_check_timeout") {
commonRequest.QueryParams["HealthCheckConnectTimeout"] = string(requests.NewInteger(d.Get("health_check_timeout").(int)))
update = true
}
if d.HasChange("health_check_interval") {
commonRequest.QueryParams["HealthCheckInterval"] = string(requests.NewInteger(d.Get("health_check_interval").(int)))
update = true
}
if d.HasChange("health_check_connect_port") {
if port, ok := d.GetOk("health_check_connect_port"); ok {
httpArgs.QueryParams["HealthCheckConnectPort"] = string(requests.NewInteger(port.(int)))
commonRequest.QueryParams["HealthCheckConnectPort"] = string(requests.NewInteger(port.(int)))
update = true
}
}
// tcp and udp
if d.HasChange("persistence_timeout") {
commonRequest.QueryParams["PersistenceTimeout"] = string(requests.NewInteger(d.Get("persistence_timeout").(int)))
update = true
}
tcpArgs := commonRequest
udpArgs := commonRequest
// http https tcp
if d.HasChange("health_check_domain") {
if domain, ok := d.GetOk("health_check_domain"); ok {
httpArgs.QueryParams["HealthCheckDomain"] = domain.(string)
tcpArgs.QueryParams["HealthCheckDomain"] = domain.(string)
update = true
}
}
if d.HasChange("health_check_uri") {
tcpArgs.QueryParams["HealthCheckURI"] = d.Get("health_check_uri").(string)
update = true
}
if d.HasChange("health_check_http_code") {
tcpArgs.QueryParams["HealthCheckHttpCode"] = d.Get("health_check_http_code").(string)
update = true
}
// tcp
if d.HasChange("health_check_type") {
tcpArgs.QueryParams["HealthCheckType"] = d.Get("health_check_type").(string)
update = true
}
// tcp
if d.HasChange("established_timeout") {
tcpArgs.QueryParams["EstablishedTimeout"] = string(requests.NewInteger(d.Get("established_timeout").(int)))
update = true
}
// https
httpsArgs := httpArgs
if protocol == Https {
scId := d.Get("server_certificate_id").(string)
if scId == "" {
scId = d.Get("ssl_certificate_id").(string)
}
if scId == "" {
return errmsgs.WrapError(errmsgs.Error("'server_certificate_id': required field is not set when the protocol is 'https'."))
}
httpsArgs.QueryParams["ServerCertificateId"] = scId
if d.HasChanges("ssl_certificate_id", "server_certificate_id") {
update = true
}
if d.HasChange("enable_http2") {
httpsArgs.QueryParams["EnableHttp2"] = d.Get("enable_http2").(string)
update = true
}
if d.HasChange("tls_cipher_policy") {
// spec changes check, can not be updated when load balancer instance is "Shared-Performance".
slbService := SlbService{client}
object, err := slbService.DescribeSlb(d.Get("load_balancer_id").(string))
if err != nil {
return errmsgs.WrapError(err)
}
spec := object.LoadBalancerSpec
if spec == "" {
if !d.IsNewResource() || string("tls_cipher_policy_1_0") != d.Get("tls_cipher_policy").(string) {
return errmsgs.WrapError(errmsgs.Error("Currently the param \"tls_cipher_policy\" can not be updated when load balancer instance is \"Shared-Performance\"."))
}
} else {
httpsArgs.QueryParams["TLSCipherPolicy"] = d.Get("tls_cipher_policy").(string)
update = true
}
}
if d.HasChange("ca_certificate_id") {
httpsArgs.QueryParams["CACertificateId"] = d.Get("ca_certificate_id").(string)
update = true
}
}
if update {
var request *requests.CommonRequest
switch protocol {
case Https:
request = httpsArgs
case Tcp:
request = tcpArgs
case Udp:
request = udpArgs
default:
request = httpArgs
}
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.ProcessCommonRequest(request)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*responses.CommonResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request, request.QueryParams)
}
if protocol == Https && d.HasChange("logs_download_attributes") {
slbService := SlbService{client}
old, new := d.GetChange("logs_download_attributes")
if len(old.(map[string]interface{})) > 0 {
err = slbService.DeleteAccessLogsDownloadAttribute(d.Get("load_balancer_id").(string))
if err != nil {
return errmsgs.WrapError(err)
}
}
if new != "" {
err = slbService.SetAccessLogsDownloadAttribute(new.(map[string]interface{}), d.Get("load_balancer_id").(string))
if err != nil {
return errmsgs.WrapError(err)
}
}
}
d.Partial(false)
return resourceAlibabacloudStackSlbListenerRead(d, meta)
}