diff --git a/lib/ansible/modules/network/ios/ios_l2_interface.py b/lib/ansible/modules/network/ios/ios_l2_interface.py index 478ac1a1cf7..27292bf1c4b 100644 --- a/lib/ansible/modules/network/ios/ios_l2_interface.py +++ b/lib/ansible/modules/network/ios/ios_l2_interface.py @@ -185,18 +185,21 @@ def remove_switchport_config_commands(name, existing, proposed, module): commands.append(command) elif mode == 'trunk': - tv_check = existing.get('trunk_vlans_list') == proposed.get('trunk_vlans_list') - - if not tv_check: - existing_vlans = existing.get('trunk_vlans_list') - proposed_vlans = proposed.get('trunk_vlans_list') - vlans_to_remove = set(proposed_vlans).intersection(existing_vlans) - - if vlans_to_remove: - proposed_allowed_vlans = proposed.get('trunk_allowed_vlans') - remove_trunk_allowed_vlans = proposed.get('trunk_vlans', proposed_allowed_vlans) - command = 'switchport trunk allowed vlan remove {0}'.format(remove_trunk_allowed_vlans) - commands.append(command) + # Supported Remove Scenarios for trunk_vlans_list + # 1) Existing: 1,2,3 Proposed: 1,2,3 - Remove all + # 2) Existing: 1,2,3 Proposed: 1,2 - Remove 1,2 Leave 3 + # 3) Existing: 1,2,3 Proposed: 2,3 - Remove 2,3 Leave 1 + # 4) Existing: 1,2,3 Proposed: 4,5,6 - None removed. + # 5) Existing: None Proposed: 1,2,3 - None removed. + existing_vlans = existing.get('trunk_vlans_list') + proposed_vlans = proposed.get('trunk_vlans_list') + vlans_to_remove = set(proposed_vlans).intersection(existing_vlans) + + if vlans_to_remove: + proposed_allowed_vlans = proposed.get('trunk_allowed_vlans') + remove_trunk_allowed_vlans = proposed.get('trunk_vlans', proposed_allowed_vlans) + command = 'switchport trunk allowed vlan remove {0}'.format(remove_trunk_allowed_vlans) + commands.append(command) native_check = existing.get('native_vlan') == proposed.get('native_vlan') if native_check and proposed.get('native_vlan'): @@ -291,7 +294,7 @@ def vlan_range_to_list(vlans): result = [] if vlans: for part in vlans.split(','): - if part == 'none': + if part.lower() == 'none': break if '-' in part: start, stop = (int(i) for i in part.split('-')) diff --git a/test/integration/targets/ios_l2_interface/tests/cli/sanity.yaml b/test/integration/targets/ios_l2_interface/tests/cli/sanity.yaml index b0596d4c61f..44466f96171 100644 --- a/test/integration/targets/ios_l2_interface/tests/cli/sanity.yaml +++ b/test/integration/targets/ios_l2_interface/tests/cli/sanity.yaml @@ -88,23 +88,52 @@ - assert: *false - - name: Ensure these VLANs are not being tagged on the trunk + - name: Remove full trunk vlan range 2-50 ios_l2_interface: &no_tag name: "{{ test_interface }}" mode: trunk - trunk_vlans: 30-4094 + trunk_vlans: 2-50 state: absent provider: "{{ cli }}" register: result - assert: *true - - name: "no tag vlan Idempotence" + - name: Check Idempotence Remove full trunk vlan range 2-50 ios_l2_interface: *no_tag register: result - assert: *false + - name: Reconfigure interface trunk port and ensure 2-50 are being tagged + ios_l2_interface: *tag + register: result + + - assert: *true + + - name: Check Idempotence Reconfigure interface trunk port and ensure 2-50 are being tagged + ios_l2_interface: *tag + register: result + + - assert: *false + + - name: Remove partial trunk vlan range 30-4094 are removed + ios_l2_interface: &partial + name: "{{ test_interface }}" + mode: trunk + trunk_vlans: 30-4094 + state: absent + provider: "{{ cli }}" + register: result + + - assert: *true + + - name: Check Idempotence Remove partial trunk vlan range 30-4094 are removed + ios_l2_interface: *partial + register: result + + - assert: *false + - name: put interface default state ios_l2_interface: *def_swi register: result