diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index e4f13b8f0..a99085101 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -8,6 +8,30 @@ This project adheres to `Semantic Versioning `_.
.. contents:: ``Release Versions``
+`3.11.0`_
+=====================
+
+**Release Date:** ``2026-03-13``
+
+Added
+-----
+
+- Added support for External fabric type in the dcnm_fabric module
+- Added support for the following parameters in the dcnm_interface module
+ - `enable_qos`
+ - `qos_policy`
+ - `queuing_policy
+
+
+Fixed
+-----
+
+- https://github.com/CiscoDevNet/ansible-dcnm/issues/440
+- https://github.com/CiscoDevNet/ansible-dcnm/issues/525
+- https://github.com/CiscoDevNet/ansible-dcnm/issues/617
+- https://github.com/CiscoDevNet/ansible-dcnm/issues/634
+- https://github.com/CiscoDevNet/ansible-dcnm/issues/637
+
`3.10.0`_
=====================
@@ -45,7 +69,6 @@ Fixed
- https://github.com/CiscoDevNet/ansible-dcnm/issues/615
- https://github.com/CiscoDevNet/ansible-dcnm/issues/626
-
`3.9.1`_
=====================
@@ -698,6 +721,7 @@ The Ansible Cisco Data Center Network Manager (DCNM) collection includes modules
- cisco.dcnm.dcnm_network - Add and remove Networks from a DCNM managed VXLAN fabric.
- cisco.dcnm.dcnm_interface - DCNM Ansible Module for managing interfaces.
+.. _3.11.0: https://github.com/CiscoDevNet/ansible-dcnm/compare/3.10.0...3.11.0
.. _3.10.0: https://github.com/CiscoDevNet/ansible-dcnm/compare/3.9.1...3.10.0
.. _3.9.1: https://github.com/CiscoDevNet/ansible-dcnm/compare/3.9.0...3.9.1
.. _3.9.0: https://github.com/CiscoDevNet/ansible-dcnm/compare/3.8.1...3.9.0
diff --git a/README.md b/README.md
index 7c1c6aabc..36a2b3537 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ This collection is intended for use with the following release versions:
## Ansible version compatibility
-This collection has been tested against following Ansible Core versions:
+This collection has been tested against following Ansible Core versions:
* `2.14.x`
* `2.15.x`
* `2.16.x`
@@ -58,7 +58,7 @@ Name | Description
[cisco.dcnm.dcnm_service_policy](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_service_policy_module.rst)|DCNM ansible module for managing service policies.
[cisco.dcnm.dcnm_service_route_peering](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_service_route_peering_module.rst)|DCNM Ansible Module for managing Service Route Peerings.
[cisco.dcnm.dcnm_template](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_template_module.rst)|DCNM Ansible Module for managing templates.
-[cisco.dcnm.dcnm_vpc_pair](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_vpc_pair_module.rst)|DCNM Ansible Module for managing VPC switch pairs required for VPC interfaces.
+[cisco.dcnm.dcnm_vpc_pair](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_vpc_pair_module.rst)|DCNM Ansible Module for managing vPC switch pairs required for vPC interfaces.
[cisco.dcnm.dcnm_vrf](https://github.com/CiscoDevNet/ansible-dcnm/blob/main/docs/cisco.dcnm.dcnm_vrf_module.rst)|Add and remove VRFs from a ND managed VXLAN fabric.
@@ -77,7 +77,7 @@ You can also include it in a `requirements.yml` file and install it with `ansibl
---
collections:
- name: cisco.dcnm
- version: 3.10.0
+ version: 3.11.0
```
## Using this collection
diff --git a/docs/cisco.dcnm.dcnm_fabric_module.rst b/docs/cisco.dcnm.dcnm_fabric_module.rst
index f588ac921..da65dd683 100644
--- a/docs/cisco.dcnm.dcnm_fabric_module.rst
+++ b/docs/cisco.dcnm.dcnm_fabric_module.rst
@@ -3028,6 +3028,944 @@ Parameters
Save and deploy the fabric configuration.
+
+ |
+
+
+ EXTERNAL_FABRIC_PARAMETERS
+
+
+ -
+
+ |
+
+ |
+
+ External fabric specific parameters.
+ Also known as External Connectivity Network.
+ The following parameters are specific to External fabrics.
+ Fabric type attached to Border Leaf switches to connect VXLAN EVPN fabrics via VRF-Lite.
+ The indentation of these parameters is meant only to logically group them.
+ They should be at the same YAML level as FABRIC_TYPE and FABRIC_NAME.
+ |
+
+
+ |
+ |
+
+
+ AAA_REMOTE_IP_ENABLED
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable only, when IP Authorization is enabled in the AAA Server
+ |
+
+
+ |
+ |
+
+
+ AAA_SERVER_CONF
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ AAA Configurations
+ |
+
+
+ |
+ |
+
+
+ BGP_AS
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ 1-4294967295 | 1-65535.0-65535 It is a good practice to have a unique ASN for each Fabric.
+ |
+
+
+ |
+ |
+
+
+ BOOTSTRAP_CONF
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Additional CLIs required during device bootup/login e.g. AAA/Radius
+ |
+
+
+ |
+ |
+
+
+ BOOTSTRAP_CONF_XE
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Additional CLIs required during device bootup/login e.g. AAA/Radius
+ |
+
+
+ |
+ |
+
+
+ BOOTSTRAP_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Automatic IP Assignment For POAP
+ |
+
+
+ |
+ |
+
+
+ BOOTSTRAP_MULTISUBNET
+
+
+ string
+
+ |
+
+ Default:
"#Scope_Start_IP, Scope_End_IP, Scope_Default_Gateway, Scope_Subnet_Prefix"
+ |
+
+ lines with # prefix are ignored here
+ |
+
+
+ |
+ |
+
+
+ CDP_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable CDP on management interface
+ |
+
+
+ |
+ |
+
+
+ DHCP_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Automatic IP Assignment For POAP From Local DHCP Server
+ |
+
+
+ |
+ |
+
+
+ DHCP_END
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ End Address For Switch POAP
+ |
+
+
+ |
+ |
+
+
+ DHCP_IPV6_ENABLE
+
+
+ string
+
+ |
+
+ Choices:
+ DHCPv4 ←
+ - DHCPv6
+
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ DHCP_START
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Start Address For Switch POAP
+ |
+
+
+ |
+ |
+
+
+ DOMAIN_NAME
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Domain name for DHCP server PnP block
+ |
+
+
+ |
+ |
+
+
+ ENABLE_AAA
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Include AAA configs from Advanced tab during device bootup
+ |
+
+
+ |
+ |
+
+
+ ENABLE_NETFLOW
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable Netflow on VTEPs
+ |
+
+
+ |
+ |
+
+
+ ENABLE_NXAPI
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable HTTPS NX-API
+ |
+
+
+ |
+ |
+
+
+ ENABLE_NXAPI_HTTP
+
+
+ boolean
+
+ |
+
+
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ ENABLE_RT_INTF_STATS
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Valid for NX-OS only
+ |
+
+
+ |
+ |
+
+
+ enableRealTimeBackup
+
+
+ boolean
+
+ |
+
+
+ Default:
""
+ |
+
+ Backup hourly only if there is any config deployment since last backup
+ |
+
+
+ |
+ |
+
+
+ enableScheduledBackup
+
+
+ boolean
+
+ |
+
+
+ Default:
""
+ |
+
+ Backup at the specified time
+ |
+
+
+ |
+ |
+
+
+ FABRIC_FREEFORM
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Additional supported CLIs for all same OS (e.g. all NxOS or IOS-XE, etc) switches
+ |
+
+
+ |
+ |
+
+
+ FABRIC_NAME
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Please provide the fabric name to create it (Max Size 64)
+ |
+
+
+ |
+ |
+
+
+ FEATURE_PTP
+
+
+ boolean
+
+ |
+
+
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ INBAND_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable POAP over Inband Interface (Pre-req: Inband Mgmt Knob should be Enabled)
+ |
+
+
+ |
+ |
+
+
+ INBAND_MGMT
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Import switches with inband connectivity
+ |
+
+
+ |
+ |
+
+
+ INTF_STAT_LOAD_INTERVAL
+
+
+ integer
+
+ |
+
+ Default:
10
+ |
+
+ Time in seconds
+ |
+
+
+ |
+ |
+
+
+ IS_READ_ONLY
+
+
+ boolean
+
+ |
+
+
+ |
+
+ If enabled, fabric is only monitored. No configuration will be deployed
+ |
+
+
+ |
+ |
+
+
+ MGMT_GW
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Default Gateway For Management VRF On The Switch
+ |
+
+
+ |
+ |
+
+
+ MGMT_PREFIX
+
+
+ integer
+
+ |
+
+ Default:
24
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ MGMT_V6PREFIX
+
+
+ integer
+
+ |
+
+ Default:
64
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ MPLS_HANDOFF
+
+
+ boolean
+
+ |
+
+
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ MPLS_LB_ID
+
+
+ integer
+
+ |
+
+ Default:
101
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ MPLS_LOOPBACK_IP_RANGE
+
+
+ string
+
+ |
+
+ Default:
"10.102.0.0/25"
+ |
+
+ MPLS Loopback IP Address Range
+ |
+
+
+ |
+ |
+
+
+ NETFLOW_EXPORTER_LIST
+
+
+ list
+ / elements=string
+
+ |
+
+ Default:
""
+ |
+
+ One or Multiple Netflow Exporters
+ |
+
+
+ |
+ |
+
+
+ NETFLOW_MONITOR_LIST
+
+
+ list
+ / elements=string
+
+ |
+
+ Default:
""
+ |
+
+ One or Multiple Netflow Monitors
+ |
+
+
+ |
+ |
+
+
+ NETFLOW_RECORD_LIST
+
+
+ list
+ / elements=string
+
+ |
+
+ Default:
""
+ |
+
+ One or Multiple Netflow Records
+ |
+
+
+ |
+ |
+
+
+ NETFLOW_SAMPLER_LIST
+
+
+ list
+ / elements=string
+
+ |
+
+ Default:
""
+ |
+
+ One or multiple netflow samplers. Applicable to N7K only
+ |
+
+
+ |
+ |
+
+
+ NXAPI_HTTP_PORT
+
+
+ integer
+
+ |
+
+ Default:
80
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ NXAPI_HTTPS_PORT
+
+
+ integer
+
+ |
+
+ Default:
443
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ PM_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ PNP_ENABLE
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable Plug n Play (Automatic IP Assignment) for Cat9K switches
+ |
+
+
+ |
+ |
+
+
+ POWER_REDUNDANCY_MODE
+
+
+ string
+
+ |
+
+ Choices:
+ ps-redundant ←
+ - combined
+ - insrc-redundant
+
+ |
+
+ Default Power Supply Mode For Bootstrapped NX-OS Switches
+ |
+
+
+ |
+ |
+
+
+ PTP_DOMAIN_ID
+
+
+ integer
+
+ |
+
+ Default:
0
+ |
+
+ Multiple Independent PTP Clocking Subdomains on a Single Network
+ |
+
+
+ |
+ |
+
+
+ PTP_LB_ID
+
+
+ integer
+
+ |
+
+ Default:
0
+ |
+
+ No description available
+ |
+
+
+ |
+ |
+
+
+ scheduledTime
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Time (UTC) in 24hr format. (00:00 to 23:59)
+ |
+
+
+ |
+ |
+
+
+ SNMP_SERVER_HOST_TRAP
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Configure NDFC as a receiver for SNMP traps
+ |
+
+
+ |
+ |
+
+
+ SUBINTERFACE_RANGE
+
+
+ string
+
+ |
+
+ Default:
"2-511"
+ |
+
+ Per Border Dot1q Range For VRF Lite Connectivity
+ |
+
+
|
@@ -3058,6 +3996,7 @@ Parameters
|
|
+
+ |
+ |
+
+
+ enable_qos
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable QoS on the interface. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ |
+
|
|
@@ -823,6 +844,42 @@ Parameters
Spanning-tree edge port behavior
+
+ |
+ |
+
+
+ qos_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ |
+
+
+ |
+ |
+
+
+ queuing_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Queuing policy name to apply to the interface. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ |
+
|
|
@@ -1252,6 +1309,27 @@ Parameters
State of Priority Flow Control (PFC) on the interface
+
+ |
+ |
+
+
+ enable_qos
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable QoS on the interface. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ |
+
|
|
@@ -1429,6 +1507,42 @@ Parameters
interface orphan port behavior when switch is in vPC
+
+ |
+ |
+
+
+ qos_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ |
+
+
+ |
+ |
+
+
+ queuing_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Queuing policy name to apply to the interface. This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ |
+
|
|
@@ -2501,6 +2615,27 @@ Parameters
Enable lacp convergence for vPC port-channels
+
+ |
+ |
+
+
+ enable_qos
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Enable QoS on the interface. This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ |
+
|
|
@@ -2892,6 +3027,42 @@ Parameters
Spanning-tree edge port behavior
+
+ |
+ |
+
+
+ qos_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true. This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ |
+
+
+ |
+ |
+
+
+ queuing_policy
+
+
+ string
+
+ |
+
+ Default:
""
+ |
+
+ Queuing policy name to apply to the interface. This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ |
+
|
diff --git a/docs/cisco.dcnm.dcnm_log_module.rst b/docs/cisco.dcnm.dcnm_log_module.rst
index c294bfb49..555fae1fa 100644
--- a/docs/cisco.dcnm.dcnm_log_module.rst
+++ b/docs/cisco.dcnm.dcnm_log_module.rst
@@ -116,7 +116,7 @@ Examples
Return Values
-------------
-Common return values are documented `here `_, the following are the fields unique to this module:
+Common return values are documented `here `_, the following are the fields unique to this module:
.. raw:: html
diff --git a/docs/cisco.dcnm.dcnm_rest_module.rst b/docs/cisco.dcnm.dcnm_rest_module.rst
index 9d3f75ff0..b49666612 100644
--- a/docs/cisco.dcnm.dcnm_rest_module.rst
+++ b/docs/cisco.dcnm.dcnm_rest_module.rst
@@ -154,7 +154,7 @@ Examples
Return Values
-------------
-Common return values are documented `here `_, the following are the fields unique to this module:
+Common return values are documented `here `_, the following are the fields unique to this module:
.. raw:: html
diff --git a/docs/cisco.dcnm.dcnm_vpc_pair_module.rst b/docs/cisco.dcnm.dcnm_vpc_pair_module.rst
index 909d13c65..0da38e893 100644
--- a/docs/cisco.dcnm.dcnm_vpc_pair_module.rst
+++ b/docs/cisco.dcnm.dcnm_vpc_pair_module.rst
@@ -5,7 +5,7 @@
cisco.dcnm.dcnm_vpc_pair
************************
-**DCNM Ansible Module for managing VPC switch pairs required for VPC interfaces.**
+**DCNM Ansible Module for managing vPC switch pairs required for vPC interfaces.**
Version added: 3.5.0
@@ -17,7 +17,7 @@ Version added: 3.5.0
Synopsis
--------
-- DCNM Ansible Module for managing VPC switch pairs.
+- DCNM Ansible Module for managing vPC switch pairs.
@@ -47,7 +47,7 @@ Parameters
Default:
[]
- A list of dictionaries containing VPC switch pair information
+ A list of dictionaries containing vPC switch pair information
|
@@ -64,7 +64,7 @@ Parameters
|
|
- IP Address/Host Name of Peer1 of VPC switch pair.
+ IP Address/Host Name of Peer1 of vPC switch pair.
|
@@ -81,7 +81,7 @@ Parameters
|
|
- IP Address/Host Name of Peer2 of VPC switch pair.
+ IP Address/Host Name of Peer2 of vPC switch pair.
|
@@ -97,7 +97,7 @@ Parameters
|
|
- A dictionary of additional VPC switch pair related parameters that must be included while creating VPC switch pairs.
+ A dictionary of additional vPC switch pair related parameters that must be included while creating vPC switch pairs.
|
@@ -141,7 +141,7 @@ Parameters
|
- Vlans that are allowed on the VPC peer link port-channel.
+ Vlans that are allowed on the vPC peer link port-channel.
|
@@ -159,7 +159,7 @@ Parameters
|
|
- VPC domain ID.
+ vPC domain ID.
Minimum value is 1 and Maximum value is 1000.
|
@@ -178,7 +178,7 @@ Parameters
|
- Name of the target fabric for VPC switch pair operations.
+ Name of the target fabric for vPC switch pair operations.
|
@@ -477,10 +477,30 @@ Parameters
|
|
- Name of the template which inlcudes the required parameters for creating the VPC switch pair.
+ Name of the template which inlcudes the required parameters for creating the vPC switch pair.
This parameter is 'mandatory' if the fabric is of type 'LANClassic' or 'External'. It is optional otherwise.
|
+
+ |
+
+
+ useVirtualPeerlink
+
+
+ boolean
+
+ |
+
+
+ |
+
+ Flag to enable or disable the use of a virtual peer link (fabric peering) for the vPC switch pair.
+ |
+
|
@@ -514,7 +534,7 @@ Parameters
|
|
- Name of the target fabric for VPC switch pair operations
+ Name of the target fabric for vPC switch pair operations
|
@@ -573,44 +593,44 @@ Examples
# This module supports the following states:
#
# Merged:
- # VPC switch pairs defined in the playbook will be merged into the target fabric.
+ # vPC switch pairs defined in the playbook will be merged into the target fabric.
#
- # The VPC switch pairs listed in the playbook will be created if not already present on the DCNM
- # server. If the VPC switch pair is already present and the configuration information included
+ # The vPC switch pairs listed in the playbook will be created if not already present on the DCNM
+ # server. If the vPC switch pair is already present and the configuration information included
# in the playbook is either different or not present in DCNM, then the corresponding
- # information is added to the DCNM. If a VPC switch pair mentioned in playbook
+ # information is added to the DCNM. If a vPC switch pair mentioned in playbook
# is already present on DCNM and there is no difference in configuration, no operation
# will be performed for such switch pairs.
#
# Replaced:
- # VPC switch pairs defined in the playbook will be replaced in the target fabric.
+ # vPC switch pairs defined in the playbook will be replaced in the target fabric.
#
- # The state of the VPC switch pairs listed in the playbook will serve as source of truth for the
- # same VPC switch pairs present on the DCNM under the fabric mentioned. Additions and updations
- # will be done to bring the DCNM VPC switch pairs to the state listed in the playbook.
- # Note: Replace will only work on the VPC switch pairs mentioned in the playbook.
+ # The state of the vPC switch pairs listed in the playbook will serve as source of truth for the
+ # same vPC switch pairs present on the DCNM under the fabric mentioned. Additions and updations
+ # will be done to bring the DCNM vPC switch pairs to the state listed in the playbook.
+ # Note: Replace will only work on the vPC switch pairs mentioned in the playbook.
#
# Overridden:
- # VPC switch pairs defined in the playbook will be overridden in the target fabric.
+ # vPC switch pairs defined in the playbook will be overridden in the target fabric.
#
- # The state of the VPC switch pairs listed in the playbook will serve as source of truth for all
- # the VPC switch pairs under the fabric mentioned. Additions and deletions will be done to bring
- # the DCNM VPC switch pairs to the state listed in the playbook. All VPC switch pairs other than the
+ # The state of the vPC switch pairs listed in the playbook will serve as source of truth for all
+ # the vPC switch pairs under the fabric mentioned. Additions and deletions will be done to bring
+ # the DCNM vPC switch pairs to the state listed in the playbook. All vPC switch pairs other than the
# ones mentioned in the playbook will be deleted.
- # Note: Override will work on the all the VPC switch pairs present in the DCNM Fabric.
+ # Note: Override will work on the all the vPC switch pairs present in the DCNM Fabric.
#
# Deleted:
- # VPC switch pairs defined in the playbook will be deleted in the target fabric.
+ # vPC switch pairs defined in the playbook will be deleted in the target fabric.
#
- # Deletes the list of VPC switch pairs specified in the playbook. If the playbook does not include
- # any VPC switch pair information, then all VPC switch pairs from the fabric will be deleted.
+ # Deletes the list of vPC switch pairs specified in the playbook. If the playbook does not include
+ # any vPC switch pair information, then all vPC switch pairs from the fabric will be deleted.
#
# Query:
- # Returns the current DCNM state for the VPC switch pairs listed in the playbook.
+ # Returns the current DCNM state for the vPC switch pairs listed in the playbook.
- # CREATE VPC SWITCH PAIR (LANClassic or External fabrics)
+ # CREATE vPC SWITCH PAIR (LANClassic or External fabrics)
- - name: Merge VPC switch pair paremeters
+ - name: Merge vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -640,9 +660,9 @@ Examples
PEER2_PO_CONF: "buffer-boost"
PEER2_PO_DESC: "This is peer2 PC"
- # CREATE VPC SWITCH PAIR (VXLAN fabrics)
+ # CREATE vPC SWITCH PAIR (VXLAN fabrics)
- - name: Merge VPC switch pair paremeters
+ - name: Merge vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -651,9 +671,9 @@ Examples
- peerOneId: 192.168.1.1
peerTwoId: 192.168.1.2
- # DELETE VPC SWITCH PAIR
+ # DELETE vPC SWITCH PAIR
- - name: Delete VPC switch pair
+ - name: Delete vPC switch pair
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -662,9 +682,9 @@ Examples
- peerOneId: 192.168.1.1
peerTwoId: 192.168.1.2
- # REPLACE VPC SWITCH PAIR (LANClassic or External fabrics)
+ # REPLACE vPC SWITCH PAIR (LANClassic or External fabrics)
- - name: Replace VPC switch pair paremeters
+ - name: Replace vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -694,9 +714,9 @@ Examples
PEER2_PO_CONF: "buffer-boost"
PEER2_PO_DESC: "This is peer2 PC"
- # OVERRIDDE VPC SWITCH PAIRS
+ # OVERRIDDE vPC SWITCH PAIRS
- - name: Override with a new VPC switch pair
+ - name: Override with a new vPC switch pair
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -728,14 +748,14 @@ Examples
deploy: true
state: overridden
- # QUERY VPC SWITCH PAIRS
+ # QUERY vPC SWITCH PAIRS
- - name: Query VPC switch pairs - with no filters
+ - name: Query vPC switch pairs - with no filters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
- - name: Query VPC switch pairs - with both peers specified
+ - name: Query vPC switch pairs - with both peers specified
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
@@ -743,7 +763,7 @@ Examples
- peerOneId: "{{ ansible_switch1 }}"
peerTwoId: "{{ ansible_switch2 }}"
- - name: Query VPC switch pairs - with one peer specified
+ - name: Query vPC switch pairs - with one peer specified
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
diff --git a/galaxy.yml b/galaxy.yml
index 3eeac173e..8ab04d984 100644
--- a/galaxy.yml
+++ b/galaxy.yml
@@ -1,7 +1,7 @@
---
namespace: cisco
name: dcnm
-version: 3.10.0
+version: 3.11.0
readme: README.md
authors:
- Shrishail Kariyappanavar
diff --git a/plugins/module_utils/fabric/fabric_types.py b/plugins/module_utils/fabric/fabric_types.py
index edc0ac814..c9485e505 100644
--- a/plugins/module_utils/fabric/fabric_types.py
+++ b/plugins/module_utils/fabric/fabric_types.py
@@ -77,6 +77,7 @@ def _init_fabric_types(self) -> None:
"""
self._fabric_type_to_template_name_map = {}
self._fabric_type_to_template_name_map["BGP"] = "Easy_Fabric_eBGP"
+ self._fabric_type_to_template_name_map["External"] = "External_Fabric"
self._fabric_type_to_template_name_map["IPFM"] = "Easy_Fabric_IPFM"
self._fabric_type_to_template_name_map["ISN"] = "External_Fabric"
self._fabric_type_to_template_name_map["LAN_CLASSIC"] = "LAN_Classic"
@@ -88,6 +89,7 @@ def _init_fabric_types(self) -> None:
# on the controller to enable the fabric type.
self._fabric_type_to_feature_name_map = {}
self._fabric_type_to_feature_name_map["BGP"] = "vxlan"
+ self._fabric_type_to_feature_name_map["External"] = "vxlan"
self._fabric_type_to_feature_name_map["IPFM"] = "pmn"
self._fabric_type_to_feature_name_map["ISN"] = "vxlan"
self._fabric_type_to_feature_name_map["LAN_CLASSIC"] = "lan"
@@ -104,6 +106,7 @@ def _init_fabric_types(self) -> None:
#
# Exposed via property fabric_type_to_ext_fabric_type_map
self._fabric_type_to_ext_fabric_type_map = {}
+ self._fabric_type_to_ext_fabric_type_map["External"] = "External Connectivity Network"
self._fabric_type_to_ext_fabric_type_map["ISN"] = "Multi-Site External Network"
self._valid_fabric_types = sorted(self._fabric_type_to_template_name_map.keys())
@@ -116,6 +119,7 @@ def _init_fabric_types(self) -> None:
#
# Exposed via property external_fabric_types
self._external_fabric_types = set()
+ self._external_fabric_types.add("External")
self._external_fabric_types.add("ISN")
self._mandatory_parameters_all_fabrics = []
@@ -126,6 +130,9 @@ def _init_fabric_types(self) -> None:
self._mandatory_parameters["BGP"] = copy.copy(
self._mandatory_parameters_all_fabrics
)
+ self._mandatory_parameters["External"] = copy.copy(
+ self._mandatory_parameters_all_fabrics
+ )
self._mandatory_parameters["IPFM"] = copy.copy(
self._mandatory_parameters_all_fabrics
)
@@ -141,14 +148,18 @@ def _init_fabric_types(self) -> None:
self._mandatory_parameters["VXLAN_EVPN"] = copy.copy(
self._mandatory_parameters_all_fabrics
)
+
self._mandatory_parameters["BGP"].append("BGP_AS")
+ self._mandatory_parameters["External"].append("BGP_AS")
self._mandatory_parameters["ISN"].append("BGP_AS")
self._mandatory_parameters["VXLAN_EVPN"].append("BGP_AS")
+
self._mandatory_parameters["VXLAN_EVPN_MSD"] = copy.copy(
self._mandatory_parameters_all_fabrics
)
self._mandatory_parameters["BGP"].sort()
+ self._mandatory_parameters["External"].sort()
self._mandatory_parameters["IPFM"].sort()
self._mandatory_parameters["ISN"].sort()
self._mandatory_parameters["LAN_CLASSIC"].sort()
diff --git a/plugins/module_utils/network/dcnm/dcnm.py b/plugins/module_utils/network/dcnm/dcnm.py
index 0498cae44..75e9da514 100644
--- a/plugins/module_utils/network/dcnm/dcnm.py
+++ b/plugins/module_utils/network/dcnm/dcnm.py
@@ -37,7 +37,8 @@
FEDERATION_MANAGER_NOT_FOUND_ERRORS = [
'Invalid JSON response: this API is allowed only for remote user',
'A federation manager does not exist',
- 'Invalid JSON response: cannot serve APIs as federation state is secondary. Use primary cluster for APIs'
+ 'Invalid JSON response: cannot serve APIs as federation state is secondary. Use primary cluster for APIs',
+ 'Invalid JSON response: cannot serve APIs as federation state is not established yet'
]
dcnm_paths = {
diff --git a/plugins/modules/dcnm_fabric.py b/plugins/modules/dcnm_fabric.py
index 749533cb0..930e46a36 100644
--- a/plugins/modules/dcnm_fabric.py
+++ b/plugins/modules/dcnm_fabric.py
@@ -63,6 +63,7 @@
FABRIC_TYPE:
choices:
- BGP
+ - External
- IPFM
- ISN
- LAN_CLASSIC
@@ -3558,6 +3559,312 @@
- Default Overlay VRF Template For Borders
required: false
type: str
+ EXTERNAL_FABRIC_PARAMETERS:
+ description:
+ - External fabric specific parameters.
+ - Also known as External Connectivity Network.
+ - The following parameters are specific to External fabrics.
+ - Fabric type attached to Border Leaf switches to connect VXLAN EVPN fabrics via VRF-Lite.
+ - The indentation of these parameters is meant only to logically group them.
+ - They should be at the same YAML level as FABRIC_TYPE and FABRIC_NAME.
+ suboptions:
+ AAA_REMOTE_IP_ENABLED:
+ default: false
+ description:
+ - Enable only, when IP Authorization is enabled in the AAA Server
+ required: false
+ type: bool
+ AAA_SERVER_CONF:
+ default: ''
+ description:
+ - AAA Configurations
+ required: false
+ type: str
+ BGP_AS:
+ default: ''
+ description:
+ - 1-4294967295 | 1-65535.0-65535 It is a good practice to have a unique
+ ASN for each Fabric.
+ required: false
+ type: str
+ BOOTSTRAP_CONF:
+ default: ''
+ description:
+ - Additional CLIs required during device bootup/login e.g. AAA/Radius
+ required: false
+ type: str
+ BOOTSTRAP_CONF_XE:
+ default: ''
+ description:
+ - Additional CLIs required during device bootup/login e.g. AAA/Radius
+ required: false
+ type: str
+ BOOTSTRAP_ENABLE:
+ default: false
+ description:
+ - Automatic IP Assignment For POAP
+ required: false
+ type: bool
+ BOOTSTRAP_MULTISUBNET:
+ default: '#Scope_Start_IP, Scope_End_IP, Scope_Default_Gateway, Scope_Subnet_Prefix'
+ description:
+ - 'lines with # prefix are ignored here'
+ required: false
+ type: str
+ CDP_ENABLE:
+ default: false
+ description:
+ - Enable CDP on management interface
+ required: false
+ type: bool
+ DHCP_ENABLE:
+ default: false
+ description:
+ - Automatic IP Assignment For POAP From Local DHCP Server
+ required: false
+ type: bool
+ DHCP_END:
+ default: ''
+ description:
+ - End Address For Switch POAP
+ required: false
+ type: str
+ DHCP_IPV6_ENABLE:
+ choices:
+ - DHCPv4
+ - DHCPv6
+ default: DHCPv4
+ description:
+ - No description available
+ required: false
+ type: str
+ DHCP_START:
+ default: ''
+ description:
+ - Start Address For Switch POAP
+ required: false
+ type: str
+ DOMAIN_NAME:
+ default: ''
+ description:
+ - Domain name for DHCP server PnP block
+ required: false
+ type: str
+ ENABLE_AAA:
+ default: false
+ description:
+ - Include AAA configs from Advanced tab during device bootup
+ required: false
+ type: bool
+ ENABLE_NETFLOW:
+ default: false
+ description:
+ - Enable Netflow on VTEPs
+ required: false
+ type: bool
+ ENABLE_NXAPI:
+ default: false
+ description:
+ - Enable HTTPS NX-API
+ required: false
+ type: bool
+ ENABLE_NXAPI_HTTP:
+ default: false
+ description:
+ - No description available
+ required: false
+ type: bool
+ ENABLE_RT_INTF_STATS:
+ default: false
+ description:
+ - Valid for NX-OS only
+ required: false
+ type: bool
+ FABRIC_FREEFORM:
+ default: ''
+ description:
+ - Additional supported CLIs for all same OS (e.g. all NxOS or IOS-XE,
+ etc) switches
+ required: false
+ type: str
+ FABRIC_NAME:
+ default: ''
+ description:
+ - Please provide the fabric name to create it (Max Size 64)
+ required: false
+ type: str
+ FEATURE_PTP:
+ default: false
+ description:
+ - No description available
+ required: false
+ type: bool
+ INBAND_ENABLE:
+ default: false
+ description:
+ - 'Enable POAP over Inband Interface (Pre-req: Inband Mgmt Knob should
+ be Enabled)'
+ required: false
+ type: bool
+ INBAND_MGMT:
+ default: false
+ description:
+ - Import switches with inband connectivity
+ required: false
+ type: bool
+ INTF_STAT_LOAD_INTERVAL:
+ default: 10
+ description:
+ - 'Time in seconds '
+ required: false
+ type: int
+ IS_READ_ONLY:
+ default: true
+ description:
+ - If enabled, fabric is only monitored. No configuration will be deployed
+ required: false
+ type: bool
+ MGMT_GW:
+ default: ''
+ description:
+ - Default Gateway For Management VRF On The Switch
+ required: false
+ type: str
+ MGMT_PREFIX:
+ default: 24
+ description:
+ - No description available
+ required: false
+ type: int
+ MGMT_V6PREFIX:
+ default: 64
+ description:
+ - No description available
+ required: false
+ type: int
+ MPLS_HANDOFF:
+ default: false
+ description:
+ - No description available
+ required: false
+ type: bool
+ MPLS_LB_ID:
+ default: 101
+ description:
+ - No description available
+ required: false
+ type: int
+ MPLS_LOOPBACK_IP_RANGE:
+ default: 10.102.0.0/25
+ description:
+ - MPLS Loopback IP Address Range
+ required: false
+ type: str
+ NETFLOW_EXPORTER_LIST:
+ default: ''
+ description:
+ - One or Multiple Netflow Exporters
+ required: false
+ type: list
+ elements: str
+ NETFLOW_MONITOR_LIST:
+ default: ''
+ description:
+ - One or Multiple Netflow Monitors
+ required: false
+ type: list
+ elements: str
+ NETFLOW_RECORD_LIST:
+ default: ''
+ description:
+ - One or Multiple Netflow Records
+ required: false
+ type: list
+ elements: str
+ NETFLOW_SAMPLER_LIST:
+ default: ''
+ description:
+ - One or multiple netflow samplers. Applicable to N7K only
+ required: false
+ type: list
+ elements: str
+ NXAPI_HTTPS_PORT:
+ default: 443
+ description:
+ - No description available
+ required: false
+ type: int
+ NXAPI_HTTP_PORT:
+ default: 80
+ description:
+ - No description available
+ required: false
+ type: int
+ PM_ENABLE:
+ default: false
+ description:
+ - No description available
+ required: false
+ type: bool
+ PNP_ENABLE:
+ default: false
+ description:
+ - Enable Plug n Play (Automatic IP Assignment) for Cat9K switches
+ required: false
+ type: bool
+ POWER_REDUNDANCY_MODE:
+ choices:
+ - ps-redundant
+ - combined
+ - insrc-redundant
+ default: ps-redundant
+ description:
+ - Default Power Supply Mode For Bootstrapped NX-OS Switches
+ required: false
+ type: str
+ PTP_DOMAIN_ID:
+ default: 0
+ description:
+ - 'Multiple Independent PTP Clocking Subdomains on a Single Network '
+ required: false
+ type: int
+ PTP_LB_ID:
+ default: 0
+ description:
+ - No description available
+ required: false
+ type: int
+ SNMP_SERVER_HOST_TRAP:
+ default: true
+ description:
+ - Configure NDFC as a receiver for SNMP traps
+ required: false
+ type: bool
+ SUBINTERFACE_RANGE:
+ default: 2-511
+ description:
+ - 'Per Border Dot1q Range For VRF Lite Connectivity '
+ required: false
+ type: str
+ enableRealTimeBackup:
+ default: ''
+ description:
+ - Backup hourly only if there is any config deployment since last
+ backup
+ required: false
+ type: bool
+ enableScheduledBackup:
+ default: ''
+ description:
+ - Backup at the specified time
+ required: false
+ type: bool
+ scheduledTime:
+ default: ''
+ description:
+ - Time (UTC) in 24hr format. (00:00 to 23:59)
+ required: false
+ type: str
"""
EXAMPLES = """
@@ -3569,6 +3876,7 @@
# - 1. BGP fabric
# - 1. VXLAN EVPN Multi-Site fabric
# - 1. LAN Classic fabric
+# - 1. External fabric
- name: Create fabrics
cisco.dcnm.dcnm_fabric:
@@ -3584,6 +3892,9 @@
FABRIC_TYPE: VXLAN_EVPN_MSD
- FABRIC_NAME: LAN_Fabric
FABRIC_TYPE: LAN_CLASSIC
+ - FABRIC_NAME: External_Fabric
+ FABRIC_TYPE: External
+ BGP_AS: 65003
register: result
- debug:
var: result
@@ -3617,6 +3928,13 @@
BOOTSTRAP_ENABLE: false
IS_READ_ONLY: false
DEPLOY: false
+ - FABRIC_NAME: External_Fabric
+ FABRIC_TYPE: External
+ BGP_AS: 65003
+ SUBINTERFACE_RANGE: 2-511
+ ENABLE_NXAPI: true
+ IS_READ_ONLY: false
+ DEPLOY: false
register: result
- debug:
var: result
@@ -3662,6 +3980,10 @@
- FABRIC_NAME: LAN_Fabric
FABRIC_TYPE: LAN_CLASSIC
DEPLOY: false
+ - FABRIC_NAME: External_Fabric
+ FABRIC_TYPE: External
+ BGP_AS: 65003
+ DEPLOY: false
register: result
- debug:
var: result
@@ -3675,6 +3997,7 @@
- FABRIC_NAME: VXLAN_Fabric
- FABRIC_NAME: MSD_Fabric
- FABRIC_NAME: LAN_Fabric
+ - FABRIC_NAME: External_Fabric
register: result
- debug:
var: result
@@ -3688,6 +4011,7 @@
- FABRIC_NAME: VXLAN_Fabric
- FABRIC_NAME: MSD_Fabric
- FABRIC_NAME: LAN_Fabric
+ - FABRIC_NAME: External_Fabric
register: result
- debug:
var: result
diff --git a/plugins/modules/dcnm_interface.py b/plugins/modules/dcnm_interface.py
index 8b17db804..983e443eb 100644
--- a/plugins/modules/dcnm_interface.py
+++ b/plugins/modules/dcnm_interface.py
@@ -216,6 +216,24 @@
type: str
choices: ['normal', 'fast']
default: normal
+ enable_qos:
+ description:
+ - Enable QoS on the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ type: bool
+ default: false
+ qos_policy:
+ description:
+ - QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ type: str
+ default: ""
+ queuing_policy:
+ description:
+ - Queuing policy name to apply to the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'l3'
+ type: str
+ default: ""
profile_vpc:
description:
- Though the key shown here is 'profile_vpc' the actual key to be used in playbook
@@ -368,6 +386,24 @@
type: str
choices: ['normal', 'fast']
default: normal
+ enable_qos:
+ description:
+ - Enable QoS on the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ type: bool
+ default: false
+ qos_policy:
+ description:
+ - QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true.
+ This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ type: str
+ default: ""
+ queuing_policy:
+ description:
+ - Queuing policy name to apply to the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk' or 'access'
+ type: str
+ default: ""
profile_subint:
description:
- Though the key shown here is 'profile_subint' the actual key to be used in playbook
@@ -638,6 +674,24 @@
- State of Switchport Monitor for SPAN/ERSPAN
type: bool
default: false
+ enable_qos:
+ description:
+ - Enable QoS on the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ type: bool
+ default: false
+ qos_policy:
+ description:
+ - QoS policy name to apply to the interface. This option is only valid when 'enable_qos' is true.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ type: str
+ default: ""
+ queuing_policy:
+ description:
+ - Queuing policy name to apply to the interface.
+ This option is applicable only for interfaces whose 'mode' is 'trunk', 'access', or 'routed'
+ type: str
+ default: ""
profile_svi:
description:
- Though the key shown here is 'profile_svi' the actual key to be used in playbook
@@ -2002,6 +2056,9 @@ def __init__(self, module):
"ENABLE_PFC": "enable_pfc",
"ENABLE_MONITOR": "enable_monitor",
"CDP_ENABLE": "enable_cdp",
+ "ENABLE_QOS": "enable_qos",
+ "QOS_POLICY": "qos_policy",
+ "QUEUING_POLICY": "queuing_policy",
}
@@ -2367,6 +2424,9 @@ def dcnm_intf_validate_port_channel_input(self, config):
disable_lacp_suspend_individual=dict(type="bool", default=False),
lacp_port_priority=dict(type="int", default=32768, range_min=1, range_max=65535),
lacp_rate=dict(type="str", default="normal"),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
pc_prof_spec_access = dict(
@@ -2390,6 +2450,9 @@ def dcnm_intf_validate_port_channel_input(self, config):
disable_lacp_suspend_individual=dict(type="bool", default=False),
lacp_port_priority=dict(type="int", default=32768, range_min=1, range_max=65535),
lacp_rate=dict(type="str", default="normal"),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
pc_prof_spec_l3 = dict(
@@ -2405,6 +2468,9 @@ def dcnm_intf_validate_port_channel_input(self, config):
cmds=dict(type="list", elements="str"),
description=dict(type="str", default=""),
admin_state=dict(type="bool", default=True),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
pc_prof_spec_dot1q = dict(
@@ -2478,6 +2544,9 @@ def dcnm_intf_validate_virtual_port_channel_input(self, cfg):
enable_lacp_vpc_convergence=dict(type="bool", default=False),
lacp_port_priority=dict(type="int", default=32768, range_min=1, range_max=65535),
lacp_rate=dict(type="str", default="normal"),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
vpc_prof_spec_access = dict(
@@ -2502,6 +2571,9 @@ def dcnm_intf_validate_virtual_port_channel_input(self, cfg):
peer1_description=dict(type="str", default=""),
peer2_description=dict(type="str", default=""),
admin_state=dict(type="bool", default=True),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
if "trunk" == cfg[0]["profile"]["mode"]:
@@ -2599,6 +2671,9 @@ def dcnm_intf_validate_ethernet_interface_input(self, cfg):
enable_pfc=dict(type="bool", default=False),
duplex=dict(
type="str", default="auto", choices=["auto", "full", "half"]),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
eth_prof_spec_access = dict(
@@ -2619,6 +2694,9 @@ def dcnm_intf_validate_ethernet_interface_input(self, cfg):
enable_pfc=dict(type="bool", default=False),
duplex=dict(
type="str", default="auto", choices=["auto", "full", "half"]),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
eth_prof_spec_routed_host = dict(
@@ -2631,6 +2709,9 @@ def dcnm_intf_validate_ethernet_interface_input(self, cfg):
cmds=dict(type="list", elements="str"),
description=dict(type="str", default=""),
admin_state=dict(type="bool", default=True),
+ enable_qos=dict(type="bool", default=False),
+ qos_policy=dict(type="str", default=""),
+ queuing_policy=dict(type="str", default=""),
)
eth_prof_spec_epl_routed_host = dict(
@@ -2661,6 +2742,8 @@ def dcnm_intf_validate_ethernet_interface_input(self, cfg):
cmds=dict(type="list", elements="str"),
description=dict(type="str", default=""),
admin_state=dict(type="bool", default=True),
+ duplex=dict(
+ type="str", default="auto", choices=["auto", "full", "half"]),
)
if "trunk" == cfg[0]["profile"]["mode"]:
@@ -2976,6 +3059,20 @@ def dcnm_intf_get_pc_payload(self, delem, intf, profile):
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = delem[profile]["lacp_rate"]
else:
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = "normal"
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
+
if delem[profile]["mode"] == "access":
if delem[profile]["members"] is None:
intf["interfaces"][0]["nvPairs"]["MEMBER_INTERFACES"] = ""
@@ -3021,6 +3118,20 @@ def dcnm_intf_get_pc_payload(self, delem, intf, profile):
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = delem[profile]["lacp_rate"]
else:
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = "normal"
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
+
if delem[profile]["mode"] == "l3":
if delem[profile]["members"] is None:
intf["interfaces"][0]["nvPairs"]["MEMBER_INTERFACES"] = ""
@@ -3051,6 +3162,20 @@ def dcnm_intf_get_pc_payload(self, delem, intf, profile):
delem[profile]["mtu"]
)
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
+
if delem[profile]["mode"] == "dot1q":
if delem[profile]["members"] is None:
intf["interfaces"][0]["nvPairs"]["MEMBER_INTERFACES"] = ""
@@ -3254,6 +3379,19 @@ def dcnm_intf_get_vpc_payload(self, delem, intf, profile):
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = delem[profile]["lacp_rate"]
else:
intf["interfaces"][0]["nvPairs"]["LACP_RATE"] = "normal"
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
intf["interfaces"][0]["nvPairs"]["INTF_NAME"] = ifname
intf["interfaces"][0]["nvPairs"]["SPEED"] = self.dcnm_intf_xlate_speed(
str(delem[profile].get("speed", ""))
@@ -3414,6 +3552,19 @@ def dcnm_intf_get_eth_payload(self, delem, intf, profile):
"ENABLE_MONITOR"] = delem[profile]["enable_monitor"]
intf["interfaces"][0]["nvPairs"][
"PORT_DUPLEX_MODE"] = delem[profile]["duplex"]
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
if delem[profile]["mode"] == "access":
intf["interfaces"][0]["nvPairs"]["BPDUGUARD_ENABLED"] = delem[
profile
@@ -3438,6 +3589,19 @@ def dcnm_intf_get_eth_payload(self, delem, intf, profile):
"ENABLE_MONITOR"] = delem[profile]["enable_monitor"]
intf["interfaces"][0]["nvPairs"][
"PORT_DUPLEX_MODE"] = delem[profile]["duplex"]
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
if delem[profile]["mode"] == "routed":
intf["interfaces"][0]["nvPairs"]["INTF_VRF"] = delem[profile][
"int_vrf"
@@ -3458,6 +3622,19 @@ def dcnm_intf_get_eth_payload(self, delem, intf, profile):
delem[profile]["mtu"]
)
intf["interfaces"][0]["nvPairs"]["INTF_NAME"] = ifname
+ if delem[profile].get("enable_qos"):
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = delem[profile]["enable_qos"]
+ if delem[profile].get("qos_policy"):
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = delem[profile]["qos_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ else:
+ intf["interfaces"][0]["nvPairs"]["ENABLE_QOS"] = False
+ intf["interfaces"][0]["nvPairs"]["QOS_POLICY"] = ""
+ if delem[profile].get("queuing_policy"):
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = delem[profile]["queuing_policy"]
+ else:
+ intf["interfaces"][0]["nvPairs"]["QUEUING_POLICY"] = ""
if delem[profile]["mode"] == "monitor":
intf["interfaces"][0]["nvPairs"]["INTF_NAME"] = ifname
if delem[profile]["mode"] == "epl_routed":
@@ -3513,6 +3690,8 @@ def dcnm_intf_get_eth_payload(self, delem, intf, profile):
"access_vlan"
]
intf["interfaces"][0]["nvPairs"]["INTF_NAME"] = ifname
+ intf["interfaces"][0]["nvPairs"][
+ "PORT_DUPLEX_MODE"] = delem[profile]["duplex"]
def dcnm_intf_get_st_fex_payload(self, delem, intf, profile):
@@ -4086,7 +4265,8 @@ def dcnm_intf_compare_elements(
"ENABLE_LACP_VPC_CONV",
"ENABLE_PFC",
"ENABLE_MONITOR",
- "CDP_ENABLE"
+ "CDP_ENABLE",
+ "ENABLE_QOS"
]
if k in boolean_keys:
# This is a special case where the value is a boolean and we need to compare it as such
@@ -4172,9 +4352,6 @@ def dcnm_intf_replace_pc_members(self, want, have):
for key in self.pol_pc_member_types[self.dcnm_version].keys():
member_policy_names.append(self.pol_pc_member_types[self.dcnm_version][key])
- # List of keys in nvPairs to protect
- protected_keys = ["PO_ID", "PC_MODE", "INTF_NAME", "ALLOWED_VLANS", "DESC", "ADMIN_STATE", "CONF", "PRIMARY_INTF"]
-
for have_int in have:
if have_int["policy"] in member_policy_names:
# We have a port-channel member interface. Find the corresponding port-channel
@@ -4183,6 +4360,8 @@ def dcnm_intf_replace_pc_members(self, want, have):
have_pc_serial = have_int["interfaces"][0]["serialNumber"]
for want_int in want:
+ # List of keys in nvPairs to protect
+ protected_keys = ["PO_ID", "PC_MODE", "INTF_NAME", "ALLOWED_VLANS", "DESC", "ADMIN_STATE", "CONF", "PRIMARY_INTF"]
match_int = find_dict_in_list_by_key_value(search=want_int['interfaces'], key='ifName', value=have_pc_name)
if match_int and match_int['serialNumber'] == have_pc_serial:
msg = "\nHave Interface Info: "
@@ -4380,7 +4559,10 @@ def dcnm_intf_compare_want_and_have(self, state):
"ENABLE_PFC",
"NATIVE_VLAN",
"PORT_DUPLEX_MODE",
- "SPEED"
+ "SPEED",
+ "ENABLE_QOS",
+ "QOS_POLICY",
+ "QUEUING_POLICY"
]
for key in keys_to_check:
@@ -4842,6 +5024,24 @@ def dcnm_intf_get_diff_overridden(self, cfg):
)
continue
+ # Skip TOR uplink member interfaces
+ if have.get("underlayPolicies") is not None:
+ is_tor_member = False
+ for policy in have.get("underlayPolicies"):
+ if policy.get("templateName") in ["int_vpc_uplink_access_po_member"]:
+ is_tor_member = True
+ break
+
+ if is_tor_member:
+ self.changed_dict[0]["skipped"].append(
+ {
+ "Name": name,
+ "Alias": have["alias"],
+ "Reason": "TOR uplink member interface",
+ }
+ )
+ continue
+
if str(have["deletable"]).lower() == "false":
# Add this 'have to a deferred list. We will process this list once we have processed all the 'haves'
defer_list.append(have)
@@ -4974,6 +5174,48 @@ def dcnm_intf_get_diff_overridden(self, cfg):
}
)
continue
+ # Port-channel which are created as part of TOR uplink should not be deleted
+ # This includes both TOR-side and leaf-side port-channels:
+ # - TOR side: "tor-connected-to-vPC-leaf:" or "tor-connected-to-leaf:"
+ # - Leaf side: "leaf-connected-to-vPC-tor:" or "leaf-connected-to-tor:"
+ if have.get("alias") is not None and (
+ "tor-connected-to" in have.get("alias")
+ or "leaf-connected-to-vPC-tor" in have.get("alias")
+ or "leaf-connected-to-tor" in have.get("alias")
+ ):
+ self.changed_dict[0]["skipped"].append(
+ {
+ "Name": name,
+ "Alias": have["alias"],
+ "Underlay Policies": have[
+ "underlayPolicies"
+ ],
+ }
+ )
+ continue
+ # Also check if port-channel uses TOR uplink templates
+ skip_pc = False
+ if have.get("underlayPolicies") is not None:
+ tor_uplink_templates = [
+ "int_vpc_uplink_access_po",
+ "int_port_channel_uplink_access",
+ ]
+ for policy in have.get("underlayPolicies"):
+ if policy.get("templateName") in tor_uplink_templates:
+ self.changed_dict[0]["skipped"].append(
+ {
+ "Name": name,
+ "Alias": have["alias"],
+ "Underlay Policies": have[
+ "underlayPolicies"
+ ],
+ "Skip Reason": "TOR uplink port-channel (template match)",
+ }
+ )
+ skip_pc = True
+ break
+ if skip_pc:
+ continue
else:
self.changed_dict[0]["debugs"].append(
{
@@ -4985,10 +5227,49 @@ def dcnm_intf_get_diff_overridden(self, cfg):
}
)
+ # TOR uplink vPC interfaces should NEVER be deleted through interface override.
+ # TOR uplink vPCs are auto-generated by NDFC when TOR switches are paired
+ # with leaf switches. These vPC interfaces (vPC1, vPC2, etc.) represent
+ # the uplink bundle between TOR and leaf switches.
+ #
+ # TOR uplink vPCs can be identified by:
+ # - ifType: INTERFACE_VPC
+ # - underlayPolicies templateName starting with "int_vpc_uplink_"
+ # - alias patterns: "tor-connected-to", "leaf-connected-to-vPC-tor"
+ if have.get("ifType") == "INTERFACE_VPC":
+ is_tor_uplink = False
+
+ # Check alias patterns for TOR uplinks
+ if have.get("alias") is not None and (
+ "tor-connected-to" in have.get("alias")
+ or "leaf-connected-to-vPC-tor" in have.get("alias")
+ or "leaf-connected-to-tor" in have.get("alias")
+ ):
+ is_tor_uplink = True
+
+ # Check underlayPolicies templateName for TOR uplink patterns
+ if not is_tor_uplink and have.get("underlayPolicies"):
+ for policy in have["underlayPolicies"]:
+ template_name = policy.get("templateName", "")
+ if template_name and template_name.startswith("int_vpc_uplink_"):
+ is_tor_uplink = True
+ break
+
+ if is_tor_uplink:
+ self.changed_dict[0]["skipped"].append(
+ {
+ "Name": name,
+ "Alias": have["alias"],
+ "Underlay Policies": have["underlayPolicies"],
+ "Reason": "TOR uplink vPC interface",
+ }
+ )
+ continue
+
# Interfaces sometimes take time to get deleted from DCNM. Such interfaces will have
# underlayPolicies set to "None". Such interfaces need not be deleted again
- if have["underlayPolicies"] is None:
+ if have.get("underlayPolicies") is None:
self.changed_dict[0]["skipped"].append(
{
"Name": name,
diff --git a/plugins/modules/dcnm_vpc_pair.py b/plugins/modules/dcnm_vpc_pair.py
index ce27b2093..0700a2371 100644
--- a/plugins/modules/dcnm_vpc_pair.py
+++ b/plugins/modules/dcnm_vpc_pair.py
@@ -22,15 +22,15 @@
DOCUMENTATION = """
---
module: dcnm_vpc_pair
-short_description: DCNM Ansible Module for managing VPC switch pairs required for VPC interfaces.
+short_description: DCNM Ansible Module for managing vPC switch pairs required for vPC interfaces.
version_added: "3.5.0"
description:
- - "DCNM Ansible Module for managing VPC switch pairs."
+ - "DCNM Ansible Module for managing vPC switch pairs."
author: Mallik Mudigonda(@mmudigon)
options:
src_fabric:
description:
- - Name of the target fabric for VPC switch pair operations
+ - Name of the target fabric for vPC switch pair operations
type: str
required: true
state:
@@ -46,34 +46,40 @@
default: true
config:
description:
- - A list of dictionaries containing VPC switch pair information
+ - A list of dictionaries containing vPC switch pair information
type: list
elements: dict
default: []
suboptions:
peerOneId:
description:
- - IP Address/Host Name of Peer1 of VPC switch pair.
+ - IP Address/Host Name of Peer1 of vPC switch pair.
type: str
required: true
peerTwoId:
description:
- - IP Address/Host Name of Peer2 of VPC switch pair.
+ - IP Address/Host Name of Peer2 of vPC switch pair.
type: str
required: true
templateName:
description:
- - Name of the template which inlcudes the required parameters for creating the VPC switch pair.
+ - Name of the template which inlcudes the required parameters for creating the vPC switch pair.
- This parameter is 'mandatory' if the fabric is of type 'LANClassic' or 'External'. It is optional
otherwise.
type: str
required: true
+ useVirtualPeerlink:
+ description:
+ - Flag to enable or disable the use of a virtual peer link (fabric peering) for the vPC switch pair.
+ type: bool
+ default: false
+
profile:
description:
- - A dictionary of additional VPC switch pair related parameters that must be included while creating VPC switch pairs.
+ - A dictionary of additional vPC switch pair related parameters that must be included while creating vPC switch pairs.
suboptions:
ADMIN_STATE:
description:
@@ -83,21 +89,21 @@
ALLOWED_VLANS:
description:
- - Vlans that are allowed on the VPC peer link port-channel.
+ - Vlans that are allowed on the vPC peer link port-channel.
type: str
choices: ['none', 'all', 'vlan-range(e.g., 1-2, 3-40)']
default: all
DOMAIN_ID:
description:
- - VPC domain ID.
+ - vPC domain ID.
- Minimum value is 1 and Maximum value is 1000.
type: int
required: true
FABRIC_NAME:
description:
- - Name of the target fabric for VPC switch pair operations.
+ - Name of the target fabric for vPC switch pair operations.
type: str
required: true
@@ -215,44 +221,44 @@
# This module supports the following states:
#
# Merged:
-# VPC switch pairs defined in the playbook will be merged into the target fabric.
+# vPC switch pairs defined in the playbook will be merged into the target fabric.
#
-# The VPC switch pairs listed in the playbook will be created if not already present on the DCNM
-# server. If the VPC switch pair is already present and the configuration information included
+# The vPC switch pairs listed in the playbook will be created if not already present on the DCNM
+# server. If the vPC switch pair is already present and the configuration information included
# in the playbook is either different or not present in DCNM, then the corresponding
-# information is added to the DCNM. If a VPC switch pair mentioned in playbook
+# information is added to the DCNM. If a vPC switch pair mentioned in playbook
# is already present on DCNM and there is no difference in configuration, no operation
# will be performed for such switch pairs.
#
# Replaced:
-# VPC switch pairs defined in the playbook will be replaced in the target fabric.
+# vPC switch pairs defined in the playbook will be replaced in the target fabric.
#
-# The state of the VPC switch pairs listed in the playbook will serve as source of truth for the
-# same VPC switch pairs present on the DCNM under the fabric mentioned. Additions and updations
-# will be done to bring the DCNM VPC switch pairs to the state listed in the playbook.
-# Note: Replace will only work on the VPC switch pairs mentioned in the playbook.
+# The state of the vPC switch pairs listed in the playbook will serve as source of truth for the
+# same vPC switch pairs present on the DCNM under the fabric mentioned. Additions and updations
+# will be done to bring the DCNM vPC switch pairs to the state listed in the playbook.
+# Note: Replace will only work on the vPC switch pairs mentioned in the playbook.
#
# Overridden:
-# VPC switch pairs defined in the playbook will be overridden in the target fabric.
+# vPC switch pairs defined in the playbook will be overridden in the target fabric.
#
-# The state of the VPC switch pairs listed in the playbook will serve as source of truth for all
-# the VPC switch pairs under the fabric mentioned. Additions and deletions will be done to bring
-# the DCNM VPC switch pairs to the state listed in the playbook. All VPC switch pairs other than the
+# The state of the vPC switch pairs listed in the playbook will serve as source of truth for all
+# the vPC switch pairs under the fabric mentioned. Additions and deletions will be done to bring
+# the DCNM vPC switch pairs to the state listed in the playbook. All vPC switch pairs other than the
# ones mentioned in the playbook will be deleted.
-# Note: Override will work on the all the VPC switch pairs present in the DCNM Fabric.
+# Note: Override will work on the all the vPC switch pairs present in the DCNM Fabric.
#
# Deleted:
-# VPC switch pairs defined in the playbook will be deleted in the target fabric.
+# vPC switch pairs defined in the playbook will be deleted in the target fabric.
#
-# Deletes the list of VPC switch pairs specified in the playbook. If the playbook does not include
-# any VPC switch pair information, then all VPC switch pairs from the fabric will be deleted.
+# Deletes the list of vPC switch pairs specified in the playbook. If the playbook does not include
+# any vPC switch pair information, then all vPC switch pairs from the fabric will be deleted.
#
# Query:
-# Returns the current DCNM state for the VPC switch pairs listed in the playbook.
+# Returns the current DCNM state for the vPC switch pairs listed in the playbook.
-# CREATE VPC SWITCH PAIR (LANClassic or External fabrics)
+# CREATE vPC SWITCH PAIR (LANClassic or External fabrics)
-- name: Merge VPC switch pair paremeters
+- name: Merge vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -282,9 +288,9 @@
PEER2_PO_CONF: "buffer-boost"
PEER2_PO_DESC: "This is peer2 PC"
-# CREATE VPC SWITCH PAIR (VXLAN fabrics)
+# CREATE vPC SWITCH PAIR (VXLAN fabrics)
-- name: Merge VPC switch pair paremeters
+- name: Merge vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -293,9 +299,9 @@
- peerOneId: 192.168.1.1
peerTwoId: 192.168.1.2
-# DELETE VPC SWITCH PAIR
+# DELETE vPC SWITCH PAIR
-- name: Delete VPC switch pair
+- name: Delete vPC switch pair
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -304,9 +310,9 @@
- peerOneId: 192.168.1.1
peerTwoId: 192.168.1.2
-# REPLACE VPC SWITCH PAIR (LANClassic or External fabrics)
+# REPLACE vPC SWITCH PAIR (LANClassic or External fabrics)
-- name: Replace VPC switch pair paremeters
+- name: Replace vPC switch pair paremeters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -336,9 +342,9 @@
PEER2_PO_CONF: "buffer-boost"
PEER2_PO_DESC: "This is peer2 PC"
-# OVERRIDDE VPC SWITCH PAIRS
+# OVERRIDDE vPC SWITCH PAIRS
-- name: Override with a new VPC switch pair
+- name: Override with a new vPC switch pair
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
deploy: true
@@ -370,14 +376,14 @@
deploy: true
state: overridden
-# QUERY VPC SWITCH PAIRS
+# QUERY vPC SWITCH PAIRS
-- name: Query VPC switch pairs - with no filters
+- name: Query vPC switch pairs - with no filters
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
-- name: Query VPC switch pairs - with both peers specified
+- name: Query vPC switch pairs - with both peers specified
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
@@ -385,7 +391,7 @@
- peerOneId: "{{ ansible_switch1 }}"
peerTwoId: "{{ ansible_switch2 }}"
-- name: Query VPC switch pairs - with one peer specified
+- name: Query vPC switch pairs - with one peer specified
cisco.dcnm.dcnm_vpc_pair:
src_fabric: "test-fabric"
state: query
@@ -490,7 +496,7 @@ def dcnm_vpc_pair_merge_want_and_have_objects(self, want, have):
Parameters:
want (dict): Object to be updated with information from have
- have (dict): Existing VPC pair information
+ have (dict): Existing vPC pair information
Returns:
None
@@ -528,7 +534,7 @@ def dcnm_vpc_pair_merge_want_and_have(self, want, have):
Parameters:
want (dict): Object to be updated with information from have
- have (dict): Existing VPC pair information
+ have (dict): Existing vPC pair information
Returns:
None
@@ -560,7 +566,7 @@ def dcnm_vpc_pair_merge_want_and_have(self, want, have):
def dcnm_vpc_pair_get_diff_query(self):
"""
- Routine to retrieve VPC switch pairs from controller. This routine extracts information provided by the
+ Routine to retrieve vPC switch pairs from controller. This routine extracts information provided by the
user and filters the output based on that.
Parameters:
@@ -579,8 +585,8 @@ def dcnm_vpc_pair_get_diff_query(self):
def dcnm_vpc_pair_get_diff_overridden(self, cfg):
"""
- Routine to override existing VPC information with what is included in the playbook. This routine
- deletes all VPC pairs which are not part of the current config and creates new ones based on what is
+ Routine to override existing vPC information with what is included in the playbook. This routine
+ deletes all vPC pairs which are not part of the current config and creates new ones based on what is
included in the playbook
Parameters:
@@ -592,7 +598,7 @@ def dcnm_vpc_pair_get_diff_overridden(self, cfg):
del_list = dcnm_vpc_pair_utils_get_delete_list(self)
- # 'del_list' contains all VPC pair information in 'have' format. Use that to update delete and delte
+ # 'del_list' contains all vPC pair information in 'have' format. Use that to update delete and delte
# deploy payloads
for elem in del_list:
@@ -602,7 +608,7 @@ def dcnm_vpc_pair_get_diff_overridden(self, cfg):
return
if self.want:
- # New configuration is included. Delete all existing VPC switch pairs and create new pairs as requested
+ # New configuration is included. Delete all existing vPC switch pairs and create new pairs as requested
# through the configuration
rc = self.dcnm_vpc_pair_get_diff_merge()
@@ -621,7 +627,7 @@ def dcnm_vpc_pair_get_diff_deleted(self):
"""
if self.vpc_pair_info == []:
- # User has not included any config. Delete all existing VPC pairs from DCNM
+ # User has not included any config. Delete all existing vPC pairs from DCNM
self.dcnm_vpc_pair_get_diff_overridden([])
return
diff --git a/plugins/modules/dcnm_vrf.py b/plugins/modules/dcnm_vrf.py
index ff2eee958..92bd61fda 100644
--- a/plugins/modules/dcnm_vrf.py
+++ b/plugins/modules/dcnm_vrf.py
@@ -2448,8 +2448,11 @@ def get_want(self):
if vrf.get("vlan_id"):
vlan_id = vrf.get("vlan_id")
else:
- # TODO: After DCNM 11.x support is ended, change the default vlan_id to ""
- vlan_id = 0
+ if self.action_fabric_type in ["multisite_parent", "multicluster_parent"]:
+ vlan_id = ""
+ else:
+ # TODO: After DCNM 11.x support is ended, change the default vlan_id to ""
+ vlan_id = 0
vrf_deploy = vrf.get("deploy", True)
diff --git a/tests/integration/targets/dcnm_interface/tasks/main.yaml b/tests/integration/targets/dcnm_interface/tasks/main.yaml
index 951dc46c6..ea85b6384 100644
--- a/tests/integration/targets/dcnm_interface/tasks/main.yaml
+++ b/tests/integration/targets/dcnm_interface/tasks/main.yaml
@@ -25,9 +25,6 @@
loop_var: test_case_to_run
tags: sanity
-- name: Meta
- ansible.builtin.meta: end_play
-
###############################################
## FACTS ##
###############################################
diff --git a/tests/integration/targets/dcnm_interface/templates/dcnm_eth/merge_conf.j2 b/tests/integration/targets/dcnm_interface/templates/dcnm_eth/merge_conf.j2
index 35daec8d5..7c2643978 100644
--- a/tests/integration/targets/dcnm_interface/templates/dcnm_eth/merge_conf.j2
+++ b/tests/integration/targets/dcnm_interface/templates/dcnm_eth/merge_conf.j2
@@ -14,6 +14,7 @@
port_type_fast: true
mtu: jumbo
allowed_vlans: none
+ enable_qos: true
cmds:
- no shutdown
description: "eth interface acting as trunk"
@@ -31,6 +32,7 @@
port_type_fast: true
mtu: default
access_vlan: 31
+ enable_qos: true
cmds:
- no shutdown
description: "eth interface acting as access"
diff --git a/tests/unit/modules/dcnm/test_dcnm_intf.py b/tests/unit/modules/dcnm/test_dcnm_intf.py
index 4fba38a76..35b3ec456 100644
--- a/tests/unit/modules/dcnm/test_dcnm_intf.py
+++ b/tests/unit/modules/dcnm/test_dcnm_intf.py
@@ -3107,7 +3107,10 @@ def test_dcnm_intf_pc_replaced_existing(self):
"CONF",
"DISABLE_LACP_SUSPEND",
"LACP_PORT_PRIO",
- "LACP_RATE"
+ "LACP_RATE",
+ "ENABLE_QOS",
+ "QOS_POLICY",
+ "QUEUING_POLICY"
]
for d in result["diff"][0]["replaced"]:
@@ -3357,6 +3360,9 @@ def test_dcnm_intf_eth_replaced_existing(self):
"SPEED",
"IPv6",
"IPv6_PREFIX",
+ "ENABLE_QOS",
+ "QOS_POLICY",
+ "QUEUING_POLICY",
]
for d in result["diff"][0]["replaced"]:
@@ -4337,7 +4343,10 @@ def test_dcnm_intf_vpc_replaced_existing(self):
"ENABLE_LACP_VPC_CONV",
"DISABLE_LACP_SUSPEND",
"LACP_PORT_PRIO",
- "LACP_RATE"
+ "LACP_RATE",
+ "ENABLE_QOS",
+ "QOS_POLICY",
+ "QUEUING_POLICY"
]
for d in result["diff"][0]["replaced"]: