ios integration tests to network_cli (#33920)

* Preliminary steps

* Fix Python3 network_cli ios

* Add connection to debug strings

* Fix ios confirm prompt by way of optional newline

Also update ios_user delete tests
pull/34088/head
Nathaniel Case 7 years ago committed by GitHub
parent 8d5c8b252d
commit cb1b705218
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -181,7 +181,8 @@ def user_del_cmd(username):
return json.dumps({
'command': 'no username %s' % username,
'prompt': 'This operation will remove all username related configurations with same name',
'answer': 'y'
'answer': 'y',
'newline': False,
})

@ -40,7 +40,7 @@ class ActionModule(_ActionModule):
try:
self._handle_template()
except ValueError as exc:
return dict(failed=True, msg=exc.message)
return dict(failed=True, msg=to_text(exc))
result = super(ActionModule, self).run(tmp, task_vars)
@ -54,7 +54,7 @@ class ActionModule(_ActionModule):
# strip out any keys that have two leading and two trailing
# underscore characters
for key in result.keys():
for key in list(result.keys()):
if PRIVATE_KEYS_RE.match(key):
del result[key]

@ -64,8 +64,8 @@ class Cliconf(CliconfBase):
@enable_mode
def edit_config(self, command):
for cmd in chain([b'configure terminal'], to_list(command), [b'end']):
self.send_command(cmd)
for cmd in chain(['configure terminal'], to_list(command), ['end']):
self.send_command(to_bytes(cmd))
def get(self, command, prompt=None, answer=None, sendonly=False):
return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly)

@ -121,8 +121,10 @@ class Connection(ConnectionBase):
try:
cmd = json.loads(to_text(cmd, errors='surrogate_or_strict'))
kwargs = {'command': to_bytes(cmd['command'], errors='surrogate_or_strict')}
for key in ('prompt', 'answer', 'sendonly'):
if cmd.get(key) is not None:
for key in ('prompt', 'answer', 'sendonly', 'newline'):
if cmd.get(key) is True or cmd.get(key) is False:
kwargs[key] = cmd[key]
elif cmd.get(key) is not None:
kwargs[key] = to_bytes(cmd[key], errors='surrogate_or_strict')
return self.send(**kwargs)
except ValueError:
@ -257,7 +259,7 @@ class Connection(ConnectionBase):
self._connected = False
display.debug("ssh connection has been closed successfully")
def receive(self, command=None, prompts=None, answer=None):
def receive(self, command=None, prompts=None, answer=None, newline=True):
'''
Handles receiving of output from command
'''
@ -279,14 +281,14 @@ class Connection(ConnectionBase):
window = self._strip(recv.read())
if prompts and not handled:
handled = self._handle_prompt(window, prompts, answer)
handled = self._handle_prompt(window, prompts, answer, newline)
if self._find_prompt(window):
self._last_response = recv.getvalue()
resp = self._strip(self._last_response)
return self._sanitize(resp, command)
def send(self, command, prompt=None, answer=None, sendonly=False):
def send(self, command, prompt=None, answer=None, newline=True, sendonly=False):
'''
Sends the command to the device in the opened shell
'''
@ -295,7 +297,7 @@ class Connection(ConnectionBase):
self._ssh_shell.sendall(b'%s\r' % command)
if sendonly:
return
response = self.receive(command, prompt, answer)
response = self.receive(command, prompt, answer, newline)
return to_text(response, errors='surrogate_or_strict')
except (socket.timeout, AttributeError):
display.vvvv(traceback.format_exc(), host=self._play_context.remote_addr)
@ -309,7 +311,7 @@ class Connection(ConnectionBase):
data = regex.sub(b'', data)
return data
def _handle_prompt(self, resp, prompts, answer):
def _handle_prompt(self, resp, prompts, answer, newline):
'''
Matches the command prompt and responds
@ -325,7 +327,9 @@ class Connection(ConnectionBase):
for regex in prompts:
match = regex.search(resp)
if match:
self._ssh_shell.sendall(b'%s\r' % answer)
self._ssh_shell.sendall(b'%s' % answer)
if newline:
self._ssh_shell.sendall(b'\r')
return True
return False

@ -4,12 +4,19 @@
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 case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -5,6 +5,7 @@
banner: login
state: absent
authorize: yes
become: yes
- name: Set login
ios_banner:
@ -15,6 +16,7 @@
string
state: present
authorize: yes
become: yes
register: result
- debug:
@ -34,6 +36,7 @@
string
state: present
authorize: yes
become: yes
register: result
- assert:

@ -5,6 +5,7 @@
banner: motd
state: absent
authorize: yes
become: yes
- name: Set motd
ios_banner:
@ -15,6 +16,7 @@
string
state: present
authorize: yes
become: yes
register: result
- debug:
@ -34,6 +36,7 @@
string
state: present
authorize: yes
become: yes
register: result
- assert:

@ -7,12 +7,14 @@
over multiple lines
state: present
authorize: yes
become: yes
- name: remove login
ios_banner:
banner: login
state: absent
authorize: yes
become: yes
register: result
- debug:
@ -28,6 +30,7 @@
banner: login
state: absent
authorize: yes
become: yes
register: result
- assert:

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,5 +1,5 @@
---
- debug: msg="START cli/bad_operator.yaml"
- debug: msg="START cli/bad_operator.yaml on connection={{ ansible_connection }}"
- name: test bad operator
ios_command:
@ -9,6 +9,7 @@
authorize: yes
wait_for:
- "result[0] contains 'Description: Foo'"
become: yes
register: result
ignore_errors: yes
@ -17,4 +18,4 @@
- "result.failed == true"
- "result.msg is defined"
- debug: msg="END cli/bad_operator.yaml"
- debug: msg="END cli/bad_operator.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/contains.yaml"
- debug: msg="START cli/contains.yaml on connection={{ ansible_connection }}"
- name: test contains operator
ios_command:
@ -10,6 +10,7 @@
wait_for:
- "result[0] contains Cisco"
- "result[1] contains Loopback888"
become: yes
register: result
- assert:
@ -17,4 +18,4 @@
- "result.changed == false"
- "result.stdout is defined"
- debug: msg="END cli/contains.yaml"
- debug: msg="END cli/contains.yaml on connection={{ ansible_connection }}"

@ -1,10 +1,11 @@
---
- debug: msg="START cli/invalid.yaml"
- debug: msg="START cli/invalid.yaml on connection={{ ansible_connection }}"
- name: run invalid command
ios_command:
commands: show foo
authorize: yes
become: yes
register: result
ignore_errors: yes
@ -18,6 +19,7 @@
- show version
- show foo
authorize: yes
become: yes
register: result
ignore_errors: yes
@ -25,4 +27,4 @@
that:
- "result.failed"
- debug: msg="END cli/invalid.yaml"
- debug: msg="END cli/invalid.yaml on connection={{ ansible_connection }}"

@ -1,11 +1,12 @@
---
- debug: msg="START cli/output.yaml"
- debug: msg="START cli/output.yaml on connection={{ ansible_connection }}"
- name: get output for single command
ios_command:
commands:
- show version
authorize: yes
become: yes
register: result
- assert:
@ -19,6 +20,7 @@
- show version
- show interfaces
authorize: yes
become: yes
register: result
- assert:
@ -27,4 +29,4 @@
- "result.stdout is defined"
- "result.stdout | length == 2"
- debug: msg="END cli/output.yaml"
- debug: msg="END cli/output.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/timeout.yaml"
- debug: msg="START cli/timeout.yaml on connection={{ ansible_connection }}"
- name: test bad condition
ios_command:
@ -8,6 +8,7 @@
authorize: yes
wait_for:
- "result[0] contains bad_value_string"
become: yes
register: result
ignore_errors: yes
@ -16,4 +17,4 @@
- "result.failed == true"
- "result.msg is defined"
- debug: msg="END cli/timeout.yaml"
- debug: msg="END cli/timeout.yaml on connection={{ ansible_connection }}"

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,5 +1,5 @@
---
- debug: msg="START cli/backup.yaml"
- debug: msg="START cli/backup.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -10,13 +10,14 @@
- interface Loopback999
match: none
authorize: yes
become: yes
- name: collect any backup files
find:
paths: "{{ role_path }}/backup"
pattern: "{{ inventory_hostname_short }}_config*"
register: backup_files
delegate_to: localhost
connection: local
- name: delete backup files
file:
@ -29,6 +30,7 @@
src: basic/config.j2
backup: yes
authorize: yes
become: yes
register: result
- assert:
@ -42,10 +44,10 @@
paths: "{{ role_path }}/backup"
pattern: "{{ inventory_hostname_short }}_config*"
register: backup_files
delegate_to: localhost
connection: local
- assert:
that:
- "backup_files.files is defined"
- debug: msg="END cli/backup.yaml"
- debug: msg="END cli/backup.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/defaults.yaml"
- debug: msg="START cli/defaults.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -10,12 +10,14 @@
- interface Loopback999
match: none
authorize: yes
become: yes
- name: configure device with defaults included
ios_config:
src: defaults/config.j2
defaults: yes
authorize: yes
become: yes
register: result
- debug: var=result
@ -31,6 +33,7 @@
src: defaults/config.j2
defaults: yes
authorize: yes
become: yes
register: result
- debug: var=result
@ -45,6 +48,7 @@
lines:
- mac-address-table notification mac-move
authorize: yes
become: yes
ignore_errors: yes
- name: show interfaces brief to ensure deivce goes to valid prompt
@ -52,6 +56,7 @@
commands:
- show interfaces
authorize: yes
become: yes
register: result
- assert:
@ -59,4 +64,4 @@
- "result.changed == false"
- "result.stdout is defined"
- debug: msg="END cli/defaults.yaml"
- debug: msg="END cli/defaults.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/save.yaml"
- debug: msg="START cli/save.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -10,12 +10,14 @@
- interface Loopback999
match: none
authorize: yes
become: yes
- name: save config
ios_config:
save: true
authorize: yes
become: yes
register: result
# FIXME https://github.com/ansible/ansible-modules-core/issues/5008
ignore_errors: true
@ -30,6 +32,7 @@
ios_config:
save: true
authorize: yes
become: yes
register: result
# FIXME https://github.com/ansible/ansible-modules-core/issues/5008
ignore_errors: true
@ -41,6 +44,7 @@
- "no ip http server"
save_when: modified
authorize: yes
become: yes
register: result
- name: save should always run
@ -50,6 +54,7 @@
- "ip http server"
save_when: modified
authorize: yes
become: yes
register: result
- assert:
@ -61,6 +66,7 @@
lines:
- "no ip http server"
authorize: yes
become: yes
register: result
- debug: msg="END cli/save.yaml"
- debug: msg="END cli/save.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/src_basic.yaml"
- debug: msg="START cli/src_basic.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -10,11 +10,13 @@
- interface Loopback999
match: none
authorize: yes
become: yes
- name: configure device with config
ios_config:
src: basic/config.j2
authorize: yes
become: yes
register: result
- name: debug, remove me
@ -31,6 +33,7 @@
ios_config:
src: basic/config.j2
authorize: yes
become: yes
register: result
- assert:
@ -40,4 +43,4 @@
# FIXME Bug https://github.com/ansible/ansible/issues/19382
# - "result.updates is not defined"
- debug: msg="END cli/src_basic.yaml"
- debug: msg="END cli/src_basic.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/src_invalid.yaml"
- debug: msg="START cli/src_invalid.yaml on connection={{ ansible_connection }}"
# Defend https://github.com/ansible/ansible-modules-core/issues/4797
@ -7,6 +7,7 @@
ios_config:
src: basic/foobar.j2
authorize: yes
become: yes
register: result
ignore_errors: yes
@ -16,4 +17,4 @@
- "result.failed == true"
- "result.msg == 'path specified in src not found'"
- debug: msg="END cli/src_invalid.yaml"
- debug: msg="END cli/src_invalid.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/src_match_none.yaml"
- debug: msg="START cli/src_match_none.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -10,12 +10,14 @@
- interface Loopback999
match: none
authorize: yes
become: yes
- name: configure device with config
ios_config:
src: basic/config.j2
match: none
authorize: yes
become: yes
register: result
- assert:
@ -29,6 +31,7 @@
ios_config:
src: basic/config.j2
authorize: yes
become: yes
register: result
- assert:
@ -38,4 +41,4 @@
- "result.changed == false"
- "result.updates is not defined"
- debug: msg="END cli/src_match_none.yaml"
- debug: msg="END cli/src_match_none.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/sublevel.yaml"
- debug: msg="START cli/sublevel.yaml on connection={{ ansible_connection }}"
- name: setup test
ios_config:
@ -8,12 +8,14 @@
- 'no ip access-list standard test'
match: none
authorize: yes
become: yes
- name: configure sub level command
ios_config:
lines: ['permit ip any any log']
parents: ['ip access-list extended test']
authorize: yes
become: yes
register: result
- assert:
@ -27,6 +29,7 @@
lines: ['permit ip any any log']
parents: ['ip access-list extended test']
authorize: yes
become: yes
register: result
- assert:
@ -39,5 +42,6 @@
- 'no ip access-list extended test'
match: none
authorize: yes
become: yes
- debug: msg="END cli/sublevel.yaml"
- debug: msg="END cli/sublevel.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/sublevel_block.yaml"
- debug: msg="START cli/sublevel_block.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -12,6 +12,7 @@
after: ['exit']
authorize: yes
match: none
become: yes
- name: configure sub level command using block resplace
ios_config:
@ -24,6 +25,7 @@
replace: block
after: ['exit']
authorize: yes
become: yes
register: result
- assert:
@ -46,6 +48,7 @@
replace: block
after: ['exit']
authorize: yes
become: yes
register: result
- assert:
@ -58,5 +61,6 @@
- no ip access-list extended test
match: none
authorize: yes
become: yes
- debug: msg="END cli/sublevel_block.yaml"
- debug: msg="END cli/sublevel_block.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/sublevel_exact.yaml"
- debug: msg="START cli/sublevel_exact.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -14,6 +14,7 @@
after: exit
match: none
authorize: yes
become: yes
- name: configure sub level command using exact match
ios_config:
@ -27,6 +28,7 @@
after: exit
match: exact
authorize: yes
become: yes
register: result
- assert:
@ -49,6 +51,7 @@
parents: ip access-list extended test
match: exact
authorize: yes
become: yes
register: result
- assert:
@ -61,5 +64,6 @@
- no ip access-list extended test
match: none
authorize: yes
become: yes
- debug: msg="END cli/sublevel_exact.yaml"
- debug: msg="END cli/sublevel_exact.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/sublevel_strict.yaml"
- debug: msg="START cli/sublevel_strict.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -13,6 +13,7 @@
before: no ip access-list extended test
match: none
authorize: yes
become: yes
- name: configure sub level command using strict match
ios_config:
@ -24,6 +25,7 @@
parents: ip access-list extended test
match: strict
authorize: yes
become: yes
register: result
- assert:
@ -40,6 +42,7 @@
after: exit
match: strict
authorize: yes
become: yes
register: result
- assert:
@ -57,5 +60,6 @@
lines: no ip access-list extended test
match: none
authorize: yes
become: yes
- debug: msg="END cli/sublevel_strict.yaml"
- debug: msg="END cli/sublevel_strict.yaml on connection={{ ansible_connection }}"

@ -1,16 +1,18 @@
---
- debug: msg="START cli/toplevel.yaml"
- debug: msg="START cli/toplevel.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
lines: ['hostname {{ shorter_hostname }}']
match: none
authorize: yes
become: yes
- name: configure top level command
ios_config:
lines: ['hostname foo']
authorize: yes
become: yes
register: result
- assert:
@ -22,6 +24,7 @@
ios_config:
lines: ['hostname foo']
authorize: yes
become: yes
register: result
- assert:
@ -33,5 +36,6 @@
lines: ['hostname {{ shorter_hostname }}']
match: none
authorize: yes
become: yes
- debug: msg="END cli/toplevel.yaml"
- debug: msg="END cli/toplevel.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/toplevel_after.yaml"
- debug: msg="START cli/toplevel_after.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -8,12 +8,14 @@
- "hostname {{ shorter_hostname }}"
match: none
authorize: yes
become: yes
- name: configure top level command with before
ios_config:
lines: ['hostname foo']
after: ['snmp-server contact bar']
authorize: yes
become: yes
register: result
- assert:
@ -27,6 +29,7 @@
lines: ['hostname foo']
after: ['snmp-server contact foo']
authorize: yes
become: yes
register: result
- assert:
@ -40,5 +43,6 @@
- "hostname {{ shorter_hostname }}"
match: none
authorize: yes
become: yes
- debug: msg="END cli/toplevel_after.yaml"
- debug: msg="END cli/toplevel_after.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/toplevel_before.yaml"
- debug: msg="START cli/toplevel_before.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -8,12 +8,14 @@
- "hostname {{ shorter_hostname }}"
match: none
authorize: yes
become: yes
- name: configure top level command with before
ios_config:
lines: ['hostname foo']
before: ['snmp-server contact bar']
authorize: yes
become: yes
register: result
- assert:
@ -27,6 +29,7 @@
lines: ['hostname foo']
before: ['snmp-server contact foo']
authorize: yes
become: yes
register: result
- assert:
@ -40,5 +43,6 @@
- "hostname {{ shorter_hostname }}"
match: none
authorize: yes
become: yes
- debug: msg="END cli/toplevel_before.yaml"
- debug: msg="END cli/toplevel_before.yaml on connection={{ ansible_connection }}"

@ -1,17 +1,19 @@
---
- debug: msg="START cli/toplevel_nonidempotent.yaml"
- debug: msg="START cli/toplevel_nonidempotent.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
lines: ['hostname {{ shorter_hostname }}']
match: none
authorize: yes
become: yes
- name: configure top level command
ios_config:
lines: ['hostname foo']
match: strict
authorize: yes
become: yes
register: result
- assert:
@ -24,6 +26,7 @@
lines: ['hostname foo']
match: strict
authorize: yes
become: yes
register: result
- assert:
@ -35,5 +38,6 @@
lines: ['hostname {{ shorter_hostname }}']
match: none
authorize: yes
become: yes
- debug: msg="END cli/toplevel_nonidempotent.yaml"
- debug: msg="END cli/toplevel_nonidempotent.yaml on connection={{ ansible_connection }}"

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,5 +1,5 @@
---
- debug: msg="START cli/all_facts.yaml"
- debug: msg="START cli/all_facts.yaml on connection={{ ansible_connection }}"
- name: test getting all facts
@ -7,6 +7,7 @@
gather_subset:
- all
authorize: yes
become: yes
register: result
@ -28,4 +29,4 @@
- "result.ansible_facts.ansible_net_memfree_mb > 1"
- "result.ansible_facts.ansible_net_memtotal_mb > 1"
- debug: msg="END cli/all_facts.yaml"
- debug: msg="END cli/all_facts.yaml on connection={{ ansible_connection }}"

@ -1,10 +1,11 @@
---
- debug: msg="START cli/default_facts.yaml"
- debug: msg="START cli/default_facts.yaml on connection={{ ansible_connection }}"
- name: test getting default facts
ios_facts:
authorize: yes
become: yes
register: result
- assert:
@ -28,4 +29,4 @@
# ... and not present
- "result.ansible_facts.ansible_net_config is not defined" # config
- debug: msg="END cli/default.yaml"
- debug: msg="END cli/default.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/invalid_subset.yaml"
- debug: msg="START cli/invalid_subset.yaml on connection={{ ansible_connection }}"
- name: test invalid subset (foobar)
@ -7,6 +7,7 @@
gather_subset:
- "foobar"
authorize: yes
become: yes
register: result
ignore_errors: true
@ -30,6 +31,7 @@
- "!hardware"
- "hardware"
authorize: yes
become: yes
register: result
ignore_errors: true
@ -45,4 +47,4 @@
- debug: msg="END cli/invalid_subset.yaml"
- debug: msg="END cli/invalid_subset.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/not_hardware_facts.yaml"
- debug: msg="START cli/not_hardware_facts.yaml on connection={{ ansible_connection }}"
- name: test not hardware
@ -7,6 +7,7 @@
gather_subset:
- "!hardware"
authorize: yes
become: yes
register: result
- assert:
@ -27,4 +28,4 @@
# ... and not present
- "result.ansible_facts.ansible_net_filesystems is not defined"
- debug: msg="END cli/not_hardware_facts.yaml"
- debug: msg="END cli/not_hardware_facts.yaml on connection={{ ansible_connection }}"

@ -4,12 +4,19 @@
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 case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,10 +1,11 @@
---
- debug: msg="START ios_interface cli/basic.yaml"
- debug: msg="START ios_interface cli/basic.yaml on connection={{ ansible_connection }}"
- name: Run show version
ios_command:
commands: show version
authorize: yes
become: yes
register: show_version_result
- block:
@ -23,6 +24,7 @@
- no negotiation auto
parents: int GigabitEthernet2
authorize: yes
become: yes
- name: Set test interface 2 to GigabitEthernet3 as we are on Cisco IOS-XE
set_fact: test_interface2=GigabitEthernet3
@ -32,6 +34,7 @@
- no negotiation auto
parents: int GigabitEthernet3
authorize: yes
become: yes
when: "'Cisco IOS-XE' in show_version_result.stdout[0]"
- name: Configure interface (setup)
@ -42,6 +45,7 @@
mtu: 1800
state: present
authorize: yes
become: yes
register: result
- name: Configure interface
@ -50,6 +54,7 @@
description: test-interface-initial
state: present
authorize: yes
become: yes
register: result
- assert:
@ -64,6 +69,7 @@
description: test-interface-initial
state: present
authorize: yes
become: yes
register: result
- assert:
@ -77,6 +83,7 @@
mtu: 2000
state: present
authorize: yes
become: yes
register: result
- assert:
@ -93,6 +100,7 @@
mtu: 1800
state: present
authorize: yes
become: yes
register: result
- assert:
@ -107,6 +115,7 @@
name: "{{ test_interface }}"
enabled: False
authorize: yes
become: yes
register: result
- assert:
@ -120,6 +129,7 @@
name: "{{ test_interface }}"
enabled: True
authorize: yes
become: yes
register: result
- assert:
@ -136,6 +146,7 @@
mtu: 1800
state: present
authorize: yes
become: yes
register: result
- name: Add interface aggregate
@ -146,6 +157,7 @@
speed: 1000
state: present
authorize: yes
become: yes
register: result
- assert:
@ -165,6 +177,7 @@
speed: 1000
state: present
authorize: yes
become: yes
register: result
- assert:
@ -179,6 +192,7 @@
enabled: False
state: present
authorize: yes
become: yes
register: result
- assert:
@ -197,6 +211,7 @@
enabled: True
state: present
authorize: yes
become: yes
register: result
- assert:
@ -214,6 +229,7 @@
- name: Loopback10
state: absent
authorize: yes
become: yes
- name: Create loopback interface aggregate
ios_interface:
@ -222,6 +238,7 @@
- name: Loopback10
state: present
authorize: yes
become: yes
register: result
- assert:
@ -237,6 +254,7 @@
- name: Loopback10
state: absent
authorize: yes
become: yes
register: result
- assert:
@ -252,10 +270,11 @@
- name: Loopback10
state: absent
authorize: yes
become: yes
register: result
- assert:
that:
- 'result.changed == false'
- debug: msg="END ios_interface cli/basic.yaml"
- debug: msg="END ios_interface cli/basic.yaml on connection={{ ansible_connection }}"

@ -1,10 +1,11 @@
---
- debug: msg="START ios_interface cli/intent.yaml"
- debug: msg="START ios_interface cli/intent.yaml on connection={{ ansible_connection }}"
- name: Run show version
ios_command:
commands: show version
authorize: yes
become: yes
register: show_version_result
- name: Set test interface to GigabitEthernet0/2 if we are on Cisco IOS
@ -23,6 +24,7 @@
tx_rate: ge(0)
rx_rate: ge(0)
authorize: yes
become: yes
register: result
- assert:
@ -36,6 +38,7 @@
tx_rate: gt(0)
rx_rate: lt(0)
authorize: yes
become: yes
ignore_errors: yes
register: result
@ -52,6 +55,7 @@
enabled: False
state: down
authorize: yes
become: yes
register: result
- assert:
@ -64,6 +68,7 @@
enabled: False
authorize: yes
state: up
become: yes
ignore_errors: yes
register: result
@ -77,6 +82,7 @@
commands:
- show lldp neighbors
authorize: yes
become: yes
register: show_lldp_neighbors_result
- block:
@ -87,6 +93,7 @@
- port: eth0
host: netdev
authorize: yes
become: yes
register: result
- assert:
@ -100,6 +107,7 @@
- port: dummy_port
host: dummy_host
authorize: yes
become: yes
ignore_errors: yes
register: result
@ -117,6 +125,7 @@
enabled: True
state: up
authorize: yes
become: yes
ignore_errors: yes
register: result
@ -133,6 +142,7 @@
- port: eth0
host: netdev
authorize: yes
become: yes
ignore_errors: yes
register: result
@ -150,6 +160,7 @@
- port: dummy_port
host: dummy_host
authorize: yes
become: yes
ignore_errors: yes
register: result

@ -4,12 +4,19 @@
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 case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -6,6 +6,7 @@
name: 172.16.0.1
state: absent
authorize: yes
become: yes
- name: Remove console
ios_logging:
@ -13,6 +14,7 @@
level: warnings
state: absent
authorize: yes
become: yes
- name: Remove buffer
ios_logging:
@ -20,6 +22,7 @@
size: 8000
authorize: yes
state: absent
become: yes
# start tests
- name: Set up host logging
@ -29,6 +32,7 @@
facility: local7
state: present
authorize: yes
become: yes
register: result
- assert:
@ -43,6 +47,7 @@
name: 172.16.0.1
state: present
authorize: yes
become: yes
register: result
- assert:
@ -55,6 +60,7 @@
name: 172.16.0.1
state: absent
authorize: yes
become: yes
register: result
- assert:
@ -68,6 +74,7 @@
name: 172.16.0.1
state: absent
authorize: yes
become: yes
register: result
- assert:
@ -80,6 +87,7 @@
level: warnings
state: present
authorize: yes
become: yes
register: result
- assert:
@ -92,6 +100,7 @@
dest: buffered
size: 8000
authorize: yes
become: yes
register: result
- assert:
@ -105,6 +114,7 @@
- { dest: console, level: notifications }
- { dest: buffered, size: 9000 }
authorize: yes
become: yes
register: result
- assert:
@ -120,6 +130,7 @@
- { dest: buffered, size: 9000 }
state: absent
authorize: yes
become: yes
register: result
- assert:

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,5 +1,5 @@
---
- debug: msg="START cli/ping.yaml"
- debug: msg="START cli/ping.yaml on connection={{ ansible_connection }}"
- ios_command:
commands: show version

@ -4,12 +4,19 @@
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 case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -6,6 +6,7 @@
next_hop: 10.0.0.8
state: present
authorize: yes
become: yes
register: result
- assert:
@ -20,6 +21,7 @@
next_hop: 10.0.0.8
state: present
authorize: yes
become: yes
register: result
- assert:
@ -34,6 +36,7 @@
admin_distance: 2
state: present
authorize: yes
become: yes
register: result
- assert:
@ -49,6 +52,7 @@
admin_distance: 2
state: present
authorize: yes
become: yes
register: result
- assert:
@ -63,6 +67,7 @@
admin_distance: 2
state: absent
authorize: yes
become: yes
register: result
- assert:
@ -78,6 +83,7 @@
admin_distance: 2
state: absent
authorize: yes
become: yes
register: result
- assert:
@ -91,6 +97,7 @@
- { prefix: 172.16.33.0, mask: 255.255.255.0, next_hop: 10.0.0.8 }
state: present
authorize: yes
become: yes
register: result
- assert:
@ -106,6 +113,7 @@
- { prefix: 172.16.34.0, mask: 255.255.255.0, next_hop: 10.0.0.8 }
state: present
authorize: yes
become: yes
register: result
- assert:
@ -121,6 +129,7 @@
- { prefix: 172.16.34.0, mask: 255.255.255.0, next_hop: 10.0.0.8 }
state: absent
authorize: yes
become: yes
register: result
- assert:

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -1,5 +1,5 @@
---
- debug: msg="START cli/set_domain_search.yaml"
- debug: msg="START cli/set_domain_search.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -8,6 +8,7 @@
- no ip domain-list redhat.com
match: none
authorize: yes
become: yes
- name: configure domain_search
ios_system:
@ -15,6 +16,7 @@
- ansible.com
- redhat.com
authorize: yes
become: yes
register: result
- assert:
@ -29,6 +31,7 @@
- ansible.com
- redhat.com
authorize: yes
become: yes
register: result
- assert:
@ -40,6 +43,7 @@
domain_search:
- ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -52,6 +56,7 @@
domain_search:
- ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -64,6 +69,7 @@
- ansible.com
- redhat.com
authorize: yes
become: yes
register: result
- assert:
@ -77,6 +83,7 @@
- ansible.com
- redhat.com
authorize: yes
become: yes
register: result
- assert:
@ -89,6 +96,7 @@
- ansible.com
- eng.ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -104,6 +112,7 @@
- ansible.com
- eng.ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -118,5 +127,6 @@
- no ip domain-list eng.ansible.com
match: none
authorize: yes
become: yes
- debug: msg="END cli/set_domain_search.yaml"
- debug: msg="END cli/set_domain_search.yaml on connection={{ ansible_connection }}"

@ -1,16 +1,18 @@
---
- debug: msg="START cli/set_domain_name.yaml"
- debug: msg="START cli/set_domain_name.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
lines: no ip domain-name
match: none
authorize: yes
become: yes
- name: configure domain_name
ios_system:
domain_name: eng.ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -21,6 +23,7 @@
ios_system:
domain_name: eng.ansible.com
authorize: yes
become: yes
register: result
- assert:
@ -32,5 +35,6 @@
lines: no ip domain-name
match: none
authorize: yes
become: yes
- debug: msg="END cli/set_domain_name.yaml"
- debug: msg="END cli/set_domain_name.yaml on connection={{ ansible_connection }}"

@ -1,16 +1,18 @@
---
- debug: msg="START cli/set_hostname.yaml"
- debug: msg="START cli/set_hostname.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
lines: hostname switch
match: none
authorize: yes
become: yes
- name: configure hostname
ios_system:
hostname: foo
authorize: yes
become: yes
register: result
- assert:
@ -21,6 +23,7 @@
ios_system:
hostname: foo
authorize: yes
become: yes
register: result
- assert:
@ -32,5 +35,6 @@
lines: "hostname {{ inventory_hostname }}"
match: none
authorize: yes
become: yes
- debug: msg="END cli/set_hostname.yaml"
- debug: msg="END cli/set_hostname.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/set_lookup_source.yaml"
- debug: msg="START cli/set_lookup_source.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -8,11 +8,13 @@
- vrf definition ansible
match: none
authorize: yes
become: yes
- name: configure lookup_source
ios_system:
lookup_source: Loopback888
authorize: yes
become: yes
register: result
- assert:
@ -24,6 +26,7 @@
ios_system:
lookup_source: Loopback888
authorize: yes
become: yes
register: result
- assert:
@ -34,6 +37,7 @@
ios_system:
lookup_enabled: False
authorize: yes
become: yes
register: result
- assert:
@ -45,6 +49,7 @@
ios_system:
lookup_enabled: True
authorize: yes
become: yes
register: result
- assert:
@ -59,6 +64,7 @@
# vrf: ansible
# authorize: yes
# provider: "{{ cli }}"
# become: yes
# register: result
#
#- assert:
@ -75,6 +81,7 @@
# vrf: ansible
# authorize: yes
# provider: "{{ cli }}"
# become: yes
# register: result
#
#- assert:
@ -88,7 +95,8 @@
- no vrf definition ansible
match: none
authorize: yes
become: yes
ignore_errors: yes
# FIXME: Not sure why this is failing with msg": "no vrf definition ansible\r\n% IPv4 and IPv6 addresses from all interfaces in VRF ansible have been removed\r\nfoo(config)#", rc:1
- debug: msg="END cli/set_lookup_source.yaml"
- debug: msg="END cli/set_lookup_source.yaml on connection={{ ansible_connection }}"

@ -1,5 +1,5 @@
---
- debug: msg="START cli/set_name_servers.yaml"
- debug: msg="START cli/set_name_servers.yaml on connection={{ ansible_connection }}"
- name: setup
ios_config:
@ -7,6 +7,7 @@
- no ip name-server
match: none
authorize: yes
become: yes
- name: configure name_servers
ios_system:
@ -15,6 +16,7 @@
- 2.2.2.2
- 3.3.3.3
authorize: yes
become: yes
register: result
- assert:
@ -32,6 +34,7 @@
- 2.2.2.2
- 3.3.3.3
authorize: yes
become: yes
register: result
- assert:
@ -73,6 +76,7 @@
- 1.1.1.1
- 2.2.2.2
authorize: yes
become: yes
register: result
- assert:
@ -87,5 +91,6 @@
- no ip name-server
match: none
authorize: yes
become: yes
- debug: msg="END cli/set_name_servers.yaml"
- debug: msg="END cli/set_name_servers.yaml on connection={{ ansible_connection }}"

@ -4,12 +4,19 @@
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 case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -8,6 +8,7 @@
state: present
authorize: yes
configured_password: pass123
become: yes
- name: test login
expect:
@ -34,6 +35,7 @@
name: auth_user
state: absent
authorize: yes
become: yes
register: result
- name: reset connection

@ -7,7 +7,7 @@
- name: ansibletest3
state: absent
authorize: yes
register: result
become: yes
- name: Create user (SetUp)
ios_user:
@ -16,6 +16,7 @@
role: network-operator
state: present
authorize: yes
become: yes
register: result
- assert:
@ -31,6 +32,7 @@
authorize: yes
state: present
view: network-admin
become: yes
register: result
- assert:
@ -45,6 +47,7 @@
role: network-operator
state: present
authorize: yes
become: yes
register: result
- assert:
@ -60,6 +63,7 @@
authorize: yes
state: present
view: network-admin
become: yes
register: result
- assert:
@ -75,6 +79,7 @@
- name: ansibletest3
state: absent
authorize: yes
become: yes
register: result
- assert:

@ -9,8 +9,14 @@
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case
include: "{{ test_case_to_run }}"
- name: run test cases (connection=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
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 ansible_become=no"
with_first_found: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

@ -6,6 +6,7 @@
# - no vlan 200
# - no vlan 300
# authorize: yes
# become: yes
#- name: setup - remove switchport settings on interfaces used in test
# ios_config:
@ -14,6 +15,7 @@
# - no switchport access vlan 100
# authorize: yes
# parents: "{{ item }}"
# become: yes
# with_items:
# - interface GigabitEthernet0/1
# - interface GigabitEthernet0/2
@ -23,6 +25,7 @@
# vlan_id: 100
# name: test-vlan
# authorize: yes
# become: yes
# register: result
#- assert:
@ -33,6 +36,7 @@
#- name: create vlan(idempotence)
# ios_vlan: *create
# become: yes
# register: result
#- assert:
@ -46,6 +50,7 @@
# - GigabitEthernet0/1
# - GigabitEthernet0/2
# authorize: yes
# become: yes
# register: result
#- assert:
@ -60,6 +65,7 @@
#- name: Add interfaces to vlan(idempotence)
# ios_vlan: *interfaces
# become: yes
# register: result
#- assert:
@ -72,6 +78,7 @@
# interfaces:
# - GigabitEthernet0/1
# authorize: yes
# become: yes
# register: result
#- assert:
@ -84,6 +91,7 @@
#- name: Remove interface from vlan(idempotence)
# ios_vlan: *single_int
# become: yes
# register: result
#- assert:
@ -95,6 +103,7 @@
# vlan_id: 100
# state: suspend
# authorize: yes
# become: yes
# register: result
#- assert:
@ -108,6 +117,7 @@
# vlan_id: 100
# state: active
# authorize: yes
# become: yes
# register: result
#- assert:
@ -121,6 +131,7 @@
# vlan_id: 100
# authorize: yes
# state: absent
# become: yes
# register: result
#- assert:
@ -130,6 +141,7 @@
#- name: delete vlan(idempotence)
# ios_vlan: *delete
# become: yes
# register: result
#- assert:
@ -142,6 +154,7 @@
# - { vlan_id: 200, name: vlan-200 }
# - { vlan_id: 300, name: vlan-300 }
# authorize: yes
# become: yes
# register: result
#- assert:
@ -154,6 +167,7 @@
#- name: create vlans using aggregate(idempotence)
# ios_vlan: *create_aggregate
# become: yes
# register: result
#- assert:
@ -167,6 +181,7 @@
# - { vlan_id: 300, name: vlan-300 }
# state: absent
# authorize: yes
# become: yes
# register: result
#- assert:
@ -177,6 +192,7 @@
#- name: delete vlans using aggregate(idempotence)
# ios_vlan: *delete_aggregate
# become: yes
# register: result
#- assert:
@ -190,6 +206,7 @@
# - no vlan 200
# - no vlan 300
# authorize: yes
# become: yes
#- name: teardown(part2)
# ios_config:
@ -198,6 +215,7 @@
# - no switchport access vlan 100
# authorize: yes
# parents: "{{ item }}"
# become: yes
# with_items:
# - interface GigabitEthernet0/1
# - interface GigabitEthernet0/2

@ -3,7 +3,8 @@
- name: Ensure we have loopback 888 for testing
ios_config:
src: config.j2
authorize: yes
connection: network_cli
become: yes
# Some AWS hostnames can be longer than those allowed by the system we are testing
# Truncate the hostname

@ -58,7 +58,7 @@ class TestIosUserModule(TestIosModule):
set_module_args(dict(name='ansible', state='absent'))
result = self.execute_module(changed=True)
cmd = json.loads(
'{"answer": "y", ' +
'{"answer": "y", "newline": false, ' +
'"prompt": "This operation will remove all username related ' +
'configurations with same name", "command": "no username ansible"}'
)
@ -87,7 +87,7 @@ class TestIosUserModule(TestIosModule):
set_module_args(dict(purge=True))
result = self.execute_module(changed=True)
cmd = json.loads(
'{"answer": "y", ' +
'{"answer": "y", "newline": false, ' +
'"prompt": "This operation will remove all username related ' +
'configurations with same name", "command": "no username ansible"}'
)

Loading…
Cancel
Save