Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
3a250a8
audit log filter n field validation
Kandarimegha Jan 27, 2026
7ed3e14
client template filter validation
Kandarimegha Jan 29, 2026
6b156db
bug fix
Kandarimegha Feb 9, 2026
588ae26
Merge branch 'main' into flexible_reports
Kandarimegha Feb 9, 2026
c57d470
addresses documentation review comments
Kandarimegha Feb 17, 2026
63848b9
Merge branch 'main' into flexible_reports
Kandarimegha Feb 17, 2026
4545ff2
Merge from mainline (#383)
madhansansel Feb 18, 2026
9b76084
fix: update required fields in LAN automation workflow manager options
koderchit Feb 19, 2026
89a2091
Bug Fix: Lan Automation Workflow Manager: Stop Lan Automation Failing…
madhansansel Feb 19, 2026
a0ab7e7
SDA Extranet Policies Workflow Manager Documetation Fix
shatagopasunil Feb 20, 2026
9f08b23
Make template_parameters optional
Feb 20, 2026
ee22305
Make template_parameters optional in template_workflow_manager (#386)
madhansansel Feb 20, 2026
a9e2f00
SDA Extranet Policies Workflow Manager Documetation Fix (#385)
madhansansel Feb 20, 2026
7a4ddb1
fix: normalize leading whitespace in REPORT_TYPES_AND_FORMATS doc string
Kandarimegha Feb 24, 2026
e78e2e4
Merge branch 'main' into flexible_reports
Kandarimegha Feb 24, 2026
3eacfab
addressed review comments
Kandarimegha Feb 24, 2026
836c13f
test in progress
syed-khadeerahmed Feb 25, 2026
5cb9f60
removed leading spaces
Kandarimegha Feb 25, 2026
b32bd44
update
Kandarimegha Feb 25, 2026
bbc4ac3
Fix missing filter and field validation in report templates (#377)
madhansansel Feb 25, 2026
3e625c8
fixed merged conflict
syed-khadeerahmed Feb 27, 2026
33b2633
Site Workflow manager - issue 312 for clear error message
md-rafeek Mar 2, 2026
fc429d4
Site Workflow manager - addressed code review comments
md-rafeek Mar 5, 2026
82b8490
Fix NoneType errors in device serial number retrieval
koderchit Mar 8, 2026
f0f9cab
Fix NoneType errors in device serial number retrieval (#389)
madhansansel Mar 8, 2026
f2c23ea
Wireless Design Workflow Manger Bug Fixes
shatagopasunil Mar 9, 2026
a0ba4dc
Added UT
shatagopasunil Mar 9, 2026
9ce45a6
Bug fix for fixing idempotent issue
shatagopasunil Mar 9, 2026
443a833
Wireless Design Workflow Manger Bug Fixes (#390)
madhansansel Mar 9, 2026
c061f8a
Merge branch 'main' of https://github.com/cisco-en-programmability/ca…
md-rafeek Mar 9, 2026
9579e02
Site Workflow manager - issue 312 for clear error message (#388)
madhansansel Mar 11, 2026
9ead5b5
Made stp_instance_vlan_id and igmp_snooping_vlan_id optional in wired…
Mar 12, 2026
90f417b
Lint fix
Mar 12, 2026
6baa041
Addressed comments
Mar 12, 2026
390bbd5
Bug fixed
Priyadharshini16092002 Mar 13, 2026
6d0ae5d
Wireless design bugs completed (#387)
madhansansel Mar 13, 2026
8e5dab8
Made stp_instance_vlan_id and igmp_snooping_vlan_id optional in wired…
madhansansel Mar 13, 2026
5b0e8cc
Adddressed review comments
Priyadharshini16092002 Mar 13, 2026
bfd5d71
Bug fixed - Events and notifications workflow manager (#392)
madhansansel Mar 13, 2026
4837239
Merge from mainline (#393)
madhansansel Mar 17, 2026
874e267
bug fixed
syed-khadeerahmed Mar 17, 2026
665db83
bug fixed - wireless design workflow manager (#394)
madhansansel Mar 18, 2026
e3d5e5b
Publish workflow manager modules in main branch
madhansansel Mar 18, 2026
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
14 changes: 14 additions & 0 deletions changelogs/changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1971,3 +1971,17 @@ releases:
deprecated_features:
- The cisco.dnac collection is now deprecated. Please migrate to cisco.catalystcenter, which provides the same functionality under the updated Cisco Catalyst Center branding.
- All modules now emit a deprecation warning at runtime directing users to cisco.catalystcenter.

6.48.2:
release_date: "2026-03-18"
changes:
release_summary: Changes in workflow manager modules, Documentation enhancements and Ansible Galaxy build configuration updates for the cisco.dnac Ansible Collection
minor_changes:
- Changes in events_and_notifications_workflow_manager module
- Changes in lan_automation_workflow_manager module
- Changes in reports_workflow_manager module
- Changes in sda_extranet_policies_workflow_manager module
- Changes in site_workflow_manager module
- Changes in template_workflow_manager module
- Changes in wired_campus_automation_workflow_manager module
- Changes in wireless_design_workflow_manager module
2 changes: 1 addition & 1 deletion galaxy.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
namespace: cisco
name: dnac
version: 6.48.1
version: 6.48.2
readme: README.md
authors:
- Rafael Campos <rcampos@cloverhound.com>
Expand Down
45 changes: 30 additions & 15 deletions plugins/module_utils/dnac.py
Original file line number Diff line number Diff line change
Expand Up @@ -1738,11 +1738,13 @@ def is_json(self, file_path):
self.log("The provided file '{0}' is not in JSON format".format(file_path), "CRITICAL")
return False

def check_task_tree_response(self, task_id):
def check_task_tree_response(self, task_id, all_failure_reason=None):
"""
Returns the task tree response of the task ID.
Args:
task_id (string) - The unique identifier of the task for which you want to retrieve details.
all_failure_reason (bool) - If True, retrieves all failure reasons for the task.

Returns:
error_msg (str) - Returns the task tree error message of the task ID.
"""
Expand All @@ -1752,15 +1754,24 @@ def check_task_tree_response(self, task_id):
function='get_task_tree',
params={"task_id": task_id}
)
self.log("Retrieving task tree details by the API 'get_task_tree' using task ID: {0}, Response: {1}"
.format(task_id, response), "DEBUG")
self.log(f"Retrieving task tree details by the API 'get_task_tree' using task ID: {task_id}, "
f"and failure reason set to '{all_failure_reason}', "
f"Response: {self.pprint(response)}", "DEBUG")

error_msg = ""
if response and isinstance(response, dict):
result = response.get('response')
error_messages = []
for item in result:
if item.get("isError") is True:
error_messages.append(item.get("progress"))

if all_failure_reason is True:
for item in result:
if item.get("isError") is True:
error_messages.append(item.get("failureReason"))
error_messages = error_messages[::-1]
else:
for item in result:
if item.get("isError") is True:
error_messages.append(item.get("progress"))

if error_messages:
error_msg = ". ".join(error_messages) + "."
Expand Down Expand Up @@ -2207,7 +2218,7 @@ def get_taskid_post_api_call(self, api_family, api_function, api_parameters):
)
self.fail_and_exit(self.msg)

def get_task_status_from_tasks_by_id(self, task_id, task_name, success_msg):
def get_task_status_from_tasks_by_id(self, task_id, task_name, success_msg, all_reasons=None):
"""
Retrieves and monitors the status of a task by its task ID.
This function continuously checks the status of a specified task using its task ID.
Expand All @@ -2217,6 +2228,7 @@ def get_task_status_from_tasks_by_id(self, task_id, task_name, success_msg):
task_id (str): The unique identifier of the task to monitor.
task_name (str): The name of the task being monitored.
success_msg (str): The success message to set if the task completes successfully.
all_reasons (bool, optional): If True, retrieves all failure reasons for the task. Defaults to None.
Returns:
self: The instance of the class with updated status and message.
"""
Expand Down Expand Up @@ -2253,15 +2265,18 @@ def get_task_status_from_tasks_by_id(self, task_id, task_name, success_msg):
if status == "FAILURE":
get_task_details_response = self.get_task_details_by_id(task_id)
failure_reason = get_task_details_response.get("failureReason")
if failure_reason:
self.msg = (
"Failed to execute the task {0} with Task ID: {1}."
"Failure reason: {2}".format(task_name, task_id, failure_reason)
)
if all_reasons is True:
self.msg = self.check_task_tree_response(task_id, True)
else:
self.msg = (
"Failed to execute the task {0} with Task ID: {1}.".format(task_name, task_id)
).format(task_name, task_id)
if failure_reason:
self.msg = (
"Failed to execute the task {0} with Task ID: {1}."
"Failure reason: {2}".format(task_name, task_id, failure_reason)
)
else:
self.msg = (
"Failed to execute the task {0} with Task ID: {1}.".format(task_name, task_id)
).format(task_name, task_id)
self.set_operation_result("failed", False, self.msg, "ERROR")
break
elif status == "SUCCESS":
Expand Down
21 changes: 21 additions & 0 deletions plugins/modules/events_and_notifications_workflow_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -2352,11 +2352,32 @@ def collect_webhook_playbook_params(self, webhook_details):

if webhook_details.get("headers") == []:
playbook_params["headers"] = []
self.log(
"Webhook headers explicitly set to empty list in playbook - "
"existing headers will be removed during update.",
"DEBUG",
)
elif webhook_details.get("headers"):
custom_header = webhook_details["headers"]
playbook_params["headers"] = []
for header in custom_header:
playbook_params["headers"].append(header)
self.log(
"Webhook headers collected from playbook: {0}".format(
playbook_params["headers"]
),
"DEBUG",
)
else:
# Headers not specified in playbook — set to empty list so that
# any existing headers on the destination are detected as a change
# and removed during update.
playbook_params["headers"] = []
self.log(
"No webhook headers specified in playbook - defaulting to empty list. "
"Any existing headers on the destination will be removed during update.",
"DEBUG",
)

return playbook_params

Expand Down
36 changes: 21 additions & 15 deletions plugins/modules/lan_automation_workflow_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,12 @@
type: dict
suboptions:
discovered_device_site_name_hierarchy:
description: Site hierarchy where the discovered
devices will be placed.
description: |
- Site hierarchy where the discovered
devices will be placed.
- Required only in merged state.
type: str
required: true
required: false
primary_device_management_ip_address:
description: Management IP address of the
primary or seed device in the LAN Automation
Expand All @@ -88,18 +90,22 @@
type: str
required: false
primary_device_interface_names:
description: A list of interface names on
the primary device to be used for LAN
automation.
description: |
- A list of interface names on
the primary device to be used for LAN
automation.
- Required only in merged state.
type: list
elements: str
required: true
required: false
ip_pools:
description: A list of IP pools used during
the LAN Automation session.
description: |
- A list of IP pools used during
the LAN Automation session.
- Required only in merged state.
type: list
elements: dict
required: true
required: false
suboptions:
ip_pool_name:
description: Name of the IP pool.
Expand Down Expand Up @@ -1041,15 +1047,15 @@ def validate_input(self):
"elements": "dict",
"discovered_device_site_name_hierarchy": {
"type": "str",
"required": True,
"required": False,
},
"primary_device_management_ip_address": {
"type": "str",
"required": True,
},
"primary_device_interface_names": {
"type": "list",
"required": True,
"required": False,
"elements": "str",
},
"peer_device_management_ip_address": {
Expand All @@ -1058,7 +1064,7 @@ def validate_input(self):
},
"ip_pools": {
"type": "list",
"required": True,
"required": False,
"elements": "dict",
"ip_pool_name": {"type": "str", "required": True},
"ip_pool_role": {
Expand Down Expand Up @@ -5115,10 +5121,10 @@ def get_lan_auto_task_status(self, task_id):
pnp_authorization = lan_automation.get("pnpAuthorization", False)
device_serials = [
serial.upper()
for serial in lan_automation.get("deviceSerialNumberAuthorization", [])
for serial in (lan_automation.get("deviceSerialNumberAuthorization") or [])
] or [
device.get("deviceSerialNumber", "").upper()
for device in lan_automation.get("discoveryDevices", [])
for device in (lan_automation.get("discoveryDevices") or [])
]

self.log("LAN Automation Config: {}".format(lan_automation), "DEBUG")
Expand Down
Loading
Loading