1919from understack_workflows .oslo_event import keystone_project
2020from understack_workflows .oslo_event import neutron_network
2121from understack_workflows .oslo_event import neutron_subnet
22+ from understack_workflows .oslo_event import update_nautobot
2223
2324logger = setup_logger (__name__ )
2425
@@ -64,14 +65,17 @@ class NoEventHandlerError(Exception):
6465EventHandler = 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