Skip to content

feat(waf): [123540800] add new resource #3355

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 6 commits into from
May 13, 2025
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
7 changes: 7 additions & 0 deletions .changelog/3355.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:new-resource
tencentcloud_waf_bot_scene_status_config
```

```release-note:new-resource
tencentcloud_waf_bot_status_config
```
7 changes: 5 additions & 2 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -2238,8 +2238,11 @@ 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_waf_domain_post_action_config": waf.ResourceTencentCloudWafDomainPostActionConfig(),
"tencentcloud_waf_instance_attack_log_post_config": waf.ResourceTencentCloudWafInstanceAttackLogPostConfig(),
"tencentcloud_waf_bot_scene_status_config": waf.ResourceTencentCloudWafBotSceneStatusConfig(),
"tencentcloud_waf_bot_status_config": waf.ResourceTencentCloudWafBotStatusConfig(),
"tencentcloud_waf_bot_scene_ucb_rule": waf.ResourceTencentCloudWafBotSceneUCBRule(),
"tencentcloud_wedata_rule_template": wedata.ResourceTencentCloudWedataRuleTemplate(),
"tencentcloud_wedata_datasource": wedata.ResourceTencentCloudWedataDatasource(),
"tencentcloud_wedata_function": wedata.ResourceTencentCloudWedataFunction(),
Expand Down
6 changes: 4 additions & 2 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -2183,8 +2183,10 @@ 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
tencentcloud_waf_domain_post_action_config
tencentcloud_waf_instance_attack_log_post_config
tencentcloud_waf_bot_scene_status_config
tencentcloud_waf_bot_status_config

Wedata
Data Source
Expand Down
189 changes: 189 additions & 0 deletions tencentcloud/services/waf/resource_tc_waf_bot_scene_status_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
package waf

import (
"context"
"fmt"
"log"
"strings"

"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 ResourceTencentCloudWafBotSceneStatusConfig() *schema.Resource {
return &schema.Resource{
Create: resourceTencentCloudWafBotSceneStatusConfigCreate,
Read: resourceTencentCloudWafBotSceneStatusConfigRead,
Update: resourceTencentCloudWafBotSceneStatusConfigUpdate,
Delete: resourceTencentCloudWafBotSceneStatusConfigDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"domain": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Domain.",
},

"scene_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Scene ID.",
},

"status": {
Type: schema.TypeBool,
Required: true,
Description: "Bot status. true - enable; false - disable.",
},

"type": {
Type: schema.TypeString,
Computed: true,
Description: "Scene type, default: Default scenario, custom: Non default scenario.",
},

"scene_name": {
Type: schema.TypeString,
Computed: true,
Description: "Scene name.",
},

"priority": {
Type: schema.TypeInt,
Computed: true,
Description: "Priority.",
},
},
}
}

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

var (
domain string
sceneId string
)

if v, ok := d.GetOk("domain"); ok {
domain = v.(string)
}

if v, ok := d.GetOk("scene_id"); ok {
sceneId = v.(string)
}

d.SetId(strings.Join([]string{domain, sceneId}, tccommon.FILED_SP))

return resourceTencentCloudWafBotSceneStatusConfigUpdate(d, meta)
}

func resourceTencentCloudWafBotSceneStatusConfigRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_waf_bot_scene_status_config.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()}
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

domain := idSplit[0]
sceneId := idSplit[1]

respData, err := service.DescribeWafBotSceneStatusConfigById(ctx, domain, sceneId)
if err != nil {
return err
}

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

_ = d.Set("domain", domain)
_ = d.Set("scene_id", sceneId)

if respData.SceneStatus != nil {
_ = d.Set("status", respData.SceneStatus)
}

if respData.Type != nil {
_ = d.Set("type", respData.Type)
}

if respData.SceneName != nil {
_ = d.Set("scene_name", respData.SceneName)
}

if respData.Priority != nil {
_ = d.Set("priority", respData.Priority)
}

return nil
}

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

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
request = wafv20180125.NewModifyBotSceneStatusRequest()
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

domain := idSplit[0]
sceneId := idSplit[1]

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

request.Domain = &domain
request.SceneId = &sceneId
reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWafV20180125Client().ModifyBotSceneStatusWithContext(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 bot scene status config failed, reason:%+v", logId, reqErr)
return reqErr
}

return resourceTencentCloudWafBotSceneStatusConfigRead(d, meta)
}

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

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Provides a resource to create a WAF bot scene status config

Example Usage

```hcl
resource "tencentcloud_waf_bot_scene_status_config" "example" {
domain = "example.com"
scene_id = "3024324123"
status = true
}
```

Import

WAF bot scene status config can be imported using the id, e.g.

```
terraform import tencentcloud_waf_bot_scene_status_config.example example.com#3024324123
```
Original file line number Diff line number Diff line change
@@ -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 TestAccTencentCloudWafBotSceneStatusConfigResource_basic(t *testing.T) {
t.Parallel()
resource.Test(t, resource.TestCase{
PreCheck: func() {
tcacctest.AccPreCheck(t)
},
Providers: tcacctest.AccProviders,
Steps: []resource.TestStep{
{
Config: testAccWafBotSceneStatusConfig,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "id"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "domain"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "scene_id"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "status"),
),
},
{
Config: testAccWafBotSceneStatusConfigUpdate,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "id"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "domain"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "scene_id"),
resource.TestCheckResourceAttrSet("tencentcloud_waf_bot_scene_status_config.example", "status"),
),
},
{
ResourceName: "tencentcloud_waf_bot_scene_status_config.example",
ImportState: true,
ImportStateVerify: true,
},
},
})
}

const testAccWafBotSceneStatusConfig = `
resource "tencentcloud_waf_bot_scene_status_config" "example" {
domain = "example.com"
scene_id = "3024324123"
status = true
}
`

const testAccWafBotSceneStatusConfigUpdate = `
resource "tencentcloud_waf_bot_scene_status_config" "example" {
domain = "example.com"
scene_id = "3024324123"
status = false
}
`
Loading
Loading