77 contextmanager ,
88)
99from dataclasses import dataclass , field
10+ from datetime import timedelta
1011
1112from anyio import fail_after , sleep
1213from anyio .from_thread import BlockingPortal
13- from google .protobuf import duration_pb2
1414from grpc .aio import Channel
15- from jumpstarter_protocol import jumpstarter_pb2 , jumpstarter_pb2_grpc , kubernetes_pb2
15+ from jumpstarter_protocol import jumpstarter_pb2 , jumpstarter_pb2_grpc
1616
1717from .exceptions import LeaseError
1818from jumpstarter .client import client_from_path
19+ from jumpstarter .client .grpc import ClientService
1920from jumpstarter .common import MetadataFilter , TemporaryUnixListener
2021from jumpstarter .common .condition import condition_false , condition_message , condition_present_and_equal , condition_true
2122from jumpstarter .common .grpc import translate_grpc_exceptions
@@ -31,6 +32,7 @@ class Lease(AbstractContextManager, AbstractAsyncContextManager):
3132 timeout : int = 1800
3233 metadata_filter : MetadataFilter = field (default_factory = MetadataFilter )
3334 portal : BlockingPortal
35+ namespace : str
3436 name : str | None = field (default = None )
3537 allow : list [str ]
3638 unsafe : bool
@@ -43,24 +45,23 @@ def __post_init__(self):
4345 super ().__post_init__ ()
4446
4547 self .controller = jumpstarter_pb2_grpc .ControllerServiceStub (self .channel )
48+ self .svc = ClientService (channel = self .channel )
4649 self .manager = self .portal .wrap_async_context_manager (self )
4750
4851 async def _create (self ):
49- duration = duration_pb2 .Duration ()
50- duration .FromSeconds (self .timeout )
51- duration_str = str (duration .ToTimedelta ())
52+ duration = timedelta (seconds = self .timeout )
53+ selector = "," .join (("{}={}" .format (label [0 ], label [1 ]) for label in self .metadata_filter .labels .items ()))
5254
53- logger .debug ("Creating lease request for labels %s for %s" , self . metadata_filter . labels , duration_str )
55+ logger .debug ("Creating lease request for selector %s for duration %s" , selector , duration )
5456 with translate_grpc_exceptions ():
5557 self .name = (
56- await self .controller .RequestLease (
57- jumpstarter_pb2 .RequestLeaseRequest (
58- duration = duration ,
59- selector = kubernetes_pb2 .LabelSelector (match_labels = self .metadata_filter .labels ),
60- )
58+ await self .svc .CreateLease (
59+ namespace = self .namespace ,
60+ selector = selector ,
61+ duration = timedelta (seconds = self .timeout ),
6162 )
6263 ).name
63- logger .info ("Created lease request for labels %s for %s" , self . metadata_filter . labels , duration_str )
64+ logger .info ("Created lease request for selector %s for duration %s" , selector , duration )
6465
6566 def request (self ):
6667 """Request a lease, or verifies a lease which was already created.
@@ -97,7 +98,10 @@ async def _acquire(self):
9798 while True :
9899 logger .debug ("Polling Lease %s" , self .name )
99100 with translate_grpc_exceptions ():
100- result = await self .controller .GetLease (jumpstarter_pb2 .GetLeaseRequest (name = self .name ))
101+ result = await self .svc .GetLease (
102+ namespace = self .namespace ,
103+ name = self .name ,
104+ )
101105
102106 # lease ready
103107 if condition_true (result .conditions , "Ready" ):
@@ -131,7 +135,10 @@ async def __aenter__(self):
131135 async def __aexit__ (self , exc_type , exc_value , traceback ):
132136 if self .release :
133137 logger .info ("Releasing Lease %s" , self .name )
134- await self .controller .ReleaseLease (jumpstarter_pb2 .ReleaseLeaseRequest (name = self .name ))
138+ await self .svc .DeleteLease (
139+ namespace = self .namespace ,
140+ name = self .name ,
141+ )
135142
136143 def __enter__ (self ):
137144 # wraps the async context manager enter
0 commit comments