From bbba0ccc63df8938527d833d59413240c6a1964b Mon Sep 17 00:00:00 2001 From: MrWolong <36806235+MrWolong@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:36:03 +0800 Subject: [PATCH] resource/alicloud_cen_transit_router_multicast_domain: Refactored the resource alicloud_cen_transit_router_multicast_domain; Added the field options, region_id (#8148) --- ...oud_cen_transit_router_multicast_domain.go | 217 +++++++++++------- ...en_transit_router_multicast_domain_test.go | 59 ++++- alicloud/service_alicloud_cen_v2.go | 83 +++++++ ...nsit_router_multicast_domain.html.markdown | 43 ++-- 4 files changed, 295 insertions(+), 107 deletions(-) diff --git a/alicloud/resource_alicloud_cen_transit_router_multicast_domain.go b/alicloud/resource_alicloud_cen_transit_router_multicast_domain.go index cbb1de5badad..044618cc28a6 100644 --- a/alicloud/resource_alicloud_cen_transit_router_multicast_domain.go +++ b/alicloud/resource_alicloud_cen_transit_router_multicast_domain.go @@ -1,14 +1,16 @@ +// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you! package alicloud import ( "fmt" + "log" + "time" + "github.com/PaesslerAG/jsonpath" util "github.com/alibabacloud-go/tea-utils/service" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - - "time" ) func resourceAliCloudCenTransitRouterMulticastDomain() *schema.Resource { @@ -21,61 +23,91 @@ func resourceAliCloudCenTransitRouterMulticastDomain() *schema.Resource { State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ - Create: schema.DefaultTimeout(3 * time.Minute), - Update: schema.DefaultTimeout(3 * time.Minute), - Delete: schema.DefaultTimeout(3 * time.Minute), + Create: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(5 * time.Minute), + Delete: schema.DefaultTimeout(5 * time.Minute), }, Schema: map[string]*schema.Schema{ + "options": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "igmpv2_support": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + }, + }, + }, + "region_id": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tags": tagsSchema(), "transit_router_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, - "transit_router_multicast_domain_name": { - Type: schema.TypeString, - Optional: true, - }, "transit_router_multicast_domain_description": { Type: schema.TypeString, Optional: true, }, - "tags": tagsSchema(), - "status": { + "transit_router_multicast_domain_name": { Type: schema.TypeString, - Computed: true, + Optional: true, }, }, } } func resourceAliCloudCenTransitRouterMulticastDomainCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) - cbnService := CbnService{client} - var response map[string]interface{} + action := "CreateTransitRouterMulticastDomain" - request := make(map[string]interface{}) - conn, err := client.NewCbnClient() + var request map[string]interface{} + var response map[string]interface{} + query := make(map[string]interface{}) + conn, err := client.NewCenClient() if err != nil { return WrapError(err) } - + request = make(map[string]interface{}) request["RegionId"] = client.RegionId - request["ClientToken"] = buildClientToken("CreateTransitRouterMulticastDomain") + request["ClientToken"] = buildClientToken(action) request["TransitRouterId"] = d.Get("transit_router_id") if v, ok := d.GetOk("transit_router_multicast_domain_name"); ok { request["TransitRouterMulticastDomainName"] = v } - if v, ok := d.GetOk("transit_router_multicast_domain_description"); ok { request["TransitRouterMulticastDomainDescription"] = v } + if v, ok := d.GetOk("tags"); ok { + tagsMap := ConvertTags(v.(map[string]interface{})) + request = expandTagsToMap(request, tagsMap) + } + if v, ok := d.GetOk("options"); ok { + jsonPathResult3, err := jsonpath.Get("$[0].igmpv2_support", v) + if err == nil && jsonPathResult3 != "" { + request["Options.Igmpv2Support"] = jsonPathResult3 + } + } runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) - wait := incrementalWait(3*time.Second, 3*time.Second) - err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutCreate)), func() *resource.RetryError { - response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), nil, request, &runtime) + wait := incrementalWait(3*time.Second, 5*time.Second) + err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), query, request, &runtime) if err != nil { if IsExpectedErrors(err, []string{"Operation.Blocking"}) || NeedRetry(err) { wait() @@ -93,87 +125,108 @@ func resourceAliCloudCenTransitRouterMulticastDomainCreate(d *schema.ResourceDat d.SetId(fmt.Sprint(response["TransitRouterMulticastDomainId"])) - stateConf := BuildStateConf([]string{}, []string{"Active"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, cbnService.CenTransitRouterMulticastDomainStateRefreshFunc(d.Id(), []string{})) - if _, err := stateConf.WaitForState(); err != nil { - return WrapErrorf(err, IdMsg, d.Id()) - } - - return resourceAliCloudCenTransitRouterMulticastDomainUpdate(d, meta) + return resourceAliCloudCenTransitRouterMulticastDomainRead(d, meta) } func resourceAliCloudCenTransitRouterMulticastDomainRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) - cbnService := CbnService{client} + cenServiceV2 := CenServiceV2{client} - object, err := cbnService.DescribeCenTransitRouterMulticastDomain(d.Id()) + objectRaw, err := cenServiceV2.DescribeCenTransitRouterMulticastDomain(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { + log.Printf("[DEBUG] Resource alicloud_cen_transit_router_multicast_domain DescribeCenTransitRouterMulticastDomain Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } - d.Set("transit_router_id", object["TransitRouterId"]) - d.Set("transit_router_multicast_domain_name", object["TransitRouterMulticastDomainName"]) - d.Set("transit_router_multicast_domain_description", object["TransitRouterMulticastDomainDescription"]) - d.Set("status", object["Status"]) + if objectRaw["RegionId"] != nil { + d.Set("region_id", objectRaw["RegionId"]) + } + if objectRaw["Status"] != nil { + d.Set("status", objectRaw["Status"]) + } + if objectRaw["TransitRouterId"] != nil { + d.Set("transit_router_id", objectRaw["TransitRouterId"]) + } + if objectRaw["TransitRouterMulticastDomainDescription"] != nil { + d.Set("transit_router_multicast_domain_description", objectRaw["TransitRouterMulticastDomainDescription"]) + } + if objectRaw["TransitRouterMulticastDomainName"] != nil { + d.Set("transit_router_multicast_domain_name", objectRaw["TransitRouterMulticastDomainName"]) + } - listTagResourcesObject, err := cbnService.ListTagResources(d.Id(), "TransitRouterMulticastDomain") - if err != nil { - return WrapError(err) + optionsMaps := make([]map[string]interface{}, 0) + optionsMap := make(map[string]interface{}) + options1Raw := make(map[string]interface{}) + if objectRaw["Options"] != nil { + options1Raw = objectRaw["Options"].(map[string]interface{}) } + if len(options1Raw) > 0 { + optionsMap["igmpv2_support"] = options1Raw["Igmpv2Support"] - d.Set("tags", tagsToMap(listTagResourcesObject)) + optionsMaps = append(optionsMaps, optionsMap) + } + if objectRaw["Options"] != nil { + if err := d.Set("options", optionsMaps); err != nil { + return err + } + } + tagsMaps := objectRaw["Tags"] + d.Set("tags", tagsToMap(tagsMaps)) return nil } func resourceAliCloudCenTransitRouterMulticastDomainUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) - cbnService := CbnService{client} + var request map[string]interface{} var response map[string]interface{} + var query map[string]interface{} update := false - d.Partial(true) - - if d.HasChange("tags") { - if err := cbnService.SetResourceTags(d, "TransitRouterMulticastDomain"); err != nil { - return WrapError(err) - } - d.SetPartial("tags") - } - request := map[string]interface{}{ - "ClientToken": buildClientToken("ModifyTransitRouterMulticastDomain"), - "TransitRouterMulticastDomainId": d.Id(), + action := "ModifyTransitRouterMulticastDomain" + conn, err := client.NewCenClient() + if err != nil { + return WrapError(err) } + request = make(map[string]interface{}) + query = make(map[string]interface{}) + request["TransitRouterMulticastDomainId"] = d.Id() - if !d.IsNewResource() && d.HasChange("transit_router_multicast_domain_name") { + request["ClientToken"] = buildClientToken(action) + if d.HasChange("transit_router_multicast_domain_name") { update = true } if v, ok := d.GetOk("transit_router_multicast_domain_name"); ok { request["TransitRouterMulticastDomainName"] = v } - if !d.IsNewResource() && d.HasChange("transit_router_multicast_domain_description") { + if d.HasChange("transit_router_multicast_domain_description") { update = true } if v, ok := d.GetOk("transit_router_multicast_domain_description"); ok { request["TransitRouterMulticastDomainDescription"] = v } - if update { - action := "ModifyTransitRouterMulticastDomain" - conn, err := client.NewCbnClient() - if err != nil { - return WrapError(err) + if d.HasChange("options.0.igmpv2_support") { + update = true + } + if v, ok := d.GetOk("options"); ok { + jsonPathResult3, err := jsonpath.Get("$[0].igmpv2_support", v) + if err == nil && jsonPathResult3 != "" { + request["Options.Igmpv2Support"] = jsonPathResult3 } + } + if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) - wait := incrementalWait(3*time.Second, 3*time.Second) - err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError { - response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), nil, request, &runtime) + wait := incrementalWait(3*time.Second, 5*time.Second) + err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), query, request, &runtime) if err != nil { if IsExpectedErrors(err, []string{"Operation.Blocking"}) || NeedRetry(err) { wait() @@ -184,48 +237,45 @@ func resourceAliCloudCenTransitRouterMulticastDomainUpdate(d *schema.ResourceDat return nil }) addDebug(action, response, request) - if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } + } - stateConf := BuildStateConf([]string{}, []string{"Active"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, cbnService.CenTransitRouterMulticastDomainStateRefreshFunc(d.Id(), []string{})) - if _, err := stateConf.WaitForState(); err != nil { - return WrapErrorf(err, IdMsg, d.Id()) + if d.HasChange("tags") { + cenServiceV2 := CenServiceV2{client} + if err := cenServiceV2.SetResourceTags(d, "TRANSITROUTERMULTICASTDOMAIN"); err != nil { + return WrapError(err) } - - d.SetPartial("transit_router_multicast_domain_name") - d.SetPartial("transit_router_multicast_domain_description") } - - d.Partial(false) - return resourceAliCloudCenTransitRouterMulticastDomainRead(d, meta) } func resourceAliCloudCenTransitRouterMulticastDomainDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) - cbnService := CbnService{client} action := "DeleteTransitRouterMulticastDomain" + var request map[string]interface{} var response map[string]interface{} - - conn, err := client.NewCbnClient() + query := make(map[string]interface{}) + conn, err := client.NewCenClient() if err != nil { return WrapError(err) } + request = make(map[string]interface{}) + request["TransitRouterMulticastDomainId"] = d.Id() - request := map[string]interface{}{ - "ClientToken": buildClientToken("DeleteTransitRouterMulticastDomain"), - "TransitRouterMulticastDomainId": d.Id(), - } + request["ClientToken"] = buildClientToken(action) runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) - wait := incrementalWait(3*time.Second, 3*time.Second) - err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutDelete)), func() *resource.RetryError { - response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), nil, request, &runtime) + wait := incrementalWait(3*time.Second, 5*time.Second) + err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), query, request, &runtime) + request["ClientToken"] = buildClientToken(action) + if err != nil { - if IsExpectedErrors(err, []string{"Operation.Blocking", "IncorrectStatus.MulticastDomain", "InvalidOperation.MulticastGroupExist"}) || NeedRetry(err) { + if IsExpectedErrors(err, []string{"Operation.Blocking"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } @@ -242,10 +292,5 @@ func resourceAliCloudCenTransitRouterMulticastDomainDelete(d *schema.ResourceDat return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } - stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 5*time.Second, cbnService.CenTransitRouterMulticastDomainStateRefreshFunc(d.Id(), []string{})) - if _, err := stateConf.WaitForState(); err != nil { - return WrapErrorf(err, IdMsg, d.Id()) - } - return nil } diff --git a/alicloud/resource_alicloud_cen_transit_router_multicast_domain_test.go b/alicloud/resource_alicloud_cen_transit_router_multicast_domain_test.go index 5321ec274196..490629228d03 100644 --- a/alicloud/resource_alicloud_cen_transit_router_multicast_domain_test.go +++ b/alicloud/resource_alicloud_cen_transit_router_multicast_domain_test.go @@ -60,18 +60,59 @@ func TestAccAliCloudCenTransitRouterMulticastDomain_basic0(t *testing.T) { }), ), }, + { + Config: testAccConfig(map[string]interface{}{ + "options": []map[string]interface{}{ + { + "igmpv2_support": "enable", + }, + }, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "options.#": "1", + }), + ), + }, { Config: testAccConfig(map[string]interface{}{ "tags": map[string]string{ "Created": "TF", - "For": "TransitRouterMulticastDomain", + "For": "Test", }, }), Check: resource.ComposeTestCheckFunc( testAccCheck(map[string]string{ "tags.%": "2", "tags.Created": "TF", - "tags.For": "TransitRouterMulticastDomain", + "tags.For": "Test", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "tags": map[string]string{ + "Created": "TF-update", + "For": "Test-update", + }, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "tags.%": "2", + "tags.Created": "TF-update", + "tags.For": "Test-update", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "tags": REMOVEKEY, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "tags.%": "0", + "tags.Created": REMOVEKEY, + "tags.For": REMOVEKEY, }), ), }, @@ -110,9 +151,14 @@ func TestAccAliCloudCenTransitRouterMulticastDomain_basic0_twin(t *testing.T) { "transit_router_id": "${alicloud_cen_transit_router.default.transit_router_id}", "transit_router_multicast_domain_name": name, "transit_router_multicast_domain_description": name, + "options": []map[string]interface{}{ + { + "igmpv2_support": "enable", + }, + }, "tags": map[string]string{ "Created": "TF", - "For": "TransitRouterMulticastDomain", + "For": "Test", }, }), Check: resource.ComposeTestCheckFunc( @@ -120,9 +166,10 @@ func TestAccAliCloudCenTransitRouterMulticastDomain_basic0_twin(t *testing.T) { "transit_router_id": CHECKSET, "transit_router_multicast_domain_name": name, "transit_router_multicast_domain_description": name, + "options.#": "1", "tags.%": "2", "tags.Created": "TF", - "tags.For": "TransitRouterMulticastDomain", + "tags.For": "Test", }), ), }, @@ -136,7 +183,9 @@ func TestAccAliCloudCenTransitRouterMulticastDomain_basic0_twin(t *testing.T) { } var resourceAliCloudCenTransitRouterMulticastDomainMap = map[string]string{ - "status": CHECKSET, + "options.#": CHECKSET, + "region_id": CHECKSET, + "status": CHECKSET, } func resourceAliCloudCenTransitRouterMulticastDomainBasicDependence(name string) string { diff --git a/alicloud/service_alicloud_cen_v2.go b/alicloud/service_alicloud_cen_v2.go index feb1eac2dab3..969aa030f46c 100644 --- a/alicloud/service_alicloud_cen_v2.go +++ b/alicloud/service_alicloud_cen_v2.go @@ -543,3 +543,86 @@ func (s *CenServiceV2) CenFlowLogStateRefreshFunc(id string, field string, failS } // DescribeCenFlowLog >>> Encapsulated. + +// DescribeCenFlowLog >>> Encapsulated. +// DescribeCenTransitRouterMulticastDomain <<< Encapsulated get interface for Cen TransitRouterMulticastDomain. + +func (s *CenServiceV2) DescribeCenTransitRouterMulticastDomain(id string) (object map[string]interface{}, err error) { + client := s.client + var request map[string]interface{} + var response map[string]interface{} + var query map[string]interface{} + conn, err := client.NewCenClient() + if err != nil { + return object, WrapError(err) + } + request = make(map[string]interface{}) + query = make(map[string]interface{}) + request["TransitRouterMulticastDomainId"] = id + request["RegionId"] = client.RegionId + action := "ListTransitRouterMulticastDomains" + request["ClientToken"] = buildClientToken(action) + + runtime := util.RuntimeOptions{} + runtime.SetAutoretry(true) + wait := incrementalWait(3*time.Second, 5*time.Second) + err = resource.Retry(1*time.Minute, func() *resource.RetryError { + response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2017-09-12"), StringPointer("AK"), query, request, &runtime) + request["ClientToken"] = buildClientToken(action) + + if err != nil { + if NeedRetry(err) { + wait() + return resource.RetryableError(err) + } + return resource.NonRetryableError(err) + } + return nil + }) + addDebug(action, response, request) + if err != nil { + return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) + } + + v, err := jsonpath.Get("$.TransitRouterMulticastDomains[*]", response) + if err != nil { + return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.TransitRouterMulticastDomains[*]", response) + } + + if len(v.([]interface{})) == 0 { + return object, WrapErrorf(Error(GetNotFoundMessage("TransitRouterMulticastDomain", id)), NotFoundMsg, response) + } + + return v.([]interface{})[0].(map[string]interface{}), nil +} + +func (s *CenServiceV2) CenTransitRouterMulticastDomainStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + object, err := s.DescribeCenTransitRouterMulticastDomain(id) + if err != nil { + if NotFoundError(err) { + return object, "", nil + } + return nil, "", WrapError(err) + } + + v, err := jsonpath.Get(field, object) + currentStatus := fmt.Sprint(v) + + if strings.HasPrefix(field, "#") { + v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) + if v != nil { + currentStatus = "#CHECKSET" + } + } + + for _, failState := range failStates { + if currentStatus == failState { + return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) + } + } + return object, currentStatus, nil + } +} + +// DescribeCenTransitRouterMulticastDomain >>> Encapsulated. diff --git a/website/docs/r/cen_transit_router_multicast_domain.html.markdown b/website/docs/r/cen_transit_router_multicast_domain.html.markdown index 08d9a15cbabb..d0a7d44a653d 100644 --- a/website/docs/r/cen_transit_router_multicast_domain.html.markdown +++ b/website/docs/r/cen_transit_router_multicast_domain.html.markdown @@ -2,7 +2,6 @@ subcategory: "Cloud Enterprise Network (CEN)" layout: "alicloud" page_title: "Alicloud: alicloud_cen_transit_router_multicast_domain" -sidebar_current: "docs-alicloud-resource-cen-transit-router-multicast-domain" description: |- Provides a Alicloud Cloud Enterprise Network (CEN) Transit Router Multicast Domain resource. --- @@ -11,6 +10,8 @@ description: |- Provides a Cloud Enterprise Network (CEN) Transit Router Multicast Domain resource. + + For information about Cloud Enterprise Network (CEN) Transit Router Multicast Domain and how to use it, see [What is Transit Router Multicast Domain](https://www.alibabacloud.com/help/en/cen/developer-reference/api-cbn-2017-09-12-createtransitroutermulticastdomain). -> **NOTE:** Available since v1.195.0. @@ -26,47 +27,57 @@ Basic Usage ```terraform +variable "name" { + default = "terraform-example" +} + resource "alicloud_cen_instance" "example" { - cen_instance_name = "tf_example" - description = "an example for cen" + cen_instance_name = var.name } resource "alicloud_cen_transit_router" "example" { - transit_router_name = "tf_example" + transit_router_name = var.name cen_id = alicloud_cen_instance.example.id support_multicast = true } -resource "alicloud_cen_transit_router_multicast_domain" "example" { +resource "alicloud_cen_transit_router_multicast_domain" "default" { transit_router_id = alicloud_cen_transit_router.example.transit_router_id - transit_router_multicast_domain_name = "tf_example" - transit_router_multicast_domain_description = "tf_example" + transit_router_multicast_domain_name = var.name + transit_router_multicast_domain_description = var.name + options { + igmpv2_support = "disable" + } } ``` ## Argument Reference The following arguments are supported: +* `options` - (Optional, Set, Available since v1.242.0) The function options of the multicast domain. See [`options`](#options) below. +* `tags` - (Optional, Map) A mapping of tags to assign to the resource. +* `transit_router_id` - (Required, ForceNew) The ID of the forwarding router instance. +* `transit_router_multicast_domain_description` - (Optional) The description of the multicast domain. +* `transit_router_multicast_domain_name` - (Optional) The name of the multicast domain. -* `transit_router_id` - (Required, ForceNew) The ID of the transit router. -* `transit_router_multicast_domain_name` - (Optional) The name of the multicast domain. The name must be 0 to 128 characters in length, and can contain letters, digits, commas (,), periods (.), semicolons (;), forward slashes (/), at signs (@), underscores (_), and hyphens (-). -* `transit_router_multicast_domain_description` - (Optional) The description of the multicast domain. The description must be 0 to 256 characters in length, and can contain letters, digits, commas (,), periods (.), semicolons (;), forward slashes (/), at signs (@), underscores (_), and hyphens (-). -* `tags` - (Optional) A mapping of tags to assign to the resource. +### `options` + +The options supports the following: +* `igmpv2_support` - (Optional) Whether to enable IGMP function for multicast domain. Default value: `disable`. Valid values: `enable`, `disable`. ## Attributes Reference The following attributes are exported: - * `id` - The resource ID in terraform of Transit Router Multicast Domain. +* `region_id` - (Available since v1.242.0) The region ID of the transit router. * `status` - The status of the Transit Router Multicast Domain. ## Timeouts The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration-0-11/resources.html#timeouts) for certain actions: - -* `create` - (Defaults to 3 mins) Used when create the Transit Router Multicast Domain. -* `update` - (Defaults to 3 mins) Used when update the Transit Router Multicast Domain. -* `delete` - (Defaults to 3 mins) Used when delete the Transit Router Multicast Domain. +* `create` - (Defaults to 5 mins) Used when create the Transit Router Multicast Domain. +* `delete` - (Defaults to 5 mins) Used when delete the Transit Router Multicast Domain. +* `update` - (Defaults to 5 mins) Used when update the Transit Router Multicast Domain. ## Import