From 007a934a278032ae024cf32d325c784eff544755 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:05:38 +0100 Subject: [PATCH 01/14] Adding support for pre-prov breakout interfaces Using jinja logic to loop through breakout_interfaces and build up breakout cli string. --- .../prep_105_topology_interfaces.py | 11 ++++++----- .../ndfc_interfaces/ndfc_interface_breakout.j2 | 2 ++ .../ndfc_inventory/common/fabric_inventory.j2 | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py index 87dbe694a..ef27b2bab 100644 --- a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py +++ b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py @@ -95,11 +95,12 @@ def prepare(self): if switch.get('interface_breakouts'): for breakout in switch.get('interface_breakouts'): - if breakout.get('to'): - nb_int = breakout['to'] - breakout['from'] - model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += nb_int + 1 - else: - model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += 1 + if not breakout.get('enable_during_bootstrap'): + if breakout.get('to'): + nb_int = breakout['to'] - breakout['from'] + model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += nb_int + 1 + else: + model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += 1 self.kwargs['results']['model_extended'] = model_data return self.kwargs['results'] diff --git a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 index 4f1e336e2..90f951d49 100644 --- a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 +++ b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 @@ -6,6 +6,7 @@ {% for switch in MD_Extended.vxlan.topology.switches %} {% if switch.interface_breakouts is defined %} {% for breakout in switch.interface_breakouts %} +{% if breakout.enable_during_bootstrap is defined and not breakout.enable_during_bootstrap %} {% if breakout.to is defined %} {% for port in range(breakout.from, breakout.to + 1) %} - name: Ethernet{{ breakout.module }}/{{ port }} @@ -33,6 +34,7 @@ profile: map: {{ breakout.map }} {% endif %} +{% endif %} {% endfor %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/roles/dtc/common/templates/ndfc_inventory/common/fabric_inventory.j2 b/roles/dtc/common/templates/ndfc_inventory/common/fabric_inventory.j2 index d27b4007d..8cb3b2a50 100644 --- a/roles/dtc/common/templates/ndfc_inventory/common/fabric_inventory.j2 +++ b/roles/dtc/common/templates/ndfc_inventory/common/fabric_inventory.j2 @@ -45,6 +45,20 @@ config_data: modulesModel: {{ switch['poap']['preprovision']['modulesModel'] }} gateway: {{ switch['management']['default_gateway_v4'] | ansible.utils.ipaddr('address') }}/{{ switch['management']['subnet_mask_ipv4'] }} +{% if switch.interface_breakouts is defined %} +{% set breakout_commands = [] %} +{% for breakout in switch.interface_breakouts %} +{% if breakout.enable_during_bootstrap is defined and breakout.enable_during_bootstrap %} +{% if breakout.to is defined %} +{% set port_range = breakout.from|string + "-" + breakout.to|string %} +{% else %} +{% set port_range = breakout.from|string %} +{% endif %} +{% set _ = breakout_commands.append("interface breakout module " + breakout.module|string + " port " + port_range + " map " + breakout.map) %} +{% endif %} +{% endfor %} + breakout: "{{ breakout_commands | join('\\n') }}" +{% endif %} hostname: {{ switch['name'] }} {% else %} poap: @@ -58,4 +72,4 @@ {% endif %} {# Global Bootstrap Section End #} {# ---------------------------- #} -{% endfor %} +{% endfor %} From eb498ae90e6380f606c2396e43659988f7dabcb7 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:57:56 +0100 Subject: [PATCH 02/14] Adding breakout of pre-prov for ISN and External fabrics --- .../dc_external_fabric_inventory.j2 | 14 ++++++++++++++ .../isn_fabric/isn_fabric_inventory.j2 | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 b/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 index 970010dcb..0f0052d35 100644 --- a/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 +++ b/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 @@ -32,6 +32,20 @@ config_data: modulesModel: {{ switch['poap']['preprovision']['modulesModel'] }} gateway: {{ switch['management']['default_gateway_v4'] | ansible.utils.ipaddr('address') }}/{{ switch['management']['subnet_mask_ipv4'] }} +{% if switch.interface_breakouts is defined %} +{% set breakout_commands = [] %} +{% for breakout in switch.interface_breakouts %} +{% if breakout.enable_during_bootstrap is defined and breakout.enable_during_bootstrap %} +{% if breakout.to is defined %} +{% set port_range = breakout.from|string + "-" + breakout.to|string %} +{% else %} +{% set port_range = breakout.from|string %} +{% endif %} +{% set _ = breakout_commands.append("interface breakout module " + breakout.module|string + " port " + port_range + " map " + breakout.map) %} +{% endif %} +{% endfor %} + breakout: "{{ breakout_commands | join('\\n') }}" +{% endif %} hostname: {{ switch['name'] }} {% endif %} {% endif %} diff --git a/roles/dtc/common/templates/ndfc_inventory/isn_fabric/isn_fabric_inventory.j2 b/roles/dtc/common/templates/ndfc_inventory/isn_fabric/isn_fabric_inventory.j2 index 112304993..eed6f049e 100644 --- a/roles/dtc/common/templates/ndfc_inventory/isn_fabric/isn_fabric_inventory.j2 +++ b/roles/dtc/common/templates/ndfc_inventory/isn_fabric/isn_fabric_inventory.j2 @@ -45,6 +45,20 @@ config_data: modulesModel: {{ switch['poap']['preprovision']['modulesModel'] }} gateway: {{ switch['management']['default_gateway_v4'] | ansible.utils.ipaddr('address') }}/{{ switch['management']['subnet_mask_ipv4'] }} +{% if switch.interface_breakouts is defined %} +{% set breakout_commands = [] %} +{% for breakout in switch.interface_breakouts %} +{% if breakout.enable_during_bootstrap is defined and breakout.enable_during_bootstrap %} +{% if breakout.to is defined %} +{% set port_range = breakout.from|string + "-" + breakout.to|string %} +{% else %} +{% set port_range = breakout.from|string %} +{% endif %} +{% set _ = breakout_commands.append("interface breakout module " + breakout.module|string + " port " + port_range + " map " + breakout.map) %} +{% endif %} +{% endfor %} + breakout: "{{ breakout_commands | join('\\n') }}" +{% endif %} hostname: {{ switch['name'] }} {% else %} poap: From c0ec646c91138170f5c6a4f5276850ef8a8ca1ec Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 17 Jul 2025 16:18:21 +0100 Subject: [PATCH 03/14] Update ndfc_interface_breakout.j2 Updated this check so that it defaults to false if not provided --- .../common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 index 90f951d49..819a7de4b 100644 --- a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 +++ b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout.j2 @@ -6,7 +6,7 @@ {% for switch in MD_Extended.vxlan.topology.switches %} {% if switch.interface_breakouts is defined %} {% for breakout in switch.interface_breakouts %} -{% if breakout.enable_during_bootstrap is defined and not breakout.enable_during_bootstrap %} +{% if not (breakout.enable_during_bootstrap | default(false)) %} {% if breakout.to is defined %} {% for port in range(breakout.from, breakout.to + 1) %} - name: Ethernet{{ breakout.module }}/{{ port }} From caafcbc1215ce3d984228a69ec934ffeb3734574 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 24 Jul 2025 11:50:47 +0100 Subject: [PATCH 04/14] Added support for breakout pre-prov in remove Changed the remove role so that it includes the pre-provisioned switches and then the overridden method of the interface module will then inculde these pre-prov interfaces --- .../tasks/common/ndfc_interface_all.yml | 2 +- .../tasks/common/ndfc_interface_breakout.yml | 20 ++++++++++ .../ndfc_interface_breakout_remove.j2 | 37 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 diff --git a/roles/dtc/common/tasks/common/ndfc_interface_all.yml b/roles/dtc/common/tasks/common/ndfc_interface_all.yml index 6a0f4eef5..039c65504 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_all.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_all.yml @@ -57,7 +57,7 @@ - name: Set interface_all Var ansible.builtin.set_fact: - interface_all: "{{ interface_breakout + interface_access + interface_access_po + interface_trunk + interface_trunk_po + interface_routed + interface_po_routed + sub_interface_routed + interface_vpc + int_loopback_config + interface_dot1q }}" + interface_all: "{{ interface_breakout_remove + interface_access + interface_access_po + interface_trunk + interface_trunk_po + interface_routed + interface_po_routed + sub_interface_routed + interface_vpc + int_loopback_config + interface_dot1q }}" when: MD_Extended.vxlan.topology.interfaces.modes.all.count > 0 delegate_to: localhost diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml index 958f22d89..0dd576f21 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml @@ -29,6 +29,7 @@ - name: Set file_name Var ansible.builtin.set_fact: file_name: "ndfc_interface_breakout.yml" + file_name_remove: "ndfc_interface_breakout_remove.yml" delegate_to: localhost - name: Stat Previous File If It Exists @@ -50,15 +51,29 @@ delegate_to: localhost when: data_file_previous.stat.exists +- name: Delete Previous Remove Data File If It Exists + ansible.builtin.file: + state: absent + path: "{{ path_name }}{{ file_name_remove }}" + delegate_to: localhost + when: data_file_previous.stat.exists + - name: Build Interface ansible.builtin.template: src: ndfc_interfaces/ndfc_interface_breakout.j2 dest: "{{ path_name }}{{ file_name }}" delegate_to: localhost +- name: Build Interface Remove breakout + ansible.builtin.template: + src: ndfc_interfaces/ndfc_interface_breakout_remove.j2 + dest: "{{ path_name }}{{ file_name_remove }}" + delegate_to: localhost + - name: Initialize interface_breakout Var ansible.builtin.set_fact: interface_breakout: [] + interface_breakout_remove: [] delegate_to: localhost - name: Set interface_breakout Var @@ -67,6 +82,11 @@ when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 delegate_to: localhost +- name: Set interface_breakout_remove Var + ansible.builtin.set_fact: + interface_breakout_remove: "{{ lookup('file', path_name + file_name_remove) | from_yaml }}" + delegate_to: localhost + - name: Diff Previous and Current Data Files cisco.nac_dc_vxlan.dtc.diff_model_changes: file_name_previous: "{{ path_name }}{{ file_name }}.old" diff --git a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 new file mode 100644 index 000000000..065bc1a43 --- /dev/null +++ b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 @@ -0,0 +1,37 @@ +--- +# This NDFC breakout interface data structure is auto-generated +# DO NOT EDIT MANUALLY +# +{% for switch in MD_Extended.vxlan.topology.switches %} +{% if switch.interface_breakouts is defined %} +{% for breakout in switch.interface_breakouts %} +{% if breakout.to is defined %} +{% for port in range(breakout.from, breakout.to + 1) %} +- name: Ethernet{{ breakout.module }}/{{ port }} + type: breakout + switch: +{% if switch.management.management_ipv4_address is defined %} + - {{ switch.management.management_ipv4_address }} +{% elif (switch.management.management_ipv4_address is not defined) and (switch.management.management_ipv6_address is defined) %} + - {{ switch.management.management_ipv6_address }} +{% endif %} + deploy: true + profile: + map: {{ breakout.map }} +{% endfor %} +{% else %} +- name: Ethernet{{ breakout.module }}/{{ breakout.from }} + type: breakout + switch: +{% if switch.management.management_ipv4_address is defined %} + - {{ switch.management.management_ipv4_address }} +{% elif (switch.management.management_ipv4_address is not defined) and (switch.management.management_ipv6_address is defined) %} + - {{ switch.management.management_ipv6_address }} +{% endif %} + deploy: true + profile: + map: {{ breakout.map }} +{% endif %} +{% endfor %} +{% endif %} +{% endfor %} \ No newline at end of file From 0ae806772606266fe57e2d5e6065eea9c0bef377 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Fri, 25 Jul 2025 14:36:31 +0100 Subject: [PATCH 05/14] Support pre-prov remove role Added into the code to check if the switch is unreachable to pop out any breakout interfaces for that switch as they will fail. Need to wait for the switch to poap and create the breakouts first --- roles/dtc/remove/tasks/common/interfaces.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/roles/dtc/remove/tasks/common/interfaces.yml b/roles/dtc/remove/tasks/common/interfaces.yml index 3f375ce6a..3b66a62ac 100644 --- a/roles/dtc/remove/tasks/common/interfaces.yml +++ b/roles/dtc/remove/tasks/common/interfaces.yml @@ -39,11 +39,21 @@ - switch_list.response.DATA | length > 0 - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) +- name: Filter out breakout interfaces for unreachable switches + ansible.builtin.set_fact: + filtered_interface_all: "{{ vars_common_local.interface_all | rejectattr('type', 'equalto', 'breakout') | list + (vars_common_local.interface_all | selectattr('type', 'equalto', 'breakout') | rejectattr('switch.0', 'in', unreachable_switch_ips) | list) }}" + vars: + unreachable_switch_ips: "{{ switch_list.response.DATA | selectattr('status', 'equalto', 'Unreachable') | map(attribute='ipAddress') | list }}" + when: + - switch_list.response.DATA | length > 0 + - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) + - vars_common_local.interface_all is defined + - name: Remove Unmanaged Fabric Interfaces cisco.dcnm.dcnm_interface: fabric: "{{ MD_Extended.vxlan.fabric.name }}" state: overridden - config: "{{ vars_common_local.interface_all }}" + config: "{{ filtered_interface_all | default(vars_common_local.interface_all) }}" # deploy: false vars: ansible_command_timeout: 3000 From 826ff00d66d7532890470fc84b2deafb0a61368e Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Fri, 1 Aug 2025 11:04:52 +0100 Subject: [PATCH 06/14] Update ndfc_interface_breakout.yml Updated after some testing where no breakouts are provided --- roles/dtc/common/tasks/common/ndfc_interface_breakout.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml index 0dd576f21..06bb61b46 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml @@ -85,6 +85,7 @@ - name: Set interface_breakout_remove Var ansible.builtin.set_fact: interface_breakout_remove: "{{ lookup('file', path_name + file_name_remove) | from_yaml }}" + when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 delegate_to: localhost - name: Diff Previous and Current Data Files From 6020667ab9f538ecd79ec9f0c3e2b9d7b32b0ef2 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Tue, 5 Aug 2025 09:02:11 +0100 Subject: [PATCH 07/14] Update prep_105_topology_interfaces.py Updated to reverse condition --- .../common/prepare_plugins/prep_105_topology_interfaces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py index ef27b2bab..b18f682d2 100644 --- a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py +++ b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py @@ -95,7 +95,7 @@ def prepare(self): if switch.get('interface_breakouts'): for breakout in switch.get('interface_breakouts'): - if not breakout.get('enable_during_bootstrap'): + if breakout.get('enable_during_bootstrap') == False: if breakout.get('to'): nb_int = breakout['to'] - breakout['from'] model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += nb_int + 1 From ce38db23adb825f061a780f293dc0af7d689b609 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:12:16 +0100 Subject: [PATCH 08/14] Update prep_105_topology_interfaces.py Changed boolean comparison after sanity failure --- .../common/prepare_plugins/prep_105_topology_interfaces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py index 34043715e..931c90536 100644 --- a/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py +++ b/plugins/action/common/prepare_plugins/prep_105_topology_interfaces.py @@ -95,7 +95,7 @@ def prepare(self): if switch.get('interface_breakouts'): for breakout in switch.get('interface_breakouts'): - if breakout.get('enable_during_bootstrap') == False: + if breakout.get('enable_during_bootstrap') is False: if breakout.get('to'): nb_int = breakout['to'] - breakout['from'] model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += nb_int + 1 From 22d907663e541f75311df2004b755de5d705332e Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 11 Sep 2025 12:57:38 +0100 Subject: [PATCH 09/14] Updated breakout remove logic Don't need the when clause as it would not get triggered for pre-prov which is what we need this structure for --- roles/dtc/common/tasks/common/ndfc_interface_breakout.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml index a8bbdc5eb..cd47a0bed 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml @@ -87,7 +87,7 @@ - name: Set interface_breakout_remove Var ansible.builtin.set_fact: interface_breakout_remove: "{{ lookup('file', path_name + file_name_remove) | from_yaml }}" - when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 + # when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 delegate_to: localhost - name: Diff Previous and Current Data Files From 987ce8b6530e30e777efa25d54b54ce6f380a399 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:33:13 +0100 Subject: [PATCH 10/14] Remove clause to filter out No need for this clause as we always need to create this list. If nothing to add it will be instantiated as an empty list --- roles/dtc/common/tasks/common/ndfc_interface_all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/dtc/common/tasks/common/ndfc_interface_all.yml b/roles/dtc/common/tasks/common/ndfc_interface_all.yml index 6c8cf7120..a66f9bc6c 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_all.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_all.yml @@ -70,7 +70,7 @@ interface_vpc + int_loopback_config + interface_dot1q }}" - when: MD_Extended.vxlan.topology.interfaces.modes.all.count > 0 + # when: MD_Extended.vxlan.topology.interfaces.modes.all.count > 0 delegate_to: localhost - name: Save interface_all From 3693abfb61ed28ccd3c881dd03b56c51dc780618 Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:51:28 +0100 Subject: [PATCH 11/14] Removed filter on interface remove role No longer needed as handled by the module now --- roles/dtc/remove/tasks/common/interfaces.yml | 21 ++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/roles/dtc/remove/tasks/common/interfaces.yml b/roles/dtc/remove/tasks/common/interfaces.yml index d5a15f3fc..c3b910c97 100644 --- a/roles/dtc/remove/tasks/common/interfaces.yml +++ b/roles/dtc/remove/tasks/common/interfaces.yml @@ -46,21 +46,22 @@ - switch_list.response.DATA | length > 0 - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) -- name: Filter out breakout interfaces for unreachable switches - ansible.builtin.set_fact: - filtered_interface_all: "{{ vars_common_local.interface_all | rejectattr('type', 'equalto', 'breakout') | list + (vars_common_local.interface_all | selectattr('type', 'equalto', 'breakout') | rejectattr('switch.0', 'in', unreachable_switch_ips) | list) }}" - vars: - unreachable_switch_ips: "{{ switch_list.response.DATA | selectattr('status', 'equalto', 'Unreachable') | map(attribute='ipAddress') | list }}" - when: - - switch_list.response.DATA | length > 0 - - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) - - vars_common_local.interface_all is defined +# NOT Needed as module is now handling this +# - name: Filter out breakout interfaces for unreachable switches +# ansible.builtin.set_fact: +# filtered_interface_all: "{{ vars_common_local.interface_all | rejectattr('type', 'equalto', 'breakout') | list + (vars_common_local.interface_all | selectattr('type', 'equalto', 'breakout') | rejectattr('switch.0', 'in', unreachable_switch_ips) | list) }}" +# vars: +# unreachable_switch_ips: "{{ switch_list.response.DATA | selectattr('status', 'equalto', 'Unreachable') | map(attribute='ipAddress') | list }}" +# when: +# - switch_list.response.DATA | length > 0 +# - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) +# - vars_common_local.interface_all is defined - name: Remove Unmanaged Fabric Interfaces in Nexus Dashboard cisco.dcnm.dcnm_interface: fabric: "{{ MD_Extended.vxlan.fabric.name }}" state: overridden - config: "{{ filtered_interface_all | default(vars_common_local.interface_all) }}" + config: "{{ vars_common_local.interface_all | default(vars_common_local.interface_all) }}" # deploy: false vars: ansible_command_timeout: 3000 From 21243d5eb3802a8e77b7303a5a932949fa33bd1c Mon Sep 17 00:00:00 2001 From: Peter Lewis - Cisco <74906052+peter8498@users.noreply.github.com> Date: Thu, 11 Sep 2025 17:01:35 +0100 Subject: [PATCH 12/14] Removed unnecessary comments and defaults --- roles/dtc/remove/tasks/common/interfaces.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/roles/dtc/remove/tasks/common/interfaces.yml b/roles/dtc/remove/tasks/common/interfaces.yml index c3b910c97..475c9c998 100644 --- a/roles/dtc/remove/tasks/common/interfaces.yml +++ b/roles/dtc/remove/tasks/common/interfaces.yml @@ -46,22 +46,11 @@ - switch_list.response.DATA | length > 0 - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) -# NOT Needed as module is now handling this -# - name: Filter out breakout interfaces for unreachable switches -# ansible.builtin.set_fact: -# filtered_interface_all: "{{ vars_common_local.interface_all | rejectattr('type', 'equalto', 'breakout') | list + (vars_common_local.interface_all | selectattr('type', 'equalto', 'breakout') | rejectattr('switch.0', 'in', unreachable_switch_ips) | list) }}" -# vars: -# unreachable_switch_ips: "{{ switch_list.response.DATA | selectattr('status', 'equalto', 'Unreachable') | map(attribute='ipAddress') | list }}" -# when: -# - switch_list.response.DATA | length > 0 -# - (interface_delete_mode is defined) and (interface_delete_mode is true|bool) -# - vars_common_local.interface_all is defined - - name: Remove Unmanaged Fabric Interfaces in Nexus Dashboard cisco.dcnm.dcnm_interface: fabric: "{{ MD_Extended.vxlan.fabric.name }}" state: overridden - config: "{{ vars_common_local.interface_all | default(vars_common_local.interface_all) }}" + config: "{{ vars_common_local.interface_all }}" # deploy: false vars: ansible_command_timeout: 3000 From ba5ee1582c8e18a69e5cff5356e17e72e916a108 Mon Sep 17 00:00:00 2001 From: mwiebe Date: Tue, 16 Sep 2025 09:15:25 -0400 Subject: [PATCH 13/14] Separate breakout and preprov breakout workflows --- .../prep_106_topology_interfaces.py | 13 ++- .../tasks/common/ndfc_interface_all.yml | 8 +- .../tasks/common/ndfc_interface_breakout.yml | 21 ----- .../ndfc_interface_breakout_preprov.yml | 89 +++++++++++++++++++ .../dtc/common/tasks/sub_main_ebgp_vxlan.yml | 10 +++ roles/dtc/common/tasks/sub_main_external.yml | 10 +++ roles/dtc/common/tasks/sub_main_isn.yml | 10 +++ roles/dtc/common/tasks/sub_main_vxlan.yml | 10 +++ ....j2 => ndfc_interface_breakout_preprov.j2} | 3 + .../ndfc_interface_ethernet.j2 | 1 + .../dc_external_fabric_inventory.j2 | 2 +- 11 files changed, 152 insertions(+), 25 deletions(-) create mode 100644 roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml rename roles/dtc/common/templates/ndfc_interfaces/{ndfc_interface_breakout_remove.j2 => ndfc_interface_breakout_preprov.j2} (91%) create mode 100644 roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_ethernet.j2 diff --git a/plugins/action/common/prepare_plugins/prep_106_topology_interfaces.py b/plugins/action/common/prepare_plugins/prep_106_topology_interfaces.py index b2fba686b..bfb686da9 100644 --- a/plugins/action/common/prepare_plugins/prep_106_topology_interfaces.py +++ b/plugins/action/common/prepare_plugins/prep_106_topology_interfaces.py @@ -47,6 +47,10 @@ def prepare(self): model_data['vxlan']['topology']['interfaces']['modes']['breakout'] = {} model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] = 0 + # Initialize breakout preprovisioned interfaces + model_data['vxlan']['topology']['interfaces']['modes']['breakout_preprov'] = {} + model_data['vxlan']['topology']['interfaces']['modes']['breakout_preprov']['count'] = 0 + loopback_id = [] if model_data['vxlan'].get('underlay', {}).get('general', {}).get('manual_underlay_allocation'): loopback_id.append(model_data['vxlan']['underlay']['general']['underlay_routing_loopback_id']) @@ -112,12 +116,19 @@ def prepare(self): if switch.get('interface_breakouts'): for breakout in switch.get('interface_breakouts'): - if breakout.get('enable_during_bootstrap') is False: + if breakout.get('enable_during_bootstrap') in [False, None]: if breakout.get('to'): nb_int = breakout['to'] - breakout['from'] model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += nb_int + 1 else: model_data['vxlan']['topology']['interfaces']['modes']['breakout']['count'] += 1 + if breakout.get('enable_during_bootstrap') is True: + if breakout.get('to'): + nb_int = breakout['to'] - breakout['from'] + model_data['vxlan']['topology']['interfaces']['modes']['breakout_preprov']['count'] += nb_int + 1 + else: + model_data['vxlan']['topology']['interfaces']['modes']['breakout_preprov']['count'] += 1 + self.kwargs['results']['model_extended'] = model_data return self.kwargs['results'] diff --git a/roles/dtc/common/tasks/common/ndfc_interface_all.yml b/roles/dtc/common/tasks/common/ndfc_interface_all.yml index a66f9bc6c..b18be5062 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_all.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_all.yml @@ -59,7 +59,8 @@ - name: Set interface_all Var ansible.builtin.set_fact: interface_all: "{{ - interface_breakout_remove + + interface_breakout + + interface_breakout_preprov + interface_access + interface_access_po + interface_trunk + @@ -70,7 +71,10 @@ interface_vpc + int_loopback_config + interface_dot1q }}" - # when: MD_Extended.vxlan.topology.interfaces.modes.all.count > 0 + when: > + MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 or + MD_Extended.vxlan.topology.interfaces.modes.breakout_preprov.count > 0 or + MD_Extended.vxlan.topology.interfaces.modes.all.count > 0 delegate_to: localhost - name: Save interface_all diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml index cd47a0bed..562fee504 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout.yml @@ -29,7 +29,6 @@ - name: Set file_name Var ansible.builtin.set_fact: file_name: "ndfc_interface_breakout.yml" - file_name_remove: "ndfc_interface_breakout_remove.yml" delegate_to: localhost - name: Stat Previous File If It Exists @@ -52,13 +51,6 @@ delegate_to: localhost when: data_file_previous.stat.exists -- name: Delete Previous Remove Data File If It Exists - ansible.builtin.file: - state: absent - path: "{{ path_name }}{{ file_name_remove }}" - delegate_to: localhost - when: data_file_previous.stat.exists - - name: Build Interface ansible.builtin.template: src: ndfc_interfaces/ndfc_interface_breakout.j2 @@ -66,16 +58,9 @@ mode: '0644' delegate_to: localhost -- name: Build Interface Remove breakout - ansible.builtin.template: - src: ndfc_interfaces/ndfc_interface_breakout_remove.j2 - dest: "{{ path_name }}{{ file_name_remove }}" - delegate_to: localhost - - name: Initialize interface_breakout Var ansible.builtin.set_fact: interface_breakout: [] - interface_breakout_remove: [] delegate_to: localhost - name: Set interface_breakout Var @@ -84,12 +69,6 @@ when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 delegate_to: localhost -- name: Set interface_breakout_remove Var - ansible.builtin.set_fact: - interface_breakout_remove: "{{ lookup('file', path_name + file_name_remove) | from_yaml }}" - # when: MD_Extended.vxlan.topology.interfaces.modes.breakout.count > 0 - delegate_to: localhost - - name: Diff Previous and Current Data Files cisco.nac_dc_vxlan.dtc.diff_model_changes: file_name_previous: "{{ path_name }}{{ file_name }}.old" diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml new file mode 100644 index 000000000..7ac541296 --- /dev/null +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml @@ -0,0 +1,89 @@ +# Copyright (c) 2025 Cisco Systems, Inc. and its affiliates +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# SPDX-License-Identifier: MIT + +--- + +- name: Initialize changes_detected Var + ansible.builtin.set_fact: + changes_detected_interface_breakout_preprov: false + delegate_to: localhost + +- name: Set file_name Var + ansible.builtin.set_fact: + file_name: "ndfc_interface_breakout_preprov.yml" + delegate_to: localhost + +- name: Stat Previous File If It Exists + ansible.builtin.stat: + path: "{{ path_name }}{{ file_name }}" + register: data_file_previous + delegate_to: localhost + +- name: Backup Previous Data File If It Exists + ansible.builtin.copy: + src: "{{ path_name }}{{ file_name }}" + dest: "{{ path_name }}{{ file_name }}.old" + mode: preserve + when: data_file_previous.stat.exists + +- name: Delete Previous Data File If It Exists + ansible.builtin.file: + state: absent + path: "{{ path_name }}{{ file_name }}" + delegate_to: localhost + when: data_file_previous.stat.exists + +- name: Build Interface + ansible.builtin.template: + src: ndfc_interfaces/ndfc_interface_breakout_preprov.j2 + dest: "{{ path_name }}{{ file_name }}" + mode: '0644' + delegate_to: localhost + +- name: Initialize interface_breakout Var + ansible.builtin.set_fact: + interface_breakout_preprov: [] + delegate_to: localhost + +- name: Set interface_breakout_preprov Var + ansible.builtin.set_fact: + interface_breakout_preprov: "{{ lookup('file', path_name + file_name) | from_yaml }}" + when: MD_Extended.vxlan.topology.interfaces.modes.breakout_preprov.count > 0 + delegate_to: localhost + +- debug: msg="{{ interface_breakout_preprov }}" + +# - meta: end_play + +- name: Diff Previous and Current Data Files + cisco.nac_dc_vxlan.dtc.diff_model_changes: + file_name_previous: "{{ path_name }}{{ file_name }}.old" + file_name_current: "{{ path_name }}{{ file_name }}" + register: file_diff_result + delegate_to: localhost + +- name: Set File Change Flag Based on File Diff Result + ansible.builtin.set_fact: + changes_detected_interface_breakout_preprov: true + delegate_to: localhost + when: + - file_diff_result.file_data_changed + - check_roles['save_previous'] \ No newline at end of file diff --git a/roles/dtc/common/tasks/sub_main_ebgp_vxlan.yml b/roles/dtc/common/tasks/sub_main_ebgp_vxlan.yml index 279437483..4c3849d57 100644 --- a/roles/dtc/common/tasks/sub_main_ebgp_vxlan.yml +++ b/roles/dtc/common/tasks/sub_main_ebgp_vxlan.yml @@ -100,6 +100,13 @@ - name: Build eBGP VXLAN Fabric Breakout Interfaces List From Template ansible.builtin.import_tasks: common/ndfc_interface_breakout.yml +# ------------------------------------------------------------------------ +# Build iBGP VXLAN Fabric PreProv Breakout Interfaces List From Template +# ------------------------------------------------------------------------ + +- name: Build iBGP VXLAN Fabric Breakout PreProv Interfaces List From Template + ansible.builtin.import_tasks: common/ndfc_interface_breakout_preprov.yml + # -------------------------------------------------------------------- # Build eBGP VXLAN Fabric Loopback Interfaces List From Template # -------------------------------------------------------------------- @@ -213,6 +220,7 @@ changes_detected_interfaces: "{{ changes_detected_interfaces }}" changes_detected_interface_loopback: "{{ changes_detected_interface_loopback }}" changes_detected_interface_breakout: "{{ changes_detected_interface_breakout }}" + changes_detected_interface_breakout_preprov: "{{ changes_detected_interface_breakout_preprov }}" changes_detected_interface_po_routed: "{{ changes_detected_interface_po_routed }}" changes_detected_interface_routed: "{{ changes_detected_interface_routed }}" changes_detected_interface_trunk_po: "{{ changes_detected_interface_trunk_po }}" @@ -230,6 +238,7 @@ fabric_config: "{{ fabric_config }}" # fabric_links: "{{ fabric_links }}" interface_breakout: "{{ interface_breakout }}" + interface_breakout_preprov: "{{ interface_breakout_preprov }}" # edge_connections: "{{ edge_connections }}" interface_access_po: "{{ interface_access_po }}" interface_access: "{{ interface_access }}" @@ -265,6 +274,7 @@ - "+ vPC Domain ID Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_vpc_domain_id_resource }} ]" - "+ ----- Interfaces -----" - "+ Interface breakout Changes Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_interface_breakout }} ]" + - "+ Interface PreProv breakout Changes Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_interface_breakout_preprov }} ]" - "+ Interface vPC Changes Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_interface_vpc }} ]" - "+ Interface Access Changes Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_interface_access }} ]" - "+ Interface Access PO Changes Detected - [ {{ vars_common_ebgp_vxlan.changes_detected_interface_access_po }} ]" diff --git a/roles/dtc/common/tasks/sub_main_external.yml b/roles/dtc/common/tasks/sub_main_external.yml index 122f5038f..53a2bc68c 100644 --- a/roles/dtc/common/tasks/sub_main_external.yml +++ b/roles/dtc/common/tasks/sub_main_external.yml @@ -73,6 +73,13 @@ - name: Build External Fabric Breakout Interfaces List From Template ansible.builtin.import_tasks: common/ndfc_interface_breakout.yml +# ------------------------------------------------------------------------ +# Build iBGP VXLAN Fabric PreProv Breakout Interfaces List From Template +# ------------------------------------------------------------------------ + +- name: Build iBGP VXLAN Fabric Breakout PreProv Interfaces List From Template + ansible.builtin.import_tasks: common/ndfc_interface_breakout_preprov.yml + # ---------------------------------------------------------------------------- # Build External Fabric Access Port-Channel Interfaces List From Template # ---------------------------------------------------------------------------- @@ -177,6 +184,7 @@ changes_detected_interface_access: "{{ changes_detected_interface_access }}" changes_detected_interface_loopback: "{{ changes_detected_interface_loopback }}" changes_detected_interface_breakout: "{{ changes_detected_interface_breakout }}" + changes_detected_interface_breakout_preprov: "{{ changes_detected_interface_breakout_preprov }}" changes_detected_interface_po_routed: "{{ changes_detected_interface_po_routed }}" changes_detected_interface_routed: "{{ changes_detected_interface_routed }}" changes_detected_interface_trunk_po: "{{ changes_detected_interface_trunk_po }}" @@ -189,6 +197,7 @@ fabric_config: "{{ fabric_config }}" edge_connections: "{{ edge_connections }}" interface_breakout: "{{ interface_breakout }}" + interface_breakout_preprov: "{{ interface_breakout_preprov }}" interface_access_po: "{{ interface_access_po }}" interface_access: "{{ interface_access }}" interface_all: "{{ interface_all }}" @@ -216,6 +225,7 @@ - "+ vPC Peer Changes Detected - [ {{ vars_common_external.changes_detected_vpc_peering }} ]" - "+ ----- Interfaces -----" - "+ Interface breakout Changes Detected - [ {{ vars_common_external.changes_detected_interface_breakout }} ]" + - "+ Interface PreProv breakout Changes Detected - [ {{ vars_common_external.changes_detected_interface_breakout_preprov }} ]" - "+ Interface Access Changes Detected - [ {{ vars_common_external.changes_detected_interface_access }} ]" - "+ Interface Access PO Changes Detected - [ {{ vars_common_external.changes_detected_interface_access_po }} ]" - "+ Interface Loopback Changes Detected - [ {{ vars_common_external.changes_detected_interface_loopback }} ]" diff --git a/roles/dtc/common/tasks/sub_main_isn.yml b/roles/dtc/common/tasks/sub_main_isn.yml index 25e9b64c7..897b13cb5 100644 --- a/roles/dtc/common/tasks/sub_main_isn.yml +++ b/roles/dtc/common/tasks/sub_main_isn.yml @@ -66,6 +66,13 @@ - name: Build ISN Fabric Breakout Interfaces List From Template ansible.builtin.import_tasks: common/ndfc_interface_breakout.yml +# ------------------------------------------------------------------------ +# Build iBGP VXLAN Fabric PreProv Breakout Interfaces List From Template +# ------------------------------------------------------------------------ + +- name: Build iBGP VXLAN Fabric Breakout PreProv Interfaces List From Template + ansible.builtin.import_tasks: common/ndfc_interface_breakout_preprov.yml + # ------------------------------------------------------------------------ # Build ISN Fabric Loopback Interfaces List From Template # ------------------------------------------------------------------------ @@ -170,6 +177,7 @@ changes_detected_interfaces: "{{ changes_detected_interfaces }}" changes_detected_interface_loopback: "{{ changes_detected_interface_loopback }}" changes_detected_interface_breakout: "{{ changes_detected_interface_breakout }}" + changes_detected_interface_breakout_preprov: "{{ changes_detected_interface_breakout_preprov }}" changes_detected_interface_po_routed: "{{ changes_detected_interface_po_routed }}" changes_detected_interface_routed: "{{ changes_detected_interface_routed }}" changes_detected_interface_trunk_po: "{{ changes_detected_interface_trunk_po }}" @@ -181,6 +189,7 @@ changes_detected_sub_interface_routed: "{{ changes_detected_sub_interface_routed }}" fabric_config: "{{ fabric_config }}" interface_breakout: "{{ interface_breakout }}" + interface_breakout_preprov: "{{ interface_breakout_preprov }}" interface_access_po: "{{ interface_access_po }}" interface_access: "{{ interface_access }}" interface_all: "{{ interface_all }}" @@ -206,6 +215,7 @@ - "+ Inventory Changes Detected - [ {{ vars_common_isn.changes_detected_inventory }} ]" - "+ ----- Interfaces -----" - "+ Interface breakout Changes Detected - [ {{ vars_common_isn.changes_detected_interface_breakout }} ]" + - "+ Interface PreProv breakout Changes Detected - [ {{ vars_common_isn.changes_detected_interface_breakout_preprov }} ]" - "+ Interface vPC Changes Detected - [ {{ vars_common_isn.changes_detected_interface_vpc }} ]" - "+ Interface Access Changes Detected - [ {{ vars_common_isn.changes_detected_interface_access }} ]" - "+ Interface Access PO Changes Detected - [ {{ vars_common_isn.changes_detected_interface_access_po }} ]" diff --git a/roles/dtc/common/tasks/sub_main_vxlan.yml b/roles/dtc/common/tasks/sub_main_vxlan.yml index 4abf9ae5f..bfdbd4357 100644 --- a/roles/dtc/common/tasks/sub_main_vxlan.yml +++ b/roles/dtc/common/tasks/sub_main_vxlan.yml @@ -101,6 +101,13 @@ - name: Build iBGP VXLAN Fabric Breakout Interfaces List From Template ansible.builtin.import_tasks: common/ndfc_interface_breakout.yml +# ------------------------------------------------------------------------ +# Build iBGP VXLAN Fabric PreProv Breakout Interfaces List From Template +# ------------------------------------------------------------------------ + +- name: Build iBGP VXLAN Fabric Breakout PreProv Interfaces List From Template + ansible.builtin.import_tasks: common/ndfc_interface_breakout_preprov.yml + # ------------------------------------------------------------------------ # Build iBGP VXLAN Fabric Loopback Interfaces List From Template # ------------------------------------------------------------------------ @@ -220,6 +227,7 @@ changes_detected_interfaces: "{{ changes_detected_interfaces }}" changes_detected_interface_loopback: "{{ changes_detected_interface_loopback }}" changes_detected_interface_breakout: "{{ changes_detected_interface_breakout }}" + changes_detected_interface_breakout_preprov: "{{ changes_detected_interface_breakout_preprov }}" changes_detected_interface_po_routed: "{{ changes_detected_interface_po_routed }}" changes_detected_interface_routed: "{{ changes_detected_interface_routed }}" changes_detected_interface_trunk_po: "{{ changes_detected_interface_trunk_po }}" @@ -239,6 +247,7 @@ fabric_links: "{{ fabric_links }}" edge_connections: "{{ edge_connections }}" interface_breakout: "{{ interface_breakout }}" + interface_breakout_preprov: "{{ interface_breakout_preprov }}" interface_access_po: "{{ interface_access_po }}" interface_access: "{{ interface_access }}" interface_all: "{{ interface_all }}" @@ -274,6 +283,7 @@ - "+ vPC Domain ID Detected - [ {{ vars_common_vxlan.changes_detected_vpc_domain_id_resource }} ]" - "+ ----- Interfaces -----" - "+ Interface breakout Changes Detected - [ {{ vars_common_vxlan.changes_detected_interface_breakout }} ]" + - "+ Interface PreProv breakout Changes Detected - [ {{ vars_common_vxlan.changes_detected_interface_breakout_preprov }} ]" - "+ Interface vPC Changes Detected - [ {{ vars_common_vxlan.changes_detected_interface_vpc }} ]" - "+ Interface Access Changes Detected - [ {{ vars_common_vxlan.changes_detected_interface_access }} ]" - "+ Interface Access PO Changes Detected - [ {{ vars_common_vxlan.changes_detected_interface_access_po }} ]" diff --git a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_preprov.j2 similarity index 91% rename from roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 rename to roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_preprov.j2 index 065bc1a43..7bf18496e 100644 --- a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_remove.j2 +++ b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_breakout_preprov.j2 @@ -2,9 +2,11 @@ # This NDFC breakout interface data structure is auto-generated # DO NOT EDIT MANUALLY # + {% for switch in MD_Extended.vxlan.topology.switches %} {% if switch.interface_breakouts is defined %} {% for breakout in switch.interface_breakouts %} +{% if breakout.enable_during_bootstrap is defined and breakout.enable_during_bootstrap | ansible.builtin.bool %} {% if breakout.to is defined %} {% for port in range(breakout.from, breakout.to + 1) %} - name: Ethernet{{ breakout.module }}/{{ port }} @@ -32,6 +34,7 @@ profile: map: {{ breakout.map }} {% endif %} +{% endif %} {% endfor %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_ethernet.j2 b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_ethernet.j2 new file mode 100644 index 000000000..18aa44627 --- /dev/null +++ b/roles/dtc/common/templates/ndfc_interfaces/ndfc_interface_ethernet.j2 @@ -0,0 +1 @@ +# Sample ethernet interface template for reference \ No newline at end of file diff --git a/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 b/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 index fca075a53..0a777c76d 100644 --- a/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 +++ b/roles/dtc/common/templates/ndfc_inventory/dc_external_fabric/dc_external_fabric_inventory.j2 @@ -19,7 +19,7 @@ {% if MD_Extended.vxlan.global[simplified_fabric_type].bootstrap.enable_bootstrap is defined and MD_Extended.vxlan.global[simplified_fabric_type].bootstrap.enable_bootstrap %} {# ------------------------- #} {# Switch POAP Section Start #} -{% if switch.poap is defined and switch.poap.bootstrap %} +{% if switch.poap is defined and (switch.poap.bootstrap | default(defaults.vxlan.topology.switches.poap.bootstrap) | ansible.builtin.bool) %} {% if poap_data[switch['serial_number']] is defined %} {% set pdata = poap_data[switch['serial_number']] %} poap: From 9996cb6c589f747591dd5759a5252b889d576501 Mon Sep 17 00:00:00 2001 From: mwiebe Date: Tue, 16 Sep 2025 09:27:19 -0400 Subject: [PATCH 14/14] Remove meta end_play --- .../common/tasks/common/ndfc_interface_breakout_preprov.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml b/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml index 7ac541296..d1cb685b2 100644 --- a/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml +++ b/roles/dtc/common/tasks/common/ndfc_interface_breakout_preprov.yml @@ -69,10 +69,6 @@ when: MD_Extended.vxlan.topology.interfaces.modes.breakout_preprov.count > 0 delegate_to: localhost -- debug: msg="{{ interface_breakout_preprov }}" - -# - meta: end_play - - name: Diff Previous and Current Data Files cisco.nac_dc_vxlan.dtc.diff_model_changes: file_name_previous: "{{ path_name }}{{ file_name }}.old"