Allow httpapi for resource modules (#62843)

* Redo tests to be transport agnostic

cli -> eos config

Redirect connection for httpapi
This commit is contained in:
Nathaniel Case 2020-01-14 14:26:10 -05:00 committed by GitHub
parent 6044325dec
commit e266e5f8b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
70 changed files with 343 additions and 158 deletions

View file

@ -32,6 +32,8 @@ from ansible.module_utils._text import to_text, to_native
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback from ansible.module_utils.basic import env_fallback
from ansible.module_utils.connection import Connection, ConnectionError from ansible.module_utils.connection import Connection, ConnectionError
from ansible.module_utils.network.eos import eos
from ansible.module_utils.network.nxos import nxos
from ansible.module_utils.network.common.netconf import NetconfConnection from ansible.module_utils.network.common.netconf import NetconfConnection
from ansible.module_utils.network.common.parsing import Cli from ansible.module_utils.network.common.parsing import Cli
from ansible.module_utils.six import iteritems from ansible.module_utils.six import iteritems
@ -212,7 +214,11 @@ def get_resource_connection(module):
capabilities = get_capabilities(module) capabilities = get_capabilities(module)
network_api = capabilities.get('network_api') network_api = capabilities.get('network_api')
if network_api in ('cliconf', 'nxapi', 'eapi', 'exosapi'): if network_api == 'eapi':
module._connection = eos.get_connection(module)
elif network_api == 'nxapi':
module._connection = nxos.get_connection(module)
elif network_api in ('cliconf', 'exosapi'):
module._connection = Connection(module._socket_path) module._connection = Connection(module._socket_path)
elif network_api == 'netconf': elif network_api == 'netconf':
module._connection = NetconfConnection(module._socket_path) module._connection = NetconfConnection(module._socket_path)

View file

@ -418,6 +418,9 @@ class HttpApi:
self._session_support = self._connection.supports_sessions() self._session_support = self._connection.supports_sessions()
return self._session_support return self._session_support
def get(self, command, **kwargs):
return self._connection.send_request(command)
def run_commands(self, commands, check_rc=True): def run_commands(self, commands, check_rc=True):
"""Runs list of commands on remote device and returns results """Runs list of commands on remote device and returns results
""" """
@ -511,7 +514,7 @@ class HttpApi:
""" """
return self.edit_config(config, commit, replace) return self.edit_config(config, commit, replace)
def edit_config(self, config, commit=False, replace=False): def edit_config(self, config, commit=True, replace=False):
"""Loads the configuration onto the remote devices """Loads the configuration onto the remote devices
If the device doesn't support configuration sessions, this will If the device doesn't support configuration sessions, this will

View file

@ -130,6 +130,13 @@ class Interfaces(FactsBase):
self.facts['all_ipv6_addresses'] = list() self.facts['all_ipv6_addresses'] = list()
data = self.responses[0] data = self.responses[0]
if not isinstance(data, dict):
# EAPI kills the whole request on an error.
self.COMMANDS.pop()
super(Interfaces, self).populate()
self.responses.append(None)
data = self.responses[0]
self.facts['interfaces'] = self.populate_interfaces(data) self.facts['interfaces'] = self.populate_interfaces(data)
data = self.responses[1] data = self.responses[1]

View file

@ -63,8 +63,7 @@ class VlansFacts(object):
if obj: if obj:
objs.extend(obj) objs.extend(obj)
ansible_facts['ansible_network_resources'].pop('vlans', None) facts = {'vlans': []}
facts = {}
if objs: if objs:
params = utils.validate_config(self.argument_spec, {'config': objs}) params = utils.validate_config(self.argument_spec, {'config': objs})
facts['vlans'] = [utils.remove_empties(cfg) for cfg in params['config']] facts['vlans'] = [utils.remove_empties(cfg) for cfg in params['config']]

View file

@ -39,7 +39,7 @@ class JsonRpcServer(object):
break break
if not rpc_method: if not rpc_method:
error = self.method_not_found() error = self.method_not_found(rpc_method)
response = json.dumps(error) response = json.dumps(error)
else: else:
try: try:

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset initial config - name: Reset initial config
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
description "Interface 1" description "Interface 1"
no shutdown no shutdown

View file

@ -0,0 +1,22 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- block:
- 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
tags: connection_network_cli
always:
- name: Clean up test state
include: "{{ role_path }}/tests/common/cleanup.yml ansible_connection=network_cli"

View file

@ -0,0 +1,22 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- block:
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi
always:
- name: Clean up test state
include: "{{ role_path }}/tests/common/cleanup.yml ansible_connection=httpapi"

View file

@ -1,22 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- block:
- 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
tags: connection_network_cli
always:
- name: Clean up test state
include: "{{ role_path }}/tests/cli/cleanup.yml ansible_connection=network_cli"

View file

@ -1,12 +1,12 @@
--- ---
- name: Remove all vlans - name: Remove all vlans
cli_config: eos_config:
config: no vlan 1-4094 lines: no vlan 1-4094
become: yes become: yes
- name: Completely remove vlans from interfaces - name: Completely remove vlans from interfaces
cli_config: eos_config:
config: | lines: |
interface {{ item }} interface {{ item }}
no switchport mode no switchport mode
no switchport access vlan no switchport access vlan

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset state - name: Reset state
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
switchport access vlan 20 switchport access vlan 20
no switchport trunk native vlan no switchport trunk native vlan

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset state - name: Reset state
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
ip address 192.0.2.12/24 ip address 192.0.2.12/24
ip address 203.0.113.27/31 secondary ip address 203.0.113.27/31 secondary

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset initial config - name: Reset initial config
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
lacp port-priority 30 lacp port-priority 30
lacp rate normal lacp rate normal

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset state - name: Reset state
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
channel-group 5 mode on channel-group 5 mode on
interface Ethernet2 interface Ethernet2

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset initial config - name: Reset initial config
cli_config: eos_config:
config: | lines: |
lldp timer 3000 lldp timer 3000
lldp holdtime 100 lldp holdtime 100
lldp reinit 5 lldp reinit 5

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,7 +1,7 @@
--- ---
- name: Reset initial config - name: Reset initial config
cli_config: eos_config:
config: | lines: |
interface Ethernet1 interface Ethernet1
no lldp receive no lldp receive
lldp transmit lldp transmit

View file

@ -0,0 +1,17 @@
---
- name: collect all cli test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -0,0 +1,17 @@
---
- name: collect all eapi test cases
find:
paths: "{{ role_path }}/tests/common"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test cases (connection=httpapi)
include: "{{ test_case_to_run }} ansible_connection=httpapi"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_httpapi

View file

@ -1,17 +1,3 @@
--- ---
- name: collect all cli test cases - { include: cli.yaml, tags: ['cli'] }
find: - { include: eapi.yaml, tags: ['eapi'] }
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
delegate_to: localhost
register: test_cases
- 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 }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: connection_network_cli

View file

@ -1,12 +1,17 @@
--- ---
- name: Reset initial config - name: Reset initial config
cli_config: eos_config:
config: | before:
no vlan 1-4094 no vlan 1-4094
defaults: yes
match: exact
lines: |
vlan 10 vlan 10
name ten name ten
state active
vlan 20 vlan 20
name twenty name twenty
state active
become: yes become: yes
- eos_facts: - eos_facts: