Skip to content

Commit ddd5a30

Browse files
handle multiple event handlers
1 parent 756fd88 commit ddd5a30

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

python/understack-workflows/understack_workflows/main/openstack_oslo_event.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from understack_workflows.oslo_event import keystone_project
2020
from understack_workflows.oslo_event import neutron_network
2121
from understack_workflows.oslo_event import neutron_subnet
22+
from understack_workflows.oslo_event import update_nautobot
2223

2324
logger = setup_logger(__name__)
2425

@@ -64,14 +65,17 @@ class NoEventHandlerError(Exception):
6465
EventHandler = Callable[[Connection, NautobotApi, dict[str, Any]], int]
6566

6667
# add the event_type here and the function that should be called
67-
_event_handlers: dict[str, EventHandler] = {
68+
_event_handlers: dict[str, EventHandler | list[EventHandler]] = {
6869
"baremetal.port.create.end": ironic_port.handle_port_create_update,
6970
"baremetal.port.update.end": ironic_port.handle_port_create_update,
7071
"baremetal.port.delete.end": ironic_port.handle_port_delete,
7172
"baremetal.portgroup.create.end": ironic_portgroup.handle_portgroup_create_update,
7273
"baremetal.portgroup.update.end": ironic_portgroup.handle_portgroup_create_update,
7374
"baremetal.portgroup.delete.end": ironic_portgroup.handle_portgroup_delete,
74-
"baremetal.node.provision_set.end": ironic_node.handle_provision_end,
75+
"baremetal.node.provision_set.end": [
76+
ironic_node.handle_provision_end,
77+
update_nautobot.handle_provision_end,
78+
],
7579
"identity.project.created": keystone_project.handle_project_created,
7680
"identity.project.updated": keystone_project.handle_project_updated,
7781
"identity.project.deleted": keystone_project.handle_project_deleted,
@@ -183,14 +187,20 @@ def main() -> int:
183187

184188
logger.info("Processing event type: %s", event_type)
185189

186-
# look up the event handler
187-
event_handler = _event_handlers.get(event_type)
188-
if event_handler is None:
190+
# look up the event handler(s)
191+
event_handlers = _event_handlers.get(event_type)
192+
if event_handlers is None:
189193
logger.error("No event handler for event type: %s", event_type)
190194
logger.debug("Available event handlers: %s", list(_event_handlers.keys()))
191195
sys.exit(_EXIT_NO_EVENT_HANDLER)
192196

193-
logger.debug("Found event handler for event type: %s", event_type)
197+
# normalize to list for consistent processing
198+
if not isinstance(event_handlers, list):
199+
event_handlers = [event_handlers]
200+
201+
logger.debug(
202+
"Found %d handler(s) for event type: %s", len(event_handlers), event_type
203+
)
194204

195205
# get a connection to OpenStack and to Nautobot
196206
try:
@@ -199,17 +209,21 @@ def main() -> int:
199209
logger.exception("Client initialization failed")
200210
sys.exit(_EXIT_CLIENT_ERROR)
201211

202-
# execute the event handler
203-
logger.info("Executing event handler for event type: %s", event_type)
204-
try:
205-
ret = event_handler(conn, nautobot, event)
206-
except Exception:
207-
logger.exception("Event handler failed")
208-
sys.exit(_EXIT_HANDLER_ERROR)
209-
210-
logger.info("Event handler completed successfully with return code: %s", ret)
211-
212-
# exit if the event handler provided a return code or just with success
213-
if isinstance(ret, int):
214-
return ret
215-
return _EXIT_SUCCESS
212+
# execute all event handlers
213+
last_ret = _EXIT_SUCCESS
214+
for idx, event_handler in enumerate(event_handlers, 1):
215+
handler_name = event_handler.__name__
216+
logger.info(
217+
"Executing handler %d/%d: %s", idx, len(event_handlers), handler_name
218+
)
219+
try:
220+
ret = event_handler(conn, nautobot, event)
221+
if isinstance(ret, int):
222+
last_ret = ret
223+
logger.info("Handler %s completed with return code: %s", handler_name, ret)
224+
except Exception:
225+
logger.exception("Handler %s failed", handler_name)
226+
sys.exit(_EXIT_HANDLER_ERROR)
227+
228+
logger.info("All handlers completed successfully")
229+
return last_ret

0 commit comments

Comments
 (0)