From d2c641b97162d3be838b2044d136ae147e949eb7 Mon Sep 17 00:00:00 2001 From: jka-pankaj Date: Thu, 25 Sep 2025 19:06:32 +0530 Subject: [PATCH 1/2] implemented the Router OSPF VRF Area Interface configuration [iosxr_router_ospf_vrf_area_interface] --- README.md | 1 + iosxr_router_ospf_vrf_area_interface.tf | 39 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 iosxr_router_ospf_vrf_area_interface.tf diff --git a/README.md b/README.md index 5e76889..f004a1a 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ module "iosxr" { | [iosxr_logging_source_interface.logging_source_interface](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/logging_source_interface) | resource | | [iosxr_mpls_oam.mpls_oam](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/mpls_oam) | resource | | [iosxr_ntp.ntp](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/ntp) | resource | +| [iosxr_router_ospf_vrf_area_interface.router_ospf_vrf_area_interface](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/router_ospf_vrf_area_interface) | resource | | [iosxr_segment_routing.segment_routing](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/segment_routing) | resource | | [iosxr_service_timestamps.service_timestamps](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/service_timestamps) | resource | | [iosxr_snmp_server_mib.snmp_server_mib](https://registry.terraform.io/providers/CiscoDevNet/iosxr/latest/docs/resources/snmp_server_mib) | resource | diff --git a/iosxr_router_ospf_vrf_area_interface.tf b/iosxr_router_ospf_vrf_area_interface.tf new file mode 100644 index 0000000..be15f3f --- /dev/null +++ b/iosxr_router_ospf_vrf_area_interface.tf @@ -0,0 +1,39 @@ +resource "iosxr_router_ospf_vrf_area_interface" "router_ospf_vrf_area_interface" { + for_each = { + for item in flatten([ + for device_name, device in { for d in local.devices : d.name => d } : [ + for process_name, process in try(local.device_config[device.name].router_ospf_processes, {}) : [ + for vrf_name, vrf in try(process.vrfs, {}) : [ + for area_id, area in try(vrf.areas, {}) : [ + for interface_name, interface in try(area.interfaces, {}) : { + device_key = device.name + process_name = process_name + vrf_name = vrf_name + area_id = area_id + interface_name = interface_name + config = interface + } + ] + ] + ] + ] + ]) : "${item.device_key}:${item.process_name}:${item.vrf_name}:${item.area_id}:${item.interface_name}" => item + } + + device = each.value.device_key + process_name = each.value.process_name + vrf_name = each.value.vrf_name + area_id = each.value.area_id + interface_name = each.value.interface_name + + # Optional attributes + network_broadcast = try(each.value.config.network_broadcast, null) + network_non_broadcast = try(each.value.config.network_non_broadcast, null) + network_point_to_point = try(each.value.config.network_point_to_point, null) + network_point_to_multipoint = try(each.value.config.network_point_to_multipoint, null) + cost = try(each.value.config.cost, null) + priority = try(each.value.config.priority, null) + passive_enable = try(each.value.config.passive_enable, null) + passive_disable = try(each.value.config.passive_disable, null) + delete_mode = try(each.value.config.delete_mode, null) +} \ No newline at end of file From cdedac5033deeadf9f9602afdb10aa69450aab08 Mon Sep 17 00:00:00 2001 From: jka-pankaj Date: Fri, 26 Sep 2025 16:09:55 +0530 Subject: [PATCH 2/2] Updated with local function --- iosxr_router_ospf_vrf_area_interface.tf | 62 +++++++++++++------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/iosxr_router_ospf_vrf_area_interface.tf b/iosxr_router_ospf_vrf_area_interface.tf index be15f3f..b478ce5 100644 --- a/iosxr_router_ospf_vrf_area_interface.tf +++ b/iosxr_router_ospf_vrf_area_interface.tf @@ -1,39 +1,43 @@ -resource "iosxr_router_ospf_vrf_area_interface" "router_ospf_vrf_area_interface" { - for_each = { - for item in flatten([ - for device_name, device in { for d in local.devices : d.name => d } : [ - for process_name, process in try(local.device_config[device.name].router_ospf_processes, {}) : [ - for vrf_name, vrf in try(process.vrfs, {}) : [ - for area_id, area in try(vrf.areas, {}) : [ - for interface_name, interface in try(area.interfaces, {}) : { - device_key = device.name - process_name = process_name - vrf_name = vrf_name - area_id = area_id - interface_name = interface_name - config = interface - } - ] +locals { + device_router_ospf_vrf_area_interface = flatten([ + for device in local.devices : [ + for process_name, process in try(local.device_config[device.name].router_ospf_processes, {}) : [ + for vrf_name, vrf in try(process.vrfs, {}) : [ + for area_id, area in try(vrf.areas, {}) : [ + for interface_name, interface in try(area.interfaces, {}) : { + device_name = device.name + process_name = process_name + vrf_name = vrf_name + area_id = area_id + interface_name = interface_name + key = "${device.name}-${process_name}-${vrf_name}-${area_id}-${replace(interface_name, "/", "_")}" + config = interface + } ] ] ] - ]) : "${item.device_key}:${item.process_name}:${item.vrf_name}:${item.area_id}:${item.interface_name}" => item - } + ] + if try(local.device_config[device.name].router_ospf_processes, null) != null + ]) +} + +resource "iosxr_router_ospf_vrf_area_interface" "router_ospf_vrf_area_interface" { + for_each = { for item in local.device_router_ospf_vrf_area_interface : item.key => item } - device = each.value.device_key + device = each.value.device_name process_name = each.value.process_name vrf_name = each.value.vrf_name area_id = each.value.area_id interface_name = each.value.interface_name - # Optional attributes - network_broadcast = try(each.value.config.network_broadcast, null) - network_non_broadcast = try(each.value.config.network_non_broadcast, null) - network_point_to_point = try(each.value.config.network_point_to_point, null) - network_point_to_multipoint = try(each.value.config.network_point_to_multipoint, null) - cost = try(each.value.config.cost, null) - priority = try(each.value.config.priority, null) - passive_enable = try(each.value.config.passive_enable, null) - passive_disable = try(each.value.config.passive_disable, null) - delete_mode = try(each.value.config.delete_mode, null) + # Optional attributes with defaults fallback + network_broadcast = try(each.value.config.network_broadcast, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_network_broadcast, null) + network_non_broadcast = try(each.value.config.network_non_broadcast, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_network_non_broadcast, null) + network_point_to_point = try(each.value.config.network_point_to_point, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_network_point_to_point, null) + network_point_to_multipoint = try(each.value.config.network_point_to_multipoint, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_network_point_to_multipoint, null) + cost = try(each.value.config.cost, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_cost, null) + priority = try(each.value.config.priority, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_priority, null) + passive_enable = try(each.value.config.passive_enable, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_passive_enable, null) + passive_disable = try(each.value.config.passive_disable, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_passive_disable, null) + delete_mode = try(each.value.config.delete_mode, local.defaults.iosxr.configuration.router_ospf_vrf_area_interface_delete_mode, null) } \ No newline at end of file