diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 5444d3b3d5..71d5c381c1 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -723,6 +723,7 @@ VPN Connections(VPN) tencentcloud_vpn_connection_reset tencentcloud_vpn_customer_gateway_configuration_download tencentcloud_vpn_gateway_ssl_client_cert + tencentcloud_vpn_gateway_ccn_routes MapReduce(EMR) Data Source @@ -1494,6 +1495,7 @@ func Provider() terraform.ResourceProvider { "tencentcloud_vpn_connection_reset": resourceTencentCloudVpnConnectionReset(), "tencentcloud_vpn_customer_gateway_configuration_download": resourceTencentCloudVpnCustomerGatewayConfigurationDownload(), "tencentcloud_vpn_gateway_ssl_client_cert": resourceTencentCloudVpnGatewaySslClientCert(), + "tencentcloud_vpn_gateway_ccn_routes": resourceTencentCloudVpnGatewayCcnRoutes(), "tencentcloud_ha_vip": resourceTencentCloudHaVip(), "tencentcloud_ha_vip_eip_attachment": resourceTencentCloudHaVipEipAttachment(), "tencentcloud_security_group": resourceTencentCloudSecurityGroup(), diff --git a/tencentcloud/resource_tc_vpn_gateway_ccn_routes.go b/tencentcloud/resource_tc_vpn_gateway_ccn_routes.go new file mode 100644 index 0000000000..c49b3c4cce --- /dev/null +++ b/tencentcloud/resource_tc_vpn_gateway_ccn_routes.go @@ -0,0 +1,177 @@ +/* +Provides a resource to create a vpn_gateway_ccn_routes + +Example Usage + +```hcl +resource "tencentcloud_vpn_gateway_ccn_routes" "vpn_gateway_ccn_routes" { + destination_cidr_block = "192.168.1.0/24" + route_id = "vpnr-akdy0757" + status = "DISABLE" + vpn_gateway_id = "vpngw-lie1a4u7" +} + +``` + +Import + +vpc vpn_gateway_ccn_routes can be imported using the id, e.g. + +``` +terraform import tencentcloud_vpn_gateway_ccn_routes.vpn_gateway_ccn_routes vpn_gateway_id#ccn_routes_id +``` +*/ +package tencentcloud + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func resourceTencentCloudVpnGatewayCcnRoutes() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudVpnGatewayCcnRoutesCreate, + Read: resourceTencentCloudVpnGatewayCcnRoutesRead, + Update: resourceTencentCloudVpnGatewayCcnRoutesUpdate, + Delete: resourceTencentCloudVpnGatewayCcnRoutesDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "vpn_gateway_id": { + Required: true, + ForceNew: true, + Type: schema.TypeString, + Description: "VPN GATEWAY INSTANCE ID.", + }, + "route_id": { + Type: schema.TypeString, + ForceNew: true, + Required: true, + Description: "Route Id.", + }, + "status": { + Type: schema.TypeString, + Required: true, + Description: "Whether routing information is enabled. `ENABLE`: Enable Route, `DISABLE`: Disable Route.", + }, + "destination_cidr_block": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Routing CIDR.", + }, + }, + } +} + +func resourceTencentCloudVpnGatewayCcnRoutesCreate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_vpn_gateway_ccn_routes.create")() + defer inconsistentCheck(d, meta)() + + var ( + vpnGwId string + routeId string + ) + + if v, ok := d.GetOk("vpn_gateway_id"); ok { + vpnGwId = v.(string) + } + + if v, ok := d.GetOk("route_id"); ok { + routeId = v.(string) + } + + d.SetId(vpnGwId + FILED_SP + routeId) + + return resourceTencentCloudVpnGatewayCcnRoutesUpdate(d, meta) +} + +func resourceTencentCloudVpnGatewayCcnRoutesRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_vpn_gateway_ccn_routes.read")() + defer inconsistentCheck(d, meta)() + + logId := getLogId(contextNil) + + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn} + + idSplit := strings.Split(d.Id(), FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + vpnGatewayId := idSplit[0] + routeId := idSplit[1] + + vpnGatewayCcnRoutes, err := service.DescribeVpcVpnGatewayCcnRoutesById(ctx, vpnGatewayId, routeId) + if err != nil { + return err + } + + if vpnGatewayCcnRoutes == nil { + d.SetId("") + log.Printf("[WARN]%s resource `VpcVpnGatewayCcnRoutes` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + _ = d.Set("vpn_gateway_id", vpnGatewayId) + _ = d.Set("route_id", vpnGatewayCcnRoutes.RouteId) + _ = d.Set("status", vpnGatewayCcnRoutes.Status) + _ = d.Set("destination_cidr_block", vpnGatewayCcnRoutes.DestinationCidrBlock) + + return nil +} + +func resourceTencentCloudVpnGatewayCcnRoutesUpdate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_vpn_gateway_ccn_routes.update")() + defer inconsistentCheck(d, meta)() + + logId := getLogId(contextNil) + + request := vpc.NewModifyVpnGatewayCcnRoutesRequest() + + idSplit := strings.Split(d.Id(), FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + vpnGatewayId := idSplit[0] + routeId := idSplit[1] + + request.VpnGatewayId = &vpnGatewayId + route := vpc.VpngwCcnRoutes{} + route.RouteId = &routeId + route.Status = helper.String(d.Get("status").(string)) + route.DestinationCidrBlock = helper.String(d.Get("destination_cidr_block").(string)) + request.Routes = append(request.Routes, &route) + + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseVpcClient().ModifyVpnGatewayCcnRoutes(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s update vpnGatewayCcnRoutes failed, reason:%+v", logId, err) + return err + } + + return resourceTencentCloudVpnGatewayCcnRoutesRead(d, meta) +} + +func resourceTencentCloudVpnGatewayCcnRoutesDelete(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_vpn_gateway_ccn_routes.delete")() + defer inconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/resource_tc_vpn_gateway_ccn_routes_test.go b/tencentcloud/resource_tc_vpn_gateway_ccn_routes_test.go new file mode 100644 index 0000000000..478f85ed5b --- /dev/null +++ b/tencentcloud/resource_tc_vpn_gateway_ccn_routes_test.go @@ -0,0 +1,39 @@ +package tencentcloud + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccTencentCloudNeedFixVpnGatewayCcnRoutesResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccVpcVpnGatewayCcnRoutes, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_vpn_gateway_ccn_routes.vpn_gateway_ccn_routes", "id")), + }, + { + ResourceName: "tencentcloud_vpn_gateway_ccn_routes.vpn_gateway_ccn_routes", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccVpcVpnGatewayCcnRoutes = ` + +resource "tencentcloud_vpn_gateway_ccn_routes" "vpn_gateway_ccn_routes" { + destination_cidr_block = "192.168.1.0/24" + route_id = "vpnr-akdy0757" + status = "DISABLE" + vpn_gateway_id = "vpngw-lie1a4u7" +} + +` diff --git a/tencentcloud/service_tencentcloud_vpc.go b/tencentcloud/service_tencentcloud_vpc.go index eb7dcbe758..a26187964a 100644 --- a/tencentcloud/service_tencentcloud_vpc.go +++ b/tencentcloud/service_tencentcloud_vpc.go @@ -6052,3 +6052,37 @@ func (me *VpcService) DescribeVpnCustomerGatewayVendors(ctx context.Context) (vp vpnCustomerGatewayVendors = response.Response.CustomerGatewayVendorSet return } + +func (me *VpcService) DescribeVpcVpnGatewayCcnRoutesById(ctx context.Context, vpnGatewayId string, routeId string) (vpnGatewayCcnRoutes *vpc.VpngwCcnRoutes, errRet error) { + logId := getLogId(ctx) + + request := vpc.NewDescribeVpnGatewayCcnRoutesRequest() + request.VpnGatewayId = &vpnGatewayId + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseVpcClient().DescribeVpnGatewayCcnRoutes(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if len(response.Response.RouteSet) < 1 { + return + } + + for _, route := range response.Response.RouteSet { + if *route.RouteId == routeId { + vpnGatewayCcnRoutes = route + break + } + } + return +} diff --git a/website/docs/r/vpn_gateway_ccn_routes.html.markdown b/website/docs/r/vpn_gateway_ccn_routes.html.markdown new file mode 100644 index 0000000000..f0016a1b1b --- /dev/null +++ b/website/docs/r/vpn_gateway_ccn_routes.html.markdown @@ -0,0 +1,49 @@ +--- +subcategory: "VPN Connections(VPN)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_vpn_gateway_ccn_routes" +sidebar_current: "docs-tencentcloud-resource-vpn_gateway_ccn_routes" +description: |- + Provides a resource to create a vpn_gateway_ccn_routes +--- + +# tencentcloud_vpn_gateway_ccn_routes + +Provides a resource to create a vpn_gateway_ccn_routes + +## Example Usage + +```hcl +resource "tencentcloud_vpn_gateway_ccn_routes" "vpn_gateway_ccn_routes" { + destination_cidr_block = "192.168.1.0/24" + route_id = "vpnr-akdy0757" + status = "DISABLE" + vpn_gateway_id = "vpngw-lie1a4u7" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `destination_cidr_block` - (Required, String, ForceNew) Routing CIDR. +* `route_id` - (Required, String, ForceNew) Route Id. +* `status` - (Required, String) Whether routing information is enabled. `ENABLE`: Enable Route, `DISABLE`: Disable Route. +* `vpn_gateway_id` - (Required, String, ForceNew) VPN GATEWAY INSTANCE ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +vpc vpn_gateway_ccn_routes can be imported using the id, e.g. + +``` +terraform import tencentcloud_vpn_gateway_ccn_routes.vpn_gateway_ccn_routes vpn_gateway_id#ccn_routes_id +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index a20f4eebec..74b871b616 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -2931,6 +2931,9 @@
  • tencentcloud_vpn_gateway
  • +
  • + tencentcloud_vpn_gateway_ccn_routes +
  • tencentcloud_vpn_gateway_route