From e1a2c6e1d397ea742ad0f263a475754ef91cdf7e Mon Sep 17 00:00:00 2001 From: Peter Sprygada Date: Tue, 14 Feb 2017 13:47:29 -0500 Subject: [PATCH] roll up of fixes for eos modules (#21406) * fixes issue with load_provider() not checking for an existing key * adds updates to eos_config results key * lots of minor syntax fixes in eos shared module * adds eos_argument_spec to eos_eapi fixes #21402 --- lib/ansible/module_utils/eos.py | 15 ++++++++------- lib/ansible/modules/network/eos/eos_command.py | 8 +++++++- lib/ansible/modules/network/eos/eos_config.py | 1 + lib/ansible/modules/network/eos/eos_eapi.py | 11 +++++++---- lib/ansible/modules/network/eos/eos_system.py | 3 +++ lib/ansible/plugins/action/eos.py | 15 +++++++-------- test/units/modules/network/eos/test_eos_eapi.py | 6 +++--- 7 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/ansible/module_utils/eos.py b/lib/ansible/module_utils/eos.py index 6f95780c491..f283fe4cbbc 100644 --- a/lib/ansible/module_utils/eos.py +++ b/lib/ansible/module_utils/eos.py @@ -27,6 +27,7 @@ # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # +import os import re import time @@ -166,7 +167,7 @@ class Cli: def configure(self, commands): """Sends configuration commands to the remote device """ - if not check_authorization(self): + if not self.check_authorization(): self._module.fail_json(msg='configuration operations require privilege escalation') conn = get_connection(self) @@ -175,7 +176,7 @@ class Cli: if rc != 0: self._module.fail_json(msg='unable to enter configuration mode', output=err) - rc, out, err = send_config(self, commands) + rc, out, err = self.send_config(commands) if rc != 0: self._module.fail_json(msg=err) @@ -185,7 +186,7 @@ class Cli: def load_config(self, commands, commit=False, replace=False): """Loads the config commands onto the remote device """ - if not check_authorization(self): + if not self.check_authorization(): self._module.fail_json(msg='configuration operations require privilege escalation') use_session = os.getenv('ANSIBLE_EOS_USE_SESSIONS', True) @@ -194,7 +195,7 @@ class Cli: except ValueError: pass - if not all((bool(use_session), supports_sessions(self))): + if not all((bool(use_session), self.supports_sessions())): return configure(self, commands) conn = get_connection(self) @@ -208,10 +209,10 @@ class Cli: if replace: self.exec_command('rollback clean-config', check_rc=True) - rc, out, err = send_config(self, commands) + rc, out, err = self.send_config(commands) if rc != 0: self.exec_command('abort') - conn.fail_json(msg=err, commands=commands) + self._module.fail_json(msg=err, commands=commands) rc, out, err = self.exec_command('show session-config diffs') if rc == 0: @@ -230,7 +231,7 @@ class Eapi: self._module = module self._enable = None self._session_support = None - self._device_config = {} + self._device_configs = {} host = module.params['host'] port = module.params['port'] diff --git a/lib/ansible/modules/network/eos/eos_command.py b/lib/ansible/modules/network/eos/eos_command.py index b79f7cfa7ad..11b0f59edad 100644 --- a/lib/ansible/modules/network/eos/eos_command.py +++ b/lib/ansible/modules/network/eos/eos_command.py @@ -125,6 +125,7 @@ failed_conditions: import time from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.pycompat24 import get_exception from ansible.module_utils.six import string_types from ansible.module_utils.netcli import Conditional from ansible.module_utils.network_common import ComplexList @@ -193,7 +194,12 @@ def main(): result['warnings'] = warnings wait_for = module.params['wait_for'] or list() - conditionals = [Conditional(c) for c in wait_for] + + try: + conditionals = [Conditional(c) for c in wait_for] + except AttributeError: + exc = get_exception() + module.fail_json(msg=str(exc)) retries = module.params['retries'] interval = module.params['interval'] diff --git a/lib/ansible/modules/network/eos/eos_config.py b/lib/ansible/modules/network/eos/eos_config.py index 3979452a527..33cd3b43735 100644 --- a/lib/ansible/modules/network/eos/eos_config.py +++ b/lib/ansible/modules/network/eos/eos_config.py @@ -250,6 +250,7 @@ def run(module, result): commands.extend(module.params['after']) result['commands'] = commands + result['updates'] = commands replace = module.params['replace'] == 'config' commit = not module.check_mode diff --git a/lib/ansible/modules/network/eos/eos_eapi.py b/lib/ansible/modules/network/eos/eos_eapi.py index 8b2a9bb55ee..33e1818b7b0 100644 --- a/lib/ansible/modules/network/eos/eos_eapi.py +++ b/lib/ansible/modules/network/eos/eos_eapi.py @@ -184,6 +184,7 @@ import re from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.eos import run_commands, load_config from ansible.module_utils.six import iteritems +from ansible.module_utils.eos import eos_argument_spec, check_args def validate_http_port(value, module): if not 1 <= value <= 65535: @@ -198,8 +199,8 @@ def validate_local_http_port(value, module): module.fail_json(msg='http_port must be between 1 and 65535') def validate_vrf(value, module): - rc, out, err = run_commands(module, ['show vrf']) - configured_vrfs = re.findall('^\s+(\w+)(?=\s)', out[0],re.M) + out = run_commands(module, ['show vrf']) + configured_vrfs = re.findall('^\s+(\w+)(?=\s)', out[0], re.M) configured_vrfs.append('default') if value not in configured_vrfs: module.fail_json(msg='vrf `%s` is not configured on the system' % value) @@ -255,7 +256,7 @@ def parse_state(data): def map_config_to_obj(module): - rc, out, err = run_commands(module, ['show management api http-commands | json']) + out = run_commands(module, ['show management api http-commands | json']) return { 'http': out[0]['httpServer']['configured'], 'http_port': out[0]['httpServer']['port'], @@ -290,7 +291,7 @@ def map_params_to_obj(module): return obj def collect_facts(module, result): - rc, out, err = run_commands(module, ['show management api http-commands | json']) + out = run_commands(module, ['show management api http-commands | json']) facts = dict(eos_eapi_urls=dict()) for each in out[0]['urls']: intf, url = each.split(' : ') @@ -320,6 +321,8 @@ def main(): state=dict(default='started', choices=['stopped', 'started']), ) + argument_spec.update(eos_argument_spec) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/lib/ansible/modules/network/eos/eos_system.py b/lib/ansible/modules/network/eos/eos_system.py index 06b3bcf164e..ae83ef0fbc5 100644 --- a/lib/ansible/modules/network/eos/eos_system.py +++ b/lib/ansible/modules/network/eos/eos_system.py @@ -143,6 +143,7 @@ import re from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.network_common import ComplexList from ansible.module_utils.eos import load_config, get_config +from ansible.module_utils.eos import eos_argument_spec _CONFIGURED_VRFS = None @@ -304,6 +305,8 @@ def main(): state=dict(default='present', choices=['present', 'absent']) ) + argument_spec.update(eos_argument_spec) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/lib/ansible/plugins/action/eos.py b/lib/ansible/plugins/action/eos.py index fe21b5d20ce..896e53a6556 100644 --- a/lib/ansible/plugins/action/eos.py +++ b/lib/ansible/plugins/action/eos.py @@ -85,14 +85,13 @@ class ActionModule(_ActionModule): def load_provider(self): provider = self._task.args.get('provider', {}) for key, value in iteritems(eos_argument_spec): - if key == 'provider': - continue - elif key in self._task.args: - provider[key] = self._task.args[key] - elif 'fallback' in value: - provider[key] = self._fallback(value['fallback']) - elif key not in provider: - provider[key] = None + if key != 'provider' and key not in provider: + if key in self._task.args: + provider[key] = self._task.args[key] + elif 'fallback' in value: + provider[key] = self._fallback(value['fallback']) + elif key not in provider: + provider[key] = None return provider def _fallback(self, fallback): diff --git a/test/units/modules/network/eos/test_eos_eapi.py b/test/units/modules/network/eos/test_eos_eapi.py index 9baa235da41..c5b659171aa 100644 --- a/test/units/modules/network/eos/test_eos_eapi.py +++ b/test/units/modules/network/eos/test_eos_eapi.py @@ -50,7 +50,7 @@ class TestEosEapiModule(TestEosModule): output = list() for cmd in commands: output.append(load_fixture(self.command_fixtures[cmd])) - return (0, output, '') + return output self.run_commands.side_effect = run_commands self.load_config.return_value = dict(diff=None, session='session') @@ -86,9 +86,9 @@ class TestEosEapiModule(TestEosModule): self.start_configured(changed=True, commands=commands) def test_eos_eapi_http_invalid(self): - set_module_args(dict(port=80000)) + set_module_args(dict(http_port=80000)) commands = [] - self.start_unconfigured(failed=True) + self.start_unconfigured(failed=True, commands=commands) def test_eos_eapi_https_enable(self): set_module_args(dict(https=True))