Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
007a934
Adding support for pre-prov breakout interfaces
peter8498 Jul 16, 2025
eb498ae
Adding breakout of pre-prov for ISN and External fabrics
peter8498 Jul 16, 2025
c0ec646
Update ndfc_interface_breakout.j2
peter8498 Jul 17, 2025
caafcbc
Added support for breakout pre-prov in remove
peter8498 Jul 24, 2025
0ae8067
Support pre-prov remove role
peter8498 Jul 25, 2025
826ff00
Update ndfc_interface_breakout.yml
peter8498 Aug 1, 2025
6020667
Update prep_105_topology_interfaces.py
peter8498 Aug 5, 2025
3d71b13
Merge branch 'develop' into fix_breakout_preprov
peter8498 Aug 27, 2025
ce38db2
Update prep_105_topology_interfaces.py
peter8498 Sep 3, 2025
097a2e1
Merge branch 'develop' into fix_breakout_preprov
peter8498 Sep 8, 2025
39e13de
Merge branch 'develop' into fix_breakout_preprov
mikewiebe Sep 9, 2025
22d9076
Updated breakout remove logic
peter8498 Sep 11, 2025
987ce8b
Remove clause to filter out
peter8498 Sep 11, 2025
3693abf
Removed filter on interface remove role
peter8498 Sep 11, 2025
21243d5
Removed unnecessary comments and defaults
peter8498 Sep 11, 2025
82a76bb
Merge branch 'develop' into fix_breakout_preprov
mikewiebe Sep 11, 2025
9d44573
Merge branch 'develop' into fix_breakout_preprov
mikewiebe Sep 15, 2025
ba5ee15
Separate breakout and preprov breakout workflows
mikewiebe Sep 16, 2025
9996cb6
Remove meta end_play
mikewiebe Sep 16, 2025
e026e3a
Merge branch 'develop' into fix_breakout_preprov
mikewiebe Sep 16, 2025
6acb5ff
Merge branch 'develop' into fix_breakout_preprov
mikewiebe Sep 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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'])
Expand Down Expand Up @@ -112,11 +116,19 @@ 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 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']
6 changes: 5 additions & 1 deletion roles/dtc/common/tasks/common/ndfc_interface_all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
ansible.builtin.set_fact:
interface_all: "{{
interface_breakout +
interface_breakout_preprov +
interface_access +
interface_access_po +
interface_trunk +
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# 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

- 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']
10 changes: 10 additions & 0 deletions roles/dtc/common/tasks/sub_main_ebgp_vxlan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
# --------------------------------------------------------------------
Expand Down Expand Up @@ -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 }}"
Expand All @@ -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 }}"
Expand Down Expand Up @@ -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 }} ]"
Expand Down
10 changes: 10 additions & 0 deletions roles/dtc/common/tasks/sub_main_external.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
# ----------------------------------------------------------------------------
Expand Down Expand Up @@ -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 }}"
Expand All @@ -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 }}"
Expand Down Expand Up @@ -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 }} ]"
Expand Down
10 changes: 10 additions & 0 deletions roles/dtc/common/tasks/sub_main_isn.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
# ------------------------------------------------------------------------
Expand Down Expand Up @@ -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 }}"
Expand All @@ -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 }}"
Expand 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 }} ]"
Expand Down
10 changes: 10 additions & 0 deletions roles/dtc/common/tasks/sub_main_vxlan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
# ------------------------------------------------------------------------
Expand Down Expand Up @@ -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 }}"
Expand All @@ -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 }}"
Expand Down Expand Up @@ -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 }} ]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 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 }}
Expand Down Expand Up @@ -33,6 +34,7 @@
profile:
map: {{ breakout.map }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
# 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 }}
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 %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Sample ethernet interface template for reference
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,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:
Expand Down
Loading