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

Commit ca93474

Browse files
committed
Generalize SerializableBaseModelList
1 parent e26a246 commit ca93474

File tree

7 files changed

+32
-34
lines changed

7 files changed

+32
-34
lines changed

packages/jumpstarter-cli-admin/jumpstarter_cli_admin/print.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
V1Alpha1Client,
1010
V1Alpha1Exporter,
1111
V1Alpha1Lease,
12-
V1Alpha1List,
1312
)
13+
from jumpstarter.common.pydantic import SerializableBaseModelList
1414

1515
CLIENT_COLUMNS = ["NAME", "ENDPOINT", "AGE"]
1616

@@ -30,7 +30,7 @@ def print_client(client: V1Alpha1Client, output: OutputType):
3030
click.echo(make_table(CLIENT_COLUMNS, [make_client_row(client)]))
3131

3232

33-
def print_clients(clients: V1Alpha1List[V1Alpha1Client], namespace: str, output: OutputType):
33+
def print_clients(clients: SerializableBaseModelList[V1Alpha1Client], namespace: str, output: OutputType):
3434
if output:
3535
echo(clients.dump(output))
3636
else:
@@ -86,7 +86,9 @@ def print_exporter(exporter: V1Alpha1Exporter, devices: bool, output: OutputType
8686
click.echo(make_table(EXPORTER_COLUMNS, [make_exporter_row(exporter)]))
8787

8888

89-
def print_exporters(exporters: V1Alpha1List[V1Alpha1Exporter], namespace: str, devices: bool, output: OutputType):
89+
def print_exporters(
90+
exporters: SerializableBaseModelList[V1Alpha1Exporter], namespace: str, devices: bool, output: OutputType
91+
):
9092
if output:
9193
echo(exporters.dump(output))
9294
else:
@@ -144,7 +146,7 @@ def print_lease(lease: V1Alpha1Lease, output: OutputType):
144146
click.echo(make_table(LEASE_COLUMNS, [make_lease_row(lease)]))
145147

146148

147-
def print_leases(leases: V1Alpha1List[V1Alpha1Lease], namespace: str, output: OutputType):
149+
def print_leases(leases: SerializableBaseModelList[V1Alpha1Lease], namespace: str, output: OutputType):
148150
if output:
149151
echo(leases.dump(output))
150152
else:

packages/jumpstarter-kubernetes/jumpstarter_kubernetes/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
V1Alpha1LeaseSpec,
1616
V1Alpha1LeaseStatus,
1717
)
18-
from .list import V1Alpha1List
1918

2019
__all__ = [
2120
"ClientsV1Alpha1Api",
@@ -33,7 +32,6 @@
3332
"V1Alpha1LeaseList",
3433
"V1Alpha1LeaseSelector",
3534
"V1Alpha1LeaseSpec",
36-
"V1Alpha1List",
3735
"get_ip_address",
3836
"helm_installed",
3937
"install_helm_chart",

packages/jumpstarter-kubernetes/jumpstarter_kubernetes/clients.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from pydantic import Field
88

99
from .json import JsonBaseModel
10-
from .list import V1Alpha1List
1110
from .serialize import SerializeV1ObjectMeta, SerializeV1ObjectReference
1211
from .util import AbstractAsyncCustomObjectApi
12+
from jumpstarter.common.pydantic import SerializableBaseModelList
1313
from jumpstarter.config import ClientConfigV1Alpha1, ClientConfigV1Alpha1Drivers, ObjectMeta
1414

1515
logger = logging.getLogger(__name__)
@@ -53,7 +53,7 @@ def from_dict(dict: dict):
5353
)
5454

5555

56-
class V1Alpha1ClientList(V1Alpha1List[V1Alpha1Client]):
56+
class V1Alpha1ClientList(SerializableBaseModelList[V1Alpha1Client]):
5757
kind: Literal["ClientList"] = Field(default="ClientList")
5858

5959
@staticmethod
@@ -99,7 +99,7 @@ async def create_client(
9999
await asyncio.sleep(CREATE_CLIENT_DELAY)
100100
raise Exception("Timeout waiting for client credentials")
101101

102-
async def list_clients(self) -> V1Alpha1List[V1Alpha1Client]:
102+
async def list_clients(self) -> SerializableBaseModelList[V1Alpha1Client]:
103103
"""List the client objects in the cluster async"""
104104
res = await self.api.list_namespaced_custom_object(
105105
namespace=self.namespace, group="jumpstarter.dev", plural="clients", version="v1alpha1"

packages/jumpstarter-kubernetes/jumpstarter_kubernetes/exporters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from pydantic import Field
77

88
from .json import JsonBaseModel
9-
from .list import V1Alpha1List
109
from .serialize import SerializeV1ObjectMeta, SerializeV1ObjectReference
1110
from .util import AbstractAsyncCustomObjectApi
11+
from jumpstarter.common.pydantic import SerializableBaseModelList
1212
from jumpstarter.config import ExporterConfigV1Alpha1, ObjectMeta
1313

1414
CREATE_EXPORTER_DELAY = 1
@@ -57,7 +57,7 @@ def from_dict(dict: dict):
5757
)
5858

5959

60-
class V1Alpha1ExporterList(V1Alpha1List[V1Alpha1Exporter]):
60+
class V1Alpha1ExporterList(SerializableBaseModelList[V1Alpha1Exporter]):
6161
kind: Literal["ExporterList"] = Field(default="ExporterList")
6262

6363
@staticmethod
@@ -68,7 +68,7 @@ def from_dict(dict: dict):
6868
class ExportersV1Alpha1Api(AbstractAsyncCustomObjectApi):
6969
"""Interact with the exporters custom resource API"""
7070

71-
async def list_exporters(self) -> V1Alpha1List[V1Alpha1Exporter]:
71+
async def list_exporters(self) -> SerializableBaseModelList[V1Alpha1Exporter]:
7272
"""List the exporter objects in the cluster"""
7373
res = await self.api.list_namespaced_custom_object(
7474
namespace=self.namespace, group="jumpstarter.dev", plural="exporters", version="v1alpha1"

packages/jumpstarter-kubernetes/jumpstarter_kubernetes/leases.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
from pydantic import Field
55

66
from .json import JsonBaseModel
7-
from .list import V1Alpha1List
87
from .serialize import SerializeV1Condition, SerializeV1ObjectMeta, SerializeV1ObjectReference
98
from .util import AbstractAsyncCustomObjectApi
9+
from jumpstarter.common.pydantic import SerializableBaseModelList
1010

1111

1212
class V1Alpha1LeaseStatus(JsonBaseModel):
@@ -77,7 +77,7 @@ def from_dict(dict: dict):
7777
)
7878

7979

80-
class V1Alpha1LeaseList(V1Alpha1List[V1Alpha1Lease]):
80+
class V1Alpha1LeaseList(SerializableBaseModelList[V1Alpha1Lease]):
8181
kind: Literal["LeaseList"] = Field(default="LeaseList")
8282

8383
@staticmethod
@@ -88,7 +88,7 @@ def from_dict(dict: dict):
8888
class LeasesV1Alpha1Api(AbstractAsyncCustomObjectApi):
8989
"""Interact with the leases custom resource API"""
9090

91-
async def list_leases(self) -> V1Alpha1List[V1Alpha1Lease]:
91+
async def list_leases(self) -> SerializableBaseModelList[V1Alpha1Lease]:
9292
"""List the lease objects in the cluster async"""
9393
result = await self.api.list_namespaced_custom_object(
9494
namespace=self.namespace, group="jumpstarter.dev", plural="leases", version="v1alpha1"

packages/jumpstarter-kubernetes/jumpstarter_kubernetes/list.py

Lines changed: 0 additions & 18 deletions
This file was deleted.

packages/jumpstarter/jumpstarter/common/pydantic.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
from typing import Generic, Literal, TypeVar
2+
13
import yaml
2-
from pydantic import BaseModel
4+
from pydantic import BaseModel, Field
5+
6+
T = TypeVar("T")
37

48

59
class OutputMode(str):
@@ -31,3 +35,15 @@ def dump_json(self) -> str:
3135

3236
def dump_yaml(self) -> str:
3337
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
38+
39+
40+
class SerializableBaseModelList(SerializableBaseModel, Generic[T]):
41+
api_version: Literal["jumpstarter.dev/v1alpha1"] = Field(
42+
alias="apiVersion",
43+
default="jumpstarter.dev/v1alpha1",
44+
)
45+
kind: Literal["List"] = Field(default="List")
46+
items: list[T]
47+
48+
def dump_name(self):
49+
return "".join(item.dump_name() for item in self.items)

0 commit comments

Comments
 (0)