diff --git a/changelogs/changelog.yaml b/changelogs/changelog.yaml index 7972040f81..652662ef7a 100644 --- a/changelogs/changelog.yaml +++ b/changelogs/changelog.yaml @@ -1412,3 +1412,11 @@ releases: - wireless_settings_power_profiles_v1_info - new module - wireless_settings_power_profiles_v1 - new module - wireless_settings_ssids_override_at_sites_v1_info - new module + + 6.28.0: + release_date: "2025-01-08" + changes: + release_summary: Fixed issues + minor_changes: + - Fixed issues in module sda_anycast_gateways_v1 + - Fixed issues in module sda_layer3_virtual_networks_v1 diff --git a/galaxy.yml b/galaxy.yml index ff34cfc22a..bd86bb4b02 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,7 +1,7 @@ --- namespace: cisco name: dnac -version: 6.27.0 +version: 6.28.0 readme: README.md authors: - Rafael Campos diff --git a/playbooks/sda_anycast_gateways.yml b/playbooks/sda_anycast_gateways.yml new file mode 100644 index 0000000000..510fe9da94 --- /dev/null +++ b/playbooks/sda_anycast_gateways.yml @@ -0,0 +1,40 @@ +--- +- hosts: dnac_servers + vars_files: + - credentials.yml + gather_facts: false + tasks: + - name: Create sda anycast gateways v1 + cisco.dnac.sda_anycast_gateways_v1: + dnac_host: "{{ dnac_host }}" + dnac_port: "{{ dnac_port }}" + dnac_username: "{{ dnac_username }}" + dnac_password: "{{ dnac_password }}" + dnac_verify: "{{ dnac_verify }}" + dnac_debug: "{{ dnac_debug }}" + state: present + payload: + - fabricId: "b6af9074-b1d8-4b40-82f9-776d34adb0fc" + virtualNetworkName: "INFRA_VN" + vlanId: 100 + vlanName: "VLAN_100" + ipPoolName: "IP_POOL_100" + isCriticalPool: true + isGroupBasedPolicyEnforcementEnabled: true + isIntraSubnetRoutingEnabled: true + isIpDirectedBroadcast: true + isLayer2FloodingEnabled: true + isMultipleIpToMacAddresses: true + isSupplicantBasedExtendedNodeOnboarding: true + isWirelessPool: true + poolType: "EXTENDED_NODE" + securityGroupName: "SG_DEFAULT" + tcpMssAdjustment: 1400 + trafficType: "DATA" + anchoredSiteId: "7087c88f-ec73-4df1-8f6b-136d7e2ed9e2" + + register: result + + - name: Show result + debug: + var: result diff --git a/playbooks/sda_layer3_virtual_networks.yml b/playbooks/sda_layer3_virtual_networks.yml new file mode 100644 index 0000000000..527eabf7cf --- /dev/null +++ b/playbooks/sda_layer3_virtual_networks.yml @@ -0,0 +1,39 @@ +--- +- hosts: dnac_servers + vars_files: + - credentials.yml + gather_facts: false + tasks: + - name: Update layer 3 virtual networks v1 + cisco.dnac.sda_layer3_virtual_networks_v1: + dnac_host: "{{ dnac_host }}" + dnac_port: "{{ dnac_port }}" + dnac_username: "{{ dnac_username }}" + dnac_password: "{{ dnac_password }}" + dnac_verify: "{{ dnac_verify }}" + dnac_debug: "{{ dnac_debug }}" + state: present + payload: + - virtualNetworkName: "DEFAULT_VN" + id: "1cc6dab4-d4e8-4523-bbc5-7f7bb4eb4c7c" + register: result + + - name: Create layer 3 virtual networks v1 + cisco.dnac.sda_layer3_virtual_networks_v1: + dnac_host: "{{ dnac_host }}" + dnac_port: "{{ dnac_port }}" + dnac_username: "{{ dnac_username }}" + dnac_password: "{{ dnac_password }}" + dnac_verify: "{{ dnac_verify }}" + dnac_debug: "{{ dnac_debug }}" + state: present + payload: + - virtualNetworkName: "DEFAULT_VNee" + fabricIds: + - "e3327bd5-e30b-40be-92ac-d6235f35a29b" + anchoredSiteId: "7087c88f-ec73-4df1-8f6b-136d7e2ed9e2" + register: result + + - name: Show result + debug: + var: result diff --git a/plugins/action/sda_anycast_gateways_v1.py b/plugins/action/sda_anycast_gateways_v1.py index d7326a6342..1e59eb18e4 100644 --- a/plugins/action/sda_anycast_gateways_v1.py +++ b/plugins/action/sda_anycast_gateways_v1.py @@ -36,10 +36,8 @@ )) required_if = [ - ("state", "present", ["id"], True), ("state", "present", ["payload"], True), ("state", "absent", ["id"], True), - ("state", "absent", ["payload"], True), ] required_one_of = [] mutually_exclusive = [] @@ -56,17 +54,24 @@ def __init__(self, params, dnac): def get_all_params(self, name=None, id=None): new_object_params = {} - new_object_params['id'] = id or self.new_object.get('id') - new_object_params['fabric_id'] = self.new_object.get('fabricId') or \ - self.new_object.get('fabric_id') - new_object_params['virtual_network_name'] = self.new_object.get('virtualNetworkName') or \ - self.new_object.get('virtual_network_name') - new_object_params['ip_pool_name'] = self.new_object.get('ipPoolName') or \ - self.new_object.get('ip_pool_name') - new_object_params['vlan_name'] = self.new_object.get('vlanName') or \ - self.new_object.get('vlan_name') - new_object_params['vlan_id'] = self.new_object.get('vlanId') or \ - self.new_object.get('vlan_id') + if isinstance(self.new_object.get("payload"), list): + if "id" in self.new_object.get("payload")[0]: + new_object_params['id'] = id or self.new_object.get('id') or self.new_object.get('payload')[0]['id'] + if "fabricId" in self.new_object.get("payload")[0]: + new_object_params['fabric_id'] = self.new_object.get('fabricId') or \ + self.new_object.get('fabric_id') or self.new_object.get('payload')[0]['fabricId'] + if "virtualNetworkName" in self.new_object.get("payload")[0]: + new_object_params['virtual_network_name'] = self.new_object.get('virtualNetworkName') or \ + self.new_object.get('virtual_network_name') or self.new_object.get('payload')[0]['virtualNetworkName'] + if "ipPoolName" in self.new_object.get("payload")[0]: + new_object_params['ip_pool_name'] = self.new_object.get('ipPoolName') or \ + self.new_object.get('ip_pool_name') or self.new_object.get('payload')[0]['ipPoolName'] + if "vlanName" in self.new_object.get("payload")[0]: + new_object_params['vlan_name'] = self.new_object.get('vlanName') or \ + self.new_object.get('vlan_name') or self.new_object.get('payload')[0]['vlanName'] + if "vlanId" in self.new_object.get("payload")[0]: + new_object_params['vlan_id'] = self.new_object.get('vlanId') or \ + self.new_object.get('vlan_id') or self.new_object.get('payload')[0]['vlanId'] new_object_params['offset'] = self.new_object.get('offset') new_object_params['limit'] = self.new_object.get('limit') return new_object_params @@ -89,6 +94,7 @@ def update_all_params(self): def get_object_by_name(self, name, is_absent=False): result = None # NOTE: Does not have a get by name method or it is in another action + print(self.get_all_params(name=name)) try: items = self.dnac.exec( family="sda", @@ -157,7 +163,6 @@ def requires_update(self, current_obj): ("isMultipleIpToMacAddresses", "isMultipleIpToMacAddresses"), ("isSupplicantBasedExtendedNodeOnboarding", "isSupplicantBasedExtendedNodeOnboarding"), ("isGroupBasedPolicyEnforcementEnabled", "isGroupBasedPolicyEnforcementEnabled"), - ("id", "id"), ] # Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params # If any does not have eq params, it requires update diff --git a/plugins/action/sda_layer3_virtual_networks_v1.py b/plugins/action/sda_layer3_virtual_networks_v1.py index f7a0619394..95f443b431 100644 --- a/plugins/action/sda_layer3_virtual_networks_v1.py +++ b/plugins/action/sda_layer3_virtual_networks_v1.py @@ -54,14 +54,19 @@ def __init__(self, params, dnac): def get_all_params(self, name=None, id=None): new_object_params = {} - new_object_params['virtual_network_name'] = self.new_object.get('virtualNetworkName') or \ - self.new_object.get('virtual_network_name') - new_object_params['fabric_id'] = self.new_object.get('fabricId') or \ - self.new_object.get('fabric_id') - new_object_params['anchored_site_id'] = self.new_object.get('anchoredSiteId') or \ - self.new_object.get('anchored_site_id') - new_object_params['offset'] = self.new_object.get('offset') - new_object_params['limit'] = self.new_object.get('limit') + if isinstance(self.new_object.get("payload"), list): + if "virtualNetworkName" in self.new_object.get("payload")[0]: + new_object_params['virtual_network_name'] = self.new_object.get('virtualNetworkName') or \ + self.new_object.get('virtual_network_name') or self.new_object.get('payload')[0]['virtualNetworkName'] + if "fabricIds" in self.new_object.get("payload")[0]: + new_object_params['fabric_id'] = self.new_object.get('fabricId') or \ + self.new_object.get('fabric_id') or self.new_object.get('payload')[0]['fabricIds'][0] + if "anchoredSiteId" in self.new_object.get("payload")[0]: + new_object_params['anchored_site_id'] = self.new_object.get('anchoredSiteId') or \ + self.new_object.get('anchored_site_id') or self.new_object.get('payload')[0]['anchoredSiteId'] + new_object_params['offset'] = self.new_object.get('offset') + new_object_params['limit'] = self.new_object.get('limit') + print(new_object_params) return new_object_params def create_params(self):