mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Modify task executor to reuse connection inside a loop. Fix WinRM connection to set _connected properly and display when remote shell is opened/closed. Add integration test using raw + with_items.
This commit is contained in:
parent
478c6c756a
commit
272778f732
3 changed files with 28 additions and 7 deletions
|
@ -67,6 +67,7 @@ class TaskExecutor:
|
||||||
self._new_stdin = new_stdin
|
self._new_stdin = new_stdin
|
||||||
self._loader = loader
|
self._loader = loader
|
||||||
self._shared_loader_obj = shared_loader_obj
|
self._shared_loader_obj = shared_loader_obj
|
||||||
|
self._connection = None
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
'''
|
'''
|
||||||
|
@ -361,8 +362,9 @@ class TaskExecutor:
|
||||||
self._task.args = variable_params
|
self._task.args = variable_params
|
||||||
|
|
||||||
# get the connection and the handler for this execution
|
# get the connection and the handler for this execution
|
||||||
self._connection = self._get_connection(variables=variables, templar=templar)
|
if not self._connection or not getattr(self._connection, '_connected', False):
|
||||||
self._connection.set_host_overrides(host=self._host)
|
self._connection = self._get_connection(variables=variables, templar=templar)
|
||||||
|
self._connection.set_host_overrides(host=self._host)
|
||||||
|
|
||||||
self._handler = self._get_action_handler(connection=self._connection, templar=templar)
|
self._handler = self._get_action_handler(connection=self._connection, templar=templar)
|
||||||
|
|
||||||
|
|
|
@ -169,14 +169,16 @@ class Connection(ConnectionBase):
|
||||||
rs = protocol.send_message(xmltodict.unparse(rq))
|
rs = protocol.send_message(xmltodict.unparse(rq))
|
||||||
|
|
||||||
def _winrm_exec(self, command, args=(), from_exec=False, stdin_iterator=None):
|
def _winrm_exec(self, command, args=(), from_exec=False, stdin_iterator=None):
|
||||||
|
if not self.protocol:
|
||||||
|
self.protocol = self._winrm_connect()
|
||||||
|
self._connected = True
|
||||||
|
if not self.shell_id:
|
||||||
|
self.shell_id = self.protocol.open_shell(codepage=65001) # UTF-8
|
||||||
|
display.vvvvv('WINRM OPEN SHELL: %s' % self.shell_id, host=self._winrm_host)
|
||||||
if from_exec:
|
if from_exec:
|
||||||
display.vvvvv("WINRM EXEC %r %r" % (command, args), host=self._winrm_host)
|
display.vvvvv("WINRM EXEC %r %r" % (command, args), host=self._winrm_host)
|
||||||
else:
|
else:
|
||||||
display.vvvvvv("WINRM EXEC %r %r" % (command, args), host=self._winrm_host)
|
display.vvvvvv("WINRM EXEC %r %r" % (command, args), host=self._winrm_host)
|
||||||
if not self.protocol:
|
|
||||||
self.protocol = self._winrm_connect()
|
|
||||||
if not self.shell_id:
|
|
||||||
self.shell_id = self.protocol.open_shell(codepage=65001) # UTF-8
|
|
||||||
command_id = None
|
command_id = None
|
||||||
try:
|
try:
|
||||||
stdin_push_failed = False
|
stdin_push_failed = False
|
||||||
|
@ -211,6 +213,7 @@ class Connection(ConnectionBase):
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
if not self.protocol:
|
if not self.protocol:
|
||||||
self.protocol = self._winrm_connect()
|
self.protocol = self._winrm_connect()
|
||||||
|
self._connected = True
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def exec_command(self, cmd, in_data=None, sudoable=True):
|
def exec_command(self, cmd, in_data=None, sudoable=True):
|
||||||
|
@ -387,5 +390,8 @@ class Connection(ConnectionBase):
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.protocol and self.shell_id:
|
if self.protocol and self.shell_id:
|
||||||
|
display.vvvvv('WINRM CLOSE SHELL: %s' % self.shell_id, host=self._winrm_host)
|
||||||
self.protocol.close_shell(self.shell_id)
|
self.protocol.close_shell(self.shell_id)
|
||||||
self.shell_id = None
|
self.shell_id = None
|
||||||
|
self.protocol = None
|
||||||
|
self._connected = False
|
||||||
|
|
|
@ -101,3 +101,16 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- "raw_result2.stdout_lines[0] == '--% icacls D:\\\\somedir\\\\ /grant \"! ЗАО. Руководство\":F'"
|
- "raw_result2.stdout_lines[0] == '--% icacls D:\\\\somedir\\\\ /grant \"! ЗАО. Руководство\":F'"
|
||||||
|
|
||||||
|
# Assumes MaxShellsPerUser == 30 (the default)
|
||||||
|
|
||||||
|
- name: test raw + with_items to verify that winrm connection is reused for each item
|
||||||
|
raw: echo "{{item}}"
|
||||||
|
with_items: "{{range(32)|list}}"
|
||||||
|
register: raw_with_items_result
|
||||||
|
|
||||||
|
- name: check raw + with_items result
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "not raw_with_items_result|failed"
|
||||||
|
- "raw_with_items_result.results|length == 32"
|
||||||
|
|
Loading…
Reference in a new issue