From e5b3f60a7400dfd7de6d38724a0de5e3882f87f3 Mon Sep 17 00:00:00 2001 From: Anil Kumar Muraleedharan Date: Wed, 15 Nov 2017 02:30:16 +0530 Subject: [PATCH] Enos connection issue (#32895) * Changes due to connection issues * Adding changes pertaining to connection issue of Ansible * Review comments of Kedar * Adding EOL PyLint issue * Fixing pep8 and yamlint issues --- lib/ansible/module_utils/enos.py | 10 +++- .../modules/network/enos/enos_facts.py | 4 +- lib/ansible/plugins/action/enos.py | 60 +++++++------------ 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/lib/ansible/module_utils/enos.py b/lib/ansible/module_utils/enos.py index 246b5e6fdd..b432589c55 100644 --- a/lib/ansible/module_utils/enos.py +++ b/lib/ansible/module_utils/enos.py @@ -35,6 +35,7 @@ from ansible.module_utils._text import to_text from ansible.module_utils.basic import env_fallback, return_values from ansible.module_utils.network_common import to_list, EntityCollection from ansible.module_utils.connection import Connection, exec_command +from ansible.module_utils.connection import ConnectionError _DEVICE_CONFIGS = {} _CONNECTION = None @@ -75,7 +76,7 @@ def get_connection(module): global _CONNECTION if _CONNECTION: return _CONNECTION - _CONNECTION = Connection(module) + _CONNECTION = Connection(module._socket_path) context = None try: @@ -144,8 +145,11 @@ def run_commands(module, commands, check_rc=True): def load_config(module, config): - conn = get_connection(module) - conn.edit_config(config) + try: + conn = get_connection(module) + conn.edit_config(config) + except ConnectionError as exc: + module.fail_json(msg=to_text(exc)) def get_defaults_flag(module): diff --git a/lib/ansible/modules/network/enos/enos_facts.py b/lib/ansible/modules/network/enos/enos_facts.py index bac97f52b9..27b4d6e60d 100644 --- a/lib/ansible/modules/network/enos/enos_facts.py +++ b/lib/ansible/modules/network/enos/enos_facts.py @@ -235,7 +235,9 @@ class Hardware(FactsBase): def populate(self): super(Hardware, self).populate() - data = self.responses[0] + data = self.run(['show system memory']) + data = to_text(data, errors='surrogate_or_strict').strip() + data = data.replace(r"\n", "\n") if data: self.facts['memtotal_mb'] = self.parse_memtotal(data) self.facts['memfree_mb'] = self.parse_memfree(data) diff --git a/lib/ansible/plugins/action/enos.py b/lib/ansible/plugins/action/enos.py index 35f28b9039..f0c9c4bdef 100644 --- a/lib/ansible/plugins/action/enos.py +++ b/lib/ansible/plugins/action/enos.py @@ -53,45 +53,31 @@ except ImportError: class ActionModule(_ActionModule): def run(self, tmp=None, task_vars=None): + if self._play_context.connection == 'local': + provider = load_provider(enos_provider_spec, self._task.args) + pc = copy.deepcopy(self._play_context) + pc.connection = 'network_cli' + pc.network_os = 'enos' + pc.remote_addr = provider['host'] or self._play_context.remote_addr + pc.port = provider['port'] or self._play_context.port or 22 + pc.remote_user = provider['username'] or self._play_context.connection_user + pc.password = provider['password'] or self._play_context.password + pc.private_key_file = provider['ssh_keyfile'] or self._play_context.private_key_file + pc.timeout = int(provider['timeout'] or C.PERSISTENT_COMMAND_TIMEOUT) + pc.become = provider['authorize'] or True + pc.become_pass = provider['auth_pass'] + pc.become_method = 'enable' - if self._play_context.connection != 'local': - return dict( - failed=True, - msg='invalid connection specified, expected connection=local, ' - 'got %s' % self._play_context.connection - ) - provider = load_provider(enos_provider_spec, self._task.args) + display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) + connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) + socket_path = connection.run() + display.vvvv('socket_path: %s' % socket_path, pc.remote_addr) + if not socket_path: + return {'failed': True, + 'msg': 'unable to open shell. Please see: ' + + 'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'} - pc = copy.deepcopy(self._play_context) - pc.connection = 'network_cli' - pc.network_os = 'enos' - pc.remote_addr = provider['host'] or self._play_context.remote_addr - display.vvvv('remote_addr: %s' % pc.remote_addr) - pc.port = provider['port'] or self._play_context.port or 22 - pc.remote_user = provider['username'] or self._play_context.connection_user - pc.password = provider['password'] or self._play_context.password - pc.private_key_file = provider['ssh_keyfile'] or self._play_context.private_key_file - pc.timeout = int(provider['timeout'] or C.PERSISTENT_COMMAND_TIMEOUT) - - pc.become = provider['authorize'] or True - pc.become_pass = provider['auth_pass'] - - display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) - connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) - - socket_path = connection.run() - - display.vvvv('socket_path: %s' % socket_path, pc.remote_addr) - if not socket_path: - return {'failed': True, - 'msg': 'unable to open shell. Please see: ' + - 'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'} - - task_vars['ansible_socket'] = socket_path - - if self._play_context.become_method == 'enable': - self._play_context.become = False - self._play_context.become_method = None + task_vars['ansible_socket'] = socket_path result = super(ActionModule, self).run(tmp, task_vars) return result