IOS-XR NetConf and Cliconf plugin work (#33332)

*  - Netconf plugin addition for iosxr
 - Utilities refactoring to support netconf and cliconf
 - iosx_banner refactoring for netconf and cliconf
 - Integration testcases changes to accomodate above changes

* Fix sanity failures, shippable errors and review comments

* fix pep8 issue

* changes run_command method to send specific command args

* - Review comment fixes
- iosxr_command changes to remove ComplexDict based command_spec

* - Move namespaces removal method from utils to netconf plugin

* Minor refactoring in utils and change in deprecation message

* rewrite build_xml logic and import changes for new utils dir structure

* - Review comment changes and minor changes to documentation

* * refactor common code and docs updates
This commit is contained in:
Kedar Kekan 2017-12-06 22:37:31 +05:30 committed by GitHub
commit 2bc4c4f156
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 1090 additions and 247 deletions

View file

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

View file

@ -0,0 +1,16 @@
---
- name: collect all netconf test cases
find:
paths: "{{ role_path }}/tests/netconf"
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
include: "{{ test_case_to_run }}"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -2,6 +2,7 @@
- name: setup - remove login
iosxr_banner:
banner: login
provider: "{{ cli }}"
state: absent
- name: Set login
@ -11,6 +12,7 @@
this is my login banner
that has a multiline
string
provider: "{{ cli }}"
state: present
register: result
@ -30,6 +32,7 @@
this is my login banner
that has a multiline
string
provider: "{{ cli }}"
state: present
register: result

View file

@ -3,6 +3,7 @@
iosxr_banner:
banner: motd
state: absent
provider: "{{ cli }}"
- name: Set motd
iosxr_banner:
@ -11,6 +12,7 @@
this is my motd banner
that has a multiline
string
provider: "{{ cli }}"
state: present
register: result
@ -30,6 +32,7 @@
this is my motd banner
that has a multiline
string
provider: "{{ cli }}"
state: present
register: result

View file

@ -5,12 +5,14 @@
text: |
Junk login banner
over multiple lines
provider: "{{ cli }}"
state: present
- name: remove login
iosxr_banner:
banner: login
state: absent
provider: "{{ cli }}"
register: result
- debug:
@ -25,6 +27,7 @@
iosxr_banner:
banner: login
state: absent
provider: "{{ cli }}"
register: result
- assert:

View file

@ -0,0 +1,49 @@
---
- name: Enable Netconf service
iosxr_netconf:
netconf_port: 830
netconf_vrf: 'default'
state: present
register: result
- name: setup - remove login
iosxr_banner:
banner: login
provider: "{{ netconf }}"
state: absent
- name: Set login
iosxr_banner:
banner: login
text: |
this is my login banner
that has a multiline
string
provider: "{{ netconf }}"
state: present
register: result
- debug:
msg: "{{ result }}"
- assert:
that:
- "result.changed == true"
- "'this is my login banner' in result.commands"
- "'that has a multiline' in result.commands"
- name: Set login again (idempotent)
iosxr_banner:
banner: login
text: |
this is my login banner
that has a multiline
string
provider: "{{ netconf }}"
state: present
register: result
- assert:
that:
- "result.changed == false"
- "result.commands | length == 0"

View file

@ -0,0 +1,49 @@
---
- name: Enable Netconf service
iosxr_netconf:
netconf_port: 830
netconf_vrf: 'default'
state: present
register: result
- name: setup - remove motd
iosxr_banner:
banner: motd
state: absent
provider: "{{ netconf }}"
- name: Set motd
iosxr_banner:
banner: motd
text: |
this is my motd banner
that has a multiline
string
provider: "{{ netconf }}"
state: present
register: result
- debug:
msg: "{{ result }}"
- assert:
that:
- "result.changed == true"
- "'this is my motd banner' in result.commands"
- "'that has a multiline' in result.commands"
- name: Set motd again (idempotent)
iosxr_banner:
banner: motd
text: |
this is my motd banner
that has a multiline
string
provider: "{{ netconf }}"
state: present
register: result
- assert:
that:
- "result.changed == false"
- "result.commands | length == 0"

View file

@ -0,0 +1,43 @@
---
- name: Enable Netconf service
iosxr_netconf:
netconf_port: 830
netconf_vrf: 'default'
state: present
register: result
- name: Setup
iosxr_banner:
banner: login
text: |
Junk login banner
over multiple lines
provider: "{{ netconf }}"
state: present
- name: remove login
iosxr_banner:
banner: login
state: absent
provider: "{{ netconf }}"
register: result
- debug:
msg: "{{ result }}"
- assert:
that:
- "result.changed == true"
- "'xc:operation=\"delete\"' in result.commands"
- name: remove login (idempotent)
iosxr_banner:
banner: login
state: absent
provider: "{{ netconf }}"
register: result
- assert:
that:
- "result.changed == false"
- "result.commands | length == 0"

View file

@ -3,7 +3,7 @@
- name: run invalid command
iosxr_command:
commands: ['show foo']
commands: [{command: 'show foo', prompt: 'fooprompt', answer: 'yes'}]
register: result
ignore_errors: yes
@ -15,7 +15,7 @@
iosxr_command:
commands:
- show version
- show foo
- [{command: 'show foo', prompt: 'fooprompt', answer: 'yes'}]
register: result
ignore_errors: yes

View file

@ -6,6 +6,7 @@
iosxr_facts:
gather_subset:
- all
provider: "{{ cli }}"
register: result

View file

@ -4,6 +4,7 @@
- name: test getting default facts
iosxr_facts:
provider: "{{ cli }}"
register: result
- assert:

View file

@ -6,6 +6,7 @@
iosxr_facts:
gather_subset:
- "foobar"
provider: "{{ cli }}"
register: result
ignore_errors: true
@ -28,6 +29,7 @@
gather_subset:
- "!hardware"
- "hardware"
provider: "{{ cli }}"
register: result
ignore_errors: true

View file

@ -6,6 +6,7 @@
iosxr_facts:
gather_subset:
- "!hardware"
provider: "{{ cli }}"
register: result
- assert:

View file

@ -5,6 +5,7 @@
iosxr_interface:
name: GigabitEthernet0/0/0/2
state: absent
provider: "{{ cli }}"
register: result
@ -13,6 +14,7 @@
name: GigabitEthernet0/0/0/2
description: test-interface-initial
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -25,6 +27,7 @@
name: GigabitEthernet0/0/0/2
description: test-interface-initial
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -39,6 +42,7 @@
duplex: half
mtu: 512
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -57,6 +61,7 @@
duplex: full
mtu: 256
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -75,6 +80,7 @@
duplex: full
mtu: 256
state: present
provider: "{{ cli }}"
register: result
- assert:
that:
@ -84,6 +90,7 @@
iosxr_interface:
name: GigabitEthernet0/0/0/2
enabled: False
provider: "{{ cli }}"
register: result
- assert:
@ -95,6 +102,7 @@
iosxr_interface:
name: GigabitEthernet0/0/0/2
enabled: True
provider: "{{ cli }}"
register: result
- assert:
@ -107,6 +115,7 @@
name: GigabitEthernet0/0/0/3
description: test-interface-initial
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -120,6 +129,7 @@
- name: GigabitEthernet0/0/0/3
- name: GigabitEthernet0/0/0/2
state: absent
provider: "{{ cli }}"
- name: Add interface aggregate
iosxr_interface:
@ -129,6 +139,7 @@
speed: 100
duplex: full
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -152,6 +163,7 @@
speed: 100
duplex: full
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -165,6 +177,7 @@
- name: GigabitEthernet0/0/0/2
enabled: False
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -180,6 +193,7 @@
- name: GigabitEthernet0/0/0/2
enabled: True
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -194,6 +208,7 @@
- name: GigabitEthernet0/0/0/4
- name: GigabitEthernet0/0/0/5
description: test-interface-initial
provider: "{{ cli }}"
register: result
- name: Create interface aggregate
@ -204,6 +219,7 @@
- name: GigabitEthernet0/0/0/5
description: test_interface_2
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -218,6 +234,7 @@
- name: GigabitEthernet0/0/0/4
- name: GigabitEthernet0/0/0/5
state: absent
provider: "{{ cli }}"
register: result
- assert:
@ -232,6 +249,7 @@
- name: GigabitEthernet0/0/0/4
- name: GigabitEthernet0/0/0/5
state: absent
provider: "{{ cli }}"
register: result
- assert:

View file

@ -7,6 +7,7 @@
description: test_interface_1
enabled: True
state: present
provider: "{{ cli }}"
register: result
- name: Check intent arguments
@ -14,6 +15,7 @@
name: GigabitEthernet0/0/0/1
state: up
delay: 20
provider: "{{ cli }}"
register: result
- assert:
@ -24,6 +26,7 @@
iosxr_interface:
name: GigabitEthernet0/0/0/1
state: down
provider: "{{ cli }}"
ignore_errors: yes
register: result
@ -38,6 +41,7 @@
enabled: False
state: down
delay: 20
provider: "{{ cli }}"
register: result
- assert:
@ -49,6 +53,7 @@
name: GigabitEthernet0/0/0/1
enabled: False
state: up
provider: "{{ cli }}"
ignore_errors: yes
register: result
@ -64,6 +69,7 @@
enabled: True
state: up
delay: 20
provider: "{{ cli }}"
ignore_errors: yes
register: result

View file

@ -5,12 +5,14 @@
dest: hostnameprefix
name: 172.16.0.1
state: absent
provider: "{{ cli }}"
- name: Remove console logging
iosxr_logging:
dest: console
level: warning
state: absent
provider: "{{ cli }}"
register: result
- name: Remove buffer
@ -18,6 +20,7 @@
dest: buffered
size: 4800000
state: absent
provider: "{{ cli }}"
register: result
# Start tests
@ -26,6 +29,7 @@
dest: hostnameprefix
name: 172.16.0.1
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -39,6 +43,7 @@
dest: hostnameprefix
name: 172.16.0.1
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -50,6 +55,7 @@
dest: hostnameprefix
name: 172.16.0.1
state: absent
provider: "{{ cli }}"
register: result
- assert:
@ -62,6 +68,7 @@
dest: hostnameprefix
name: 172.16.0.1
state: absent
provider: "{{ cli }}"
register: result
- assert:
@ -73,6 +80,7 @@
dest: console
level: warning
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -84,6 +92,7 @@
iosxr_logging:
dest: buffered
size: 4800000
provider: "{{ cli }}"
register: result
- assert:
@ -96,6 +105,7 @@
aggregate:
- { dest: console, level: notifications }
- { dest: buffered, size: 4700000 }
provider: "{{ cli }}"
register: result
- assert:
@ -110,6 +120,7 @@
- { dest: console, level: notifications }
- { dest: buffered, size: 4700000 }
state: absent
provider: "{{ cli }}"
register: result
- assert:

View file

@ -7,12 +7,14 @@
- no ip domain-list ansible.com
- no ip domain-list redhat.com
match: none
provider: "{{ cli }}"
- name: configure domain_search
iosxr_system:
domain_search:
- ansible.com
- redhat.com
provider: "{{ cli }}"
register: result
- assert:
@ -26,6 +28,7 @@
domain_search:
- ansible.com
- redhat.com
provider: "{{ cli }}"
register: result
- assert:
@ -36,6 +39,7 @@
iosxr_system:
domain_search:
- ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -47,6 +51,7 @@
iosxr_system:
domain_search:
- ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -58,6 +63,7 @@
domain_search:
- ansible.com
- redhat.com
provider: "{{ cli }}"
register: result
- assert:
@ -70,6 +76,7 @@
domain_search:
- ansible.com
- redhat.com
provider: "{{ cli }}"
register: result
- assert:
@ -81,6 +88,7 @@
domain_search:
- ansible.com
- eng.ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -95,6 +103,7 @@
domain_search:
- ansible.com
- eng.ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -108,5 +117,6 @@
- no domain list redhat.com
- no domain list eng.ansible.com
match: none
provider: "{{ cli }}"
- debug: msg="END cli/set_domain_search.yaml"

View file

@ -5,10 +5,12 @@
iosxr_config:
lines: no domain name
match: none
provider: "{{ cli }}"
- name: configure domain_name
iosxr_system:
domain_name: eng.ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -18,6 +20,7 @@
- name: verify domain_name
iosxr_system:
domain_name: eng.ansible.com
provider: "{{ cli }}"
register: result
- assert:
@ -28,5 +31,6 @@
iosxr_config:
lines: no domain name
match: none
provider: "{{ cli }}"
- debug: msg="END cli/set_domain_name.yaml"

View file

@ -5,10 +5,12 @@
iosxr_config:
lines: hostname switch
match: none
provider: "{{ cli }}"
- name: configure hostname
iosxr_system:
hostname: foo
provider: "{{ cli }}"
register: result
- assert:
@ -18,6 +20,7 @@
- name: verify hostname
iosxr_system:
hostname: foo
provider: "{{ cli }}"
register: result
- assert:
@ -28,5 +31,6 @@
iosxr_config:
lines: "hostname {{ inventory_hostname }}"
match: none
provider: "{{ cli }}"
- debug: msg="END cli/set_hostname.yaml"

View file

@ -7,10 +7,12 @@
- no domain lookup source-interface Loopback10
# - vrf ansible
match: none
provider: "{{ cli }}"
- name: configure lookup_source
iosxr_system:
lookup_source: Loopback10
provider: "{{ cli }}"
register: result
- assert:
@ -21,6 +23,7 @@
- name: verify lookup_source
iosxr_system:
lookup_source: Loopback10
provider: "{{ cli }}"
register: result
- assert:
@ -58,5 +61,6 @@
- no domain lookup source-interface Loopback10
- no vrf ansible
match: none
provider: "{{ cli }}"
- debug: msg="END cli/set_lookup_source.yaml"

View file

@ -8,6 +8,7 @@
- no ip name-server 2.2.2.2
- no ip name-server 3.3.3.3
match: none
provider: "{{ cli }}"
- name: configure name_servers
iosxr_system:
@ -15,6 +16,7 @@
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
provider: "{{ cli }}"
register: result
- assert:
@ -31,6 +33,7 @@
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
provider: "{{ cli }}"
register: result
- assert:
@ -69,6 +72,7 @@
name_servers:
- 1.1.1.1
- 2.2.2.2
provider: "{{ cli }}"
register: result
- assert:

View file

@ -5,6 +5,7 @@
name: auth_user
state: present
configured_password: pass123
provider: "{{ cli }}"
- name: test login
expect:
@ -30,6 +31,7 @@
name: auth_user
state: present
public_key_contents: "{{ lookup('file', \"{{ role_path }}/files/public.pub\") }}"
provider: "{{ cli }}"
- name: test login with private key
expect:
@ -40,6 +42,7 @@
- name: remove user and key
iosxr_user:
name: auth_user
provider: "{{ cli }}"
state: absent
- name: test login with private key (should fail, no user)
@ -55,6 +58,7 @@
name: auth_user
state: present
public_key: "{{ role_path }}/files/public.pub"
provider: "{{ cli }}"
- name: test login with private key
expect:
@ -68,6 +72,7 @@
name: auth_user
state: present
public_key_contents: "{{ lookup('file', \"{{ role_path }}/files/public2.pub\") }}"
provider: "{{ cli }}"
# FIXME: pexpect fails with OSError: [Errno 5] Input/output error
- name: test login with invalid private key (should fail)
@ -88,4 +93,5 @@
iosxr_user:
name: auth_user
state: absent
provider: "{{ cli }}"
register: result

View file

@ -5,12 +5,14 @@
- no username ansibletest1
- no username ansibletest2
- no username ansibletest3
provider: "{{ cli }}"
- name: Create user (SetUp)
iosxr_user:
name: ansibletest1
configured_password: test
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -25,6 +27,7 @@
configured_password: test
update_password: always
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -39,6 +42,7 @@
configured_password: test
update_password: on_create
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -53,6 +57,7 @@
update_password: on_create
group: sysadmin
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -68,6 +73,7 @@
update_password: on_create
group: sysadmin
state: present
provider: "{{ cli }}"
register: result
- assert:
@ -83,6 +89,7 @@
configured_password: test
state: present
group: sysadmin
provider: "{{ cli }}"
register: result
- assert:
@ -103,6 +110,7 @@
configured_password: test
state: present
group: sysadmin
provider: "{{ cli }}"
register: result
- assert:
@ -122,6 +130,7 @@
update_password: on_create
state: present
group: sysadmin
provider: "{{ cli }}"
register: result
- assert:
@ -136,6 +145,7 @@
- name: ansibletest2
- name: ansibletest3
state: absent
provider: "{{ cli }}"
register: result
- assert:
@ -150,6 +160,7 @@
- name: ansibletest2
- name: ansibletest3
state: absent
provider: "{{ cli }}"
register: result
- assert:

View file

@ -182,10 +182,6 @@ lib/ansible/modules/network/ios/ios_command.py
lib/ansible/modules/network/ios/ios_facts.py
lib/ansible/modules/network/ios/ios_system.py
lib/ansible/modules/network/ios/ios_vrf.py
lib/ansible/modules/network/iosxr/iosxr_command.py
lib/ansible/modules/network/iosxr/iosxr_config.py
lib/ansible/modules/network/iosxr/iosxr_facts.py
lib/ansible/modules/network/iosxr/iosxr_system.py
lib/ansible/modules/network/netvisor/pn_cluster.py
lib/ansible/modules/network/netvisor/pn_ospfarea.py
lib/ansible/modules/network/netvisor/pn_vlag.py

View file

@ -32,13 +32,13 @@ class TestIosxrCommandModule(TestIosxrModule):
def setUp(self):
super(TestIosxrCommandModule, self).setUp()
self.mock_run_commands = patch('ansible.modules.network.iosxr.iosxr_command.run_commands')
self.run_commands = self.mock_run_commands.start()
self.mock_run_command = patch('ansible.modules.network.iosxr.iosxr_command.run_command')
self.run_command = self.mock_run_command.start()
def tearDown(self):
super(TestIosxrCommandModule, self).tearDown()
self.mock_run_commands.stop()
self.mock_run_command.stop()
def load_fixtures(self, commands=None):
@ -49,13 +49,13 @@ class TestIosxrCommandModule(TestIosxrModule):
for item in commands:
try:
command = item['command']
except ValueError:
except Exception:
command = item
filename = str(command).replace(' ', '_')
output.append(load_fixture(filename))
return output
self.run_commands.side_effect = load_from_file
self.run_command.side_effect = load_from_file
def test_iosxr_command_simple(self):
set_module_args(dict(commands=['show version']))
@ -78,13 +78,13 @@ class TestIosxrCommandModule(TestIosxrModule):
wait_for = 'result[0] contains "test string"'
set_module_args(dict(commands=['show version'], wait_for=wait_for))
self.execute_module(failed=True)
self.assertEqual(self.run_commands.call_count, 10)
self.assertEqual(self.run_command.call_count, 10)
def test_iosxr_command_retries(self):
wait_for = 'result[0] contains "test string"'
set_module_args(dict(commands=['show version'], wait_for=wait_for, retries=2))
self.execute_module(failed=True)
self.assertEqual(self.run_commands.call_count, 2)
self.assertEqual(self.run_command.call_count, 2)
def test_iosxr_command_match_any(self):
wait_for = ['result[0] contains "Cisco IOS"',

View file

@ -34,14 +34,14 @@ class TestIosxrFacts(TestIosxrModule):
def setUp(self):
super(TestIosxrFacts, self).setUp()
self.mock_run_commands = patch(
'ansible.modules.network.iosxr.iosxr_facts.run_commands')
self.run_commands = self.mock_run_commands.start()
self.mock_run_command = patch(
'ansible.modules.network.iosxr.iosxr_facts.run_command')
self.run_command = self.mock_run_command.start()
def tearDown(self):
super(TestIosxrFacts, self).tearDown()
self.mock_run_commands.stop()
self.mock_run_command.stop()
def load_fixtures(self, commands=None):
@ -60,7 +60,7 @@ class TestIosxrFacts(TestIosxrModule):
output.append(load_fixture(filename))
return output
self.run_commands.side_effect = load_from_file
self.run_command.side_effect = load_from_file
def test_iosxr_facts_gather_subset_default(self):
set_module_args(dict())