mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
* Fix DCI issues and changes to action plugin & utils (#35083)
* * Fix DCI issues and changes to action plugin & utils * * Additional check to handle cli only modules for platforms that support netconf
This commit is contained in:
parent
784853da35
commit
719feef2e0
4 changed files with 18 additions and 27 deletions
|
@ -48,7 +48,6 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_XML = False
|
HAS_XML = False
|
||||||
|
|
||||||
_DEVICE_CONFIGS = {}
|
|
||||||
_EDIT_OPS = frozenset(['merge', 'create', 'replace', 'delete'])
|
_EDIT_OPS = frozenset(['merge', 'create', 'replace', 'delete'])
|
||||||
|
|
||||||
BASE_1_0 = "{urn:ietf:params:xml:ns:netconf:base:1.0}"
|
BASE_1_0 = "{urn:ietf:params:xml:ns:netconf:base:1.0}"
|
||||||
|
@ -78,7 +77,7 @@ iosxr_provider_spec = {
|
||||||
'password': dict(fallback=(env_fallback, ['ANSIBLE_NET_PASSWORD']), no_log=True),
|
'password': dict(fallback=(env_fallback, ['ANSIBLE_NET_PASSWORD']), no_log=True),
|
||||||
'ssh_keyfile': dict(fallback=(env_fallback, ['ANSIBLE_NET_SSH_KEYFILE']), type='path'),
|
'ssh_keyfile': dict(fallback=(env_fallback, ['ANSIBLE_NET_SSH_KEYFILE']), type='path'),
|
||||||
'timeout': dict(type='int'),
|
'timeout': dict(type='int'),
|
||||||
'transport': dict(),
|
'transport': dict(type='str', default='cli', choices=['cli', 'netconf']),
|
||||||
}
|
}
|
||||||
|
|
||||||
iosxr_argument_spec = {
|
iosxr_argument_spec = {
|
||||||
|
@ -356,8 +355,6 @@ def commit_config(module, comment=None, confirmed=False, confirm_timeout=None, p
|
||||||
|
|
||||||
|
|
||||||
def get_oper(module, filter=None):
|
def get_oper(module, filter=None):
|
||||||
global _DEVICE_CONFIGS
|
|
||||||
|
|
||||||
conn = get_connection(module)
|
conn = get_connection(module)
|
||||||
|
|
||||||
if filter is not None:
|
if filter is not None:
|
||||||
|
@ -367,25 +364,16 @@ def get_oper(module, filter=None):
|
||||||
|
|
||||||
|
|
||||||
def get_config(module, config_filter=None, source='running'):
|
def get_config(module, config_filter=None, source='running'):
|
||||||
global _DEVICE_CONFIGS
|
|
||||||
|
|
||||||
conn = get_connection(module)
|
conn = get_connection(module)
|
||||||
|
|
||||||
if config_filter is not None:
|
# Note: Does not cache config in favour of latest config on every get operation.
|
||||||
key = (source + ' ' + ' '.join(config_filter)).strip().rstrip()
|
out = conn.get_config(source=source, filter=config_filter)
|
||||||
else:
|
if is_netconf(module):
|
||||||
key = source
|
out = to_xml(conn.get_config(source=source, filter=config_filter))
|
||||||
config = _DEVICE_CONFIGS.get(key)
|
|
||||||
if config:
|
|
||||||
return config
|
|
||||||
else:
|
|
||||||
out = conn.get_config(source=source, filter=config_filter)
|
|
||||||
if is_netconf(module):
|
|
||||||
out = to_xml(conn.get_config(source=source, filter=config_filter))
|
|
||||||
|
|
||||||
cfg = out.strip()
|
cfg = out.strip()
|
||||||
_DEVICE_CONFIGS.update({key: cfg})
|
|
||||||
return cfg
|
return cfg
|
||||||
|
|
||||||
|
|
||||||
def load_config(module, command_filter, commit=False, replace=False,
|
def load_config(module, command_filter, commit=False, replace=False,
|
||||||
|
|
|
@ -45,15 +45,14 @@ class ActionModule(_ActionModule):
|
||||||
provider = load_provider(iosxr_provider_spec, self._task.args)
|
provider = load_provider(iosxr_provider_spec, self._task.args)
|
||||||
pc = copy.deepcopy(self._play_context)
|
pc = copy.deepcopy(self._play_context)
|
||||||
if self._task.action in ['iosxr_netconf', 'iosxr_config', 'iosxr_command'] or \
|
if self._task.action in ['iosxr_netconf', 'iosxr_config', 'iosxr_command'] or \
|
||||||
(provider['transport'] == 'cli' and (self._task.action == 'iosxr_banner' or
|
(provider['transport'] == 'cli'):
|
||||||
self._task.action == 'iosxr_facts' or self._task.action == 'iosxr_logging' or
|
|
||||||
self._task.action == 'iosxr_system' or self._task.action == 'iosxr_user' or
|
|
||||||
self._task.action == 'iosxr_interface')):
|
|
||||||
pc.connection = 'network_cli'
|
pc.connection = 'network_cli'
|
||||||
pc.port = int(provider['port'] or self._play_context.port or 22)
|
pc.port = int(provider['port'] or self._play_context.port or 22)
|
||||||
else:
|
elif provider['transport'] == 'netconf':
|
||||||
pc.connection = 'netconf'
|
pc.connection = 'netconf'
|
||||||
pc.port = int(provider['port'] or self._play_context.port or 830)
|
pc.port = int(provider['port'] or self._play_context.port or 830)
|
||||||
|
else:
|
||||||
|
return {'failed': True, 'msg': 'Transport type %s is not valid for this module' % provider['transport']}
|
||||||
|
|
||||||
pc.network_os = 'iosxr'
|
pc.network_os = 'iosxr'
|
||||||
pc.remote_addr = provider['host'] or self._play_context.remote_addr
|
pc.remote_addr = provider['host'] or self._play_context.remote_addr
|
||||||
|
|
|
@ -37,6 +37,9 @@ except ImportError:
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
_CLI_ONLY_MODULES = frozenset(['junos_netconf', 'iosxr_netconf', 'iosxr_config', 'iosxr_command'])
|
||||||
|
_NETCONF_SUPPORTED_PLATFORMS = frozenset(['junos', 'iosxr'])
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(ActionBase):
|
class ActionModule(ActionBase):
|
||||||
|
|
||||||
|
@ -57,7 +60,8 @@ class ActionModule(ActionBase):
|
||||||
module = load_module(module_name, f, p, d)
|
module = load_module(module_name, f, p, d)
|
||||||
|
|
||||||
self.provider = load_provider(module.get_provider_argspec(), self._task.args)
|
self.provider = load_provider(module.get_provider_argspec(), self._task.args)
|
||||||
if play_context.network_os == 'junos':
|
if self.provider.get('transport') == 'netconf' and play_context.network_os in _NETCONF_SUPPORTED_PLATFORMS \
|
||||||
|
and self._task.action not in _CLI_ONLY_MODULES:
|
||||||
play_context.connection = 'netconf'
|
play_context.connection = 'netconf'
|
||||||
play_context.port = int(self.provider['port'] or self._play_context.port or 830)
|
play_context.port = int(self.provider['port'] or self._play_context.port or 830)
|
||||||
elif self.provider.get('transport') in ('nxapi', 'eapi') and play_context.network_os in ('nxos', 'eos'):
|
elif self.provider.get('transport') in ('nxapi', 'eapi') and play_context.network_os in ('nxos', 'eos'):
|
||||||
|
|
|
@ -17,6 +17,6 @@
|
||||||
|
|
||||||
- name: run test case (connection=local)
|
- name: run test case (connection=local)
|
||||||
include: "{{ test_case_to_run }} ansible_connection=local"
|
include: "{{ test_case_to_run }} ansible_connection=local"
|
||||||
with_first_found: "{{ test_items }}"
|
with_items: "{{ test_items }}"
|
||||||
loop_control:
|
loop_control:
|
||||||
loop_var: test_case_to_run
|
loop_var: test_case_to_run
|
||||||
|
|
Loading…
Reference in a new issue