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

Commit b4c44e6

Browse files
committed
cli: support lease transfer
depends on jumpstarter-dev/jumpstarter-controller#199 Signed-off-by: Benny Zlotnik <bzlotnik@redhat.com>
1 parent 312a389 commit b4c44e6

3 files changed

Lines changed: 29 additions & 18 deletions

File tree

packages/jumpstarter-cli/jumpstarter_cli/update.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,32 @@ def update():
2222
@click.argument("name")
2323
@opt_duration_partial(required=False)
2424
@opt_begin_time
25+
@click.option(
26+
"--client",
27+
type=str,
28+
default=None,
29+
help="Transfer lease to a different client (format: namespaces/{namespace}/clients/{client})",
30+
)
2531
@opt_output_all
2632
@handle_exceptions_with_reauthentication(relogin_client)
27-
def update_lease(config, name: str, duration: timedelta | None, begin_time: datetime | None, output: OutputType):
33+
def update_lease(
34+
config, name: str, duration: timedelta | None, begin_time: datetime | None, client: str | None, output: OutputType
35+
):
2836
"""
2937
Update a lease
3038
31-
Update the duration and/or begin time of an existing lease.
32-
At least one of --duration or --begin-time must be specified.
39+
Update the duration, begin time, and/or owner of an existing lease.
40+
At least one of --duration, --begin-time, or --client must be specified.
41+
42+
To transfer a lease to another client, use the --client option with the
43+
full client identifier (e.g., namespaces/default/clients/other-client).
44+
3345
Updating the begin time of an already active lease is not allowed.
3446
"""
3547

36-
if duration is None and begin_time is None:
37-
raise click.UsageError("At least one of --duration or --begin-time must be specified")
48+
if duration is None and begin_time is None and client is None:
49+
raise click.UsageError("At least one of --duration, --begin-time, or --client must be specified")
3850

39-
lease = config.update_lease(name, duration=duration, begin_time=begin_time)
51+
lease = config.update_lease(name, duration=duration, begin_time=begin_time, client=client)
4052

4153
model_print(lease, output)

packages/jumpstarter/jumpstarter/client/grpc.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,7 @@ def model_dump_json(self, **kwargs):
275275
if not self.include_online:
276276
exclude_fields.add("online")
277277

278-
data = {
279-
"exporters": [
280-
exporter.model_dump(mode="json", exclude=exclude_fields) for exporter in self.exporters
281-
]
282-
}
278+
data = {"exporters": [exporter.model_dump(mode="json", exclude=exclude_fields) for exporter in self.exporters]}
283279
return json.dumps(data, **json_kwargs)
284280

285281
def model_dump(self, **kwargs):
@@ -289,11 +285,8 @@ def model_dump(self, **kwargs):
289285
if not self.include_online:
290286
exclude_fields.add("online")
291287

292-
return {
293-
"exporters": [
294-
exporter.model_dump(mode="json", exclude=exclude_fields) for exporter in self.exporters
295-
]
296-
}
288+
return {"exporters": [exporter.model_dump(mode="json", exclude=exclude_fields) for exporter in self.exporters]}
289+
297290

298291
class LeaseList(BaseModel):
299292
leases: list[Lease]
@@ -419,6 +412,7 @@ async def UpdateLease(
419412
name: str,
420413
duration: timedelta | None = None,
421414
begin_time: datetime | None = None,
415+
client: str | None = None,
422416
):
423417
lease_pb = client_pb2.Lease(
424418
name="namespaces/{}/leases/{}".format(self.namespace, name),
@@ -438,8 +432,12 @@ async def UpdateLease(
438432
lease_pb.begin_time.CopyFrom(timestamp_pb)
439433
update_fields.append("begin_time")
440434

435+
if client is not None:
436+
lease_pb.client = client
437+
update_fields.append("client")
438+
441439
if not update_fields:
442-
raise ValueError("At least one of duration or begin_time must be provided")
440+
raise ValueError("At least one of duration, begin_time, or client must be provided")
443441

444442
update_mask = field_mask_pb2.FieldMask()
445443
update_mask.FromJsonString(",".join(update_fields))

packages/jumpstarter/jumpstarter/config/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,10 @@ async def update_lease(
244244
name: str,
245245
duration: timedelta | None = None,
246246
begin_time: datetime | None = None,
247+
client: str | None = None,
247248
):
248249
svc = ClientService(channel=await self.channel(), namespace=self.metadata.namespace)
249-
return await svc.UpdateLease(name=name, duration=duration, begin_time=begin_time)
250+
return await svc.UpdateLease(name=name, duration=duration, begin_time=begin_time, client=client)
250251

251252
@asynccontextmanager
252253
async def lease_async(

0 commit comments

Comments
 (0)