Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit 263cfc9

Browse files
committed
Improve messaging and typing
1 parent d72ba30 commit 263cfc9

1 file changed

Lines changed: 15 additions & 34 deletions

File tree

packages/jumpstarter/jumpstarter/exporter/exporter.py

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)