From 739dcfbf570bb8d1207bbfd480c9d75d2d7d6c2f Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 24 Jul 2025 16:23:39 +0800 Subject: [PATCH 1/2] add --- tencentcloud/provider.go | 1 + tencentcloud/provider.md | 1 + .../resource_tc_teo_customize_error_page.go | 286 ++++++++++++++++++ .../resource_tc_teo_customize_error_page.md | 78 +++++ ...source_tc_teo_customize_error_page_test.go | 70 +++++ .../services/teo/service_tencentcloud_teo.go | 51 ++++ .../r/teo_customize_error_page.html.markdown | 108 +++++++ website/tencentcloud.erb | 3 + 8 files changed, 598 insertions(+) create mode 100644 tencentcloud/services/teo/resource_tc_teo_customize_error_page.go create mode 100644 tencentcloud/services/teo/resource_tc_teo_customize_error_page.md create mode 100644 tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go create mode 100644 website/docs/r/teo_customize_error_page.html.markdown diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 9f1eb91c22..25aa6d31c1 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1892,6 +1892,7 @@ func Provider() *schema.Provider { "tencentcloud_teo_bind_security_template": teo.ResourceTencentCloudTeoBindSecurityTemplate(), "tencentcloud_teo_plan": teo.ResourceTencentCloudTeoPlan(), "tencentcloud_teo_content_identifier": teo.ResourceTencentCloudTeoContentIdentifier(), + "tencentcloud_teo_customize_error_page": teo.ResourceTencentCloudTeoCustomizeErrorPage(), "tencentcloud_tcm_mesh": tcm.ResourceTencentCloudTcmMesh(), "tencentcloud_tcm_cluster_attachment": tcm.ResourceTencentCloudTcmClusterAttachment(), "tencentcloud_tcm_prometheus_attachment": tcm.ResourceTencentCloudTcmPrometheusAttachment(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index 69b7ccc8f8..186400d2c9 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -1514,6 +1514,7 @@ tencentcloud_teo_security_policy_config tencentcloud_teo_dns_record tencentcloud_teo_bind_security_template tencentcloud_teo_content_identifier +tencentcloud_teo_customize_error_page TencentCloud ServiceMesh(TCM) Data Source diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go new file mode 100644 index 0000000000..d2fc286745 --- /dev/null +++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.go @@ -0,0 +1,286 @@ +package teo + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + teov20220901 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo/v20220901" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudTeoCustomizeErrorPage() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudTeoCustomizeErrorPageCreate, + Read: resourceTencentCloudTeoCustomizeErrorPageRead, + Update: resourceTencentCloudTeoCustomizeErrorPageUpdate, + Delete: resourceTencentCloudTeoCustomizeErrorPageDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "zone_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Zone ID.", + }, + + "name": { + Type: schema.TypeString, + Required: true, + Description: "Custom error page name. The name must be 2-30 characters long.", + }, + + "content_type": { + Type: schema.TypeString, + Required: true, + Description: "Custom error page type, with values:
  • text/html;
  • application/json;
  • text/plain;
  • text/xml.
  • .", + }, + + "description": { + Type: schema.TypeString, + Optional: true, + Description: "Custom error page description, not exceeding 60 characters.", + }, + + "content": { + Type: schema.TypeString, + Optional: true, + Description: "Custom error page content, not exceeding 2 KB.", + }, + + // computed + "page_id": { + Type: schema.TypeString, + Computed: true, + Description: "Page ID.", + }, + }, + } +} + +func resourceTencentCloudTeoCustomizeErrorPageCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = teov20220901.NewCreateCustomizeErrorPageRequest() + response = teov20220901.NewCreateCustomizeErrorPageResponse() + zoneId string + pageId string + ) + + if v, ok := d.GetOk("zone_id"); ok { + request.ZoneId = helper.String(v.(string)) + zoneId = v.(string) + } + + if v, ok := d.GetOk("name"); ok { + request.Name = helper.String(v.(string)) + } + + if v, ok := d.GetOk("content_type"); ok { + request.ContentType = helper.String(v.(string)) + } + + if v, ok := d.GetOk("description"); ok { + request.Description = helper.String(v.(string)) + } + + if v, ok := d.GetOk("content"); ok { + request.Content = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().CreateCustomizeErrorPageWithContext(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 { + return resource.NonRetryableError(fmt.Errorf("Create teo customize error page failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create teo customize error page failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.PageId == nil { + return fmt.Errorf("PageId is nil.") + } + + pageId = *response.Response.PageId + d.SetId(strings.Join([]string{zoneId, pageId}, tccommon.FILED_SP)) + return resourceTencentCloudTeoCustomizeErrorPageRead(d, meta) +} + +func resourceTencentCloudTeoCustomizeErrorPageRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = TeoService{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()) + } + + zoneId := idSplit[0] + pageId := idSplit[1] + + respData, err := service.DescribeTeoCustomizeErrorPageById(ctx, zoneId, pageId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `teo_customize_error_page` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + _ = d.Set("zone_id", zoneId) + _ = d.Set("page_id", pageId) + + if respData.Name != nil { + _ = d.Set("name", respData.Name) + } + + if respData.ContentType != nil { + _ = d.Set("content_type", respData.ContentType) + } + + if respData.Description != nil { + _ = d.Set("description", respData.Description) + } + + if respData.Content != nil { + _ = d.Set("content", respData.Content) + } + + return nil +} + +func resourceTencentCloudTeoCustomizeErrorPageUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + zoneId := idSplit[0] + pageId := idSplit[1] + + needChange := false + mutableArgs := []string{"name", "description", "content_type", "content"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := teov20220901.NewModifyCustomErrorPageRequest() + if v, ok := d.GetOk("name"); ok { + request.Name = helper.String(v.(string)) + } + + if v, ok := d.GetOk("description"); ok { + request.Description = helper.String(v.(string)) + } + + if v, ok := d.GetOk("content_type"); ok { + request.ContentType = helper.String(v.(string)) + } + + if v, ok := d.GetOk("content"); ok { + request.Content = helper.String(v.(string)) + } + + request.ZoneId = &zoneId + request.PageId = &pageId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().ModifyCustomErrorPageWithContext(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 teo customize error page failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return resourceTencentCloudTeoCustomizeErrorPageRead(d, meta) +} + +func resourceTencentCloudTeoCustomizeErrorPageDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_teo_customize_error_page.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = teov20220901.NewDeleteCustomErrorPageRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + zoneId := idSplit[0] + pageId := idSplit[1] + + request.ZoneId = &zoneId + request.PageId = &pageId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTeoV20220901Client().DeleteCustomErrorPageWithContext(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 teo customize error page failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md new file mode 100644 index 0000000000..26cd43b49d --- /dev/null +++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page.md @@ -0,0 +1,78 @@ +Provides a resource to create a TEO customize error page + +Example Usage + +If content_type is application/json + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "application/json" + description = "description." + content = jsonencode({ + "key" : "value", + }) +} +``` + +If content_type is text/html + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/html" + description = "description." + content = <<-EOF + + + + + Error Page + + + customize error page + + + EOF +} +``` + +If content_type is text/plain + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/plain" + description = "description." + content = "customize error page" +} +``` + +If content_type is text/xml + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/xml" + description = "description." + content = <<-EOF + + + + customize error page + + EOF +} +``` + +Import + +TEO customize error page can be imported using the id, e.g. + +``` +terraform import tencentcloud_teo_customize_error_page.example zone-3edjdliiw3he#p-3egexy9b4426 +``` diff --git a/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go b/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go new file mode 100644 index 0000000000..d7f4b928df --- /dev/null +++ b/tencentcloud/services/teo/resource_tc_teo_customize_error_page_test.go @@ -0,0 +1,70 @@ +package teo_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudTeoCustomizeErrorPageResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccTeoCustomizeErrorPage, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "zone_id"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "name"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content_type"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "description"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content"), + ), + }, + { + Config: testAccTeoCustomizeErrorPageUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "zone_id"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "name"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content_type"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "description"), + resource.TestCheckResourceAttrSet("tencentcloud_teo_customize_error_page.example", "content"), + ), + }, + { + ResourceName: "tencentcloud_teo_customize_error_page.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccTeoCustomizeErrorPage = ` +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/plain" + description = "description." + content = "customize error page" +} +` + +const testAccTeoCustomizeErrorPageUpdate = ` +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example-update" + content_type = "application/json" + description = "description update." + content = jsonencode({ + "key" : "value", + }) +} +` diff --git a/tencentcloud/services/teo/service_tencentcloud_teo.go b/tencentcloud/services/teo/service_tencentcloud_teo.go index 5554680ca1..d02eeb5c4a 100644 --- a/tencentcloud/services/teo/service_tencentcloud_teo.go +++ b/tencentcloud/services/teo/service_tencentcloud_teo.go @@ -2021,3 +2021,54 @@ func (me *TeoService) DescribeTeoContentIdentifierById(ctx context.Context, cont ret = response.Response.ContentIdentifiers[0] return } + +func (me *TeoService) DescribeTeoCustomizeErrorPageById(ctx context.Context, zoneId, pageId string) (ret *teo.CustomErrorPage, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := teo.NewDescribeCustomErrorPagesRequest() + response := teo.NewDescribeCustomErrorPagesResponse() + request.ZoneId = &zoneId + request.Filters = []*teo.AdvancedFilter{ + { + Name: helper.String("page-id"), + Values: helper.Strings([]string{pageId}), + Fuzzy: helper.Bool(false), + }, + } + + 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()) + } + }() + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseTeoV20220901Client().DescribeCustomErrorPages(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.ErrorPages) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe teo custom error pages failed, Response is nil.")) + } + + response = result + return nil + }) + + if err != nil { + errRet = err + return + } + + if len(response.Response.ErrorPages) != 1 { + errRet = fmt.Errorf("`ErrorPages` returning multiple values, Should be one.") + return + } + + ret = response.Response.ErrorPages[0] + return +} diff --git a/website/docs/r/teo_customize_error_page.html.markdown b/website/docs/r/teo_customize_error_page.html.markdown new file mode 100644 index 0000000000..308a8bb28b --- /dev/null +++ b/website/docs/r/teo_customize_error_page.html.markdown @@ -0,0 +1,108 @@ +--- +subcategory: "TencentCloud EdgeOne(TEO)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_teo_customize_error_page" +sidebar_current: "docs-tencentcloud-resource-teo_customize_error_page" +description: |- + Provides a resource to create a TEO customize error page +--- + +# tencentcloud_teo_customize_error_page + +Provides a resource to create a TEO customize error page + +## Example Usage + +### If content_type is application/json + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "application/json" + description = "description." + content = jsonencode({ + "key" : "value", + }) +} +``` + +### If content_type is text/html + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/html" + description = "description." + content = <<-EOF + + + + + Error Page + + + customize error page + + + EOF +} +``` + +### If content_type is text/plain + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/plain" + description = "description." + content = "customize error page" +} +``` + +### If content_type is text/xml + +```hcl +resource "tencentcloud_teo_customize_error_page" "example" { + zone_id = "zone-3edjdliiw3he" + name = "tf-example" + content_type = "text/xml" + description = "description." + content = <<-EOF + + + + customize error page + + EOF +} +``` + +## Argument Reference + +The following arguments are supported: + +* `content_type` - (Required, String) Custom error page type, with values:
  • text/html;
  • application/json;
  • text/plain;
  • text/xml.
  • . +* `name` - (Required, String) Custom error page name. The name must be 2-30 characters long. +* `zone_id` - (Required, String, ForceNew) Zone ID. +* `content` - (Optional, String) Custom error page content, not exceeding 2 KB. +* `description` - (Optional, String) Custom error page description, not exceeding 60 characters. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `page_id` - Page ID. + + +## Import + +TEO customize error page can be imported using the id, e.g. + +``` +terraform import tencentcloud_teo_customize_error_page.example zone-3edjdliiw3he#p-3egexy9b4426 +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index ba50abce7a..50b59e2b9e 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -5339,6 +5339,9 @@
  • tencentcloud_teo_content_identifier
  • +
  • + tencentcloud_teo_customize_error_page +
  • tencentcloud_teo_dns_record
  • From a5fc08ed2fc070be0473533ae83055803d40e259 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 24 Jul 2025 16:25:53 +0800 Subject: [PATCH 2/2] add --- .changelog/3454.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/3454.txt diff --git a/.changelog/3454.txt b/.changelog/3454.txt new file mode 100644 index 0000000000..c22413156a --- /dev/null +++ b/.changelog/3454.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_teo_customize_error_page +``` \ No newline at end of file