diff --git a/docs/data-sources/bgp_address_family_l2vpn.md b/docs/data-sources/bgp_address_family_l2vpn.md index bb36f4b4..3835c3f1 100644 --- a/docs/data-sources/bgp_address_family_l2vpn.md +++ b/docs/data-sources/bgp_address_family_l2vpn.md @@ -33,4 +33,6 @@ data "iosxe_bgp_address_family_l2vpn" "example" { ### Read-Only +- `bgp_nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking - `id` (String) The path of the retrieved object. +- `rewrite_evpn_rt_asn` (Boolean) Enable rewrite RT in the BGP EVPN address-family diff --git a/docs/resources/bgp_address_family_l2vpn.md b/docs/resources/bgp_address_family_l2vpn.md index 05e7943a..d9e357f2 100644 --- a/docs/resources/bgp_address_family_l2vpn.md +++ b/docs/resources/bgp_address_family_l2vpn.md @@ -14,8 +14,10 @@ This resource can manage the BGP Address Family L2VPN configuration. ```terraform resource "iosxe_bgp_address_family_l2vpn" "example" { - asn = "65000" - af_name = "evpn" + asn = "65000" + af_name = "evpn" + rewrite_evpn_rt_asn = true + bgp_nexthop_trigger_delay = 10 } ``` @@ -29,9 +31,12 @@ resource "iosxe_bgp_address_family_l2vpn" "example" { ### Optional +- `bgp_nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking + - Range: `0`-`100` - `delete_mode` (String) Configure behavior when deleting/destroying the resource. Either delete the entire object (YANG container) being managed, or only delete the individual resource attributes configured explicitly and leave everything else as-is. Default value is `all`. - Choices: `all`, `attributes` - `device` (String) A device name from the provider configuration. +- `rewrite_evpn_rt_asn` (Boolean) Enable rewrite RT in the BGP EVPN address-family ### Read-Only diff --git a/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf b/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf index 7c00a176..5a071e61 100644 --- a/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf +++ b/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf @@ -1,4 +1,6 @@ resource "iosxe_bgp_address_family_l2vpn" "example" { - asn = "65000" - af_name = "evpn" + asn = "65000" + af_name = "evpn" + rewrite_evpn_rt_asn = true + bgp_nexthop_trigger_delay = 10 } diff --git a/gen/definitions/bgp_address_family_l2vpn.yaml b/gen/definitions/bgp_address_family_l2vpn.yaml index f189b1cd..b8f8d7ec 100644 --- a/gen/definitions/bgp_address_family_l2vpn.yaml +++ b/gen/definitions/bgp_address_family_l2vpn.yaml @@ -9,6 +9,12 @@ attributes: example: 65000 - yang_name: af-name example: evpn + - yang_name: l2vpn-evpn/rewrite-evpn-rt-asn + tf_name: rewrite_evpn_rt_asn + example: true + - yang_name: l2vpn-evpn/bgp/nexthop/trigger/delay + tf_name: bgp_nexthop_trigger_delay + example: 10 test_prerequisites: - path: Cisco-IOS-XE-native:native/router/Cisco-IOS-XE-bgp:bgp=65000 attributes: diff --git a/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go b/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go index 663aae39..6a19b8d5 100644 --- a/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go @@ -75,6 +75,14 @@ func (d *BGPAddressFamilyL2VPNDataSource) Schema(ctx context.Context, req dataso MarkdownDescription: "", Required: true, }, + "rewrite_evpn_rt_asn": schema.BoolAttribute{ + MarkdownDescription: "Enable rewrite RT in the BGP EVPN address-family", + Computed: true, + }, + "bgp_nexthop_trigger_delay": schema.Int64Attribute{ + MarkdownDescription: "Set the delay to trigger nexthop tracking", + Computed: true, + }, }, } } diff --git a/internal/provider/data_source_iosxe_bgp_address_family_l2vpn_test.go b/internal/provider/data_source_iosxe_bgp_address_family_l2vpn_test.go index ebce263b..311bbf32 100644 --- a/internal/provider/data_source_iosxe_bgp_address_family_l2vpn_test.go +++ b/internal/provider/data_source_iosxe_bgp_address_family_l2vpn_test.go @@ -36,6 +36,8 @@ func TestAccDataSourceIosxeBGPAddressFamilyL2VPN(t *testing.T) { t.Skip("skipping test, set environment variable C9000V") } var checks []resource.TestCheckFunc + checks = append(checks, resource.TestCheckResourceAttr("data.iosxe_bgp_address_family_l2vpn.test", "rewrite_evpn_rt_asn", "true")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxe_bgp_address_family_l2vpn.test", "bgp_nexthop_trigger_delay", "10")) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, @@ -70,6 +72,8 @@ func testAccDataSourceIosxeBGPAddressFamilyL2VPNConfig() string { config += ` delete_mode = "attributes"` + "\n" config += ` asn = "65000"` + "\n" config += ` af_name = "evpn"` + "\n" + config += ` rewrite_evpn_rt_asn = true` + "\n" + config += ` bgp_nexthop_trigger_delay = 10` + "\n" config += ` depends_on = [iosxe_restconf.PreReq0, ]` + "\n" config += `}` + "\n" diff --git a/internal/provider/model_iosxe_bgp_address_family_l2vpn.go b/internal/provider/model_iosxe_bgp_address_family_l2vpn.go index db89dc70..27d77bce 100644 --- a/internal/provider/model_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/model_iosxe_bgp_address_family_l2vpn.go @@ -25,6 +25,7 @@ import ( "fmt" "net/url" "regexp" + "strconv" "github.com/CiscoDevNet/terraform-provider-iosxe/internal/provider/helpers" "github.com/hashicorp/terraform-plugin-framework/types" @@ -36,18 +37,22 @@ import ( // Section below is generated&owned by "gen/generator.go". //template:begin types type BGPAddressFamilyL2VPN struct { - Device types.String `tfsdk:"device"` - Id types.String `tfsdk:"id"` - DeleteMode types.String `tfsdk:"delete_mode"` - Asn types.String `tfsdk:"asn"` - AfName types.String `tfsdk:"af_name"` + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + DeleteMode types.String `tfsdk:"delete_mode"` + Asn types.String `tfsdk:"asn"` + AfName types.String `tfsdk:"af_name"` + RewriteEvpnRtAsn types.Bool `tfsdk:"rewrite_evpn_rt_asn"` + BgpNexthopTriggerDelay types.Int64 `tfsdk:"bgp_nexthop_trigger_delay"` } type BGPAddressFamilyL2VPNData struct { - Device types.String `tfsdk:"device"` - Id types.String `tfsdk:"id"` - Asn types.String `tfsdk:"asn"` - AfName types.String `tfsdk:"af_name"` + Device types.String `tfsdk:"device"` + Id types.String `tfsdk:"id"` + Asn types.String `tfsdk:"asn"` + AfName types.String `tfsdk:"af_name"` + RewriteEvpnRtAsn types.Bool `tfsdk:"rewrite_evpn_rt_asn"` + BgpNexthopTriggerDelay types.Int64 `tfsdk:"bgp_nexthop_trigger_delay"` } // End of section. //template:end types @@ -82,6 +87,14 @@ func (data BGPAddressFamilyL2VPN) toBody(ctx context.Context) string { if !data.AfName.IsNull() && !data.AfName.IsUnknown() { body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"af-name", data.AfName.ValueString()) } + if !data.RewriteEvpnRtAsn.IsNull() && !data.RewriteEvpnRtAsn.IsUnknown() { + if data.RewriteEvpnRtAsn.ValueBool() { + body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.rewrite-evpn-rt-asn", map[string]string{}) + } + } + if !data.BgpNexthopTriggerDelay.IsNull() && !data.BgpNexthopTriggerDelay.IsUnknown() { + body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.bgp.nexthop.trigger.delay", strconv.FormatInt(data.BgpNexthopTriggerDelay.ValueInt64(), 10)) + } return body } @@ -99,6 +112,20 @@ func (data *BGPAddressFamilyL2VPN) updateFromBody(ctx context.Context, res gjson } else { data.AfName = types.StringNull() } + if value := res.Get(prefix + "l2vpn-evpn.rewrite-evpn-rt-asn"); !data.RewriteEvpnRtAsn.IsNull() { + if value.Exists() { + data.RewriteEvpnRtAsn = types.BoolValue(true) + } else { + data.RewriteEvpnRtAsn = types.BoolValue(false) + } + } else { + data.RewriteEvpnRtAsn = types.BoolNull() + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() && !data.BgpNexthopTriggerDelay.IsNull() { + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) + } else { + data.BgpNexthopTriggerDelay = types.Int64Null() + } } // End of section. //template:end updateFromBody @@ -110,6 +137,14 @@ func (data *BGPAddressFamilyL2VPN) fromBody(ctx context.Context, res gjson.Resul if res.Get(helpers.LastElement(data.getPath())).IsArray() { prefix += "0." } + if value := res.Get(prefix + "l2vpn-evpn.rewrite-evpn-rt-asn"); value.Exists() { + data.RewriteEvpnRtAsn = types.BoolValue(true) + } else { + data.RewriteEvpnRtAsn = types.BoolValue(false) + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) + } } // End of section. //template:end fromBody @@ -121,6 +156,14 @@ func (data *BGPAddressFamilyL2VPNData) fromBody(ctx context.Context, res gjson.R if res.Get(helpers.LastElement(data.getPath())).IsArray() { prefix += "0." } + if value := res.Get(prefix + "l2vpn-evpn.rewrite-evpn-rt-asn"); value.Exists() { + data.RewriteEvpnRtAsn = types.BoolValue(true) + } else { + data.RewriteEvpnRtAsn = types.BoolValue(false) + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) + } } // End of section. //template:end fromBodyData @@ -129,6 +172,12 @@ func (data *BGPAddressFamilyL2VPNData) fromBody(ctx context.Context, res gjson.R func (data *BGPAddressFamilyL2VPN) getDeletedItems(ctx context.Context, state BGPAddressFamilyL2VPN) []string { deletedItems := make([]string, 0) + if !state.BgpNexthopTriggerDelay.IsNull() && data.BgpNexthopTriggerDelay.IsNull() { + deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", state.getPath())) + } + if !state.RewriteEvpnRtAsn.IsNull() && data.RewriteEvpnRtAsn.IsNull() { + deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/rewrite-evpn-rt-asn", state.getPath())) + } return deletedItems } @@ -139,6 +188,9 @@ func (data *BGPAddressFamilyL2VPN) getDeletedItems(ctx context.Context, state BG func (data *BGPAddressFamilyL2VPN) getEmptyLeafsDelete(ctx context.Context) []string { emptyLeafsDelete := make([]string, 0) + if !data.RewriteEvpnRtAsn.IsNull() && !data.RewriteEvpnRtAsn.ValueBool() { + emptyLeafsDelete = append(emptyLeafsDelete, fmt.Sprintf("%v/l2vpn-evpn/rewrite-evpn-rt-asn", data.getPath())) + } return emptyLeafsDelete } @@ -149,6 +201,12 @@ func (data *BGPAddressFamilyL2VPN) getEmptyLeafsDelete(ctx context.Context) []st func (data *BGPAddressFamilyL2VPN) getDeletePaths(ctx context.Context) []string { var deletePaths []string + if !data.BgpNexthopTriggerDelay.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", data.getPath())) + } + if !data.RewriteEvpnRtAsn.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/rewrite-evpn-rt-asn", data.getPath())) + } return deletePaths } diff --git a/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go b/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go index cfa27586..62505f23 100644 --- a/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/CiscoDevNet/terraform-provider-iosxe/internal/provider/helpers" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -101,6 +102,17 @@ func (r *BGPAddressFamilyL2VPNResource) Schema(ctx context.Context, req resource stringplanmodifier.RequiresReplace(), }, }, + "rewrite_evpn_rt_asn": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Enable rewrite RT in the BGP EVPN address-family").String, + Optional: true, + }, + "bgp_nexthop_trigger_delay": schema.Int64Attribute{ + MarkdownDescription: helpers.NewAttributeDescription("Set the delay to trigger nexthop tracking").AddIntegerRangeDescription(0, 100).String, + Optional: true, + Validators: []validator.Int64{ + int64validator.Between(0, 100), + }, + }, }, } } diff --git a/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go b/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go index 6a3a7be6..7991f95f 100644 --- a/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go +++ b/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go @@ -39,6 +39,8 @@ func TestAccIosxeBGPAddressFamilyL2VPN(t *testing.T) { } var checks []resource.TestCheckFunc checks = append(checks, resource.TestCheckResourceAttr("iosxe_bgp_address_family_l2vpn.test", "af_name", "evpn")) + checks = append(checks, resource.TestCheckResourceAttr("iosxe_bgp_address_family_l2vpn.test", "rewrite_evpn_rt_asn", "true")) + checks = append(checks, resource.TestCheckResourceAttr("iosxe_bgp_address_family_l2vpn.test", "bgp_nexthop_trigger_delay", "10")) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, @@ -110,6 +112,8 @@ func testAccIosxeBGPAddressFamilyL2VPNConfig_all() string { config := `resource "iosxe_bgp_address_family_l2vpn" "test" {` + "\n" config += ` asn = "65000"` + "\n" config += ` af_name = "evpn"` + "\n" + config += ` rewrite_evpn_rt_asn = true` + "\n" + config += ` bgp_nexthop_trigger_delay = 10` + "\n" config += ` depends_on = [iosxe_restconf.PreReq0, ]` + "\n" config += `}` + "\n" return config