Fix eos_l2_interface idempotency (#56531)

* Attempt to handle just mode trunk properly

* Add test for trunk-only config and clean up tests

* Add missing eapi tests and remove references to provider as we do not test local
This commit is contained in:
Nathaniel Case 2019-05-17 13:06:27 -04:00 committed by GitHub
parent 18f22de67e
commit 63e33f7e71
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 149 additions and 76 deletions

View file

@ -119,9 +119,8 @@ def search_obj_in_list(name, lst):
return None return None
def map_obj_to_commands(updates, module): def map_obj_to_commands(want, have, module):
commands = list() commands = list()
want, have = updates
for w in want: for w in want:
name = w['name'] name = w['name']
@ -170,11 +169,10 @@ def map_obj_to_commands(updates, module):
if mode != obj_in_have['mode']: if mode != obj_in_have['mode']:
if obj_in_have['mode'] == 'access': if obj_in_have['mode'] == 'access':
commands.append('no switchport access vlan {0}'.format(obj_in_have['access_vlan'])) commands.append('no switchport access vlan {0}'.format(obj_in_have['access_vlan']))
if native_vlan:
commands.append('switchport mode trunk') commands.append('switchport mode trunk')
if native_vlan:
commands.append('switchport trunk native vlan {0}'.format(native_vlan)) commands.append('switchport trunk native vlan {0}'.format(native_vlan))
if trunk_allowed_vlans: if trunk_allowed_vlans:
commands.append('switchport mode trunk')
commands.append('switchport trunk allowed vlan {0}'.format(trunk_allowed_vlans)) commands.append('switchport trunk allowed vlan {0}'.format(trunk_allowed_vlans))
else: else:
if obj_in_have['native_vlan']: if obj_in_have['native_vlan']:
@ -189,7 +187,6 @@ def map_obj_to_commands(updates, module):
if access_vlan != obj_in_have['access_vlan']: if access_vlan != obj_in_have['access_vlan']:
commands.append('switchport access vlan {0}'.format(access_vlan)) commands.append('switchport access vlan {0}'.format(access_vlan))
else: else:
commands.append('switchport mode {0}'.format(mode))
if native_vlan != obj_in_have['native_vlan'] and native_vlan: if native_vlan != obj_in_have['native_vlan'] and native_vlan:
commands.append('switchport trunk native vlan {0}'.format(native_vlan)) commands.append('switchport trunk native vlan {0}'.format(native_vlan))
if trunk_allowed_vlans != obj_in_have['trunk_allowed_vlans'] and trunk_allowed_vlans: if trunk_allowed_vlans != obj_in_have['trunk_allowed_vlans'] and trunk_allowed_vlans:
@ -307,7 +304,7 @@ def main():
want = map_params_to_obj(module) want = map_params_to_obj(module)
have = map_config_to_obj(module, warnings) have = map_config_to_obj(module, warnings)
commands = map_obj_to_commands((want, have), module) commands = map_obj_to_commands(want, have, module)
result['commands'] = commands result['commands'] = commands
if commands: if commands:

View file

@ -1,140 +1,108 @@
--- ---
- debug: msg="START eos_l2_interface cli/basic.yaml on connection={{ ansible_connection }}" - debug:
msg: "START eos_l2_interface cli/basic.yaml on connection={{ ansible_connection }}"
- name: Delete test interface switchports - name: Delete test interface switchports
eos_l2_interface: eos_l2_interface: &clear
name: Ethernet1 name: Ethernet1
state: absent state: absent
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
- name: Set switchport mode to access on vlan 4000 - name: Set switchport mode to access on vlan 4000
eos_l2_interface: eos_l2_interface: &vlan-4000
name: Ethernet1 name: Ethernet1
state: present state: present
mode: access mode: access
access_vlan: 4000 access_vlan: 4000
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: &changed
that: that:
- 'result.changed == true' - 'result.changed == true'
- name: Set switchport mode to access on vlan 4000 again (idempotent) - name: Set switchport mode to access on vlan 4000 again (idempotent)
eos_l2_interface: eos_l2_interface: *vlan-4000
name: Ethernet1
state: present
mode: access
access_vlan: 4000
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: &unchanged
that: that:
- 'result.changed == false' - 'result.changed == false'
- name: Change access vlan to 4001 - name: Change access vlan to 4001
eos_l2_interface: eos_l2_interface: &vlan-4001
name: Ethernet1 name: Ethernet1
state: present state: present
mode: access mode: access
access_vlan: 4001 access_vlan: 4001
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *changed
that:
- 'result.changed == true'
- name: Change access vlan to 4001 again (idempotent) - name: Change access vlan to 4001 again (idempotent)
eos_l2_interface: eos_l2_interface: *vlan-4001
name: Ethernet1
state: present
mode: access
access_vlan: 4001
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *unchanged
that:
- 'result.changed == false' - name: Change switchport mode to trunk
eos_l2_interface: &trunk
name: Ethernet1
state: present
mode: trunk
become: yes
register: result
- assert: *changed
- name: Change switchport mode to trunk (idempotent)
eos_l2_interface: *trunk
become: yes
register: result
- assert: *unchanged
- name: Change switchport mode to trunk and set native vlan to 4001 - name: Change switchport mode to trunk and set native vlan to 4001
eos_l2_interface: eos_l2_interface: &trunk-native
name: Ethernet1 name: Ethernet1
state: present state: present
mode: trunk mode: trunk
native_vlan: 4001 native_vlan: 4001
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *changed
that:
- 'result.changed == true'
- name: Change switchport mode to trunk and set native vlan to 4001 again (idempotent) - name: Change switchport mode to trunk and set native vlan to 4001 again (idempotent)
eos_l2_interface: eos_l2_interface: *trunk-native
name: Ethernet1
state: present
mode: trunk
native_vlan: 4001
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *unchanged
that:
- 'result.changed == false'
- name: Set trunk allowed vlans to 20 and 4000 - name: Set trunk allowed vlans to 20 and 4000
eos_l2_interface: eos_l2_interface: &trunk-allowed
name: Ethernet1 name: Ethernet1
state: present state: present
mode: trunk mode: trunk
trunk_allowed_vlans: 20,4000 trunk_allowed_vlans: 20,4000
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *changed
that:
- 'result.changed == true'
- name: Set trunk allowed vlans to 20 and 4000 again (idempotent) - name: Set trunk allowed vlans to 20 and 4000 again (idempotent)
eos_l2_interface: eos_l2_interface: *trunk-allowed
name: Ethernet1
state: present
mode: trunk
trunk_allowed_vlans: 20,4000
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
register: result register: result
- assert: - assert: *unchanged
that:
- 'result.changed == false'
- name: Tear down switchports - name: Tear down switchports
eos_l2_interface: eos_l2_interface: *clear
name: Ethernet1
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes become: yes
- debug: msg="END eos_l3_interface cli/basic.yaml on connection={{ ansible_connection }}" - debug: msg="END eos_l2_interface cli/basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,108 @@
---
- debug:
msg: "START eos_l2_interface eapi/basic.yaml on connection={{ ansible_connection }}"
- name: Delete test interface switchports
eos_l2_interface: &clear
name: Ethernet1
state: absent
become: yes
- name: Set switchport mode to access on vlan 4000
eos_l2_interface: &vlan-4000
name: Ethernet1
state: present
mode: access
access_vlan: 4000
become: yes
register: result
- assert: &changed
that:
- 'result.changed == true'
- name: Set switchport mode to access on vlan 4000 again (idempotent)
eos_l2_interface: *vlan-4000
become: yes
register: result
- assert: &unchanged
that:
- 'result.changed == false'
- name: Change access vlan to 4001
eos_l2_interface: &vlan-4001
name: Ethernet1
state: present
mode: access
access_vlan: 4001
become: yes
register: result
- assert: *changed
- name: Change access vlan to 4001 again (idempotent)
eos_l2_interface: *vlan-4001
become: yes
register: result
- assert: *unchanged
- name: Change switchport mode to trunk
eos_l2_interface: &trunk
name: Ethernet1
state: present
mode: trunk
become: yes
register: result
- assert: *changed
- name: Change switchport mode to trunk (idempotent)
eos_l2_interface: *trunk
become: yes
register: result
- assert: *unchanged
- name: Change switchport mode to trunk and set native vlan to 4001
eos_l2_interface: &trunk-native
name: Ethernet1
state: present
mode: trunk
native_vlan: 4001
become: yes
register: result
- assert: *changed
- name: Change switchport mode to trunk and set native vlan to 4001 again (idempotent)
eos_l2_interface: *trunk-native
become: yes
register: result
- assert: *unchanged
- name: Set trunk allowed vlans to 20 and 4000
eos_l2_interface: &trunk-allowed
name: Ethernet1
state: present
mode: trunk
trunk_allowed_vlans: 20,4000
become: yes
register: result
- assert: *changed
- name: Set trunk allowed vlans to 20 and 4000 again (idempotent)
eos_l2_interface: *trunk-allowed
become: yes
register: result
- assert: *unchanged
- name: Tear down switchports
eos_l2_interface: *clear
become: yes
- debug: msg="END eos_l2_interface eapi/basic.yaml on connection={{ ansible_connection }}"