alibabacloudstack/resource_apsarastack_vpngateway_vpnrouteentry.go (202 lines of code) (raw):

package alibabacloudstack import ( "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceAlibabacloudStackVpnRouteEntry() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "vpn_gateway_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "next_hop": { Type: schema.TypeString, ForceNew: true, Required: true, }, "route_dest": { Type: schema.TypeString, ForceNew: true, Required: true, }, "weight": { Type: schema.TypeInt, Required: true, ValidateFunc: validation.IntInSlice([]int{0, 100}), }, "publish_vpc": { Type: schema.TypeBool, Required: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackVpnRouteEntryCreate, resourceAlibabacloudStackVpnRouteEntryRead, resourceAlibabacloudStackVpnRouteEntryUpdate, resourceAlibabacloudStackVpnRouteEntryDelete) return resource } func resourceAlibabacloudStackVpnRouteEntryCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) vpnRouteEntryService := VpnGatewayService{client} request := vpc.CreateCreateVpnRouteEntryRequest() client.InitRpcRequest(*request.RpcRequest) request.VpnGatewayId = d.Get("vpn_gateway_id").(string) request.RouteDest = d.Get("route_dest").(string) request.NextHop = d.Get("next_hop").(string) request.Weight = requests.NewInteger(d.Get("weight").(int)) request.PublishVpc = requests.NewBoolean(d.Get("publish_vpc").(bool)) request.ClientToken = buildClientToken(request.GetActionName()) var raw interface{} wait := incrementalWait(5*time.Second, 5*time.Second) err := resource.Retry(5*time.Minute, func() *resource.RetryError { raw1, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { return vpcClient.CreateVpnRouteEntry(request) }) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"VpnGateway.Configuring"}) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(request.GetActionName(), raw1, request.RpcRequest, request) raw = raw1 return nil }) if err != nil { errmsg := "" if raw != nil { response, ok := raw.(*vpc.CreateVpnRouteEntryResponse) if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } response, _ := raw.(*vpc.CreateVpnRouteEntryResponse) id := response.VpnInstanceId + ":" + response.NextHop + ":" + response.RouteDest d.SetId(id) if err := vpnRouteEntryService.WaitForVpnRouteEntry(d.Id(), Active, 2*DefaultTimeoutMedium); err != nil { return errmsgs.WrapError(err) } return nil } func resourceAlibabacloudStackVpnRouteEntryRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) vpnRouteEntryService := VpnGatewayService{client} object, err := vpnRouteEntryService.DescribeVpnRouteEntry(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } d.Set("weight", object.Weight) d.Set("next_hop", object.NextHop) d.Set("route_dest", object.RouteDest) //d.Set("old_weight", object.Weight) d.Set("vpn_gateway_id", object.VpnInstanceId) if object.State == "published" { d.Set("publish_vpc", true) } else { d.Set("publish_vpc", false) } return nil } func resourceAlibabacloudStackVpnRouteEntryUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) d.Partial(true) if d.HasChange("publish_vpc") { request := vpc.CreatePublishVpnRouteEntryRequest() client.InitRpcRequest(*request.RpcRequest) request.VpnGatewayId = d.Get("vpn_gateway_id").(string) request.RouteDest = d.Get("route_dest").(string) request.NextHop = d.Get("next_hop").(string) request.RouteType = "dbr" request.PublishVpc = requests.NewBoolean(d.Get("publish_vpc").(bool)) raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { return vpcClient.PublishVpnRouteEntry(request) }) if err != nil { errmsg := "" if raw != nil { response, ok := raw.(*vpc.PublishVpnRouteEntryResponse) if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } //d.SetPartial("public_vpc") addDebug(request.GetActionName(), raw, request.RpcRequest, request) } if d.HasChange("weight") { request := vpc.CreateModifyVpnRouteEntryWeightRequest() client.InitRpcRequest(*request.RpcRequest) oldWeight, newWeight := d.GetChange("weight") request.VpnGatewayId = d.Get("vpn_gateway_id").(string) request.RouteDest = d.Get("route_dest").(string) request.NextHop = d.Get("next_hop").(string) request.Weight = requests.NewInteger(oldWeight.(int)) request.NewWeight = requests.NewInteger(newWeight.(int)) raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { return vpcClient.ModifyVpnRouteEntryWeight(request) }) if err != nil { errmsg := "" if raw != nil { response, ok := raw.(*vpc.ModifyVpnRouteEntryWeightResponse) if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } //d.SetPartial("weight") addDebug(request.GetActionName(), raw, request.RpcRequest, request) } d.Partial(false) return nil } func resourceAlibabacloudStackVpnRouteEntryDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) vpnRouteEntryService := VpnGatewayService{client} request := vpc.CreateDeleteVpnRouteEntryRequest() client.InitRpcRequest(*request.RpcRequest) request.VpnGatewayId = d.Get("vpn_gateway_id").(string) request.RouteDest = d.Get("route_dest").(string) request.NextHop = d.Get("next_hop").(string) request.Weight = requests.NewInteger(d.Get("weight").(int)) request.ClientToken = buildClientToken(request.GetActionName()) wait := incrementalWait(5*time.Second, 5*time.Second) err := resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { return vpcClient.DeleteVpnRouteEntry(request) }) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"VpnGateway.Configuring"}) { wait() return resource.RetryableError(err) } errmsg := "" if raw != nil { response, ok := raw.(*vpc.DeleteVpnRouteEntryResponse) if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } } err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) return resource.NonRetryableError(err) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil }) if err != nil { return err } return errmsgs.WrapError(vpnRouteEntryService.WaitForVpnRouteEntry(d.Id(), Deleted, DefaultTimeoutMedium)) }