@@ -175,8 +175,12 @@ def stop(self, wait_for_lease_exit=False, should_unregister=False):
175175
176176 # Stop immediately if not started yet or if immediate stop is requested
177177 if (not self ._started or not wait_for_lease_exit ) and self ._tg is not None :
178- logger .info ("Stopping exporter immediately, unregister from controller=%s" , should_unregister )
178+ if should_unregister :
179+ logger .info ("Stopping exporter immediately, unregistering from controller" )
180+ else :
181+ logger .info ("Stopping exporter immediately, will not unregister from controller" )
179182 self ._unregister = should_unregister
183+ # Cancel any ongoing tasks
180184 self ._tg .cancel_scope .cancel ()
181185 elif not self ._stop_requested :
182186 self ._stop_requested = True
@@ -228,14 +232,7 @@ async def _retry_stream(
228232 def _listen_stream_factory (
229233 self , lease_name : str
230234 ) -> Callable [[jumpstarter_pb2_grpc .ControllerServiceStub ], AsyncGenerator [jumpstarter_pb2 .ListenResponse , None ]]:
231- """Create a stream factory for listening to connection requests.
232-
233- Args:
234- lease_name: The lease name to listen for
235-
236- Returns:
237- A factory function that creates a Listen stream when given a ControllerServiceStub
238- """
235+ """Create a stream factory for listening to connection requests."""
239236
240237 def factory (
241238 ctrl : jumpstarter_pb2_grpc .ControllerServiceStub ,
@@ -247,11 +244,7 @@ def factory(
247244 def _status_stream_factory (
248245 self ,
249246 ) -> Callable [[jumpstarter_pb2_grpc .ControllerServiceStub ], AsyncGenerator [jumpstarter_pb2 .StatusResponse , None ]]:
250- """Create a stream factory for status updates.
251-
252- Returns:
253- A factory function that creates a Status stream when given a ControllerServiceStub
254- """
247+ """Create a stream factory for status updates."""
255248
256249 def factory (
257250 ctrl : jumpstarter_pb2_grpc .ControllerServiceStub ,
@@ -260,24 +253,10 @@ def factory(
260253
261254 return factory
262255
263- def _create_hook_context (self , lease_name : str , client_name : str ) -> HookContext :
264- """Create a standardized hook context.
265-
266- Args:
267- lease_name: Name of the lease
268- client_name: Name of the client
269-
270- Returns:
271- HookContext object with consistent fields
272- """
273- return HookContext (
274- lease_name = lease_name ,
275- client_name = client_name ,
276- )
277-
278256 async def _register_with_controller (self , channel : grpc .aio .Channel ):
279257 """Register the exporter with the controller."""
280- response = await jumpstarter_pb2_grpc .ExporterServiceStub (channel ).GetReport (empty_pb2 .Empty ())
258+ exporter_stub = jumpstarter_pb2_grpc .ExporterServiceStub (channel )
259+ response : jumpstarter_pb2 .GetReportResponse = await exporter_stub .GetReport (empty_pb2 .Empty ())
281260 logger .info ("Registering exporter with controller" )
282261 controller = jumpstarter_pb2_grpc .ControllerServiceStub (channel )
283262 await controller .Register (
@@ -286,7 +265,10 @@ async def _register_with_controller(self, channel: grpc.aio.Channel):
286265 reports = response .reports ,
287266 )
288267 )
268+ # Mark exporter as registered internally
289269 self ._registered = True
270+ # Report that exporter is available to the controller
271+ # TODO: Determine if the controller should handle this logic internally
290272 await self ._report_status (ExporterStatus .AVAILABLE , "Exporter registered and available" )
291273
292274 async def _report_status (self , status : ExporterStatus , message : str = "" ):
@@ -472,12 +454,11 @@ async def serve(self): # noqa: C901
472454 self ._status_stream_factory (),
473455 status_tx ,
474456 )
475- # Type: status is jumpstarter_pb2.StatusResponse with lease_name and other status fields
476457 async for status in status_rx :
477458 if self ._lease_name != "" and self ._lease_name != status .lease_name :
478459 # After-lease hook for the previous lease (lease name changed)
479460 if self .hook_executor and self ._current_client_name :
480- hook_context = self . _create_hook_context (self ._lease_name , self ._current_client_name )
461+ hook_context = HookContext (self ._lease_name , self ._current_client_name )
481462 # Shield the after-lease hook from cancellation and await it
482463 with CancelScope (shield = True ):
483464 await self ._report_status (ExporterStatus .AFTER_LEASE_HOOK , "Running afterLease hooks" )
@@ -527,7 +508,7 @@ async def serve(self): # noqa: C901
527508 # Before-lease hook when transitioning from unleased to leased
528509 if not previous_leased :
529510 if self .hook_executor :
530- hook_context = self . _create_hook_context (status .lease_name , status .client_name )
511+ hook_context = HookContext (status .lease_name , status .client_name )
531512 tg .start_soon (self .run_before_lease_hook , hook_context )
532513 else :
533514 # No hook configured, set event immediately
@@ -539,7 +520,7 @@ async def serve(self): # noqa: C901
539520
540521 # After-lease hook when transitioning from leased to unleased
541522 if previous_leased and self .hook_executor and self ._current_client_name :
542- hook_context = self . _create_hook_context (self ._lease_name , self ._current_client_name )
523+ hook_context = HookContext (self ._lease_name , self ._current_client_name )
543524 # Shield the after-lease hook from cancellation and await it
544525 with CancelScope (shield = True ):
545526 await self ._report_status (ExporterStatus .AFTER_LEASE_HOOK , "Running afterLease hooks" )
0 commit comments