mirror of
https://github.com/ansible/awx.git
synced 2026-03-07 03:31:10 -03:30
Fix error with ad hoc command events when running in check mode.
This commit is contained in:
@@ -43,7 +43,7 @@ class Migration(migrations.Migration):
|
|||||||
('created', models.DateTimeField(default=None, editable=False)),
|
('created', models.DateTimeField(default=None, editable=False)),
|
||||||
('modified', models.DateTimeField(default=None, editable=False)),
|
('modified', models.DateTimeField(default=None, editable=False)),
|
||||||
('host_name', models.CharField(default=b'', max_length=1024, editable=False)),
|
('host_name', models.CharField(default=b'', max_length=1024, editable=False)),
|
||||||
('event', models.CharField(max_length=100, choices=[(b'runner_on_failed', 'Host Failed'), (b'runner_on_ok', 'Host OK'), (b'runner_on_unreachable', 'Host Unreachable')])),
|
('event', models.CharField(max_length=100, choices=[(b'runner_on_failed', 'Host Failed'), (b'runner_on_ok', 'Host OK'), (b'runner_on_unreachable', 'Host Unreachable'), (b'runner_on_skipped', 'Host Skipped')])),
|
||||||
('event_data', jsonfield.fields.JSONField(default={}, blank=True)),
|
('event_data', jsonfield.fields.JSONField(default={}, blank=True)),
|
||||||
('failed', models.BooleanField(default=False, editable=False)),
|
('failed', models.BooleanField(default=False, editable=False)),
|
||||||
('changed', models.BooleanField(default=False, editable=False)),
|
('changed', models.BooleanField(default=False, editable=False)),
|
||||||
|
|||||||
@@ -221,8 +221,9 @@ class AdHocCommandEvent(CreatedModifiedModel):
|
|||||||
('runner_on_unreachable', _('Host Unreachable'), True),
|
('runner_on_unreachable', _('Host Unreachable'), True),
|
||||||
# Tower won't see no_hosts (check is done earlier without callback).
|
# Tower won't see no_hosts (check is done earlier without callback).
|
||||||
#('runner_on_no_hosts', _('No Hosts Matched'), False),
|
#('runner_on_no_hosts', _('No Hosts Matched'), False),
|
||||||
# Tower should probably never see skipped (no conditionals).
|
# Tower will see skipped (when running in check mode for a module that
|
||||||
#('runner_on_skipped', _('Host Skipped'), False),
|
# does not support check mode).
|
||||||
|
('runner_on_skipped', _('Host Skipped'), False),
|
||||||
# Tower does not support async for ad hoc commands.
|
# Tower does not support async for ad hoc commands.
|
||||||
#('runner_on_async_poll', _('Host Polling'), False),
|
#('runner_on_async_poll', _('Host Polling'), False),
|
||||||
#('runner_on_async_ok', _('Host Async OK'), False),
|
#('runner_on_async_ok', _('Host Async OK'), False),
|
||||||
|
|||||||
@@ -128,8 +128,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest):
|
|||||||
self.assertFalse(ad_hoc_command.passwords_needed_to_start)
|
self.assertFalse(ad_hoc_command.passwords_needed_to_start)
|
||||||
self.assertTrue(ad_hoc_command.signal_start())
|
self.assertTrue(ad_hoc_command.signal_start())
|
||||||
ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk)
|
ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk)
|
||||||
self.check_job_result(ad_hoc_command, 'failed')
|
self.check_job_result(ad_hoc_command, 'successful')
|
||||||
self.check_ad_hoc_command_events(ad_hoc_command, 'unreachable')
|
self.check_ad_hoc_command_events(ad_hoc_command, 'skipped')
|
||||||
|
|
||||||
@mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('canceled', 0))
|
@mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('canceled', 0))
|
||||||
def test_cancel_ad_hoc_command(self, ignore):
|
def test_cancel_ad_hoc_command(self, ignore):
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ CENSOR_FIELD_WHITELIST=[
|
|||||||
]
|
]
|
||||||
|
|
||||||
def censor(obj):
|
def censor(obj):
|
||||||
|
if not isinstance(obj, dict):
|
||||||
|
return obj
|
||||||
if obj.get('_ansible_no_log', False):
|
if obj.get('_ansible_no_log', False):
|
||||||
new_obj = {}
|
new_obj = {}
|
||||||
for k in CENSOR_FIELD_WHITELIST:
|
for k in CENSOR_FIELD_WHITELIST:
|
||||||
@@ -529,6 +531,7 @@ class AdHocCommandCallbackModule(BaseCallbackModule):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.ad_hoc_command_id = int(os.getenv('AD_HOC_COMMAND_ID', '0'))
|
self.ad_hoc_command_id = int(os.getenv('AD_HOC_COMMAND_ID', '0'))
|
||||||
self.rest_api_path = '/api/v1/ad_hoc_commands/%d/events/' % self.ad_hoc_command_id
|
self.rest_api_path = '/api/v1/ad_hoc_commands/%d/events/' % self.ad_hoc_command_id
|
||||||
|
self.skipped_hosts = set()
|
||||||
super(AdHocCommandCallbackModule, self).__init__()
|
super(AdHocCommandCallbackModule, self).__init__()
|
||||||
|
|
||||||
def _log_event(self, event, **event_data):
|
def _log_event(self, event, **event_data):
|
||||||
@@ -539,6 +542,18 @@ class AdHocCommandCallbackModule(BaseCallbackModule):
|
|||||||
def runner_on_file_diff(self, host, diff):
|
def runner_on_file_diff(self, host, diff):
|
||||||
pass # Ignore file diff for ad hoc commands.
|
pass # Ignore file diff for ad hoc commands.
|
||||||
|
|
||||||
|
def runner_on_ok(self, host, res):
|
||||||
|
# When running in check mode using a module that does not support check
|
||||||
|
# mode, Ansible v1.9 will call runner_on_skipped followed by
|
||||||
|
# runner_on_ok for the same host; only capture the skipped event and
|
||||||
|
# ignore the ok event.
|
||||||
|
if host not in self.skipped_hosts:
|
||||||
|
super(AdHocCommandCallbackModule, self).runner_on_ok(host, res)
|
||||||
|
|
||||||
|
def runner_on_skipped(self, host, item=None):
|
||||||
|
super(AdHocCommandCallbackModule, self).runner_on_skipped(host, item)
|
||||||
|
self.skipped_hosts.add(host)
|
||||||
|
|
||||||
|
|
||||||
if os.getenv('JOB_ID', ''):
|
if os.getenv('JOB_ID', ''):
|
||||||
CallbackModule = JobCallbackModule
|
CallbackModule = JobCallbackModule
|
||||||
|
|||||||
Reference in New Issue
Block a user