func resourceAlibabacloudStackExpressConnectVirtualBorderRouterUpdate()

in alibabacloudstack/resource_apsarastack_expressconnect_virtualborderrouter.go [230:431]


func resourceAlibabacloudStackExpressConnectVirtualBorderRouterUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)
	vpcService := VpcService{client}
	d.Partial(true)

	update := false
	request := client.NewCommonRequest("POST", "Vpc", "2016-04-28", "ModifyVirtualBorderRouterAttribute", "")
	request.QueryParams["VbrId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("circuit_code") {
		update = true
		if v, ok := d.GetOk("circuit_code"); ok {
			request.QueryParams["CircuitCode"] = v.(string)
		}
	}
	if !d.IsNewResource() && d.HasChange("description") {
		update = true
		if v, ok := d.GetOk("description"); ok {
			request.QueryParams["Description"] = v.(string)
		}
	}
	if d.HasChange("detect_multiplier") {
		update = true
		if v, ok := d.GetOk("detect_multiplier"); ok {
			request.QueryParams["DetectMultiplier"] = fmt.Sprint(v)
		} else if v, ok := d.GetOk("min_rx_interval"); ok && fmt.Sprint(v) != "" {
			if v, ok := d.GetOk("min_tx_interval"); ok && fmt.Sprint(v) != "" {
				return errmsgs.WrapError(fmt.Errorf("attribute '%s' is required when '%s' is %v and '%s' is %v ", "detect_multiplier", "min_rx_interval", d.Get("min_rx_interval"), "min_tx_interval", d.Get("min_tx_interval")))
			}
		}
		request.QueryParams["MinRxInterval"] = fmt.Sprint(d.Get("min_rx_interval"))
		request.QueryParams["MinTxInterval"] = fmt.Sprint(d.Get("min_tx_interval"))
	}
	if !d.IsNewResource() && d.HasChange("enable_ipv6") {
		update = true
		if v, ok := d.GetOkExists("enable_ipv6"); ok {
			request.QueryParams["EnableIpv6"] = v.(string)
		}
	}
	if !d.IsNewResource() && d.HasChange("local_gateway_ip") {
		update = true
		request.QueryParams["LocalGatewayIp"] = d.Get("local_gateway_ip").(string)
	}
	if !d.IsNewResource() && d.HasChange("local_ipv6_gateway_ip") {
		update = true
		if v, ok := d.GetOk("local_ipv6_gateway_ip"); ok {
			request.QueryParams["LocalIpv6GatewayIp"] = v.(string)
		}
	}
	if d.HasChange("min_rx_interval") {
		update = true
		if v, ok := d.GetOk("min_rx_interval"); ok {
			request.QueryParams["MinRxInterval"] = fmt.Sprint(v)
		} else if v, ok := d.GetOk("detect_multiplier"); ok && fmt.Sprint(v) != "" {
			if v, ok := d.GetOk("min_tx_interval"); ok && fmt.Sprint(v) != "" {
				return errmsgs.WrapError(fmt.Errorf("attribute '%s' is required when '%s' is %v and '%s' is %v ", "min_rx_interval", "detect_multiplier", d.Get("detect_multiplier"), "min_tx_interval", d.Get("min_tx_interval")))
			}
		}
		request.QueryParams["DetectMultiplier"] = fmt.Sprint(d.Get("detect_multiplier"))
		request.QueryParams["MinTxInterval"] = fmt.Sprint(d.Get("min_tx_interval"))
	}
	if d.HasChange("min_tx_interval") {
		update = true
		if v, ok := d.GetOk("min_tx_interval"); ok {
			request.QueryParams["MinTxInterval"] = fmt.Sprint(v)
		} else if v, ok := d.GetOk("detect_multiplier"); ok && fmt.Sprint(v) != "" {
			if v, ok := d.GetOk("min_rx_interval"); ok && fmt.Sprint(v) != "" {
				return errmsgs.WrapError(fmt.Errorf("attribute '%s' is required when '%s' is %v and '%s' is %v ", "min_tx_interval", "detect_multiplier", d.Get("detect_multiplier"), "min_rx_interval", d.Get("min_rx_interval")))
			}
		}
		request.QueryParams["DetectMultiplier"] = fmt.Sprint(d.Get("detect_multiplier"))
		request.QueryParams["MinRxInterval"] = fmt.Sprint(d.Get("min_rx_interval"))
	}
	if !d.IsNewResource() && d.HasChange("peer_gateway_ip") {
		update = true
		request.QueryParams["PeerGatewayIp"] = d.Get("peer_gateway_ip").(string)
	}
	if !d.IsNewResource() && d.HasChange("peer_ipv6_gateway_ip") {
		update = true
		if v, ok := d.GetOk("peer_ipv6_gateway_ip"); ok {
			request.QueryParams["PeerIpv6GatewayIp"] = v.(string)
		}
	}
	if !d.IsNewResource() && d.HasChange("peering_ipv6_subnet_mask") {
		update = true
		if v, ok := d.GetOk("peering_ipv6_subnet_mask"); ok {
			request.QueryParams["PeeringIpv6SubnetMask"] = v.(string)
		}
	}
	if !d.IsNewResource() && d.HasChange("peering_subnet_mask") {
		update = true
		request.QueryParams["PeeringSubnetMask"] = d.Get("peering_subnet_mask").(string)
	}
	if !d.IsNewResource() && d.HasChange("virtual_border_router_name") {
		update = true
		if v, ok := d.GetOk("virtual_border_router_name"); ok {
			request.QueryParams["Name"] = v.(string)
		}
	}
	if !d.IsNewResource() && d.HasChange("vlan_id") {
		update = true
		request.QueryParams["VlanId"] = fmt.Sprint(d.Get("vlan_id"))
	}
	if update {
		if v, ok := d.GetOk("associated_physical_connections"); ok {
			request.QueryParams["AssociatedPhysicalConnections"] = v.(string)
		}
		if v, ok := d.GetOk("bandwidth"); ok {
			request.QueryParams["Bandwidth"] = v.(string)
		}
		err := resource.Retry(3*time.Minute, func() *resource.RetryError {
			raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
				return vpcClient.ProcessCommonRequest(request)
			})
			if err != nil {
				return resource.NonRetryableError(err)
			}
			addDebug(request.GetActionName(), raw, request, request.QueryParams)
			bresponse, ok := raw.(*responses.CommonResponse)
			if bresponse.GetHttpStatus() != 200 {
				errmsg := ""
				if ok {
					errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
				}
				return resource.RetryableError(fmt.Errorf("ModifyVirtualBorderRouterAttribute Failed!!! %s", errmsg))
			}
			return nil
		})
		if err != nil {
			return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
		}
	}
	if d.HasChange("status") {
		object, err := vpcService.DescribeExpressConnectVirtualBorderRouter(d.Id())
		if err != nil {
			return errmsgs.WrapError(err)
		}
		target := d.Get("status").(string)
		if object["Status"].(string) != target {
			if target == "active" {
				rqs := client.NewCommonRequest("POST", "Vpc", "2016-04-28", "RecoverVirtualBorderRouter", "")
				rqs.QueryParams["VbrId"] = d.Id()
				err := resource.Retry(3*time.Minute, func() *resource.RetryError {
					raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
						return vpcClient.ProcessCommonRequest(rqs)
					})
					if err != nil {
						return resource.NonRetryableError(err)
					}
					addDebug(rqs.GetActionName(), raw, rqs, rqs.QueryParams)
					bresponse, ok := raw.(*responses.CommonResponse)
					if bresponse.GetHttpStatus() != 200 {
						errmsg := ""
						if ok {
							errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
						}
						return resource.RetryableError(fmt.Errorf("RecoverVirtualBorderRouter Failed!!! %s", errmsg))
					}
					return nil
				})
				if err != nil {
					return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), rqs.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
				}
				stateConf := BuildStateConf([]string{}, []string{"active"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, vpcService.ExpressConnectVirtualBorderRouterStateRefreshFunc(d.Id(), []string{}))
				if _, err := stateConf.WaitForState(); err != nil {
					return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
				}
			}
			if target == "terminated" {
				rqs := client.NewCommonRequest("POST", "Vpc", "2016-04-28", "TerminateVirtualBorderRouter", "")
				rqs.QueryParams["VbrId"] = d.Id()
				err := resource.Retry(3*time.Minute, func() *resource.RetryError {
					raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
						return vpcClient.ProcessCommonRequest(rqs)
					})
					if err != nil {
						return resource.NonRetryableError(err)
					}
					addDebug(rqs.GetActionName(), raw, rqs, rqs.QueryParams)
					bresponse, ok := raw.(*responses.CommonResponse)
					if bresponse.GetHttpStatus() != 200 {
						errmsg := ""
						if ok {
							errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
						}
						return resource.RetryableError(fmt.Errorf("TerminateVirtualBorderRouter Failed!!! %s", errmsg))
					}
					return nil
				})
				if err != nil {
					return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), rqs.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
				}
				stateConf := BuildStateConf([]string{}, []string{"terminated"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, vpcService.ExpressConnectVirtualBorderRouterStateRefreshFunc(d.Id(), []string{}))
				if _, err := stateConf.WaitForState(); err != nil {
					return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
				}
			}
		}
	}
	d.Partial(false)
	return nil
}