77from types import SimpleNamespace
88from typing import Any
99
10- from google .protobuf import duration_pb2 , field_mask_pb2 , json_format
10+ from google .protobuf import duration_pb2 , field_mask_pb2 , json_format , timestamp_pb2
1111from grpc import ChannelConnectivity
1212from grpc .aio import Channel
1313from jumpstarter_protocol import client_pb2 , client_pb2_grpc , jumpstarter_pb2_grpc , kubernetes_pb2 , router_pb2_grpc
@@ -346,18 +346,26 @@ async def CreateLease(
346346 * ,
347347 selector : str ,
348348 duration : timedelta ,
349+ begin_time : datetime | None = None ,
349350 ):
350351 duration_pb = duration_pb2 .Duration ()
351352 duration_pb .FromTimedelta (duration )
352353
354+ lease_pb = client_pb2 .Lease (
355+ duration = duration_pb ,
356+ selector = selector ,
357+ )
358+
359+ if begin_time :
360+ timestamp_pb = timestamp_pb2 .Timestamp ()
361+ timestamp_pb .FromDatetime (begin_time )
362+ lease_pb .begin_time .CopyFrom (timestamp_pb )
363+
353364 with translate_grpc_exceptions ():
354365 lease = await self .stub .CreateLease (
355366 client_pb2 .CreateLeaseRequest (
356367 parent = "namespaces/{}" .format (self .namespace ),
357- lease = client_pb2 .Lease (
358- duration = duration_pb ,
359- selector = selector ,
360- ),
368+ lease = lease_pb ,
361369 )
362370 )
363371 return Lease .from_protobuf (lease )
@@ -366,21 +374,37 @@ async def UpdateLease(
366374 self ,
367375 * ,
368376 name : str ,
369- duration : timedelta ,
377+ duration : timedelta | None = None ,
378+ begin_time : datetime | None = None ,
370379 ):
371- duration_pb = duration_pb2 .Duration ()
372- duration_pb .FromTimedelta (duration )
380+ lease_pb = client_pb2 .Lease (
381+ name = "namespaces/{}/leases/{}" .format (self .namespace , name ),
382+ )
383+
384+ update_fields = []
385+
386+ if duration is not None :
387+ duration_pb = duration_pb2 .Duration ()
388+ duration_pb .FromTimedelta (duration )
389+ lease_pb .duration .CopyFrom (duration_pb )
390+ update_fields .append ("duration" )
391+
392+ if begin_time is not None :
393+ timestamp_pb = timestamp_pb2 .Timestamp ()
394+ timestamp_pb .FromDatetime (begin_time )
395+ lease_pb .begin_time .CopyFrom (timestamp_pb )
396+ update_fields .append ("begin_time" )
397+
398+ if not update_fields :
399+ raise ValueError ("At least one of duration or begin_time must be provided" )
373400
374401 update_mask = field_mask_pb2 .FieldMask ()
375- update_mask .FromJsonString ("duration" )
402+ update_mask .FromJsonString ("," . join ( update_fields ) )
376403
377404 with translate_grpc_exceptions ():
378405 lease = await self .stub .UpdateLease (
379406 client_pb2 .UpdateLeaseRequest (
380- lease = client_pb2 .Lease (
381- name = "namespaces/{}/leases/{}" .format (self .namespace , name ),
382- duration = duration_pb ,
383- ),
407+ lease = lease_pb ,
384408 update_mask = update_mask ,
385409 )
386410 )
0 commit comments