From 7ceddf5779c4a4d98b26f8403560e7fd952d2264 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Tue, 21 Oct 2025 15:57:12 +0800 Subject: [PATCH 1/3] add --- tencentcloud/provider.go | 1 + tencentcloud/provider.md | 1 + ...rivate_nat_gateway_translation_nat_rule.go | 395 ++++++++++++++++++ ...rivate_nat_gateway_translation_nat_rule.md | 33 ++ ...e_nat_gateway_translation_nat_rule_test.go | 75 ++++ .../services/vpc/service_tencentcloud_vpc.go | 54 +++ ...gateway_translation_nat_rule.html.markdown | 68 +++ website/tencentcloud.erb | 3 + 8 files changed, 630 insertions(+) create mode 100644 tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.go create mode 100644 tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.md create mode 100644 tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule_test.go create mode 100644 website/docs/r/vpc_private_nat_gateway_translation_nat_rule.html.markdown diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 2f3742f4a8..cf38215aa1 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1361,6 +1361,7 @@ func Provider() *schema.Provider { "tencentcloud_nat_gateway_snat": vpc.ResourceTencentCloudNatGatewaySnat(), "tencentcloud_nat_refresh_nat_dc_route": vpc.ResourceTencentCloudNatRefreshNatDcRoute(), "tencentcloud_vpc_private_nat_gateway": vpc.ResourceTencentCloudVpcPrivateNatGateway(), + "tencentcloud_vpc_private_nat_gateway_translation_nat_rule": vpc.ResourceTencentCloudVpcPrivateNatGatewayTranslationNatRule(), "tencentcloud_oceanus_job": oceanus.ResourceTencentCloudOceanusJob(), "tencentcloud_oceanus_job_config": oceanus.ResourceTencentCloudOceanusJobConfig(), "tencentcloud_oceanus_job_copy": oceanus.ResourceTencentCloudOceanusJobCopy(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index 09811efdda..cf70d1dbc9 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -1293,6 +1293,7 @@ tencentcloud_protocol_template tencentcloud_protocol_template_group tencentcloud_route_table tencentcloud_vpc_private_nat_gateway +tencentcloud_vpc_private_nat_gateway_translation_nat_rule tencentcloud_route_table_association tencentcloud_route_entry tencentcloud_route_table_entry diff --git a/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.go b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.go new file mode 100644 index 0000000000..370ecf2f95 --- /dev/null +++ b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.go @@ -0,0 +1,395 @@ +package vpc + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + vpcv20170312 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +var MAX_CREATE_RULES_LEN = 20 + +func ResourceTencentCloudVpcPrivateNatGatewayTranslationNatRule() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleCreate, + Read: resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleRead, + Update: resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleUpdate, + Delete: resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "nat_gateway_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Private NAT gateway unique ID, such as: `intranat-xxxxxxxx`.", + }, + + "translation_nat_rules": { + Type: schema.TypeSet, + Required: true, + Description: "Translation rule object array.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "translation_direction": { + Type: schema.TypeString, + Required: true, + Description: "Translation rule target, optional values \"LOCAL\",\"PEER\".", + }, + "translation_type": { + Type: schema.TypeString, + Required: true, + Description: "Translation rule type, optional values \"NETWORK_LAYER\",\"TRANSPORT_LAYER\".", + }, + "translation_ip": { + Type: schema.TypeString, + Required: true, + Description: "Translation IP, when translation rule type is transport layer, it is an IP pool.", + }, + "description": { + Type: schema.TypeString, + Required: true, + Description: "Translation rule description.", + }, + "original_ip": { + Type: schema.TypeString, + Optional: true, + Description: "Source IP, valid when translation rule type is network layer.", + }, + }, + }, + }, + }, + } +} + +func resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway_translation_nat_rule.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = vpcv20170312.NewCreatePrivateNatGatewayTranslationNatRuleRequest() + natGatewayId string + ) + + if v, ok := d.GetOk("nat_gateway_id"); ok { + request.NatGatewayId = helper.String(v.(string)) + natGatewayId = v.(string) + } + + var allRules []*vpcv20170312.TranslationNatRuleInput + if v, ok := d.GetOk("translation_nat_rules"); ok { + for _, item := range v.(*schema.Set).List() { + translationNatRulesMap := item.(map[string]interface{}) + translationNatRuleInput := vpcv20170312.TranslationNatRuleInput{} + if v, ok := translationNatRulesMap["translation_direction"].(string); ok && v != "" { + translationNatRuleInput.TranslationDirection = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_type"].(string); ok && v != "" { + translationNatRuleInput.TranslationType = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_ip"].(string); ok && v != "" { + translationNatRuleInput.TranslationIp = helper.String(v) + } + + if v, ok := translationNatRulesMap["description"].(string); ok && v != "" { + translationNatRuleInput.Description = helper.String(v) + } + + if v, ok := translationNatRulesMap["original_ip"].(string); ok && v != "" { + translationNatRuleInput.OriginalIp = helper.String(v) + } + + allRules = append(allRules, &translationNatRuleInput) + } + } + + for i := 0; i < len(allRules); i += MAX_CREATE_RULES_LEN { + end := i + MAX_CREATE_RULES_LEN + if end > len(allRules) { + end = len(allRules) + } + + batchRules := allRules[i:end] + request.TranslationNatRules = batchRules + request.NatGatewayId = helper.String(natGatewayId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().CreatePrivateNatGatewayTranslationNatRuleWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.NatGatewayId == nil { + return resource.NonRetryableError(fmt.Errorf("Create vpc private nat gateway translation nat rule failed, Response is nil.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create vpc private nat gateway translation nat rule failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + d.SetId(natGatewayId) + return resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleRead(d, meta) +} + +func resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway_translation_nat_rule.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + natGatewayId = d.Id() + ) + + respData, err := service.DescribeVpcPrivateNatGatewayTranslationNatRuleById(ctx, natGatewayId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_vpc_private_nat_gateway_translation_nat_rule` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + _ = d.Set("nat_gateway_id", natGatewayId) + + translationNatRuleSetList := make([]map[string]interface{}, 0, len(respData)) + for _, translationNatRuleSet := range respData { + translationNatRuleSetMap := map[string]interface{}{} + if translationNatRuleSet.TranslationDirection != nil { + translationNatRuleSetMap["translation_direction"] = translationNatRuleSet.TranslationDirection + } + + if translationNatRuleSet.TranslationType != nil { + translationNatRuleSetMap["translation_type"] = translationNatRuleSet.TranslationType + } + + if translationNatRuleSet.TranslationIp != nil { + translationNatRuleSetMap["translation_ip"] = translationNatRuleSet.TranslationIp + } + + if translationNatRuleSet.Description != nil { + translationNatRuleSetMap["description"] = translationNatRuleSet.Description + } + + if translationNatRuleSet.OriginalIp != nil { + translationNatRuleSetMap["original_ip"] = translationNatRuleSet.OriginalIp + } + + translationNatRuleSetList = append(translationNatRuleSetList, translationNatRuleSetMap) + } + + _ = d.Set("translation_nat_rules", translationNatRuleSetList) + + return nil +} + +func resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway_translation_nat_rule.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + natGatewayId = d.Id() + ) + + if d.HasChange("translation_nat_rules") { + oldInterface, newInterface := d.GetChange("translation_nat_rules") + olds := oldInterface.(*schema.Set) + news := newInterface.(*schema.Set) + remove := olds.Difference(news).List() + add := news.Difference(olds).List() + + if len(remove) > 0 { + request := vpcv20170312.NewDeletePrivateNatGatewayTranslationNatRuleRequest() + for _, item := range remove { + translationNatRulesMap := item.(map[string]interface{}) + translationNatRuleInput := vpcv20170312.TranslationNatRule{} + if v, ok := translationNatRulesMap["translation_direction"].(string); ok && v != "" { + translationNatRuleInput.TranslationDirection = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_type"].(string); ok && v != "" { + translationNatRuleInput.TranslationType = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_ip"].(string); ok && v != "" { + translationNatRuleInput.TranslationIp = helper.String(v) + } + + if v, ok := translationNatRulesMap["description"].(string); ok && v != "" { + translationNatRuleInput.Description = helper.String(v) + } + + if v, ok := translationNatRulesMap["original_ip"].(string); ok && v != "" { + translationNatRuleInput.OriginalIp = helper.String(v) + } + + request.TranslationNatRules = append(request.TranslationNatRules, &translationNatRuleInput) + } + + request.NatGatewayId = &natGatewayId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().DeletePrivateNatGatewayTranslationNatRuleWithContext(ctx, request) + if e != nil { + return tccommon.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 reqErr != nil { + log.Printf("[CRITAL]%s delete vpc private nat gateway translation nat rule failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + if len(add) > 0 { + request := vpcv20170312.NewCreatePrivateNatGatewayTranslationNatRuleRequest() + var allRules []*vpcv20170312.TranslationNatRuleInput + for _, item := range add { + translationNatRulesMap := item.(map[string]interface{}) + translationNatRuleInput := vpcv20170312.TranslationNatRuleInput{} + if v, ok := translationNatRulesMap["translation_direction"].(string); ok && v != "" { + translationNatRuleInput.TranslationDirection = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_type"].(string); ok && v != "" { + translationNatRuleInput.TranslationType = helper.String(v) + } + + if v, ok := translationNatRulesMap["translation_ip"].(string); ok && v != "" { + translationNatRuleInput.TranslationIp = helper.String(v) + } + + if v, ok := translationNatRulesMap["description"].(string); ok && v != "" { + translationNatRuleInput.Description = helper.String(v) + } + + if v, ok := translationNatRulesMap["original_ip"].(string); ok && v != "" { + translationNatRuleInput.OriginalIp = helper.String(v) + } + + allRules = append(allRules, &translationNatRuleInput) + } + + for i := 0; i < len(allRules); i += MAX_CREATE_RULES_LEN { + end := i + MAX_CREATE_RULES_LEN + if end > len(allRules) { + end = len(allRules) + } + + batchRules := allRules[i:end] + request.TranslationNatRules = batchRules + request.NatGatewayId = helper.String(natGatewayId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().CreatePrivateNatGatewayTranslationNatRuleWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.NatGatewayId == nil { + return resource.NonRetryableError(fmt.Errorf("Create vpc private nat gateway translation nat rule failed, Response is nil.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create vpc private nat gateway translation nat rule failed, reason:%+v", logId, reqErr) + return reqErr + } + } + } + } + + return resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleRead(d, meta) +} + +func resourceTencentCloudVpcPrivateNatGatewayTranslationNatRuleDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway_translation_nat_rule.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + request = vpcv20170312.NewDeletePrivateNatGatewayTranslationNatRuleRequest() + natGatewayId = d.Id() + ) + + // get all rules + respData, err := service.DescribeVpcPrivateNatGatewayTranslationNatRuleById(ctx, natGatewayId) + if err != nil { + return err + } + + for _, item := range respData { + translationNatRule := vpcv20170312.TranslationNatRule{} + if item.TranslationDirection != nil { + translationNatRule.TranslationDirection = item.TranslationDirection + } + + if item.TranslationType != nil { + translationNatRule.TranslationType = item.TranslationType + } + + if item.TranslationIp != nil { + translationNatRule.TranslationIp = item.TranslationIp + } + + if item.Description != nil { + translationNatRule.Description = item.Description + } + + if item.OriginalIp != nil { + translationNatRule.OriginalIp = item.OriginalIp + } + + request.TranslationNatRules = append(request.TranslationNatRules, &translationNatRule) + } + + request.NatGatewayId = &natGatewayId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().DeletePrivateNatGatewayTranslationNatRuleWithContext(ctx, request) + if e != nil { + return tccommon.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 reqErr != nil { + log.Printf("[CRITAL]%s delete vpc private nat gateway translation nat rule failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.md b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.md new file mode 100644 index 0000000000..783761362c --- /dev/null +++ b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule.md @@ -0,0 +1,33 @@ +Provides a resource to create a VPC private nat gateway translation nat rule + +~> **NOTE:** + +Example Usage + +```hcl +resource "tencentcloud_vpc_private_nat_gateway_translation_nat_rule" "example" { + nat_gateway_id = "intranat-r46f6pxl" + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "NETWORK_LAYER" + translation_ip = "2.2.2.2" + description = "remark." + original_ip = "1.1.1.1" + } + + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "TRANSPORT_LAYER" + translation_ip = "3.3.3.3" + description = "remark." + } +} +``` + +Import + +VPC private nat gateway translation nat rule can be imported using the id, e.g. + +``` +terraform import tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example intranat-r46f6pxl +``` diff --git a/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule_test.go b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule_test.go new file mode 100644 index 0000000000..e7d5aee9fb --- /dev/null +++ b/tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway_translation_nat_rule_test.go @@ -0,0 +1,75 @@ +package vpc_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudVpcPrivateNatGatewayTranslationNatRuleResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccVpcPrivateNatGatewayTranslationNatRule, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "nat_gateway_id"), + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "translation_nat_rules.#"), + ), + }, + { + Config: testAccVpcPrivateNatGatewayTranslationNatRuleUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "nat_gateway_id"), + resource.TestCheckResourceAttrSet("tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", "translation_nat_rules.#"), + ), + }, + { + ResourceName: "tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccVpcPrivateNatGatewayTranslationNatRule = ` +resource "tencentcloud_vpc_private_nat_gateway_translation_nat_rule" "example" { + nat_gateway_id = "intranat-r46f6pxl" + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "NETWORK_LAYER" + translation_ip = "2.2.2.2" + description = "remark." + original_ip = "1.1.1.1" + } + + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "TRANSPORT_LAYER" + translation_ip = "3.3.3.3" + description = "remark." + } +} +` + +const testAccVpcPrivateNatGatewayTranslationNatRuleUpdate = ` +resource "tencentcloud_vpc_private_nat_gateway_translation_nat_rule" "example" { + nat_gateway_id = "intranat-r46f6pxl" + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "NETWORK_LAYER" + translation_ip = "2.2.2.2" + description = "remark." + original_ip = "1.1.1.1" + } +} +` diff --git a/tencentcloud/services/vpc/service_tencentcloud_vpc.go b/tencentcloud/services/vpc/service_tencentcloud_vpc.go index 2315dc9788..9b772fc0e9 100644 --- a/tencentcloud/services/vpc/service_tencentcloud_vpc.go +++ b/tencentcloud/services/vpc/service_tencentcloud_vpc.go @@ -8557,3 +8557,57 @@ func (me *VpcService) DescribeElasticPublicIpv6sByFilter(ctx context.Context, pa return } + +func (me *VpcService) DescribeVpcPrivateNatGatewayTranslationNatRuleById(ctx context.Context, natGatewayId string) (ret []*vpc.TranslationNatRule, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := vpc.NewDescribePrivateNatGatewayTranslationNatRulesRequest() + response := vpc.NewDescribePrivateNatGatewayTranslationNatRulesResponse() + request.NatGatewayId = &natGatewayId + + 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()) + } + }() + + var ( + offset uint64 = 0 + limit uint64 = 100 + ) + + for { + request.Offset = &offset + request.Limit = &limit + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseVpcClient().DescribePrivateNatGatewayTranslationNatRules(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + response = result + return nil + }) + + if err != nil { + errRet = err + return + } + + if response == nil || len(response.Response.TranslationNatRuleSet) < 1 { + break + } + + ret = append(ret, response.Response.TranslationNatRuleSet...) + if len(response.Response.TranslationNatRuleSet) < int(limit) { + break + } + + offset += limit + } + + return +} diff --git a/website/docs/r/vpc_private_nat_gateway_translation_nat_rule.html.markdown b/website/docs/r/vpc_private_nat_gateway_translation_nat_rule.html.markdown new file mode 100644 index 0000000000..9af921c194 --- /dev/null +++ b/website/docs/r/vpc_private_nat_gateway_translation_nat_rule.html.markdown @@ -0,0 +1,68 @@ +--- +subcategory: "Virtual Private Cloud(VPC)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_vpc_private_nat_gateway_translation_nat_rule" +sidebar_current: "docs-tencentcloud-resource-vpc_private_nat_gateway_translation_nat_rule" +description: |- + Provides a resource to create a VPC private nat gateway translation nat rule +--- + +# tencentcloud_vpc_private_nat_gateway_translation_nat_rule + +Provides a resource to create a VPC private nat gateway translation nat rule + +~> **NOTE:** + +## Example Usage + +```hcl +resource "tencentcloud_vpc_private_nat_gateway_translation_nat_rule" "example" { + nat_gateway_id = "intranat-r46f6pxl" + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "NETWORK_LAYER" + translation_ip = "2.2.2.2" + description = "remark." + original_ip = "1.1.1.1" + } + + translation_nat_rules { + translation_direction = "LOCAL" + translation_type = "TRANSPORT_LAYER" + translation_ip = "3.3.3.3" + description = "remark." + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `nat_gateway_id` - (Required, String, ForceNew) Private NAT gateway unique ID, such as: `intranat-xxxxxxxx`. +* `translation_nat_rules` - (Required, Set) Translation rule object array. + +The `translation_nat_rules` object supports the following: + +* `description` - (Required, String) Translation rule description. +* `translation_direction` - (Required, String) Translation rule target, optional values "LOCAL","PEER". +* `translation_ip` - (Required, String) Translation IP, when translation rule type is transport layer, it is an IP pool. +* `translation_type` - (Required, String) Translation rule type, optional values "NETWORK_LAYER","TRANSPORT_LAYER". +* `original_ip` - (Optional, String) Source IP, valid when translation rule type is network layer. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +VPC private nat gateway translation nat rule can be imported using the id, e.g. + +``` +terraform import tencentcloud_vpc_private_nat_gateway_translation_nat_rule.example intranat-r46f6pxl +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 5fd2f650a5..bef6b7fe72 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -6855,6 +6855,9 @@