From 888dc3884e5f6c09d7d3cafb7b26a268e5605f89 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 24 Oct 2025 20:21:27 +0000 Subject: [PATCH 1/2] feat(bgp): add EVPN advanced configuration support - Add rewrite-evpn-rt-asn (boolean) for multi-AS EVPN deployments - Add nexthop trigger enable (boolean) as prerequisite for delay - Add nexthop trigger delay (uint8, 0-100) for nexthop tracking optimization YANG discovery revealed enable attribute is required due to when constraint. This implements 3 attributes (not 2) for complete YANG model support. Fixes #471 --- docs/data-sources/bgp_address_family_l2vpn.md | 3 + docs/resources/bgp_address_family_l2vpn.md | 12 +- .../resource.tf | 7 +- gen/definitions/bgp_address_family_l2vpn.yaml | 10 ++ ...a_source_iosxe_bgp_address_family_l2vpn.go | 12 ++ ...rce_iosxe_bgp_address_family_l2vpn_test.go | 6 + .../model_iosxe_bgp_address_family_l2vpn.go | 104 ++++++++++++++++-- ...resource_iosxe_bgp_address_family_l2vpn.go | 19 ++++ ...rce_iosxe_bgp_address_family_l2vpn_test.go | 6 + 9 files changed, 166 insertions(+), 13 deletions(-) diff --git a/docs/data-sources/bgp_address_family_l2vpn.md b/docs/data-sources/bgp_address_family_l2vpn.md index bb36f4b4..d2d8b38d 100644 --- a/docs/data-sources/bgp_address_family_l2vpn.md +++ b/docs/data-sources/bgp_address_family_l2vpn.md @@ -34,3 +34,6 @@ data "iosxe_bgp_address_family_l2vpn" "example" { ### Read-Only - `id` (String) The path of the retrieved object. +- `nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking +- `nexthop_trigger_enable` (Boolean) Enable nexthop tracking +- `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..f8f450c8 100644 --- a/docs/resources/bgp_address_family_l2vpn.md +++ b/docs/resources/bgp_address_family_l2vpn.md @@ -14,8 +14,11 @@ 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 + nexthop_trigger_enable = true + nexthop_trigger_delay = 10 } ``` @@ -32,6 +35,11 @@ resource "iosxe_bgp_address_family_l2vpn" "example" { - `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. +- `nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking + - Range: `0`-`100` +- `nexthop_trigger_enable` (Boolean) Enable nexthop tracking + - Default value: `true` +- `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..eb85df1e 100644 --- a/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf +++ b/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf @@ -1,4 +1,7 @@ resource "iosxe_bgp_address_family_l2vpn" "example" { - asn = "65000" - af_name = "evpn" + asn = "65000" + af_name = "evpn" + rewrite_evpn_rt_asn = true + nexthop_trigger_enable = true + nexthop_trigger_delay = 10 } diff --git a/gen/definitions/bgp_address_family_l2vpn.yaml b/gen/definitions/bgp_address_family_l2vpn.yaml index f189b1cd..6f646574 100644 --- a/gen/definitions/bgp_address_family_l2vpn.yaml +++ b/gen/definitions/bgp_address_family_l2vpn.yaml @@ -9,6 +9,16 @@ 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/enable + tf_name: nexthop_trigger_enable + example: true + default_value: true + - yang_name: l2vpn-evpn/bgp/nexthop/trigger/delay + tf_name: 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..989c205d 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,18 @@ 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, + }, + "nexthop_trigger_enable": schema.BoolAttribute{ + MarkdownDescription: "Enable nexthop tracking", + Computed: true, + }, + "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..ed6b8ee4 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,9 @@ 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", "nexthop_trigger_enable", "true")) + checks = append(checks, resource.TestCheckResourceAttr("data.iosxe_bgp_address_family_l2vpn.test", "nexthop_trigger_delay", "10")) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, @@ -70,6 +73,9 @@ 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 += ` nexthop_trigger_enable = true` + "\n" + config += ` 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..f89ca0e8 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,24 @@ 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"` + NexthopTriggerEnable types.Bool `tfsdk:"nexthop_trigger_enable"` + NexthopTriggerDelay types.Int64 `tfsdk:"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"` + NexthopTriggerEnable types.Bool `tfsdk:"nexthop_trigger_enable"` + NexthopTriggerDelay types.Int64 `tfsdk:"nexthop_trigger_delay"` } // End of section. //template:end types @@ -82,6 +89,17 @@ 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.NexthopTriggerEnable.IsNull() && !data.NexthopTriggerEnable.IsUnknown() { + body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.bgp.nexthop.trigger.enable", data.NexthopTriggerEnable.ValueBool()) + } + if !data.NexthopTriggerDelay.IsNull() && !data.NexthopTriggerDelay.IsUnknown() { + body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.bgp.nexthop.trigger.delay", strconv.FormatInt(data.NexthopTriggerDelay.ValueInt64(), 10)) + } return body } @@ -99,6 +117,27 @@ 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.enable"); !data.NexthopTriggerEnable.IsNull() { + if value.Exists() { + data.NexthopTriggerEnable = types.BoolValue(value.Bool()) + } + } else { + data.NexthopTriggerEnable = types.BoolNull() + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() && !data.NexthopTriggerDelay.IsNull() { + data.NexthopTriggerDelay = types.Int64Value(value.Int()) + } else { + data.NexthopTriggerDelay = types.Int64Null() + } } // End of section. //template:end updateFromBody @@ -110,6 +149,19 @@ 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.enable"); value.Exists() { + data.NexthopTriggerEnable = types.BoolValue(value.Bool()) + } else { + data.NexthopTriggerEnable = types.BoolNull() + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { + data.NexthopTriggerDelay = types.Int64Value(value.Int()) + } } // End of section. //template:end fromBody @@ -121,6 +173,19 @@ 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.enable"); value.Exists() { + data.NexthopTriggerEnable = types.BoolValue(value.Bool()) + } else { + data.NexthopTriggerEnable = types.BoolNull() + } + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { + data.NexthopTriggerDelay = types.Int64Value(value.Int()) + } } // End of section. //template:end fromBodyData @@ -129,6 +194,15 @@ 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.NexthopTriggerDelay.IsNull() && data.NexthopTriggerDelay.IsNull() { + deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", state.getPath())) + } + if !state.NexthopTriggerEnable.IsNull() && data.NexthopTriggerEnable.IsNull() { + deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/enable", 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 +213,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 +226,15 @@ func (data *BGPAddressFamilyL2VPN) getEmptyLeafsDelete(ctx context.Context) []st func (data *BGPAddressFamilyL2VPN) getDeletePaths(ctx context.Context) []string { var deletePaths []string + if !data.NexthopTriggerDelay.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", data.getPath())) + } + if !data.NexthopTriggerEnable.IsNull() { + deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/enable", 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..c42c306a 100644 --- a/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go @@ -26,10 +26,12 @@ 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" "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -101,6 +103,23 @@ 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, + }, + "nexthop_trigger_enable": schema.BoolAttribute{ + MarkdownDescription: helpers.NewAttributeDescription("Enable nexthop tracking").AddDefaultValueDescription("true").String, + Optional: true, + Computed: true, + Default: booldefault.StaticBool(true), + }, + "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..45b509f7 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,9 @@ 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", "nexthop_trigger_enable", "true")) + checks = append(checks, resource.TestCheckResourceAttr("iosxe_bgp_address_family_l2vpn.test", "nexthop_trigger_delay", "10")) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, @@ -110,6 +113,9 @@ 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 += ` nexthop_trigger_enable = true` + "\n" + config += ` nexthop_trigger_delay = 10` + "\n" config += ` depends_on = [iosxe_restconf.PreReq0, ]` + "\n" config += `}` + "\n" return config From 963ef0aa5b01d20cc6cd44b16962d945ca565cf8 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 30 Oct 2025 23:57:57 +0000 Subject: [PATCH 2/2] refactor(bgp): simplify EVPN advanced attributes per reviewer feedback - Remove nexthop_trigger_enable (IOS-XE default is true) - Rename nexthop_trigger_delay -> bgp_nexthop_trigger_delay (add bgp_ prefix) - Simplifies user experience (only configure delay value) - Aligns with reviewer feedback on PR #324 --- docs/data-sources/bgp_address_family_l2vpn.md | 3 +- docs/resources/bgp_address_family_l2vpn.md | 15 ++-- .../resource.tf | 9 ++- gen/definitions/bgp_address_family_l2vpn.yaml | 6 +- ...a_source_iosxe_bgp_address_family_l2vpn.go | 6 +- ...rce_iosxe_bgp_address_family_l2vpn_test.go | 6 +- .../model_iosxe_bgp_address_family_l2vpn.go | 72 ++++++------------- ...resource_iosxe_bgp_address_family_l2vpn.go | 9 +-- ...rce_iosxe_bgp_address_family_l2vpn_test.go | 6 +- 9 files changed, 40 insertions(+), 92 deletions(-) diff --git a/docs/data-sources/bgp_address_family_l2vpn.md b/docs/data-sources/bgp_address_family_l2vpn.md index d2d8b38d..3835c3f1 100644 --- a/docs/data-sources/bgp_address_family_l2vpn.md +++ b/docs/data-sources/bgp_address_family_l2vpn.md @@ -33,7 +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. -- `nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking -- `nexthop_trigger_enable` (Boolean) Enable nexthop tracking - `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 f8f450c8..d9e357f2 100644 --- a/docs/resources/bgp_address_family_l2vpn.md +++ b/docs/resources/bgp_address_family_l2vpn.md @@ -14,11 +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" - rewrite_evpn_rt_asn = true - nexthop_trigger_enable = true - nexthop_trigger_delay = 10 + asn = "65000" + af_name = "evpn" + rewrite_evpn_rt_asn = true + bgp_nexthop_trigger_delay = 10 } ``` @@ -32,13 +31,11 @@ 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. -- `nexthop_trigger_delay` (Number) Set the delay to trigger nexthop tracking - - Range: `0`-`100` -- `nexthop_trigger_enable` (Boolean) Enable nexthop tracking - - Default value: `true` - `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 eb85df1e..5a071e61 100644 --- a/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf +++ b/examples/resources/iosxe_bgp_address_family_l2vpn/resource.tf @@ -1,7 +1,6 @@ resource "iosxe_bgp_address_family_l2vpn" "example" { - asn = "65000" - af_name = "evpn" - rewrite_evpn_rt_asn = true - nexthop_trigger_enable = true - nexthop_trigger_delay = 10 + 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 6f646574..b8f8d7ec 100644 --- a/gen/definitions/bgp_address_family_l2vpn.yaml +++ b/gen/definitions/bgp_address_family_l2vpn.yaml @@ -12,12 +12,8 @@ attributes: - yang_name: l2vpn-evpn/rewrite-evpn-rt-asn tf_name: rewrite_evpn_rt_asn example: true - - yang_name: l2vpn-evpn/bgp/nexthop/trigger/enable - tf_name: nexthop_trigger_enable - example: true - default_value: true - yang_name: l2vpn-evpn/bgp/nexthop/trigger/delay - tf_name: 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 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 989c205d..6a19b8d5 100644 --- a/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/data_source_iosxe_bgp_address_family_l2vpn.go @@ -79,11 +79,7 @@ func (d *BGPAddressFamilyL2VPNDataSource) Schema(ctx context.Context, req dataso MarkdownDescription: "Enable rewrite RT in the BGP EVPN address-family", Computed: true, }, - "nexthop_trigger_enable": schema.BoolAttribute{ - MarkdownDescription: "Enable nexthop tracking", - Computed: true, - }, - "nexthop_trigger_delay": schema.Int64Attribute{ + "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 ed6b8ee4..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 @@ -37,8 +37,7 @@ func TestAccDataSourceIosxeBGPAddressFamilyL2VPN(t *testing.T) { } 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", "nexthop_trigger_enable", "true")) - checks = append(checks, resource.TestCheckResourceAttr("data.iosxe_bgp_address_family_l2vpn.test", "nexthop_trigger_delay", "10")) + 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, @@ -74,8 +73,7 @@ func testAccDataSourceIosxeBGPAddressFamilyL2VPNConfig() string { config += ` asn = "65000"` + "\n" config += ` af_name = "evpn"` + "\n" config += ` rewrite_evpn_rt_asn = true` + "\n" - config += ` nexthop_trigger_enable = true` + "\n" - config += ` nexthop_trigger_delay = 10` + "\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 f89ca0e8..27d77bce 100644 --- a/internal/provider/model_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/model_iosxe_bgp_address_family_l2vpn.go @@ -37,24 +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"` - RewriteEvpnRtAsn types.Bool `tfsdk:"rewrite_evpn_rt_asn"` - NexthopTriggerEnable types.Bool `tfsdk:"nexthop_trigger_enable"` - NexthopTriggerDelay types.Int64 `tfsdk:"nexthop_trigger_delay"` + 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"` - RewriteEvpnRtAsn types.Bool `tfsdk:"rewrite_evpn_rt_asn"` - NexthopTriggerEnable types.Bool `tfsdk:"nexthop_trigger_enable"` - NexthopTriggerDelay types.Int64 `tfsdk:"nexthop_trigger_delay"` + 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 @@ -94,11 +92,8 @@ func (data BGPAddressFamilyL2VPN) toBody(ctx context.Context) string { body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.rewrite-evpn-rt-asn", map[string]string{}) } } - if !data.NexthopTriggerEnable.IsNull() && !data.NexthopTriggerEnable.IsUnknown() { - body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.bgp.nexthop.trigger.enable", data.NexthopTriggerEnable.ValueBool()) - } - if !data.NexthopTriggerDelay.IsNull() && !data.NexthopTriggerDelay.IsUnknown() { - body, _ = sjson.Set(body, helpers.LastElement(data.getPath())+"."+"l2vpn-evpn.bgp.nexthop.trigger.delay", strconv.FormatInt(data.NexthopTriggerDelay.ValueInt64(), 10)) + 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 } @@ -126,17 +121,10 @@ func (data *BGPAddressFamilyL2VPN) updateFromBody(ctx context.Context, res gjson } else { data.RewriteEvpnRtAsn = types.BoolNull() } - if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.enable"); !data.NexthopTriggerEnable.IsNull() { - if value.Exists() { - data.NexthopTriggerEnable = types.BoolValue(value.Bool()) - } - } else { - data.NexthopTriggerEnable = types.BoolNull() - } - if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() && !data.NexthopTriggerDelay.IsNull() { - data.NexthopTriggerDelay = types.Int64Value(value.Int()) + if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() && !data.BgpNexthopTriggerDelay.IsNull() { + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) } else { - data.NexthopTriggerDelay = types.Int64Null() + data.BgpNexthopTriggerDelay = types.Int64Null() } } @@ -154,13 +142,8 @@ func (data *BGPAddressFamilyL2VPN) fromBody(ctx context.Context, res gjson.Resul } else { data.RewriteEvpnRtAsn = types.BoolValue(false) } - if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.enable"); value.Exists() { - data.NexthopTriggerEnable = types.BoolValue(value.Bool()) - } else { - data.NexthopTriggerEnable = types.BoolNull() - } if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { - data.NexthopTriggerDelay = types.Int64Value(value.Int()) + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) } } @@ -178,13 +161,8 @@ func (data *BGPAddressFamilyL2VPNData) fromBody(ctx context.Context, res gjson.R } else { data.RewriteEvpnRtAsn = types.BoolValue(false) } - if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.enable"); value.Exists() { - data.NexthopTriggerEnable = types.BoolValue(value.Bool()) - } else { - data.NexthopTriggerEnable = types.BoolNull() - } if value := res.Get(prefix + "l2vpn-evpn.bgp.nexthop.trigger.delay"); value.Exists() { - data.NexthopTriggerDelay = types.Int64Value(value.Int()) + data.BgpNexthopTriggerDelay = types.Int64Value(value.Int()) } } @@ -194,12 +172,9 @@ 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.NexthopTriggerDelay.IsNull() && data.NexthopTriggerDelay.IsNull() { + if !state.BgpNexthopTriggerDelay.IsNull() && data.BgpNexthopTriggerDelay.IsNull() { deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", state.getPath())) } - if !state.NexthopTriggerEnable.IsNull() && data.NexthopTriggerEnable.IsNull() { - deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/enable", state.getPath())) - } if !state.RewriteEvpnRtAsn.IsNull() && data.RewriteEvpnRtAsn.IsNull() { deletedItems = append(deletedItems, fmt.Sprintf("%v/l2vpn-evpn/rewrite-evpn-rt-asn", state.getPath())) } @@ -226,12 +201,9 @@ func (data *BGPAddressFamilyL2VPN) getEmptyLeafsDelete(ctx context.Context) []st func (data *BGPAddressFamilyL2VPN) getDeletePaths(ctx context.Context) []string { var deletePaths []string - if !data.NexthopTriggerDelay.IsNull() { + if !data.BgpNexthopTriggerDelay.IsNull() { deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/delay", data.getPath())) } - if !data.NexthopTriggerEnable.IsNull() { - deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/bgp/nexthop/trigger/enable", data.getPath())) - } if !data.RewriteEvpnRtAsn.IsNull() { deletePaths = append(deletePaths, fmt.Sprintf("%v/l2vpn-evpn/rewrite-evpn-rt-asn", data.getPath())) } diff --git a/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go b/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go index c42c306a..62505f23 100644 --- a/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go +++ b/internal/provider/resource_iosxe_bgp_address_family_l2vpn.go @@ -31,7 +31,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" - "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -107,13 +106,7 @@ func (r *BGPAddressFamilyL2VPNResource) Schema(ctx context.Context, req resource MarkdownDescription: helpers.NewAttributeDescription("Enable rewrite RT in the BGP EVPN address-family").String, Optional: true, }, - "nexthop_trigger_enable": schema.BoolAttribute{ - MarkdownDescription: helpers.NewAttributeDescription("Enable nexthop tracking").AddDefaultValueDescription("true").String, - Optional: true, - Computed: true, - Default: booldefault.StaticBool(true), - }, - "nexthop_trigger_delay": schema.Int64Attribute{ + "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{ 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 45b509f7..7991f95f 100644 --- a/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go +++ b/internal/provider/resource_iosxe_bgp_address_family_l2vpn_test.go @@ -40,8 +40,7 @@ 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", "nexthop_trigger_enable", "true")) - checks = append(checks, resource.TestCheckResourceAttr("iosxe_bgp_address_family_l2vpn.test", "nexthop_trigger_delay", "10")) + 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, @@ -114,8 +113,7 @@ func testAccIosxeBGPAddressFamilyL2VPNConfig_all() string { config += ` asn = "65000"` + "\n" config += ` af_name = "evpn"` + "\n" config += ` rewrite_evpn_rt_asn = true` + "\n" - config += ` nexthop_trigger_enable = true` + "\n" - config += ` nexthop_trigger_delay = 10` + "\n" + config += ` bgp_nexthop_trigger_delay = 10` + "\n" config += ` depends_on = [iosxe_restconf.PreReq0, ]` + "\n" config += `}` + "\n" return config