Add cli_config module (#42413)

* cli_config module

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* rename diff and replace

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* add nxos changes

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* nxos tests

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* remove severity

* address review comment

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* add module diff

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* add iosxr test

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* address diff review

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* Add junos tests

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* vyos cliconf diff fix

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
This commit is contained in:
Trishna Guha 2018-08-14 13:52:15 +05:30 committed by GitHub
commit a8c24a5d5e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 960 additions and 4 deletions

View file

@ -0,0 +1,16 @@
---
- name: collect all cli_config test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,3 +1,4 @@
---
- { include: cli.yaml, tags: ['cli'] }
- { include: cli_config.yaml, tags: ['cli_config'] }
- { include: eapi.yaml, tags: ['eapi'] }

View file

@ -0,0 +1,33 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: |
interface Ethernet2
no description
no shutdown
become: yes
- name: configure device with config
cli_config: &conf
config: "{{ lookup('template', 'basic/config.j2') }}"
register: result
become: yes
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,16 @@
---
- name: collect all cli_config test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,2 +1,3 @@
---
- { include: cli.yaml, tags: ['cli'] }
- { include: cli_config.yaml, tags: ['cli_config'] }

View file

@ -0,0 +1,5 @@
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log

View file

@ -0,0 +1,6 @@
no ip access-list extended test
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log

View file

@ -0,0 +1,5 @@
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log

View file

@ -0,0 +1,5 @@
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log

View file

@ -0,0 +1,5 @@
no ip access-list extended test
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log

View file

@ -0,0 +1,7 @@
no ip access-list extended test
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log
permit ip host 192.0.2.5 any log

View file

@ -0,0 +1,7 @@
no ip access-list extended test
ip access-list extended test
permit ip host 192.0.2.1 any log
permit ip host 192.0.2.2 any log
permit ip host 192.0.2.3 any log
permit ip host 192.0.2.4 any log
permit ip host 192.0.2.5 any log

View file

@ -0,0 +1,45 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: |
interface loopback999
no description
shutdown
diff_match: none
- name: configure device with config
cli_config: &conf
config: "{{ lookup('template', 'basic/config.j2') }}"
register: result
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: remove config
cli_config: *rm
- name: configure device with config
cli_config:
config: "{{ lookup('template', 'basic/config.j2') }}"
defaults: yes
register: result
- assert:
that:
- "result.changed == true"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,32 @@
---
- debug: msg="START cli_config/cli_block_replace.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config:
config: "{{ lookup('template', 'basic/setupblock.j2') }}"
diff_match: none
- name: block replace
cli_config: &block
config: "{{ lookup('template', 'basic/configblock.j2') }}"
diff_replace: block
register: result
- assert:
that:
- "result.changed == true"
- name: block replace (Idempotence)
cli_config: *block
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config:
config: no ip access-list extended test
diff_match: none
- debug: msg="END cli_config/cli_block_replace.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,33 @@
---
- debug: msg="START cli_config/cli_exact_match.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config:
config: "{{ lookup('template', 'basic/setupexact.j2') }}"
diff_match: none
- name: configure using exact match
cli_config:
config: "{{ lookup('template', 'basic/configexact1.j2') }}"
diff_match: exact
register: result
- assert:
that:
- "result.changed == true"
- name: check using exact match
cli_config:
config: "{{ lookup('template', 'basic/configexact2.j2') }}"
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config:
config: no ip access-list extended test
diff_match: none
- debug: msg="END cli_config/cli_exact_match.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,24 @@
---
- debug: msg="START cli_config/cli_strict_match.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config:
config: "{{ lookup('template', 'basic/setupstrict.j2') }}"
diff_match: none
- name: configure using strict match
cli_config:
config: "{{ lookup('template', 'basic/configstrict1.j2') }}"
diff_match: strict
register: result
- assert:
that:
- "result.changed == true"
- name: teardown
cli_config:
config: no ip access-list extended test
diff_match: none
- debug: msg="END cli_config/cli_strict_match.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,16 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,2 +1,3 @@
---
- { include: cli.yaml, tags: ['cli'] }
- { include: cli_config.yaml, tags: ['cli_config'] }

View file

@ -0,0 +1,33 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: |
interface Loopback999
no description
no shutdown
become: yes
- name: configure device with config
cli_config: &conf
config: "{{ lookup('template', 'basic/config.j2') }}"
register: result
become: yes
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,16 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,2 +1,3 @@
---
- { include: netconf.yaml, tags: ['netconf'] }
- { include: cli_config.yaml, tags: ['cli_config'] }

View file

@ -0,0 +1,29 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: delete interfaces ge-0/0/1
become: yes
- name: configure device with config
cli_config: &conf
config: set interfaces ge-0/0/1 description 'test-interface'
register: result
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,16 @@
---
- name: collect all cli_config test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,3 +1,4 @@
---
- { include: cli.yaml, tags: ['cli'] }
- { include: nxapi.yaml, tags: ['nxapi'] }
- { include: cli_config.yaml, tags: ['cli_config'] }

View file

@ -1,4 +1,4 @@
interface Ethernet2/5
description this is a test
shutdown
interface loopback1
description this is a test
shutdown

View file

@ -0,0 +1,5 @@
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log

View file

@ -0,0 +1,5 @@
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log

View file

@ -0,0 +1,6 @@
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log
50 permit ip 192.0.2.5/32 any log

View file

@ -0,0 +1,6 @@
no ip access-list test
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log

View file

@ -0,0 +1,7 @@
no ip access-list test
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log
50 permit ip 192.0.2.5/32 any log

View file

@ -0,0 +1,7 @@
no ip access-list test
ip access-list test
10 permit ip 192.0.2.1/32 any log
20 permit ip 192.0.2.2/32 any log
30 permit ip 192.0.2.3/32 any log
40 permit ip 192.0.2.4/32 any log
50 permit ip 192.0.2.5/32 any log

View file

@ -0,0 +1,45 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: |
interface loopback1
no description
no shutdown
diff_match: none
- name: configure device with config
cli_config: &conf
config: "{{ lookup('template', 'basic/config.j2') }}"
register: result
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: remove config
cli_config: *rm
- name: configure device with config
cli_config:
config: "{{ lookup('template', 'basic/config.j2') }}"
defaults: yes
register: result
- assert:
that:
- "result.changed == true"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,30 @@
---
- debug: msg="START cli_config/cli_block_replace.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config: &rm
config: "no ip access-list test"
diff_match: none
- name: block replace
cli_config: &block
config: "{{ lookup('template', 'basic/configblock.j2') }}"
diff_replace: block
register: result
- assert:
that:
- "result.changed == true"
- name: block replace (Idempotence)
cli_config: *block
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_block_replace.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,33 @@
---
- debug: msg="START cli_config/cli_exact_match.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config:
config: "{{ lookup('template', 'basic/setupexact.j2') }}"
diff_match: none
- name: configure using exact match
cli_config:
config: "{{ lookup('template', 'basic/configexact1.j2') }}"
diff_match: exact
register: result
- assert:
that:
- "result.changed == true"
- name: check using exact match
cli_config:
config: "{{ lookup('template', 'basic/configexact2.j2') }}"
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config:
config: no ip access-list test
diff_match: none
- debug: msg="END cli_config/cli_exact_match.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,25 @@
---
- debug: msg="START cli_config/cli_strict_match.yaml on connection={{ ansible_connection }}"
- name: setup - remove configuration
cli_config:
config: "{{ lookup('template', 'basic/setupstrict.j2') }}"
diff_match: none
- name: configure using strict match
cli_config:
config: "{{ lookup('template', 'basic/configstrict1.j2') }}"
diff_match: strict
diff_replace: block
register: result
- assert:
that:
- "result.changed == true"
- name: teardown
cli_config:
config: no ip access-list test
diff_match: none
- debug: msg="END cli_config/cli_strict_match.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,16 @@
---
- name: collect all cli_config test cases
find:
paths: "{{ role_path }}/tests/cli_config"
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 case (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -1,2 +1,3 @@
---
- { include: cli.yaml, tags: ['cli'] }
- { include: cli_config.yaml, tags: ['cli_config'] }

View file

@ -0,0 +1,28 @@
---
- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection }}"
- name: setup - remove interface description
cli_config: &rm
config: delete interfaces loopback lo description
- name: configure device with config
cli_config: &conf
config: set interfaces loopback lo description 'this is a test'
register: result
- assert:
that:
- "result.changed == true"
- name: Idempotence
cli_config: *conf
register: result
- assert:
that:
- "result.changed == false"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection }}"

View file

@ -0,0 +1,30 @@
---
- debug: msg="START cli_config/cli_comment.yaml on connection={{ ansible_connection }}"
- name: setup
cli_config: &rm
config: set system host-name {{ inventory_hostname_short }}
- name: configure using comment
cli_config:
config: set system host-name foo
commit_comment: this is a test
register: result
- assert:
that:
- "result.changed == true"
- name: collect system commits
vyos_command:
commands: show system commit
register: result
- assert:
that:
- "'this is a test' in result.stdout_lines[0][1]"
- name: teardown
cli_config: *rm
- debug: msg="END cli_config/cli_comment.yaml on connection={{ ansible_connection }}"