Revert "Remove top-level arguments from network modules (#62603)"

This reverts commit d5ac3f7e77.
This commit is contained in:
Matt Clay 2019-10-15 12:53:51 -07:00
parent e4eea0510c
commit 20be8693ba
41 changed files with 431 additions and 114 deletions

View file

@ -430,10 +430,12 @@ def validate_prefix(prefix):
def load_provider(spec, args):
provider = args.get('provider') or {}
provider = args.get('provider', {})
for key, value in iteritems(spec):
if key not in provider:
if 'fallback' in value:
if key in args:
provider[key] = args[key]
elif 'fallback' in value:
provider[key] = _fallback(value['fallback'])
elif 'default' in value:
provider[key] = value['default']

View file

@ -36,6 +36,7 @@ from ansible.module_utils.basic import env_fallback
from ansible.module_utils.connection import Connection, ConnectionError
from ansible.module_utils.network.common.config import NetworkConfig, dumps
from ansible.module_utils.network.common.utils import to_list, ComplexList
from ansible.module_utils.six import iteritems
from ansible.module_utils.urls import fetch_url
_DEVICE_CONNECTION = None
@ -60,15 +61,41 @@ eos_provider_spec = {
eos_argument_spec = {
'provider': dict(type='dict', options=eos_provider_spec),
}
eos_top_spec = {
'host': dict(removed_in_version=2.9),
'port': dict(removed_in_version=2.9, type='int'),
'username': dict(removed_in_version=2.9),
'password': dict(removed_in_version=2.9, no_log=True),
'ssh_keyfile': dict(removed_in_version=2.9, type='path'),
'authorize': dict(fallback=(env_fallback, ['ANSIBLE_NET_AUTHORIZE']), type='bool'),
'auth_pass': dict(removed_in_version=2.9, no_log=True),
'use_ssl': dict(removed_in_version=2.9, type='bool'),
'validate_certs': dict(removed_in_version=2.9, type='bool'),
'timeout': dict(removed_in_version=2.9, type='int'),
'transport': dict(removed_in_version=2.9, choices=['cli', 'eapi'])
}
eos_argument_spec.update(eos_top_spec)
def get_provider_argspec():
return eos_provider_spec
def load_params(module):
provider = module.params.get('provider') or dict()
for key, value in iteritems(provider):
if key in eos_argument_spec:
if module.params.get(key) is None and value is not None:
module.params[key] = value
def get_connection(module):
global _DEVICE_CONNECTION
if not _DEVICE_CONNECTION:
load_params(module)
if is_local_eapi(module):
conn = LocalEapi(module)
else:
@ -183,24 +210,23 @@ class LocalEapi:
self._session_support = None
self._device_configs = {}
provider = module.params.get("provider") or {}
host = provider.get('host')
port = provider.get('port')
host = module.params['provider']['host']
port = module.params['provider']['port']
self._module.params['url_username'] = provider.get('username')
self._module.params['url_password'] = provider.get('password')
self._module.params['url_username'] = self._module.params['username']
self._module.params['url_password'] = self._module.params['password']
if provider.get('use_ssl'):
if module.params['provider']['use_ssl']:
proto = 'https'
else:
proto = 'http'
module.params['validate_certs'] = provider.get('validate_certs')
module.params['validate_certs'] = module.params['provider']['validate_certs']
self._url = '%s://%s:%s/command-api' % (proto, host, port)
if provider.get("auth_pass"):
self._enable = {'cmd': 'enable', 'input': provider.get('auth_pass')}
if module.params['auth_pass']:
self._enable = {'cmd': 'enable', 'input': module.params['auth_pass']}
else:
self._enable = 'enable'
@ -225,7 +251,7 @@ class LocalEapi:
data = self._module.jsonify(body)
headers = {'Content-Type': 'application/json-rpc'}
timeout = self._module.params['provider']['timeout']
timeout = self._module.params['timeout']
use_proxy = self._module.params['provider']['use_proxy']
response, headers = fetch_url(
@ -569,10 +595,12 @@ def is_json(cmd):
def is_local_eapi(module):
transports = []
transports.append(module.params.get('transport', ""))
provider = module.params.get('provider')
if provider:
return provider.get('transport') == 'eapi'
return False
transports.append(provider.get('transport', ""))
return 'eapi' in transports
def to_command(module, commands):

View file

@ -48,6 +48,18 @@ ios_argument_spec = {
'provider': dict(type='dict', options=ios_provider_spec),
}
ios_top_spec = {
'host': dict(removed_in_version=2.9),
'port': dict(removed_in_version=2.9, type='int'),
'username': dict(removed_in_version=2.9),
'password': dict(removed_in_version=2.9, no_log=True),
'ssh_keyfile': dict(removed_in_version=2.9, type='path'),
'authorize': dict(fallback=(env_fallback, ['ANSIBLE_NET_AUTHORIZE']), type='bool'),
'auth_pass': dict(removed_in_version=2.9, no_log=True),
'timeout': dict(removed_in_version=2.9, type='int')
}
ios_argument_spec.update(ios_top_spec)
def get_provider_argspec():
return ios_provider_spec

View file

@ -90,6 +90,16 @@ command_spec = {
'answer': dict(default=None)
}
iosxr_top_spec = {
'host': dict(removed_in_version=2.9),
'port': dict(removed_in_version=2.9, type='int'),
'username': dict(removed_in_version=2.9),
'password': dict(removed_in_version=2.9, no_log=True),
'ssh_keyfile': dict(removed_in_version=2.9, type='path'),
'timeout': dict(removed_in_version=2.9, type='int'),
}
iosxr_argument_spec.update(iosxr_top_spec)
CONFIG_MISPLACED_CHILDREN = [
re.compile(r'^end-\s*(.+)$')
]

View file

@ -10,8 +10,7 @@ calls the appropriate facts gathering function
"""
from ansible.module_utils.network.common.facts.facts import FactsBase
from ansible.module_utils.network.junos.junos import HAS_PYEZ
from ansible.module_utils.network.junos.facts.legacy.base import Default, Hardware, Config, Interfaces, OFacts
from ansible.module_utils.network.junos.facts.legacy.base import Default, Hardware, Config, Interfaces, OFacts, HAS_PYEZ
from ansible.module_utils.network.junos.facts.interfaces.interfaces import InterfacesFacts
from ansible.module_utils.network.junos.facts.lacp.lacp import LacpFacts
from ansible.module_utils.network.junos.facts.lacp_interfaces.lacp_interfaces import Lacp_interfacesFacts

View file

@ -11,8 +11,8 @@ based on the configuration.
import platform
from ansible.module_utils.network.common.netconf import exec_rpc
from ansible.module_utils.network.junos.junos import tostring
from ansible.module_utils.network.junos.junos import get_configuration, get_capabilities, get_device
from ansible.module_utils.network.junos.junos import get_param, tostring
from ansible.module_utils.network.junos.junos import get_configuration, get_capabilities
from ansible.module_utils._text import to_text
@ -21,6 +21,13 @@ try:
except ImportError:
from xml.etree.ElementTree import Element, SubElement
try:
from jnpr.junos import Device
from jnpr.junos.exception import ConnectError
HAS_PYEZ = True
except ImportError:
HAS_PYEZ = False
class FactsBase(object):
@ -177,9 +184,33 @@ class Interfaces(FactsBase):
class OFacts(FactsBase):
def _connect(self, module):
host = get_param(module, 'host')
kwargs = {
'port': get_param(module, 'port') or 830,
'user': get_param(module, 'username')
}
if get_param(module, 'password'):
kwargs['passwd'] = get_param(module, 'password')
if get_param(module, 'ssh_keyfile'):
kwargs['ssh_private_key_file'] = get_param(module, 'ssh_keyfile')
kwargs['gather_facts'] = False
try:
device = Device(host, **kwargs)
device.open()
device.timeout = get_param(module, 'timeout') or 10
except ConnectError as exc:
module.fail_json('unable to connect to %s: %s' % (host, to_text(exc)))
return device
def populate(self):
device = get_device(self.module)
device = self._connect(self.module)
facts = dict(device.facts)
if '2RE' in facts:

View file

@ -33,13 +33,6 @@ except ImportError:
from xml.etree.ElementTree import Element, SubElement, tostring as xml_to_string
HAS_LXML = False
try:
from jnpr.junos import Device
from jnpr.junos.exception import ConnectError
HAS_PYEZ = True
except ImportError:
HAS_PYEZ = False
ACTIONS = frozenset(['merge', 'override', 'replace', 'update', 'set'])
JSON_ACTIONS = frozenset(['merge', 'override', 'update'])
FORMATS = frozenset(['xml', 'text', 'json'])
@ -57,6 +50,16 @@ junos_provider_spec = {
junos_argument_spec = {
'provider': dict(type='dict', options=junos_provider_spec),
}
junos_top_spec = {
'host': dict(removed_in_version=2.9),
'port': dict(removed_in_version=2.9, type='int'),
'username': dict(removed_in_version=2.9),
'password': dict(removed_in_version=2.9, no_log=True),
'ssh_keyfile': dict(removed_in_version=2.9, type='path'),
'timeout': dict(removed_in_version=2.9, type='int'),
'transport': dict(removed_in_version=2.9)
}
junos_argument_spec.update(junos_top_spec)
def tostring(element, encoding='UTF-8'):
@ -98,33 +101,6 @@ def get_capabilities(module):
return module._junos_capabilities
def get_device(module):
provider = module.params.get("provider") or {}
host = provider.get('host')
kwargs = {
'port': provider.get('port') or 830,
'user': provider.get('username')
}
if 'password' in provider:
kwargs['passwd'] = provider.get('password')
if 'ssh_keyfile' in provider:
kwargs['ssh_private_key_file'] = provider.get('ssh_keyfile')
kwargs['gather_facts'] = False
try:
device = Device(host, **kwargs)
device.open()
device.timeout = provider.get('timeout') or 10
except ConnectError as exc:
module.fail_json('unable to connect to %s: %s' % (host, to_text(exc)))
return device
def is_netconf(module):
capabilities = get_capabilities(module)
return True if capabilities.get('network_api') == 'netconf' else False
@ -276,6 +252,16 @@ def load_config(module, candidate, warnings, action='merge', format='xml'):
return get_diff(module)
def get_param(module, key):
if module.params.get(key):
value = module.params[key]
elif module.params.get('provider'):
value = module.params['provider'].get(key)
else:
value = None
return value
def map_params_to_obj(module, param_to_xpath_map, param=None):
"""
Creates a new dictionary with key as xpath corresponding

View file

@ -83,15 +83,42 @@ nxos_provider_spec = {
nxos_argument_spec = {
'provider': dict(type='dict', options=nxos_provider_spec),
}
nxos_top_spec = {
'host': dict(type='str', removed_in_version=2.9),
'port': dict(type='int', removed_in_version=2.9),
'username': dict(type='str', removed_in_version=2.9),
'password': dict(type='str', no_log=True, removed_in_version=2.9),
'ssh_keyfile': dict(type='str', removed_in_version=2.9),
'authorize': dict(type='bool', fallback=(env_fallback, ['ANSIBLE_NET_AUTHORIZE'])),
'auth_pass': dict(type='str', no_log=True, removed_in_version=2.9),
'use_ssl': dict(type='bool', removed_in_version=2.9),
'validate_certs': dict(type='bool', removed_in_version=2.9),
'timeout': dict(type='int', removed_in_version=2.9),
'transport': dict(type='str', choices=['cli', 'nxapi'], removed_in_version=2.9)
}
nxos_argument_spec.update(nxos_top_spec)
def get_provider_argspec():
return nxos_provider_spec
def load_params(module):
provider = module.params.get('provider') or dict()
for key, value in iteritems(provider):
if key in nxos_provider_spec:
if module.params.get(key) is None and value is not None:
module.params[key] = value
def get_connection(module):
global _DEVICE_CONNECTION
if not _DEVICE_CONNECTION:
load_params(module)
if is_local_nxapi(module):
conn = LocalNxapi(module)
else:
@ -251,14 +278,13 @@ class LocalNxapi:
self._device_configs = {}
self._module_context = {}
provider = self._module.params.get("provider") or {}
self._module.params['url_username'] = provider.get('username')
self._module.params['url_password'] = provider.get('password')
self._module.params['url_username'] = self._module.params['username']
self._module.params['url_password'] = self._module.params['password']
host = provider.get('host')
port = provider.get('port')
host = self._module.params['host']
port = self._module.params['port']
if provider.get('use_ssl'):
if self._module.params['use_ssl']:
proto = 'https'
port = port or 443
else:
@ -1148,10 +1174,10 @@ def is_text(cmd):
def is_local_nxapi(module):
transport = module.params.get('transport')
provider = module.params.get('provider')
if provider:
return provider.get("transport") == 'nxapi'
return False
provider_transport = provider['transport'] if provider else None
return 'nxapi' in (transport, provider_transport)
def to_command(module, commands):

View file

@ -46,6 +46,17 @@ vyos_provider_spec = {
vyos_argument_spec = {
'provider': dict(type='dict', options=vyos_provider_spec),
}
vyos_top_spec = {
'host': dict(removed_in_version=2.9),
'port': dict(removed_in_version=2.9, type='int'),
'username': dict(removed_in_version=2.9),
'password': dict(removed_in_version=2.9, no_log=True),
'ssh_keyfile': dict(removed_in_version=2.9, type='path'),
'timeout': dict(removed_in_version=2.9, type='int'),
}
vyos_argument_spec.update(vyos_top_spec)
def get_provider_argspec():

View file

@ -89,7 +89,7 @@ session_name:
"""
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.eos.eos import load_config, run_commands
from ansible.module_utils.network.eos.eos import eos_argument_spec, is_local_eapi
from ansible.module_utils.network.eos.eos import eos_argument_spec
from ansible.module_utils.six import string_types
from ansible.module_utils._text import to_text
@ -129,7 +129,7 @@ def map_config_to_obj(module):
output = run_commands(module, ['show banner %s' % module.params['banner']])
obj = {'banner': module.params['banner'], 'state': 'absent'}
if output:
if is_local_eapi(module):
if module.params['transport'] == 'eapi':
# On EAPI we need to extract the banner text from dict key
# 'loginBanner'
if module.params['banner'] == 'login':

View file

@ -101,12 +101,6 @@ options:
type: bool
default: 'no'
aliases: ['enable_socket']
timeout:
description:
- The time (in seconds) to wait for the eAPI configuration to be
reflected in the running-config.
type: int
default: 30
vrf:
description:
- The C(vrf) argument will configure eAPI to listen for connections
@ -184,9 +178,10 @@ from ansible.module_utils.network.eos.eos import eos_argument_spec
def check_transport(module):
transport = (module.params['provider'] or {}).get('transport')
transport = module.params['transport']
provider_transport = (module.params['provider'] or {}).get('transport')
if transport == 'eapi':
if 'eapi' in (transport, provider_transport):
module.fail_json(msg='eos_eapi module is only supported over cli transport')
@ -339,7 +334,7 @@ def verify_state(updates, module):
('local_http', 'localHttpServer'),
('socket', 'unixSocketServer')]
timeout = module.params["timeout"]
timeout = module.params['timeout'] or 30
state = module.params['state']
while invalid_state:
@ -386,7 +381,6 @@ def main():
local_http_port=dict(type='int'),
socket=dict(aliases=['enable_socket'], type='bool'),
timeout=dict(type="int", default=30),
vrf=dict(default='default'),

View file

@ -361,6 +361,11 @@ def main():
supports_check_mode=True)
warnings = list()
if module.params['password'] and not module.params['configured_password']:
warnings.append(
'The "password" argument is used to authenticate the current connection. ' +
'To set a user password use "configured_password" instead.'
)
result = {'changed': False}
if warnings:

View file

@ -505,7 +505,15 @@ def main():
supports_check_mode=True)
warnings = list()
result = {'changed': False, 'warnings': warnings}
if module.params['password'] and not module.params['configured_password']:
warnings.append(
'The "password" argument is used to authenticate the current connection. ' +
'To set a user password use "configured_password" instead.'
)
result = {'changed': False}
if warnings:
result['warnings'] = warnings
want = map_params_to_obj(module)
have = map_config_to_obj(module)

View file

@ -251,18 +251,12 @@ class PublicKeyManager(object):
def copy_key_to_node(self, base64keyfile):
""" Copy key to IOS-XR node. We use SFTP because older IOS-XR versions don't handle SCP very well.
"""
provider = self._module.params.get("provider") or {}
node = provider.get('host')
if node is None:
if (self._module.params['host'] is None or self._module.params['provider']['host'] is None):
return False
user = provider.get('username')
if user is None:
if (self._module.params['username'] is None or self._module.params['provider']['username'] is None):
return False
password = provider.get('password')
ssh_keyfile = provider.get('ssh_keyfile')
if self._module.params['aggregate']:
name = 'aggregate'
else:
@ -271,6 +265,11 @@ class PublicKeyManager(object):
src = base64keyfile
dst = '/harddisk:/publickey_%s.b64' % (name)
user = self._module.params['username'] or self._module.params['provider']['username']
node = self._module.params['host'] or self._module.params['provider']['host']
password = self._module.params['password'] or self._module.params['provider']['password']
ssh_keyfile = self._module.params['ssh_keyfile'] or self._module.params['provider']['ssh_keyfile']
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if not ssh_keyfile:
@ -285,17 +284,16 @@ class PublicKeyManager(object):
def addremovekey(self, command):
""" Add or remove key based on command
"""
provider = self._module.params.get("provider") or {}
node = provider.get('host')
if node is None:
if (self._module.params['host'] is None or self._module.params['provider']['host'] is None):
return False
user = provider.get('username')
if user is None:
if (self._module.params['username'] is None or self._module.params['provider']['username'] is None):
return False
password = provider.get('password')
ssh_keyfile = provider.get('ssh_keyfile')
user = self._module.params['username'] or self._module.params['provider']['username']
node = self._module.params['host'] or self._module.params['provider']['host']
password = self._module.params['password'] or self._module.params['provider']['password']
ssh_keyfile = self._module.params['ssh_keyfile'] or self._module.params['provider']['ssh_keyfile']
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
@ -697,6 +695,11 @@ def main():
)
result = {'changed': False, 'warnings': []}
if module.params['password'] and not module.params['configured_password']:
result['warnings'].append(
'The "password" argument is used to authenticate the current connection. ' +
'To set a user password use "configured_password" instead.'
)
config_object = None
if is_cliconf(module):

View file

@ -114,15 +114,44 @@ EXAMPLES = """
reboot: no
"""
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.junos.junos import junos_argument_spec, get_device
from ansible.module_utils.network.junos.junos import junos_argument_spec, get_param
from ansible.module_utils._text import to_native
try:
from jnpr.junos import Device
from jnpr.junos.utils.sw import SW
from jnpr.junos.exception import ConnectError
HAS_PYEZ = True
except ImportError:
HAS_PYEZ = False
def connect(module):
host = get_param(module, 'host')
kwargs = {
'port': get_param(module, 'port') or 830,
'user': get_param(module, 'username')
}
if get_param(module, 'password'):
kwargs['passwd'] = get_param(module, 'password')
if get_param(module, 'ssh_keyfile'):
kwargs['ssh_private_key_file'] = get_param(module, 'ssh_keyfile')
kwargs['gather_facts'] = False
try:
device = Device(host, **kwargs)
device.open()
device.timeout = get_param(module, 'timeout') or 10
except ConnectError as exc:
module.fail_json(msg='unable to connect to %s: %s' % (host, to_native(exc)))
return device
def install_package(module, device):
junos = SW(device)
package = module.params['src']
@ -179,7 +208,7 @@ def main():
do_upgrade = module.params['force'] or False
device = get_device(module)
device = connect(module)
if not module.params['force']:
device.facts_refresh()

View file

@ -82,16 +82,44 @@ changed:
type: bool
"""
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.junos.junos import junos_argument_spec, get_device
from ansible.module_utils.network.junos.junos import junos_argument_spec, get_param
from ansible.module_utils._text import to_native
try:
from jnpr.junos import Device
from jnpr.junos.utils.scp import SCP
from jnpr.junos.exception import ConnectError
HAS_PYEZ = True
except ImportError:
HAS_PYEZ = False
def connect(module):
host = get_param(module, 'host')
kwargs = {
'port': get_param(module, 'port') or 830,
'user': get_param(module, 'username')
}
if get_param(module, 'password'):
kwargs['passwd'] = get_param(module, 'password')
if get_param(module, 'ssh_keyfile'):
kwargs['ssh_private_key_file'] = get_param(module, 'ssh_keyfile')
kwargs['gather_facts'] = False
try:
device = Device(host, **kwargs)
device.open()
device.timeout = get_param(module, 'timeout') or 10
except ConnectError as exc:
module.fail_json('unable to connect to %s: %s' % (host, to_native(exc)))
return device
def transfer_files(module, device):
dest = module.params['dest']
recursive = module.params['recursive']
@ -134,7 +162,7 @@ def main():
if not module.check_mode:
# open pyez connection and transfer files via SCP
try:
device = get_device(module)
device = connect(module)
transfer_files(module, device)
except Exception as ex:
module.fail_json(

View file

@ -76,6 +76,7 @@ EXAMPLES = r'''
priority: 150
interface: vlan10
preempt: enabled
host: 68.170.147.165
- name: Ensure HSRP is configured with following params on a SVI
with clear text authentication
@ -85,6 +86,7 @@ EXAMPLES = r'''
priority: 150
interface: vlan10
preempt: enabled
host: 68.170.147.165
auth_type: text
auth_string: CISCO
@ -96,6 +98,7 @@ EXAMPLES = r'''
priority: 150
interface: vlan10
preempt: enabled
host: 68.170.147.165
auth_type: md5
auth_string: "0 1234"
@ -107,6 +110,7 @@ EXAMPLES = r'''
priority: 150
interface: vlan10
preempt: enabled
host: 68.170.147.165
auth_type: md5
auth_string: "7 1234"
@ -115,6 +119,7 @@ EXAMPLES = r'''
group: 10
interface: vlan10
vip: 10.1.1.1
host: 68.170.147.165
state: absent
'''

View file

@ -306,7 +306,15 @@ def main():
supports_check_mode=True)
warnings = list()
result = {'changed': False, 'warnings': warnings}
if module.params['password'] and not module.params['configured_password']:
warnings.append(
'The "password" argument is used to authenticate the current connection. ' +
'To set a user password use "configured_password" instead.'
)
result = {'changed': False}
if warnings:
result['warnings'] = warnings
want = map_params_to_obj(module)
have = config_to_dict(module)

View file

@ -9,6 +9,32 @@ class ModuleDocFragment(object):
# Standard files documentation fragment
DOCUMENTATION = r'''
options:
authorize:
description:
- B(Deprecated)
- "Starting with Ansible 2.5 we recommend using C(connection: network_cli) and C(become: yes)."
- This option is only required if you are using eAPI.
- For more information please see the L(EOS Platform Options guide, ../network/user_guide/platform_eos.html).
- HORIZONTALLINE
- Instructs the module to enter privileged mode on the remote device
before sending any commands. If not specified, the device will
attempt to execute all commands in non-privileged mode. If the value
is not specified in the task, the value of environment variable
C(ANSIBLE_NET_AUTHORIZE) will be used instead.
type: bool
default: no
auth_pass:
description:
- B(Deprecated)
- "Starting with Ansible 2.5 we recommend using C(connection: network_cli) and C(become: yes) with C(become_pass)."
- This option is only required if you are using eAPI.
- For more information please see the L(EOS Platform Options guide, ../network/user_guide/platform_eos.html).
- HORIZONTALLINE
- Specifies the password to use if required to enter privileged mode
on the remote device. If I(authorize) is false, then this argument
does nothing. If the value is not specified in the task, the value of
environment variable C(ANSIBLE_NET_AUTH_PASS) will be used instead.
type: str
provider:
description:
- B(Deprecated)

View file

@ -9,6 +9,30 @@ class ModuleDocFragment(object):
# Standard files documentation fragment
DOCUMENTATION = r'''
options:
authorize:
description:
- B(Deprecated)
- "Starting with Ansible 2.5 we recommend using C(connection: network_cli) and C(become: yes)."
- For more information please see the L(IOS Platform Options guide, ../network/user_guide/platform_ios.html).
- HORIZONTALLINE
- Instructs the module to enter privileged mode on the remote device
before sending any commands. If not specified, the device will
attempt to execute all commands in non-privileged mode. If the value
is not specified in the task, the value of environment variable
C(ANSIBLE_NET_AUTHORIZE) will be used instead.
type: bool
default: no
auth_pass:
description:
- B(Deprecated)
- "Starting with Ansible 2.5 we recommend using C(connection: network_cli) and C(become: yes) with C(become_pass)."
- For more information please see the L(IOS Platform Options guide, ../network/user_guide/platform_ios.html).
- HORIZONTALLINE
- Specifies the password to use if required to enter privileged mode
on the remote device. If I(authorize) is false, then this argument
does nothing. If the value is not specified in the task, the value of
environment variable C(ANSIBLE_NET_AUTH_PASS) will be used instead.
type: str
provider:
description:
- B(Deprecated)

View file

@ -12,6 +12,7 @@
state: up
tx_rate: ge(0)
rx_rate: ge(0)
authorize: yes
become: yes
register: result

View file

@ -17,6 +17,7 @@
state: up
tx_rate: ge(0)
rx_rate: ge(0)
authorize: yes
become: yes
register: result

View file

@ -6,6 +6,7 @@
lines:
- no interface port-channel 20
- no interface port-channel 100
authorize: yes
provider: "{{ cli }}"
become: yes
@ -13,6 +14,7 @@
eos_config:
lines:
- no channel-group 20
authorize: yes
provider: "{{ cli }}"
parents: "{{ item }}"
loop:
@ -24,6 +26,7 @@
eos_linkagg: &create
group: 20
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -49,6 +52,7 @@
members:
- Ethernet1
- Ethernet2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -76,6 +80,7 @@
mode: active
members:
- Ethernet2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -99,6 +104,7 @@
eos_linkagg: &remove
group: 20
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -122,6 +128,7 @@
aggregate:
- { group: 20, min_links: 3 }
- { group: 100, min_links: 4 }
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -148,6 +155,7 @@
aggregate:
- { group: 20, min_links: 3 }
- { group: 100, min_links: 4 }
authorize: yes
provider: "{{ cli }}"
state: absent
become: yes
@ -173,6 +181,7 @@
lines:
- no interface port-channel 20
- no interface port-channel 100
authorize: yes
provider: "{{ cli }}"
become: yes
@ -180,6 +189,7 @@
eos_config:
lines:
- no channel-group 20
authorize: yes
provider: "{{ cli }}"
parents: "{{ item }}"
become: yes

View file

@ -14,11 +14,9 @@
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: network_cli
- name: run test cases (connection=local)
include: "{{ test_case_to_run }} ansible_connection=local ansible_become=no"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: local

View file

@ -3,8 +3,8 @@
find:
paths: "{{ role_path }}/tests/eapi"
patterns: "{{ testcase }}.yaml"
register: test_cases
delegate_to: localhost
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
@ -14,11 +14,9 @@
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: httpapi
- name: run test cases (connection=local)
- name: run test case (connection=local)
include: "{{ test_case_to_run }} ansible_connection=local"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run
tags: local

View file

@ -10,6 +10,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes
@ -18,6 +19,7 @@
address: 192.168.3.0/24
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -32,6 +34,7 @@
address: 192.168.3.0/250
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -45,6 +48,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes
@ -61,6 +65,7 @@
state: up
tx_rate: ge(0)
rx_rate: ge(0)
authorize: yes
provider: "{{ cli }}"
become: yes
register: result

View file

@ -10,6 +10,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ eapi }}"
become: yes
@ -18,6 +19,7 @@
address: 192.168.3.0/24
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ eapi }}"
become: yes
register: result
@ -32,6 +34,7 @@
address: 192.168.3.0/250
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ eapi }}"
become: yes
register: result
@ -45,6 +48,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ eapi }}"
become: yes
@ -61,6 +65,7 @@
state: up
tx_rate: ge(0)
rx_rate: ge(0)
authorize: yes
provider: "{{ eapi }}"
become: yes
register: result

View file

@ -7,6 +7,7 @@
- no ip route 192.168.3.0/24 192.168.0.1
- no ip route 192.168.4.0/24 192.168.0.1
- no ip route 192.168.5.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes
@ -15,6 +16,7 @@
address: 192.168.3.0/24
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -38,6 +40,7 @@
address: 192.168.3.0/24
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ cli }}"
state: absent
become: yes
@ -62,6 +65,7 @@
aggregate:
- { address: 192.168.4.0/24, next_hop: 192.168.0.1 }
- { address: 192.168.5.0/24, next_hop: 192.168.0.1 }
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -86,6 +90,7 @@
aggregate:
- { address: 192.168.4.0/24, next_hop: 192.168.0.1 }
- { address: 192.168.5.0/24, next_hop: 192.168.0.1 }
authorize: yes
state: absent
provider: "{{ cli }}"
become: yes
@ -112,6 +117,7 @@
- no ip route 192.168.3.0/24 192.168.0.1
- no ip route 192.168.4.0/24 192.168.0.1
- no ip route 192.168.5.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes

View file

@ -8,6 +8,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes
@ -16,6 +17,7 @@
address: 192.168.3.0/24
next_hop: 192.168.0.1
admin_distance: 2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -29,6 +31,7 @@
eos_config:
lines:
- no ip route 192.168.3.0/24 192.168.0.1
authorize: yes
provider: "{{ cli }}"
become: yes

View file

@ -6,6 +6,7 @@
privilege: 15
role: network-operator
state: present
authorize: yes
provider: "{{ cli }}"
configured_password: pass123
become: yes
@ -35,5 +36,6 @@
name: auth_user
state: absent
provider: "{{ cli }}"
authorize: yes
become: yes
register: result

View file

@ -18,6 +18,7 @@
role: network-operator
state: present
configured_password: test1
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -36,6 +37,7 @@
privilege: 15
state: present
configured_password: test1
authorize: yes
update_password: on_create
provider: "{{ cli }}"
become: yes
@ -53,6 +55,7 @@
aggregate:
- { name: ansibletest2, configured_password: test2 }
- { name: ansibletest3, configured_password: test3 }
authorize: yes
state: present
role: network-operator
provider: "{{ cli }}"
@ -74,6 +77,7 @@
name: faileduser1
privilege: 15
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
ignore_errors: yes
@ -93,4 +97,5 @@
- no username ansibletest3
- no username ansibletest4
provider: "{{ cli }}"
authorize: yes
become: yes

View file

@ -18,6 +18,7 @@
role: network-operator
state: present
configured_password: test1
authorize: yes
provider: "{{ cli }}"
become: yes
register: result

View file

@ -6,6 +6,7 @@
- no vlan 4000
- no vlan 4001
- no vlan 4002
authorize: yes
provider: "{{ cli }}"
become: yes
@ -15,6 +16,7 @@
- switchport
- no switchport access vlan 4000
parents: interface Ethernet1
authorize: yes
provider: "{{ cli }}"
become: yes
@ -24,6 +26,7 @@
- switchport
- no switchport access vlan 4000
parents: interface Ethernet2
authorize: yes
provider: "{{ cli }}"
become: yes
@ -32,6 +35,7 @@
vlan_id: 4000
name: vlan-4000
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -49,6 +53,7 @@
vlan_id: 4000
name: vlan-4000
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -65,6 +70,7 @@
vlan_id: 4000
name: vlan-4000-new
state: suspend
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -83,6 +89,7 @@
vlan_id: 4000
name: vlan-4000-new
state: suspend
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -98,6 +105,7 @@
eos_vlan:
vlan_id: 4000
state: active
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -120,6 +128,7 @@
associated_interfaces:
- Ethernet1
- Ethernet2
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -142,6 +151,7 @@
interfaces:
- Ethernet 1 # interface name space scenario
- Ethernet 2 # interface name space scenario
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -159,6 +169,7 @@
state: present
associated_interfaces:
- test
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -174,6 +185,7 @@
state: present
interfaces:
- Ethernet1
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -193,6 +205,7 @@
state: present
interfaces:
- Ethernet 1 # space scenario
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -210,6 +223,7 @@
- {vlan_id: 4000, state: absent}
- {vlan_id: 4001, name: vlan-4001}
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -229,6 +243,7 @@
- {vlan_id: 4000, state: absent}
- {vlan_id: 4001, name: vlan-4001}
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -247,6 +262,7 @@
name: vlan-4002
state: present
purge: yes
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -267,6 +283,7 @@
name: vlan-4002
state: present
purge: yes
authorize: yes
provider: "{{ cli }}"
become: yes
register: result

View file

@ -8,6 +8,7 @@
eos_config:
lines:
- no vlan 4000
authorize: yes
provider: "{{ cli }}"
become: yes
@ -16,6 +17,7 @@
vlan_id: 4000
name: vlan-4000
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -32,6 +34,7 @@
eos_config:
lines:
- no vlan 4000
authorize: yes
provider: "{{ cli }}"
become: yes

View file

@ -4,6 +4,7 @@
eos_vrf:
name: "{{ item }}"
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
with_items:
@ -19,6 +20,7 @@
name: test
rd: 1:200
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -36,6 +38,7 @@
name: test
rd: 1:200
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -52,6 +55,7 @@
name: test
rd: 1:201
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -69,6 +73,7 @@
name: test
rd: 1:201
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -85,6 +90,7 @@
name: test
rd: 1:201
state: present
authorize: yes
interfaces:
- Ethernet2
associated_interfaces:
@ -106,6 +112,7 @@
name: test
rd: 1:201
state: present
authorize: yes
interfaces:
- ethernet 2 # interface name modified to test case insensitive and space scenario
provider: "{{ cli }}"
@ -123,6 +130,7 @@
eos_vrf:
name: test
state: present
authorize: yes
associated_interfaces:
- test
provider: "{{ cli }}"
@ -139,6 +147,7 @@
name: test1
rd: 1:202
state: present
authorize: yes
interfaces:
- loopback10
- loopback11
@ -175,6 +184,7 @@
name: test1
rd: 1:202
state: present
authorize: yes
interfaces:
- loopback10
- loopback11
@ -196,6 +206,7 @@
eos_vrf:
name: "{{ item }}"
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
with_items:
@ -209,6 +220,7 @@
- { name: test2, rd: "1:202" }
- { name: test3, rd: "1:203" }
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -229,6 +241,7 @@
- { name: test2, rd: "1:202" }
- { name: test3, rd: "1:203" }
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -247,6 +260,7 @@
- { name: test5, rd: "1:205" }
state: present
purge: yes
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -268,6 +282,7 @@
eos_vrf:
name: test
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
@ -275,6 +290,7 @@
eos_vrf:
name: test
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
@ -287,6 +303,7 @@
- { name: test4 }
- { name: test5 }
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
@ -299,6 +316,7 @@
- { name: test4 }
- { name: test5 }
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes

View file

@ -8,6 +8,7 @@
net_vrf:
name: test
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes
@ -16,6 +17,7 @@
name: test
rd: 1:200
state: present
authorize: yes
provider: "{{ cli }}"
become: yes
register: result
@ -32,6 +34,7 @@
net_vrf:
name: test
state: absent
authorize: yes
provider: "{{ cli }}"
become: yes

View file

@ -31,6 +31,7 @@
- name: unexpected unsuccessful ping
ios_ping: &invalid_ip
dest: '10.255.255.250'
timeout: 45
provider: "{{ cli }}"
register: uup
ignore_errors: yes

View file

@ -22,9 +22,6 @@ from ansible.modules.network.eos import eos_banner
from units.modules.utils import set_module_args
from .eos_module import TestEosModule, load_fixture
CLI = dict(transport="cli")
EAPI = dict(transport="eapi")
class TestEosBannerModule(TestEosModule):
@ -54,32 +51,34 @@ class TestEosBannerModule(TestEosModule):
self.load_config.return_value = dict(diff=None, session='session')
def test_eos_banner_create_with_cli_transport(self):
set_module_args(dict(banner='login', text='test\nbanner\nstring', provider=CLI))
set_module_args(dict(banner='login', text='test\nbanner\nstring',
transport='cli'))
commands = ['banner login', 'test', 'banner', 'string', 'EOF']
self.execute_module(changed=True, commands=commands)
def test_eos_banner_remove_with_cli_transport(self):
set_module_args(dict(banner='login', state='absent', provider=CLI))
set_module_args(dict(banner='login', state='absent', transport='cli'))
commands = ['no banner login']
self.execute_module(changed=True, commands=commands)
def test_eos_banner_create_with_eapi_transport(self):
set_module_args(dict(banner='login', text='test\nbanner\nstring', provider=EAPI))
set_module_args(dict(banner='login', text='test\nbanner\nstring',
transport='eapi'))
commands = ['banner login']
inputs = ['test\nbanner\nstring']
self.execute_module(changed=True, commands=commands, inputs=inputs, transport='eapi')
def test_eos_banner_remove_with_eapi_transport(self):
set_module_args(dict(banner='login', state='absent', provider=EAPI))
set_module_args(dict(banner='login', state='absent', transport='eapi'))
commands = ['no banner login']
self.execute_module(changed=True, commands=commands, transport='eapi')
def test_eos_banner_nochange_with_cli_transport(self):
banner_text = load_fixture('eos_banner_show_banner.txt').strip()
set_module_args(dict(banner='login', text=banner_text, provider=CLI))
set_module_args(dict(banner='login', text=banner_text, transport='cli'))
self.execute_module()
def test_eos_banner_nochange_with_eapi_transport(self):
banner_text = load_fixture('eos_banner_show_banner.txt').strip()
set_module_args(dict(banner='login', text=banner_text, provider=EAPI))
set_module_args(dict(banner='login', text=banner_text, transport='eapi'))
self.execute_module(transport='eapi')

View file

@ -59,7 +59,7 @@ class TestIosPingModule(TestIosModule):
def test_ios_ping_expected_failure(self):
''' Test for unsuccessful pings when destination should not be reachable '''
set_module_args(dict(count=2, dest="10.255.255.250", state="absent"))
set_module_args(dict(count=2, dest="10.255.255.250", state="absent", timeout=45))
self.execute_module()
def test_ios_ping_unexpected_success(self):
@ -69,5 +69,5 @@ class TestIosPingModule(TestIosModule):
def test_ios_ping_unexpected_failure(self):
''' Test for unsuccessful pings when destination should be reachable - FAIL. '''
set_module_args(dict(count=2, dest="10.255.255.250"))
set_module_args(dict(count=2, dest="10.255.255.250", timeout=45))
self.execute_module(failed=True)

View file

@ -37,10 +37,16 @@ module_patcher.start()
from ansible.modules.network.junos import junos_package
class TestJunosPackageModule(TestJunosModule):
class TestJunosCommandModule(TestJunosModule):
module = junos_package
def setUp(self):
super(TestJunosCommandModule, self).setUp()
def tearDown(self):
super(TestJunosCommandModule, self).tearDown()
def test_junos_package_src(self):
set_module_args(dict(src='junos-vsrx-12.1X46-D10.2-domestic.tgz'))
result = self.execute_module(changed=True)

View file

@ -55,7 +55,7 @@ class TestNxosHsrpModule(TestNxosModule):
priority='150',
interface='Ethernet1/2',
preempt='enabled',
))
host='192.0.2.1'))
result = self.execute_module(changed=True)
self.assertEqual(sorted(result['commands']), sorted(['config t',
'interface ethernet1/2',