fix multiple handler notifications

Fixes #19647
Adds integration test to catch multiple handler notifications
(cherry picked from commit c2495677b0)
This commit is contained in:
Matt Davis 2016-12-22 16:50:08 -08:00
parent 3c7987f3a4
commit 7683715caf
3 changed files with 39 additions and 1 deletions

View file

@ -435,7 +435,7 @@ class StrategyBase:
target_handler = search_handler_blocks_by_name(handler_name, iterator._play.handlers) target_handler = search_handler_blocks_by_name(handler_name, iterator._play.handlers)
if target_handler is not None: if target_handler is not None:
found = True found = True
if original_host._uuid not in self._notified_handlers[target_handler._uuid]: if original_host not in self._notified_handlers[target_handler._uuid]:
self._notified_handlers[target_handler._uuid].append(original_host) self._notified_handlers[target_handler._uuid].append(original_host)
# FIXME: should this be a callback? # FIXME: should this be a callback?
display.vv("NOTIFIED HANDLER %s" % (handler_name,)) display.vv("NOTIFIED HANDLER %s" % (handler_name,))

View file

@ -5,3 +5,6 @@
- name: set_handler_fact_2 - name: set_handler_fact_2
set_fact: set_fact:
handler2_called: True handler2_called: True
- name: count_handler
shell: echo . >> {{ handler_countpath }}

View file

@ -30,6 +30,41 @@
- "handler1_called is defined" - "handler1_called is defined"
- "handler2_called is not defined" - "handler2_called is not defined"
- name: make a tempfile for counting
shell: mktemp
register: mktemp_out
- name: register tempfile path
set_fact:
handler_countpath: "{{ mktemp_out.stdout }}"
- name: notify the counting handler
shell: echo
notify:
- count_handler
- name: notify the counting handler again
shell: echo
notify:
- count_handler
- name: force handler execution now
meta: flush_handlers
- name: get handler execution count
shell: cat {{ handler_countpath }} | grep -o . | wc -l
register: exec_count_out
- debug: var=exec_count_out.stdout
- name: ensure single execution
assert:
that:
- exec_count_out.stdout | int == 1
- name: cleanup tempfile
file: path={{ handler_countpath }} state=absent
- name: reset handler1_called - name: reset handler1_called
set_fact: set_fact:
handler1_called: False handler1_called: False