Skip to content

Commit aa8c5c4

Browse files
authored
Merge pull request #806 from netascode/release_0.8.0
Release 0.8.0
2 parents a90899c + fa4722e commit aa8c5c4

59 files changed

Lines changed: 8527 additions & 921 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.rst

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,54 @@ This project adheres to `Semantic Versioning <http://semver.org/>`_.
88

99
.. contents:: ``Release Versions``
1010

11+
`0.8.0`_
12+
=====================
13+
14+
**Release Date:** ``2026-05-31``
15+
16+
Added
17+
-----
18+
* This release delivers the DTC Pythonic Consolidation
19+
* This is a major architectural refactor of the Direct-to-Controller (DTC) roles that replaces per-fabric YAML task files with a unified, data-driven pipeline powered by Python action plugins and externalized YAML registries.
20+
* ``cr_manage_vrfs_networks`` split into independent ``cr_manage_vrfs`` and ``cr_manage_networks`` tags
21+
* Added ``role_create`` and ``role_remove`` top-level role tags
22+
* Added ``cr_manage_links`` and ``cr_manage_tor_pairing`` to iBGP and eBGP VXLAN tag sets
23+
* General performance improvements
24+
25+
Fixed
26+
-----
27+
28+
* https://github.com/netascode/ansible-dc-vxlan/issues/767
29+
* https://github.com/netascode/ansible-dc-vxlan/issues/783
30+
* https://github.com/netascode/ansible-dc-vxlan/issues/786
31+
32+
* Template Fixes
33+
34+
* ndfc_bgw_anycast_vip.j2, ndfc_underlay_ip_address.j2, ndfc_vpc_domain_id_resource.j2
35+
36+
* Switched from bare ``vxlan.*`` references to fully-qualified ``data_model_extended.vxlan.*``
37+
38+
* ndfc_fabric_links.j2
39+
40+
* Added ``peer1_ipv4_addr`` / ``peer2_ipv4_addr`` support for numbered fabric links
41+
42+
* ndfc_policy.j2
43+
44+
* Added guard for empty switches list to prevent empty policy render
45+
46+
* dc_vxlan_fabric_attach_vrfs_loopbacks.j2, msd_fabric_attach_vrfs_loopbacks.j2, mcfg_fabric_attach_vrfs_loopbacks.j2
47+
48+
* Widened loopback attach condition to include ``loopback_ipv4``, ``loopback_ipv6``, and ``freeform_config``
49+
50+
* ndfc_underlay_ip_address.j2
51+
52+
* Added anycast RP resource allocation for multicast replication mode
53+
54+
* mcfg_fabric_attach_vrfs_loopbacks.j2
55+
56+
* Fixed ``vlan_id`` type (quoted string for NDFC API)
57+
58+
1159
`0.7.2`_
1260
=====================
1361

@@ -520,6 +568,7 @@ The following roles have been added to the collection:
520568

521569
This version of the collection includes support for an IPv4 Underlay only. Support for IPv6 Underlay will be available in the next release.
522570

571+
.. _0.8.0: https://github.com/netascode/ansible-dc-vxlan/compare/0.7.2...0.8.0
523572
.. _0.7.2: https://github.com/netascode/ansible-dc-vxlan/compare/0.7.1...0.7.2
524573
.. _0.7.1: https://github.com/netascode/ansible-dc-vxlan/compare/0.7.0...0.7.1
525574
.. _0.7.0: https://github.com/netascode/ansible-dc-vxlan/compare/0.6.0...0.7.0

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ We welcome community contributions to this collection. If you find problems, ple
462462

463463
MIT License
464464

465-
Copyright (c) 2024-2025 Cisco and/or its affiliates.
465+
Copyright (c) 2024-2026 Cisco and/or its affiliates.
466466

467467
Permission is hereby granted, free of charge, to any person obtaining a copy
468468
of this software and associated documentation files (the "Software"), to deal

galaxy.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
namespace: cisco
33
name: nac_dc_vxlan
4-
version: 0.7.2
4+
version: 0.8.0
55
readme: README.md
66
authors:
77
- Charly Coueffe <ccoueffe>
@@ -32,5 +32,5 @@ tags: [cisco, dc, nd, ndfc, nxos, networking, vxlan, evpn, nac, sac]
3232

3333
dependencies:
3434
"ansible.netcommon": ">=4.1.0"
35-
"cisco.dcnm": ">=3.11.1"
35+
"cisco.dcnm": ">=3.12.0"
3636
"community.general": ">=8.5.0"

plugins/action/common/get_credentials.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,7 @@ def run(self, tmp=None, task_vars=None):
207207
display.vvv(f"Using group_vars discovery credentials from model data for device {device_ip}")
208208

209209
results['updated_inv_list'] = updated_inv_list
210+
# Convention: post-hooks that produce module-ready data set 'module_data'
211+
# so build_resource_data can pass it directly to downstream NDFC modules.
212+
results['module_data'] = updated_inv_list
210213
return results

plugins/action/common/nac_dc_validate.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ def run(self, tmp=None, task_vars=None):
8989
schema = DEFAULT_SCHEMA
9090

9191
rules_list = []
92+
data_model_loaded = None
9293
if rules and task_vars['role_path'] in rules:
9394
# Load in-memory data model using iac-validate
9495
# Perform the load in this if block to avoid loading the data model multiple times when custom enhanced rules are provided
9596
results['data'] = load_yaml_files([mdata])
97+
data_model_loaded = results['data']
9698

9799
# Introduce common directory to the rules list by default once vrf and network rules are updated
98100
parent_keys = ['vxlan', 'fabric']
@@ -156,11 +158,17 @@ def run(self, tmp=None, task_vars=None):
156158
# Else block to pickup custom enhanced rules provided by the user
157159
rules_list.append(f'{rules}')
158160

161+
syntax_validated = False
159162
for rules_item in rules_list:
160163
validator = nac_validate.validator.Validator(schema, rules_item)
161-
if schema:
164+
if schema and not syntax_validated and validator.schema is not None:
162165
validator.validate_syntax([mdata])
166+
syntax_validated = True
163167
if rules_item:
168+
if data_model_loaded is None:
169+
data_model_loaded = load_yaml_files([mdata])
170+
results['data'] = data_model_loaded
171+
validator.data = data_model_loaded
164172
validator.validate_semantics([mdata])
165173

166174
msg = ""

plugins/action/common/read_run_map.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ def run(self, tmp=None, task_vars=None):
4040
results['diff_run'] = True
4141
results['validate_only_run'] = False
4242

43+
fabric_name = self._task.args.get('fabric_name')
4344
data_model = self._task.args.get('data_model')
4445
play_tags = self._task.args.get('play_tags')
45-
fabric_name = data_model['vxlan']['fabric']['name']
46+
if fabric_name is None:
47+
fabric_name = data_model['vxlan']['fabric']['name']
4648

4749
if 'dtc' in task_vars['role_path']:
4850
common_role_path = os.path.dirname(task_vars['role_path'])

plugins/action/common/run_map.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,12 @@ def run(self, tmp=None, task_vars=None):
4141
results = super(ActionModule, self).run(tmp, task_vars)
4242
results['failed'] = False
4343

44+
fabric_name = self._task.args.get('fabric_name')
4445
data_model = self._task.args.get('data_model')
4546
stage = self._task.args['stage']
4647

47-
fabric_name = data_model['vxlan']['fabric']['name']
48+
if fabric_name is None:
49+
fabric_name = data_model['vxlan']['fabric']['name']
4850

4951
if 'dtc' in task_vars['role_path']:
5052
common_role_path = os.path.dirname(task_vars['role_path'])

0 commit comments

Comments
 (0)