From ff1dadc526ca3c8891d3d35c2642e75e360d616f Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Tue, 25 Nov 2025 19:18:38 +0800 Subject: [PATCH 1/2] add --- .../cfw/resource_tc_cfw_nat_instance.go | 35 +++++--- .../cfw/resource_tc_cfw_nat_instance.md | 22 ++--- .../services/cfw/service_tencentcloud_cfw.go | 83 +++++++++++++++---- website/docs/r/cfw_nat_instance.html.markdown | 20 ++--- 4 files changed, 108 insertions(+), 52 deletions(-) diff --git a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.go b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.go index f01a455278..2191fe7920 100644 --- a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.go +++ b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.go @@ -288,6 +288,10 @@ func resourceTencentCloudCfwNatInstanceCreate(d *schema.ResourceData, meta inter 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 { + return resource.NonRetryableError(fmt.Errorf("Create cfw natInstance failed, Response is nil.")) + } + response = result return nil }) @@ -297,6 +301,10 @@ func resourceTencentCloudCfwNatInstanceCreate(d *schema.ResourceData, meta inter return err } + if response.Response.CfwInsId == nil { + return fmt.Errorf("CfwInsId is nil.") + } + instanceId = *response.Response.CfwInsId d.SetId(instanceId) @@ -308,8 +316,11 @@ func resourceTencentCloudCfwNatInstanceCreate(d *schema.ResourceData, meta inter } if natInstance == nil { - e = fmt.Errorf("cfw nat instance %s not exists", instanceId) - return resource.NonRetryableError(e) + return resource.NonRetryableError(fmt.Errorf("cfw nat instance %s not exists", instanceId)) + } + + if natInstance.Status == nil { + return resource.NonRetryableError(fmt.Errorf("status is nil")) } if *natInstance.Status == 0 { @@ -346,8 +357,8 @@ func resourceTencentCloudCfwNatInstanceRead(d *schema.ResourceData, meta interfa } if natInstance == nil { + log.Printf("[WARN]%s resource `tencentcloud_cfw_nat_instance` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) d.SetId("") - log.Printf("[WARN]%s resource `CfwNatInstance` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) return nil } @@ -404,14 +415,12 @@ func resourceTencentCloudCfwNatInstanceRead(d *schema.ResourceData, meta interfa } } - if natInstance.ZoneZh != nil { - zoneZh := *natInstance.ZoneZh - zone = ZONE_MAP_CN2EN[zoneZh] + if natInstance.Zone != nil { + zone = *natInstance.Zone } - if natInstance.ZoneZhBak != nil { - zoneBakZh := *natInstance.ZoneZhBak - zoneBak = ZONE_MAP_CN2EN[zoneBakZh] + if natInstance.ZoneBak != nil { + zoneBak = *natInstance.ZoneBak } if zone == zoneBak { @@ -419,6 +428,7 @@ func resourceTencentCloudCfwNatInstanceRead(d *schema.ResourceData, meta interfa zoneList := []string{ zone, } + _ = d.Set("zone_set", zoneList) } else { _ = d.Set("cross_a_zone", CROSS_A_ZONE_1) @@ -426,6 +436,7 @@ func resourceTencentCloudCfwNatInstanceRead(d *schema.ResourceData, meta interfa zone, zoneBak, } + _ = d.Set("zone_set", zoneList) } @@ -479,20 +490,18 @@ func resourceTencentCloudCfwNatInstanceUpdate(d *schema.ResourceData, meta inter instanceId = d.Id() ) - immutableArgs := []string{"width", "mode", "new_mode_items", "nat_gw_list", "zone", "zone_bak", "cross_a_zone", "domain", "fw_cidr_info"} - + immutableArgs := []string{"width", "mode", "new_mode_items", "nat_gw_list", "zone", "zone_bak", "cross_a_zone"} for _, v := range immutableArgs { if d.HasChange(v) { return fmt.Errorf("argument `%s` cannot be changed", v) } } - request.NatInstanceId = &instanceId - if v, ok := d.GetOk("name"); ok { request.InstanceName = helper.String(v.(string)) } + request.NatInstanceId = &instanceId err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCfwClient().ModifyNatInstance(request) if e != nil { diff --git a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md index e0d5a1e757..ecee2868f3 100644 --- a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md +++ b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md @@ -1,4 +1,4 @@ -Provides a resource to create a cfw nat_instance +Provides a resource to create a CFW nat instance Example Usage @@ -6,19 +6,20 @@ If mode is 0 ```hcl resource "tencentcloud_cfw_nat_instance" "example" { - name = "tf_example" - width = 20 - mode = 0 + name = "tf_example" + cross_a_zone = 1 + width = 20 + mode = 0 new_mode_items { vpc_list = [ - "vpc-5063ta4i" + "vpc-40hif9or" ] eips = [ - "152.136.168.192" + "119.29.107.37" ] } - cross_a_zone = 0 - zone_set = [ + zone_set = [ + "ap-guangzhou-6", "ap-guangzhou-7" ] } @@ -35,7 +36,6 @@ resource "tencentcloud_cfw_nat_instance" "example" { "nat-9wwkz1kr" ] cross_a_zone = 1 - cross_a_zone = 0 zone_set = [ "ap-guangzhou-6", "ap-guangzhou-7" @@ -45,8 +45,8 @@ resource "tencentcloud_cfw_nat_instance" "example" { Import -cfw nat_instance can be imported using the id, e.g. +CFW nat instance can be imported using the id, e.g. ``` terraform import tencentcloud_cfw_nat_instance.example cfwnat-54a21421 -``` \ No newline at end of file +``` diff --git a/tencentcloud/services/cfw/service_tencentcloud_cfw.go b/tencentcloud/services/cfw/service_tencentcloud_cfw.go index 0f7d83aa2c..7695fab418 100644 --- a/tencentcloud/services/cfw/service_tencentcloud_cfw.go +++ b/tencentcloud/services/cfw/service_tencentcloud_cfw.go @@ -238,6 +238,7 @@ func (me *CfwService) DescribeCfwNatInstanceById(ctx context.Context, natinsId s logId := tccommon.GetLogId(ctx) request := cfw.NewDescribeNatFwInstancesInfoRequest() + response := cfw.NewDescribeNatFwInstancesInfoResponse() request.Offset = common.Int64Ptr(0) request.Limit = common.Int64Ptr(10) request.Filter = []*cfw.NatFwFilter{ @@ -253,17 +254,28 @@ func (me *CfwService) DescribeCfwNatInstanceById(ctx context.Context, natinsId s } }() - ratelimit.Check(request.GetAction()) var iacExtInfo connectivity.IacExtInfo iacExtInfo.InstanceId = natinsId - response, err := me.client.UseCfwClient(iacExtInfo).DescribeNatFwInstancesInfo(request) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCfwClient(iacExtInfo).DescribeNatFwInstancesInfo(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil || result.Response.NatinsLst == nil { + return resource.NonRetryableError(fmt.Errorf("Describe nat fw instances info failed, Response is nil.")) + } + + response = result + return nil + }) + 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.NatinsLst) < 1 { return } @@ -276,6 +288,7 @@ func (me *CfwService) DescribeCfwEipsById(ctx context.Context, instanceId string logId := tccommon.GetLogId(ctx) request := cfw.NewDescribeCfwEipsRequest() + response := cfw.NewDescribeCfwEipsResponse() request.Mode = common.Uint64Ptr(1) request.NatGatewayId = common.StringPtr("ALL") request.CfwInstance = common.StringPtr(instanceId) @@ -286,22 +299,34 @@ func (me *CfwService) DescribeCfwEipsById(ctx context.Context, instanceId string } }() - ratelimit.Check(request.GetAction()) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCfwClient().DescribeCfwEips(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil || result.Response.NatFwEipList == nil { + return resource.NonRetryableError(fmt.Errorf("Describe cfw eips failed, Response is nil.")) + } + + response = result + return nil + }) - response, err := me.client.UseCfwClient().DescribeCfwEips(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.NatFwEipList) < 1 { return } for _, item := range response.Response.NatFwEipList { - gwList = append(gwList, *item.NatGatewayId) + if item.NatGatewayId != nil { + gwList = append(gwList, *item.NatGatewayId) + } } return @@ -319,16 +344,25 @@ func (me *CfwService) DeleteCfwNatInstanceById(ctx context.Context, instanceId s } }() - ratelimit.Check(request.GetAction()) + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCfwClient().DeleteNatFwInstance(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Delete nat fw instance failed, Response is nil.")) + } + + return nil + }) - response, err := me.client.UseCfwClient().DeleteNatFwInstance(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()) - return } @@ -336,6 +370,7 @@ func (me *CfwService) DescribeNatFwVpcDnsLstById(ctx context.Context, instanceId logId := tccommon.GetLogId(ctx) request := cfw.NewDescribeNatFwVpcDnsLstRequest() + response := cfw.NewDescribeNatFwVpcDnsLstResponse() request.NatFwInsId = &instanceId request.Offset = common.Int64Ptr(0) request.Limit = common.Int64Ptr(10) @@ -346,22 +381,34 @@ func (me *CfwService) DescribeNatFwVpcDnsLstById(ctx context.Context, instanceId } }() - ratelimit.Check(request.GetAction()) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCfwClient().DescribeNatFwVpcDnsLst(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil || result.Response.VpcDnsSwitchLst == nil { + return resource.NonRetryableError(fmt.Errorf("Describe nat fw vpc dns list failed, Response is nil.")) + } + + response = result + return nil + }) - response, err := me.client.UseCfwClient().DescribeNatFwVpcDnsLst(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.VpcDnsSwitchLst) < 1 { return } for _, item := range response.Response.VpcDnsSwitchLst { - vpcList = append(vpcList, *item.VpcId) + if item.VpcId != nil { + vpcList = append(vpcList, *item.VpcId) + } } return diff --git a/website/docs/r/cfw_nat_instance.html.markdown b/website/docs/r/cfw_nat_instance.html.markdown index e5221fbf4a..12d06ae6ca 100644 --- a/website/docs/r/cfw_nat_instance.html.markdown +++ b/website/docs/r/cfw_nat_instance.html.markdown @@ -4,12 +4,12 @@ layout: "tencentcloud" page_title: "TencentCloud: tencentcloud_cfw_nat_instance" sidebar_current: "docs-tencentcloud-resource-cfw_nat_instance" description: |- - Provides a resource to create a cfw nat_instance + Provides a resource to create a CFW nat instance --- # tencentcloud_cfw_nat_instance -Provides a resource to create a cfw nat_instance +Provides a resource to create a CFW nat instance ## Example Usage @@ -17,19 +17,20 @@ Provides a resource to create a cfw nat_instance ```hcl resource "tencentcloud_cfw_nat_instance" "example" { - name = "tf_example" - width = 20 - mode = 0 + name = "tf_example" + cross_a_zone = 1 + width = 20 + mode = 0 new_mode_items { vpc_list = [ - "vpc-5063ta4i" + "vpc-40hif9or" ] eips = [ - "152.136.168.192" + "119.29.107.37" ] } - cross_a_zone = 0 zone_set = [ + "ap-guangzhou-6", "ap-guangzhou-7" ] } @@ -46,7 +47,6 @@ resource "tencentcloud_cfw_nat_instance" "example" { "nat-9wwkz1kr" ] cross_a_zone = 1 - cross_a_zone = 0 zone_set = [ "ap-guangzhou-6", "ap-guangzhou-7" @@ -81,7 +81,7 @@ In addition to all arguments above, the following attributes are exported: ## Import -cfw nat_instance can be imported using the id, e.g. +CFW nat instance can be imported using the id, e.g. ``` terraform import tencentcloud_cfw_nat_instance.example cfwnat-54a21421 From 589a0a872e3807a229502c82deab2fa918f887fd Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Tue, 25 Nov 2025 19:20:40 +0800 Subject: [PATCH 2/2] add --- .changelog/3616.txt | 3 +++ .../services/cfw/resource_tc_cfw_nat_instance.md | 11 ++++++----- website/docs/r/cfw_nat_instance.html.markdown | 9 +++++---- 3 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 .changelog/3616.txt diff --git a/.changelog/3616.txt b/.changelog/3616.txt new file mode 100644 index 0000000000..1a689bea8d --- /dev/null +++ b/.changelog/3616.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_cfw_nat_instance: optimiz read function code logic +``` \ No newline at end of file diff --git a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md index ecee2868f3..6516a363be 100644 --- a/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md +++ b/tencentcloud/services/cfw/resource_tc_cfw_nat_instance.md @@ -29,14 +29,15 @@ If mode is 1 ```hcl resource "tencentcloud_cfw_nat_instance" "example" { - name = "tf_example" - width = 20 - mode = 1 + name = "tf_example" + cross_a_zone = 1 + width = 20 + mode = 1 nat_gw_list = [ "nat-9wwkz1kr" ] - cross_a_zone = 1 - zone_set = [ + + zone_set = [ "ap-guangzhou-6", "ap-guangzhou-7" ] diff --git a/website/docs/r/cfw_nat_instance.html.markdown b/website/docs/r/cfw_nat_instance.html.markdown index 12d06ae6ca..14ef0441db 100644 --- a/website/docs/r/cfw_nat_instance.html.markdown +++ b/website/docs/r/cfw_nat_instance.html.markdown @@ -40,13 +40,14 @@ resource "tencentcloud_cfw_nat_instance" "example" { ```hcl resource "tencentcloud_cfw_nat_instance" "example" { - name = "tf_example" - width = 20 - mode = 1 + name = "tf_example" + cross_a_zone = 1 + width = 20 + mode = 1 nat_gw_list = [ "nat-9wwkz1kr" ] - cross_a_zone = 1 + zone_set = [ "ap-guangzhou-6", "ap-guangzhou-7"