diff --git a/.changelog/3354.txt b/.changelog/3354.txt new file mode 100644 index 0000000000..4c7a44512e --- /dev/null +++ b/.changelog/3354.txt @@ -0,0 +1,7 @@ +```release-note:new-resource +tencentcloud_waf_domain_post_action +``` + +```release-note:new-resource +tencentcloud_waf_instance_attack_log_post +``` diff --git a/go.mod b/go.mod index 8b5d9ca919..4c6e8b14de 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1162 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161 @@ -97,7 +97,7 @@ require ( 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.1154 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1149 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199 github.com/tencentyun/cos-go-sdk-v5 v0.7.64 diff --git a/go.sum b/go.sum index 2a799e5574..b89924ddcb 100644 --- a/go.sum +++ b/go.sum @@ -971,6 +971,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1159 h1:Jl1 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1159/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161 h1:S4dJSWhOtaPjp0/GO/yhzUC6DfZvpWhrnsEKaLxr73c= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1162 h1:bscCBygP9JRl6iNabF+vmBOhY+xayFFGYV5Wa0NzH0A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1162/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU= @@ -1119,6 +1121,10 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1148 h1:ILcBbO github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1148/go.mod h1:1n+Jj71KPI+7oeySg5l9+JopaMgsIqA0y9ATSi4nx0k= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1149 h1:SOrBtPoCjS8Jsq1dHa2Ul+ZUPP/vT6j/dJN/08ZEMHM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1149/go.mod h1:6e3sb0k9K8kWQdB/WVXVrZxyYxrSC8hN4MWpzYRR80s= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1161 h1:7eXR3p6ZmggYE7GIvN/FbIg1ESh+LxJWbb0LV4oapnQ= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1161/go.mod h1:v3l7e0+48bKOFo8V/KLLDtegi0H7zLDqGKLMdqNPblI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162 h1:gnmuUaoFAShc9FKj3Omswu3n08bHM/sGsl8xjFAkFNs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162/go.mod h1:bu3KAFeoJ1xDGQp72h9Le3FqbOcCcdomOUig3OqgcE4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 h1:NLgKNOIHWa38AmW7dyfI9Jlcp2Kr9VRD94f48pPNmxM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792/go.mod h1:Xz6vPV3gHlzPwtEcmWdWO1EUXJDgn2p7UMCXbJiVioQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199 h1:hMBLtiJPnZ9GvA677cTB6ELBR6B68wCR2QY1sNoGQc4= diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index f6f1647a51..a7ea730de6 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -2238,6 +2238,8 @@ func Provider() *schema.Provider { "tencentcloud_waf_ip_access_control_v2": waf.ResourceTencentCloudWafIpAccessControlV2(), "tencentcloud_waf_log_post_cls_flow": waf.ResourceTencentCloudWafLogPostClsFlow(), "tencentcloud_waf_log_post_ckafka_flow": waf.ResourceTencentCloudWafLogPostCkafkaFlow(), + "tencentcloud_waf_domain_post_action": waf.ResourceTencentCloudWafDomainPostAction(), + "tencentcloud_waf_instance_attack_log_post": waf.ResourceTencentCloudWafInstanceAttackLogPost(), "tencentcloud_wedata_rule_template": wedata.ResourceTencentCloudWedataRuleTemplate(), "tencentcloud_wedata_datasource": wedata.ResourceTencentCloudWedataDatasource(), "tencentcloud_wedata_function": wedata.ResourceTencentCloudWedataFunction(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index f579040538..49f79a6910 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -2183,6 +2183,8 @@ tencentcloud_waf_ip_access_control tencentcloud_waf_ip_access_control_v2 tencentcloud_waf_log_post_cls_flow tencentcloud_waf_log_post_ckafka_flow +tencentcloud_waf_domain_post_action +tencentcloud_waf_instance_attack_log_post Wedata Data Source diff --git a/tencentcloud/services/waf/resource_tc_waf_clb_instance.go b/tencentcloud/services/waf/resource_tc_waf_clb_instance.go index 681796fa1c..19b48ecf35 100644 --- a/tencentcloud/services/waf/resource_tc_waf_clb_instance.go +++ b/tencentcloud/services/waf/resource_tc_waf_clb_instance.go @@ -313,6 +313,10 @@ func resourceTencentCloudWafClbInstanceCreate(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 waf clb instance failed, Response is nil.")) + } + if *result.Response.Status == 0 || *result.Response.InstanceId == "" { return resource.NonRetryableError(fmt.Errorf("create waf clb instance status error: %s", *result.Response.ReturnMessage)) } diff --git a/tencentcloud/services/waf/resource_tc_waf_domain_post_action.go b/tencentcloud/services/waf/resource_tc_waf_domain_post_action.go new file mode 100644 index 0000000000..0e664561e4 --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_domain_post_action.go @@ -0,0 +1,144 @@ +package waf + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wafv20180125 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWafDomainPostAction() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWafDomainPostActionCreate, + Read: resourceTencentCloudWafDomainPostActionRead, + Update: resourceTencentCloudWafDomainPostActionUpdate, + Delete: resourceTencentCloudWafDomainPostActionDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "domain": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Domain.", + }, + + "post_cls_action": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: tccommon.ValidateAllowedIntValue([]int{0, 1}), + Description: "0- Disable shipping, 1- Enable shipping.", + }, + + "post_ckafka_action": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: tccommon.ValidateAllowedIntValue([]int{0, 1}), + Description: "0- Disable shipping, 1- Enable shipping.", + }, + }, + } +} + +func resourceTencentCloudWafDomainPostActionCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_domain_post_action.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var domain string + if v, ok := d.GetOk("domain"); ok { + domain = v.(string) + } + + d.SetId(domain) + + return resourceTencentCloudWafDomainPostActionUpdate(d, meta) +} + +func resourceTencentCloudWafDomainPostActionRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_domain_post_action.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WafService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + domain = d.Id() + ) + + respData, err := service.DescribeWafDomainPostActionById(ctx, domain) + if err != nil { + return err + } + + if respData == nil || len(respData) < 1 { + d.SetId("") + log.Printf("[WARN]%s resource `waf_domain_post_action` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + _ = d.Set("domain", domain) + + for _, item := range respData { + if item.PostCLSStatus != nil { + _ = d.Set("post_cls_action", item.PostCLSStatus) + } + + if item.PostCKafkaStatus != nil { + _ = d.Set("post_ckafka_action", item.PostCKafkaStatus) + } + } + + return nil +} + +func resourceTencentCloudWafDomainPostActionUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_domain_post_action.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wafv20180125.NewModifyDomainPostActionRequest() + domain = d.Id() + ) + + if v, ok := d.GetOkExists("post_cls_action"); ok { + request.PostCLSAction = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOkExists("post_ckafka_action"); ok { + request.PostCKafkaAction = helper.IntInt64(v.(int)) + } + + request.Domain = &domain + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWafV20180125Client().ModifyDomainPostActionWithContext(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 update waf domain post action failed, reason:%+v", logId, reqErr) + return reqErr + } + + return resourceTencentCloudWafDomainPostActionRead(d, meta) +} + +func resourceTencentCloudWafDomainPostActionDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_domain_post_action.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/waf/resource_tc_waf_domain_post_action.md b/tencentcloud/services/waf/resource_tc_waf_domain_post_action.md new file mode 100644 index 0000000000..6ef2b54d3a --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_domain_post_action.md @@ -0,0 +1,19 @@ +Provides a resource to create a WAF domain post action + +Example Usage + +```hcl +resource "tencentcloud_waf_domain_post_action" "example" { + domain = "example.com" + post_cls_action = 1 + post_ckafka_action = 0 +} +``` + +Import + +WAF domain post action can be imported using the id, e.g. + +``` +terraform import tencentcloud_waf_domain_post_action.example example.com +``` diff --git a/tencentcloud/services/waf/resource_tc_waf_domain_post_action_test.go b/tencentcloud/services/waf/resource_tc_waf_domain_post_action_test.go new file mode 100644 index 0000000000..102d808cae --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_domain_post_action_test.go @@ -0,0 +1,60 @@ +package waf_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWafDomainPostActionResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWafDomainPostAction, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "domain"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "post_cls_action"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "post_ckafka_action"), + ), + }, + { + Config: testAccWafDomainPostActionUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "domain"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "post_cls_action"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_domain_post_action.example", "post_ckafka_action"), + ), + }, + { + ResourceName: "tencentcloud_waf_domain_post_action.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWafDomainPostAction = ` +resource "tencentcloud_waf_domain_post_action" "example" { + domain = "example.com" + post_cls_action = 1 + post_ckafka_action = 0 +} +` + +const testAccWafDomainPostActionUpdate = ` +resource "tencentcloud_waf_domain_post_action" "example" { + domain = "example.com" + post_cls_action = 0 + post_ckafka_action = 1 +} +` diff --git a/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.go b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.go new file mode 100644 index 0000000000..e40503aeb3 --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.go @@ -0,0 +1,127 @@ +package waf + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wafv20180125 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWafInstanceAttackLogPost() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWafInstanceAttackLogPostCreate, + Read: resourceTencentCloudWafInstanceAttackLogPostRead, + Update: resourceTencentCloudWafInstanceAttackLogPostUpdate, + Delete: resourceTencentCloudWafInstanceAttackLogPostDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Waf instance ID.", + }, + + "attack_log_post": { + Type: schema.TypeInt, + Required: true, + ValidateFunc: tccommon.ValidateAllowedIntValue([]int{0, 1}), + Description: "Attack log delivery switch. 0- Disable, 1- Enable.", + }, + }, + } +} + +func resourceTencentCloudWafInstanceAttackLogPostCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_instance_attack_log_post.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var instanceId string + if v, ok := d.GetOk("instance_id"); ok { + instanceId = v.(string) + } + + d.SetId(instanceId) + + return resourceTencentCloudWafInstanceAttackLogPostUpdate(d, meta) +} + +func resourceTencentCloudWafInstanceAttackLogPostRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_instance_attack_log_post.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WafService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) + + respData, err := service.DescribeWafInstanceById(ctx, instanceId) + if err != nil { + return err + } + + if respData == nil { + d.SetId("") + log.Printf("[WARN]%s resource `waf_instance_attack_log_post` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + _ = d.Set("instance_id", instanceId) + + if respData.AttackLogPost != nil { + _ = d.Set("attack_log_post", respData.AttackLogPost) + } + + return nil +} + +func resourceTencentCloudWafInstanceAttackLogPostUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_instance_attack_log_post.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wafv20180125.NewModifyInstanceAttackLogPostRequest() + instanceId = d.Id() + ) + + if v, ok := d.GetOkExists("attack_log_post"); ok { + request.AttackLogPost = helper.IntInt64(v.(int)) + } + + request.InstanceId = &instanceId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWafV20180125Client().ModifyInstanceAttackLogPostWithContext(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 update waf instance attack log_post failed, reason:%+v", logId, reqErr) + return reqErr + } + + return resourceTencentCloudWafInstanceAttackLogPostRead(d, meta) +} + +func resourceTencentCloudWafInstanceAttackLogPostDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_waf_instance_attack_log_post.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.md b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.md new file mode 100644 index 0000000000..248af60221 --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post.md @@ -0,0 +1,20 @@ +Provides a resource to create a WAF instance attack log post + +~> **NOTE:** Only enterprise version and above are supported for activation + +Example Usage + +```hcl +resource "tencentcloud_waf_instance_attack_log_post" "example" { + instance_id = "waf_2kxtlbky11b4wcrb" + attack_log_post = 1 +} +``` + +Import + +WAF instance attack log post can be imported using the id, e.g. + +``` +terraform import tencentcloud_waf_instance_attack_log_post.example waf_2kxtlbky11b4wcrb +``` diff --git a/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post_test.go b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post_test.go new file mode 100644 index 0000000000..da62c2eeb8 --- /dev/null +++ b/tencentcloud/services/waf/resource_tc_waf_instance_attack_log_post_test.go @@ -0,0 +1,56 @@ +package waf_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWafInstanceAttackLogPostResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWafInstanceAttackLogPost, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "instance_id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "attack_log_post"), + ), + }, + { + Config: testAccWafInstanceAttackLogPostUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "instance_id"), + resource.TestCheckResourceAttrSet("tencentcloud_waf_instance_attack_log_post.example", "attack_log_post"), + ), + }, + { + ResourceName: "tencentcloud_waf_instance_attack_log_post.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWafInstanceAttackLogPost = ` +resource "tencentcloud_waf_instance_attack_log_post" "example" { + instance_id = "waf_2kxtlbky11b4wcrb" + attack_log_post = 1 +} +` + +const testAccWafInstanceAttackLogPostUpdate = ` +resource "tencentcloud_waf_instance_attack_log_post" "example" { + instance_id = "waf_2kxtlbky11b4wcrb" + attack_log_post = 0 +} +` diff --git a/tencentcloud/services/waf/resource_tc_waf_saas_instance.go b/tencentcloud/services/waf/resource_tc_waf_saas_instance.go index d1e12a6756..e087e9f1f3 100644 --- a/tencentcloud/services/waf/resource_tc_waf_saas_instance.go +++ b/tencentcloud/services/waf/resource_tc_waf_saas_instance.go @@ -346,6 +346,10 @@ func resourceTencentCloudWafSaasInstanceCreate(d *schema.ResourceData, meta inte 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 waf saas instance failed, Response is nil.")) + } + if *result.Response.Status == 0 || *result.Response.InstanceId == "" { return resource.NonRetryableError(fmt.Errorf("create waf saas instance status error: %s", *result.Response.ReturnMessage)) } diff --git a/tencentcloud/services/waf/service_tencentcloud_waf.go b/tencentcloud/services/waf/service_tencentcloud_waf.go index 3f9e8c77a4..771607ab98 100644 --- a/tencentcloud/services/waf/service_tencentcloud_waf.go +++ b/tencentcloud/services/waf/service_tencentcloud_waf.go @@ -2,6 +2,7 @@ package waf import ( "context" + "fmt" "log" "strconv" @@ -590,6 +591,7 @@ func (me *WafService) DescribeWafInstanceById(ctx context.Context, instanceId st logId := tccommon.GetLogId(ctx) request := waf.NewDescribeInstancesRequest() + response := waf.NewDescribeInstancesResponse() request.Offset = common.Uint64Ptr(1) request.Limit = common.Uint64Ptr(20) request.Filters = []*waf.FiltersItemNew{ @@ -606,17 +608,27 @@ func (me *WafService) DescribeWafInstanceById(ctx context.Context, instanceId st } }() - ratelimit.Check(request.GetAction()) var iacExtInfo connectivity.IacExtInfo iacExtInfo.InstanceId = instanceId - response, err := me.client.UseWafClient(iacExtInfo).DescribeInstances(request) + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWafClient(iacExtInfo).DescribeInstances(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 } - 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.Instances) < 1 { return } @@ -625,6 +637,48 @@ func (me *WafService) DescribeWafInstanceById(ctx context.Context, instanceId st return } +func (me *WafService) DescribeWafInstanceWaitStatusById(ctx context.Context, instanceId string) error { + logId := tccommon.GetLogId(ctx) + + request := waf.NewDescribeInstancesRequest() + request.Offset = common.Uint64Ptr(1) + request.Limit = common.Uint64Ptr(20) + request.Filters = []*waf.FiltersItemNew{ + { + Name: common.StringPtr("InstanceId"), + Values: common.StringPtrs([]string{instanceId}), + ExactMatch: common.BoolPtr(true), + }, + } + + err := resource.Retry(tccommon.ReadRetryTimeout*10, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWafClient().DescribeInstances(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 || len(result.Response.Instances) < 1 { + return resource.NonRetryableError(fmt.Errorf("DescribeInstances response is nil.")) + } + + instance := result.Response.Instances[0] + if instance.Status != nil && *instance.Status == 0 { + return nil + } + + return resource.RetryableError(fmt.Errorf("Waf instance still running, status is %d...", *instance.Status)) + }) + + if err != nil { + return err + } + + return nil +} + func (me *WafService) DescribeWafAttackLogHistogramByFilter(ctx context.Context, param map[string]interface{}) (AttackLogHistogram *waf.GetAttackHistogramResponseParams, errRet error) { var ( logId = tccommon.GetLogId(ctx) @@ -1582,3 +1636,65 @@ func (me *WafService) DescribeWafLogPostCkafkaFlowById(ctx context.Context, logT ret = response.Response return } + +func (me *WafService) DescribeWafDomainPostActionById(ctx context.Context, domain string) (domains []*waf.DomainInfo, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := waf.NewDescribeDomainsRequest() + response := waf.NewDescribeDomainsResponse() + tmpFilter := []*waf.FiltersItemNew{} + if domain != "" { + tmpFilter = append(tmpFilter, &waf.FiltersItemNew{ + Name: common.StringPtr("Domain"), + Values: common.StringPtrs([]string{domain}), + ExactMatch: common.BoolPtr(true), + }) + } + + request.Filters = tmpFilter + + 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 = 20 + ) + for { + request.Offset = &offset + request.Limit = &limit + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWafV20180125Client().DescribeDomains(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.Domains) < 1 { + break + } + + domains = append(domains, response.Response.Domains...) + if len(response.Response.Domains) < int(limit) { + break + } + + offset += limit + } + + return +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go index 38c2dc3afa..788b771b86 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go @@ -265,7 +265,7 @@ func CompleteCommonParams(request Request, region string, requestClient string) params["Action"] = request.GetAction() params["Timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) params["Nonce"] = strconv.Itoa(rand.Int()) - params["RequestClient"] = "SDK_GO_1.0.1161" + params["RequestClient"] = "SDK_GO_1.0.1162" if requestClient != "" { params["RequestClient"] += ": " + requestClient } diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go index 31ec5d4577..4312684a12 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go @@ -9038,6 +9038,79 @@ func (c *Client) ModifyHostStatusWithContext(ctx context.Context, request *Modif return } +func NewModifyInstanceAttackLogPostRequest() (request *ModifyInstanceAttackLogPostRequest) { + request = &ModifyInstanceAttackLogPostRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "ModifyInstanceAttackLogPost") + + + return +} + +func NewModifyInstanceAttackLogPostResponse() (response *ModifyInstanceAttackLogPostResponse) { + response = &ModifyInstanceAttackLogPostResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return + +} + +// ModifyInstanceAttackLogPost +// 修改实例攻击日志投递开关,企业版及以上版本可以开通,否则返回错误 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +func (c *Client) ModifyInstanceAttackLogPost(request *ModifyInstanceAttackLogPostRequest) (response *ModifyInstanceAttackLogPostResponse, err error) { + return c.ModifyInstanceAttackLogPostWithContext(context.Background(), request) +} + +// ModifyInstanceAttackLogPost +// 修改实例攻击日志投递开关,企业版及以上版本可以开通,否则返回错误 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +func (c *Client) ModifyInstanceAttackLogPostWithContext(ctx context.Context, request *ModifyInstanceAttackLogPostRequest) (response *ModifyInstanceAttackLogPostResponse, err error) { + if request == nil { + request = NewModifyInstanceAttackLogPostRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ModifyInstanceAttackLogPost require credential") + } + + request.SetContext(ctx) + + response = NewModifyInstanceAttackLogPostResponse() + err = c.Send(request, response) + return +} + func NewModifyInstanceElasticModeRequest() (request *ModifyInstanceElasticModeRequest) { request = &ModifyInstanceElasticModeRequest{ BaseRequest: &tchttp.BaseRequest{}, diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go index 73004719c9..e8bc0ae860 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go @@ -14209,6 +14209,67 @@ func (r *ModifyHostStatusResponse) FromJsonString(s string) error { return json.Unmarshal([]byte(s), &r) } +// Predefined struct for user +type ModifyInstanceAttackLogPostRequestParams struct { + // 实例ID + InstanceId *string `json:"InstanceId,omitnil,omitempty" name:"InstanceId"` + + // 攻击日志投递开关 + AttackLogPost *int64 `json:"AttackLogPost,omitnil,omitempty" name:"AttackLogPost"` +} + +type ModifyInstanceAttackLogPostRequest struct { + *tchttp.BaseRequest + + // 实例ID + InstanceId *string `json:"InstanceId,omitnil,omitempty" name:"InstanceId"` + + // 攻击日志投递开关 + AttackLogPost *int64 `json:"AttackLogPost,omitnil,omitempty" name:"AttackLogPost"` +} + +func (r *ModifyInstanceAttackLogPostRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceAttackLogPostRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "InstanceId") + delete(f, "AttackLogPost") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ModifyInstanceAttackLogPostRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceAttackLogPostResponseParams struct { + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} + +type ModifyInstanceAttackLogPostResponse struct { + *tchttp.BaseResponse + Response *ModifyInstanceAttackLogPostResponseParams `json:"Response"` +} + +func (r *ModifyInstanceAttackLogPostResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceAttackLogPostResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + // Predefined struct for user type ModifyInstanceElasticModeRequestParams struct { // 实例ID diff --git a/vendor/modules.txt b/vendor/modules.txt index dc3ee3f8ed..1d929942c6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1166,7 +1166,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1162 ## explicit; go 1.11 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors @@ -1352,7 +1352,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod/v20180717 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1154 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1149 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 diff --git a/website/docs/r/waf_domain_post_action.html.markdown b/website/docs/r/waf_domain_post_action.html.markdown new file mode 100644 index 0000000000..3197a9e9ed --- /dev/null +++ b/website/docs/r/waf_domain_post_action.html.markdown @@ -0,0 +1,47 @@ +--- +subcategory: "Web Application Firewall(WAF)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_waf_domain_post_action" +sidebar_current: "docs-tencentcloud-resource-waf_domain_post_action" +description: |- + Provides a resource to create a WAF domain post action +--- + +# tencentcloud_waf_domain_post_action + +Provides a resource to create a WAF domain post action + +## Example Usage + +```hcl +resource "tencentcloud_waf_domain_post_action" "example" { + domain = "example.com" + post_cls_action = 1 + post_ckafka_action = 0 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `domain` - (Required, String, ForceNew) Domain. +* `post_ckafka_action` - (Required, Int) 0- Disable shipping, 1- Enable shipping. +* `post_cls_action` - (Required, Int) 0- Disable shipping, 1- Enable shipping. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +WAF domain post action can be imported using the id, e.g. + +``` +terraform import tencentcloud_waf_domain_post_action.example example.com +``` + diff --git a/website/docs/r/waf_instance_attack_log_post.html.markdown b/website/docs/r/waf_instance_attack_log_post.html.markdown new file mode 100644 index 0000000000..fd6a45ac13 --- /dev/null +++ b/website/docs/r/waf_instance_attack_log_post.html.markdown @@ -0,0 +1,47 @@ +--- +subcategory: "Web Application Firewall(WAF)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_waf_instance_attack_log_post" +sidebar_current: "docs-tencentcloud-resource-waf_instance_attack_log_post" +description: |- + Provides a resource to create a WAF instance attack log post +--- + +# tencentcloud_waf_instance_attack_log_post + +Provides a resource to create a WAF instance attack log post + +~> **NOTE:** Only enterprise version and above are supported for activation + +## Example Usage + +```hcl +resource "tencentcloud_waf_instance_attack_log_post" "example" { + instance_id = "waf_2kxtlbky11b4wcrb" + attack_log_post = 1 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `attack_log_post` - (Required, Int) Attack log delivery switch. 0- Disable, 1- Enable. +* `instance_id` - (Required, String, ForceNew) Waf instance ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +WAF instance attack log post can be imported using the id, e.g. + +``` +terraform import tencentcloud_waf_instance_attack_log_post.example waf_2kxtlbky11b4wcrb +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 6588ec471e..e273c4f190 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -6850,6 +6850,12 @@
  • tencentcloud_waf_custom_white_rule
  • +
  • + tencentcloud_waf_domain_post_action +
  • +
  • + tencentcloud_waf_instance_attack_log_post +
  • tencentcloud_waf_ip_access_control