Skip to content

feat(vpc): [118297120] support tencentcloud_vpc_private_nat_gateway #2763

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/2763.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
tencentcloud_vpc_private_nat_gateway
```
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.961
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.970
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.971
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.978
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.960
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692
Expand Down Expand Up @@ -96,7 +96,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tse v1.0.857
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tsf v1.0.674
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.971
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.978
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.833
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -970,6 +970,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.970 h1:IsF+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.970/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.971 h1:T5zEH1QM1XX+hJoAe4krnSjrnsTgHv1KfGC4Sos0Y4M=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.971/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.978 h1:3piderD6Cl4bt8mnSOROm+My1nHM5jtReECZeAn15oQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.978/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860/go.mod h1:NZo1WplQcC314kMlCRUoy8NQju2BnolIJj7NAWgsuhY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8=
Expand Down Expand Up @@ -1118,6 +1120,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.964 h1:+HsB7iM
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.964/go.mod h1:ohfNiTUrMTR50FAUe4wALZVYa1404YQvYB57pvVVADM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.971 h1:eQsRAk1n6z4du93ebKe1XyQpTELY0YIJ4Y7jvMLdNNg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.971/go.mod h1:QpI0wEhuqhVI3jZbakGNzsJlt7YJdB8rqY9b/SI+NMM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.978 h1:EZlxS90zY799+zYB7dmbMqU8XyWT0lesPTPkCtibC54=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.978/go.mod h1:+8DNFolL3rl8vlN1hiY8HhJG0SchGhzLbCN0K0TA0vU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.833 h1:avaBlZ+Qqv7bfMg/u0jlRsbEBbE18CfqKWbfGc84PLg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.833/go.mod h1:fUWG217b//46Oa3VXxC5mgeYeewVAbF+lc81uET89EM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 h1:NLgKNOIHWa38AmW7dyfI9Jlcp2Kr9VRD94f48pPNmxM=
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1134,6 +1134,7 @@ func Provider() *schema.Provider {
"tencentcloud_nat_gateway": vpc.ResourceTencentCloudNatGateway(),
"tencentcloud_nat_gateway_snat": vpc.ResourceTencentCloudNatGatewaySnat(),
"tencentcloud_nat_refresh_nat_dc_route": vpc.ResourceTencentCloudNatRefreshNatDcRoute(),
"tencentcloud_vpc_private_nat_gateway": vpc.ResourceTencentCloudVpcPrivateNatGateway(),
"tencentcloud_oceanus_job": oceanus.ResourceTencentCloudOceanusJob(),
"tencentcloud_oceanus_job_config": oceanus.ResourceTencentCloudOceanusJobConfig(),
"tencentcloud_oceanus_job_copy": oceanus.ResourceTencentCloudOceanusJobCopy(),
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,7 @@ Virtual Private Cloud(VPC)
tencentcloud_protocol_template
tencentcloud_protocol_template_group
tencentcloud_route_table
tencentcloud_vpc_private_nat_gateway
tencentcloud_route_table_association
tencentcloud_route_entry
tencentcloud_route_table_entry
Expand Down
278 changes: 278 additions & 0 deletions tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
package vpc

import (
"context"
"fmt"
"log"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "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"
)

func ResourceTencentCloudVpcPrivateNatGateway() *schema.Resource {
return &schema.Resource{
Create: resourceTencentCloudVpcPrivateNatGatewayCreate,
Read: resourceTencentCloudVpcPrivateNatGatewayRead,
Update: resourceTencentCloudVpcPrivateNatGatewayUpdate,
Delete: resourceTencentCloudVpcPrivateNatGatewayDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"nat_gateway_name": {
Required: true,
Type: schema.TypeString,
Description: "Private network gateway name.",
},

"vpc_id": {
Optional: true,
Computed: true,
Type: schema.TypeString,
Description: "Private Cloud instance ID. This parameter is required when creating a VPC type private network NAT gateway or a private network NAT gateway of private network gateway.",
},

"cross_domain": {
Optional: true,
Computed: true,
Type: schema.TypeBool,
Description: "Cross-domain parameters. Cross-domain binding of VPCs is supported only when the value is True.",
},

"vpc_type": {
Optional: true,
Computed: true,
Type: schema.TypeBool,
Description: "VPC type private network NAT gateway. Only when the value is True will a VPC type private network NAT gateway be created.",
},

"ccn_id": {
Optional: true,
Computed: true,
Type: schema.TypeString,
Description: "Cloud Connect Network type The Cloud Connect Network instance ID required to be bound to the private network NAT gateway.",
},
},
}
}

func resourceTencentCloudVpcPrivateNatGatewayCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway.create")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

var (
request = vpc.NewCreatePrivateNatGatewayRequest()
response = vpc.NewCreatePrivateNatGatewayResponse()
instanceId string
)
if v, ok := d.GetOk("nat_gateway_name"); ok {
request.NatGatewayName = helper.String(v.(string))
}

if v, ok := d.GetOk("vpc_id"); ok {
request.VpcId = helper.String(v.(string))
}

if v, ok := d.GetOkExists("cross_domain"); ok {
request.CrossDomain = helper.Bool(v.(bool))
}

if v, ok := d.GetOkExists("vpc_type"); ok {
request.VpcType = helper.Bool(v.(bool))
}

if v, ok := d.GetOk("ccn_id"); ok {
request.CcnId = helper.String(v.(string))
}

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().CreatePrivateNatGateway(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 {
log.Printf("[CRITAL]%s create vpc privateNatGateway failed, reason:%+v", logId, err)
return err
}

if response.Response != nil && len(response.Response.PrivateNatGatewaySet) > 0 {
privateNatGateway := response.Response.PrivateNatGatewaySet[0]
if privateNatGateway.NatGatewayId != nil {
instanceId = *response.Response.PrivateNatGatewaySet[0].NatGatewayId
}
}
if instanceId == "" {
d.SetId("")
return fmt.Errorf("instanceId is nil")
}

service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
err = resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError {
privateNatGateway, errRet := service.DescribeVpcPrivateNatGatewayById(ctx, instanceId)
if errRet != nil {
return tccommon.RetryError(errRet)
}
if privateNatGateway.Status == nil {
return resource.RetryableError(fmt.Errorf("waiting for instance create"))
}
if *privateNatGateway.Status != "AVAILABLE" {
return resource.RetryableError(fmt.Errorf("waiting for instance create"))
}
return nil
})
if err != nil {
return err
}
d.SetId(instanceId)

return resourceTencentCloudVpcPrivateNatGatewayRead(d, meta)
}

func resourceTencentCloudVpcPrivateNatGatewayRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway.read")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)

ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}

instanceId := d.Id()

privateNatGateway, err := service.DescribeVpcPrivateNatGatewayById(ctx, instanceId)
if err != nil {
return err
}

if privateNatGateway == nil {
d.SetId("")
log.Printf("[WARN]%s resource `VpcPrivateNatGateway` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}

if privateNatGateway.NatGatewayName != nil {
_ = d.Set("nat_gateway_name", privateNatGateway.NatGatewayName)
}

if privateNatGateway.VpcId != nil {
_ = d.Set("vpc_id", privateNatGateway.VpcId)
}

if privateNatGateway.CrossDomain != nil {
_ = d.Set("cross_domain", privateNatGateway.CrossDomain)
}

if privateNatGateway.VpcType != nil {
_ = d.Set("vpc_type", privateNatGateway.VpcType)
}

if privateNatGateway.CcnId != nil {
_ = d.Set("ccn_id", privateNatGateway.CcnId)
}

return nil
}

func resourceTencentCloudVpcPrivateNatGatewayUpdate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway.update")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

request := vpc.NewModifyPrivateNatGatewayAttributeRequest()

instanceId := d.Id()

request.NatGatewayId = &instanceId

immutableArgs := []string{"vpc_id", "cross_domain", "vpc_type", "ccn_id"}

for _, v := range immutableArgs {
if d.HasChange(v) {
return fmt.Errorf("argument `%s` cannot be changed", v)
}
}

if d.HasChange("nat_gateway_name") {
if v, ok := d.GetOk("nat_gateway_name"); ok {
request.NatGatewayName = helper.String(v.(string))
}
}

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyPrivateNatGatewayAttribute(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 err != nil {
log.Printf("[CRITAL]%s update vpc privateNatGateway failed, reason:%+v", logId, err)
return err
}

service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
err = resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError {
privateNatGateway, errRet := service.DescribeVpcPrivateNatGatewayById(ctx, instanceId)
if errRet != nil {
return tccommon.RetryError(errRet)
}
if privateNatGateway.Status == nil {
return resource.RetryableError(fmt.Errorf("waiting for instance update"))
}
if *privateNatGateway.Status != "AVAILABLE" {
return resource.RetryableError(fmt.Errorf("waiting for instance update"))
}
return nil
})
if err != nil {
return err
}
return resourceTencentCloudVpcPrivateNatGatewayRead(d, meta)
}

func resourceTencentCloudVpcPrivateNatGatewayDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_vpc_private_nat_gateway.delete")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
instanceId := d.Id()

if err := service.DeleteVpcPrivateNatGatewayById(ctx, instanceId); err != nil {
return err
}

err := resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError {
privateNatGateway, errRet := service.DescribeVpcPrivateNatGatewayById(ctx, instanceId)
if errRet != nil {
return tccommon.RetryError(errRet)
}
if privateNatGateway != nil {
return resource.RetryableError(fmt.Errorf("waiting for instance delete"))
}
return nil
})

if err != nil {
return err
}
return nil
}
18 changes: 18 additions & 0 deletions tencentcloud/services/vpc/resource_tc_vpc_private_nat_gateway.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Provides a resource to create a vpc private nat gateway

Example Usage

```hcl
resource "tencentcloud_vpc_private_nat_gateway" "private_nat_gateway" {
nat_gateway_name = "xxx"
vpc_id = "xxx"
}
```

Import

vpc private_nat_gateway can be imported using the id, e.g.

```
terraform import tencentcloud_vpc_private_nat_gateway.private_nat_gateway private_nat_gateway_id
```
Loading
Loading