mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-05-30 12:59:09 -07:00
Add ios_linkagg DI module (#33215)
* Add ios_linkagg DI module Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * pep8 fixes * update ios version * ios_linkagg integration test Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * fix port-channel commands * update test * ios tests to network_cli Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * add required_together check in aggregate and update test Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * fix pep8 issues * Add discovery of ios switch type Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
This commit is contained in:
parent
557716dc49
commit
2e76f04a9e
9 changed files with 723 additions and 180 deletions
|
@ -121,14 +121,24 @@
|
|||
failed_modules: "{{ failed_modules }} + [ 'ios_lldp' ]"
|
||||
test_failed: true
|
||||
|
||||
# - block:
|
||||
# - include_role:
|
||||
# name: ios_vlan
|
||||
# when: "limit_to in ['*', 'ios_vlan']"
|
||||
# rescue:
|
||||
# - set_fact:
|
||||
# failed_modules: "{{ failed_modules }} + [ 'ios_vlan' ]"
|
||||
# test_failed: true
|
||||
- block:
|
||||
- include_role:
|
||||
name: ios_vlan
|
||||
when: "limit_to in ['*', 'ios_vlan']"
|
||||
rescue:
|
||||
- set_fact:
|
||||
failed_modules: "{{ failed_modules }} + [ 'ios_vlan' ]"
|
||||
test_failed: true
|
||||
|
||||
- block:
|
||||
- include_role:
|
||||
name: ios_linkagg
|
||||
when: "limit_to in ['*', 'ios_linkagg']"
|
||||
rescue:
|
||||
- set_fact:
|
||||
failed_modules: "{{ failed_modules }} + [ 'ios_linkagg' ]"
|
||||
test_failed: true
|
||||
|
||||
|
||||
###########
|
||||
- debug: var=failed_modules
|
||||
|
|
3
test/integration/targets/ios_linkagg/defaults/main.yaml
Normal file
3
test/integration/targets/ios_linkagg/defaults/main.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
testcase: "*"
|
||||
test_items: []
|
2
test/integration/targets/ios_linkagg/meta/main.yaml
Normal file
2
test/integration/targets/ios_linkagg/meta/main.yaml
Normal file
|
@ -0,0 +1,2 @@
|
|||
dependencies:
|
||||
- prepare_ios_tests
|
22
test/integration/targets/ios_linkagg/tasks/cli.yaml
Normal file
22
test/integration/targets/ios_linkagg/tasks/cli.yaml
Normal file
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
- name: collect all cli test cases
|
||||
find:
|
||||
paths: "{{ role_path }}/tests/cli"
|
||||
patterns: "{{ testcase }}.yaml"
|
||||
register: test_cases
|
||||
delegate_to: localhost
|
||||
|
||||
- name: set test_items
|
||||
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
|
||||
|
||||
- name: run test cases (connection=network_cli)
|
||||
include: "{{ test_case_to_run }}"
|
||||
with_items: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
||||
|
||||
- name: run test case (connection=local)
|
||||
include: "{{ test_case_to_run }} ansible_connection=local"
|
||||
with_first_found: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
2
test/integration/targets/ios_linkagg/tasks/main.yaml
Normal file
2
test/integration/targets/ios_linkagg/tasks/main.yaml
Normal file
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
- { include: cli.yaml, tags: ['cli'] }
|
171
test/integration/targets/ios_linkagg/tests/cli/basic.yaml
Normal file
171
test/integration/targets/ios_linkagg/tests/cli/basic.yaml
Normal file
|
@ -0,0 +1,171 @@
|
|||
---
|
||||
- debug: msg="START cli/basic.yaml on connection={{ ansible_connection }}"
|
||||
|
||||
- set_fact: switch_type="{{ switch_type }}"
|
||||
|
||||
- block:
|
||||
|
||||
- name: setup - remove config used in test(part1)
|
||||
ios_config:
|
||||
lines:
|
||||
- no interface port-channel 20
|
||||
authorize: yes
|
||||
ignore_errors: yes
|
||||
|
||||
- name: setup - remove config used in test(part2)
|
||||
ios_config:
|
||||
lines:
|
||||
- no interface port-channel 5
|
||||
authorize: yes
|
||||
ignore_errors: yes
|
||||
|
||||
- name: setup - remove config used in test(part3)
|
||||
ios_config:
|
||||
lines:
|
||||
- no channel-group 20 mode active
|
||||
authorize: yes
|
||||
parents: "{{ item }}"
|
||||
loop:
|
||||
- interface GigabitEthernet0/1
|
||||
- interface GigabitEthernet0/2
|
||||
|
||||
- name: create linkagg
|
||||
ios_linkagg: &create
|
||||
group: 20
|
||||
state: present
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'interface port-channel 20' in result.commands"
|
||||
|
||||
- name: create linkagg(Idempotence)
|
||||
ios_linkagg: *create
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: set link aggregation group to members
|
||||
ios_linkagg: &configure_member
|
||||
group: 20
|
||||
mode: active
|
||||
members:
|
||||
- GigabitEthernet0/1
|
||||
- GigabitEthernet0/2
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'interface GigabitEthernet0/1' in result.commands"
|
||||
- "'channel-group 20 mode active' in result.commands"
|
||||
- "'interface GigabitEthernet0/2' in result.commands"
|
||||
- "'channel-group 20 mode active' in result.commands"
|
||||
|
||||
- name: set link aggregation group to members(Idempotence)
|
||||
ios_linkagg: *configure_member
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: remove link aggregation group from member
|
||||
ios_linkagg: &remove_member
|
||||
group: 20
|
||||
mode: active
|
||||
members:
|
||||
- GigabitEthernet0/2
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'interface GigabitEthernet0/1' in result.commands"
|
||||
- "'no channel-group 20 mode active' in result.commands"
|
||||
|
||||
- name: remove link aggregation group from member(Idempotence)
|
||||
ios_linkagg: *remove_member
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: remove linkagg
|
||||
ios_linkagg: &remove
|
||||
group: 20
|
||||
state: absent
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'no interface port-channel 20' in result.commands"
|
||||
|
||||
- name: remove linkagg(Idempotence)
|
||||
ios_linkagg: *remove
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: create aggregate of linkagg definitions
|
||||
ios_linkagg: &create_agg
|
||||
aggregate:
|
||||
- { group: 5 }
|
||||
- { group: 20, mode: active, members: ['GigabitEthernet0/1'] }
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'interface port-channel 5' in result.commands"
|
||||
- "'interface port-channel 20' in result.commands"
|
||||
- "'interface GigabitEthernet0/1' in result.commands"
|
||||
- "'channel-group 20 mode active' in result.commands"
|
||||
|
||||
- name: create aggregate of linkagg definitions(Idempotence)
|
||||
ios_linkagg: *create_agg
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: teardown(part1)
|
||||
ios_config:
|
||||
lines:
|
||||
- no interface port-channel 20
|
||||
authorize: yes
|
||||
ignore_errors: yes
|
||||
|
||||
- name: teardown(part2)
|
||||
ios_config:
|
||||
lines:
|
||||
- no interface port-channel 5
|
||||
authorize: yes
|
||||
ignore_errors: yes
|
||||
|
||||
- name: teardown(part3)
|
||||
ios_config:
|
||||
lines:
|
||||
- no channel-group 20 mode active
|
||||
authorize: yes
|
||||
parents: "{{ item }}"
|
||||
loop:
|
||||
- interface GigabitEthernet0/1
|
||||
- interface GigabitEthernet0/2
|
||||
|
||||
when: switch_type == 'L2'
|
||||
|
||||
- debug: msg="END cli/basic.yaml on connection={{ ansible_connection }}"
|
|
@ -1,203 +1,213 @@
|
|||
#---
|
||||
#- name: setup - remove vlan used in test
|
||||
# ios_config:
|
||||
# lines:
|
||||
# - no vlan 100
|
||||
# - no vlan 200
|
||||
# - no vlan 300
|
||||
# authorize: yes
|
||||
---
|
||||
- debug: msg="START cli/basic.yaml on connection={{ ansible_connection }}"
|
||||
|
||||
#- name: setup - remove switchport settings on interfaces used in test
|
||||
# ios_config:
|
||||
# lines:
|
||||
# - switchport mode access
|
||||
# - no switchport access vlan 100
|
||||
# authorize: yes
|
||||
# parents: "{{ item }}"
|
||||
# with_items:
|
||||
# - interface GigabitEthernet0/1
|
||||
# - interface GigabitEthernet0/2
|
||||
- set_fact: switch_type="{{ switch_type }}"
|
||||
|
||||
#- name: create vlan
|
||||
# ios_vlan: &create
|
||||
# vlan_id: 100
|
||||
# name: test-vlan
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- block:
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'vlan 100' in result.commands"
|
||||
# - "'name test-vlan' in result.commands"
|
||||
- name: setup - remove vlan used in test
|
||||
ios_config:
|
||||
lines:
|
||||
- no vlan 100
|
||||
- no vlan 200
|
||||
- no vlan 300
|
||||
authorize: yes
|
||||
|
||||
#- name: create vlan(idempotence)
|
||||
# ios_vlan: *create
|
||||
# register: result
|
||||
- name: setup - remove switchport settings on interfaces used in test
|
||||
ios_config:
|
||||
lines:
|
||||
- switchport mode access
|
||||
- no switchport access vlan 100
|
||||
authorize: yes
|
||||
parents: "{{ item }}"
|
||||
loop:
|
||||
- interface GigabitEthernet0/1
|
||||
- interface GigabitEthernet0/2
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: create vlan
|
||||
ios_vlan: &create
|
||||
vlan_id: 100
|
||||
name: test-vlan
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: Add interfaces to vlan
|
||||
# ios_vlan: &interfaces
|
||||
# vlan_id: 100
|
||||
# interfaces:
|
||||
# - GigabitEthernet0/1
|
||||
# - GigabitEthernet0/2
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'vlan 100' in result.commands"
|
||||
- "'name test-vlan' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'interface GigabitEthernet0/1' in result.commands"
|
||||
# - "'switchport mode access' in result.commands"
|
||||
# - "'switchport access vlan 100' in result.commands"
|
||||
# - "'interface GigabitEthernet0/2' in result.commands"
|
||||
# - "'switchport mode access' in result.commands"
|
||||
# - "'switchport access vlan 100' in result.commands"
|
||||
- name: create vlan(idempotence)
|
||||
ios_vlan: *create
|
||||
register: result
|
||||
|
||||
#- name: Add interfaces to vlan(idempotence)
|
||||
# ios_vlan: *interfaces
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: Add interfaces to vlan
|
||||
ios_vlan: &interfaces
|
||||
vlan_id: 100
|
||||
interfaces:
|
||||
- GigabitEthernet0/1
|
||||
- GigabitEthernet0/2
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: Remove interface from vlan
|
||||
# ios_vlan: &single_int
|
||||
# vlan_id: 100
|
||||
# interfaces:
|
||||
# - GigabitEthernet0/1
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'interface GigabitEthernet0/1' in result.commands"
|
||||
- "'switchport mode access' in result.commands"
|
||||
- "'switchport access vlan 100' in result.commands"
|
||||
- "'interface GigabitEthernet0/2' in result.commands"
|
||||
- "'switchport mode access' in result.commands"
|
||||
- "'switchport access vlan 100' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'vlan 100' in result.commands"
|
||||
# - "'interface GigabitEthernet0/2' in result.commands"
|
||||
# - "'switchport mode access' in result.commands"
|
||||
# - "'no switchport access vlan 100' in result.commands"
|
||||
- name: Add interfaces to vlan(idempotence)
|
||||
ios_vlan: *interfaces
|
||||
register: result
|
||||
|
||||
#- name: Remove interface from vlan(idempotence)
|
||||
# ios_vlan: *single_int
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: Remove interface from vlan
|
||||
ios_vlan: &single_int
|
||||
vlan_id: 100
|
||||
interfaces:
|
||||
- GigabitEthernet0/1
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: Suspend vlan
|
||||
# ios_vlan:
|
||||
# vlan_id: 100
|
||||
# state: suspend
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'vlan 100' in result.commands"
|
||||
- "'interface GigabitEthernet0/2' in result.commands"
|
||||
- "'switchport mode access' in result.commands"
|
||||
- "'no switchport access vlan 100' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'vlan 100' in result.commands"
|
||||
# - "'state suspend' in result.commands"
|
||||
- name: Remove interface from vlan(idempotence)
|
||||
ios_vlan: *single_int
|
||||
register: result
|
||||
|
||||
#- name: Unsuspend vlan
|
||||
# ios_vlan:
|
||||
# vlan_id: 100
|
||||
# state: active
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'vlan 100' in result.commands"
|
||||
# - "'state active' in result.commands"
|
||||
- name: Suspend vlan
|
||||
ios_vlan:
|
||||
vlan_id: 100
|
||||
state: suspend
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: delete vlan
|
||||
# ios_vlan: &delete
|
||||
# vlan_id: 100
|
||||
# authorize: yes
|
||||
# state: absent
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'vlan 100' in result.commands"
|
||||
- "'state suspend' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'no vlan 100' in result.commands"
|
||||
- name: Unsuspend vlan
|
||||
ios_vlan:
|
||||
vlan_id: 100
|
||||
state: active
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: delete vlan(idempotence)
|
||||
# ios_vlan: *delete
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'vlan 100' in result.commands"
|
||||
- "'state active' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: delete vlan
|
||||
ios_vlan: &delete
|
||||
vlan_id: 100
|
||||
authorize: yes
|
||||
state: absent
|
||||
register: result
|
||||
|
||||
#- name: create vlans using aggregate
|
||||
# ios_vlan: &create_aggregate
|
||||
# aggregate:
|
||||
# - { vlan_id: 200, name: vlan-200 }
|
||||
# - { vlan_id: 300, name: vlan-300 }
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'no vlan 100' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'vlan 200' in result.commands"
|
||||
# - "'name vlan-200' in result.commands"
|
||||
# - "'vlan 300' in result.commands"
|
||||
# - "'name vlan-300' in result.commands"
|
||||
- name: delete vlan(idempotence)
|
||||
ios_vlan: *delete
|
||||
register: result
|
||||
|
||||
#- name: create vlans using aggregate(idempotence)
|
||||
# ios_vlan: *create_aggregate
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: create vlans using aggregate
|
||||
ios_vlan: &create_aggregate
|
||||
aggregate:
|
||||
- { vlan_id: 200, name: vlan-200 }
|
||||
- { vlan_id: 300, name: vlan-300 }
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: delete vlans using aggregate
|
||||
# ios_vlan: &delete_aggregate
|
||||
# aggregate:
|
||||
# - { vlan_id: 200, name: vlan-200 }
|
||||
# - { vlan_id: 300, name: vlan-300 }
|
||||
# state: absent
|
||||
# authorize: yes
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'vlan 200' in result.commands"
|
||||
- "'name vlan-200' in result.commands"
|
||||
- "'vlan 300' in result.commands"
|
||||
- "'name vlan-300' in result.commands"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == true"
|
||||
# - "'no vlan 200' in result.commands"
|
||||
# - "'no vlan 300' in result.commands"
|
||||
- name: create vlans using aggregate(idempotence)
|
||||
ios_vlan: *create_aggregate
|
||||
register: result
|
||||
|
||||
#- name: delete vlans using aggregate(idempotence)
|
||||
# ios_vlan: *delete_aggregate
|
||||
# register: result
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
#- assert:
|
||||
# that:
|
||||
# - "result.changed == false"
|
||||
- name: delete vlans using aggregate
|
||||
ios_vlan: &delete_aggregate
|
||||
aggregate:
|
||||
- { vlan_id: 200, name: vlan-200 }
|
||||
- { vlan_id: 300, name: vlan-300 }
|
||||
state: absent
|
||||
authorize: yes
|
||||
register: result
|
||||
|
||||
#- name: teardown(part1)
|
||||
# ios_config:
|
||||
# lines:
|
||||
# - no vlan 100
|
||||
# - no vlan 200
|
||||
# - no vlan 300
|
||||
# authorize: yes
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == true"
|
||||
- "'no vlan 200' in result.commands"
|
||||
- "'no vlan 300' in result.commands"
|
||||
|
||||
#- name: teardown(part2)
|
||||
# ios_config:
|
||||
# lines:
|
||||
# - switchport mode access
|
||||
# - no switchport access vlan 100
|
||||
# authorize: yes
|
||||
# parents: "{{ item }}"
|
||||
# with_items:
|
||||
# - interface GigabitEthernet0/1
|
||||
# - interface GigabitEthernet0/2
|
||||
- name: delete vlans using aggregate(idempotence)
|
||||
ios_vlan: *delete_aggregate
|
||||
register: result
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- "result.changed == false"
|
||||
|
||||
- name: teardown(part1)
|
||||
ios_config:
|
||||
lines:
|
||||
- no vlan 100
|
||||
- no vlan 200
|
||||
- no vlan 300
|
||||
authorize: yes
|
||||
|
||||
- name: teardown(part2)
|
||||
ios_config:
|
||||
lines:
|
||||
- switchport mode access
|
||||
- no switchport access vlan 100
|
||||
authorize: yes
|
||||
parents: "{{ item }}"
|
||||
loop:
|
||||
- interface GigabitEthernet0/1
|
||||
- interface GigabitEthernet0/2
|
||||
|
||||
when: switch_type == 'L2'
|
||||
|
||||
- debug: msg="END cli/basic.yaml on connection={{ ansible_connection }}"
|
||||
|
|
|
@ -11,3 +11,15 @@
|
|||
# http://jinja.pocoo.org/docs/2.9/templates/#truncate
|
||||
- set_fact:
|
||||
shorter_hostname: '{{ inventory_hostname_short| truncate(10, True, "") }}'
|
||||
|
||||
- name: "Discover IOS L2/L3 switch type"
|
||||
ios_command:
|
||||
commands: ['show version']
|
||||
connection: network_cli
|
||||
become: yes
|
||||
register: result
|
||||
|
||||
- set_fact: switch_type=""
|
||||
|
||||
- set_fact: switch_type="L2"
|
||||
when: '"l2" in result.stdout[0]'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue