Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions docs/source/api-reference/drivers/proxy.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
children:
proxy:
ref: "foo.bar.power"
foo:
children:
bar:
children:
power:
type: "jumpstarter_driver_power.driver.MockPower"
proxy:
ref: "foo.bar.power"
foo:
bar:
power:
type: "jumpstarter_driver_power.driver.MockPower"
22 changes: 18 additions & 4 deletions packages/jumpstarter/jumpstarter/config/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ class ExporterConfigV1Alpha1DriverInstanceProxy(BaseModel):


class ExporterConfigV1Alpha1DriverInstanceComposite(BaseModel):
children: dict[str, ExporterConfigV1Alpha1DriverInstance] = Field(default_factory=dict)
children: dict[str, ExporterConfigV1Alpha1DriverInstance]


class ExporterConfigV1Alpha1DriverInstanceCompositeSimplified(RootModel):
root: dict[str, ExporterConfigV1Alpha1DriverInstance]


class ExporterConfigV1Alpha1DriverInstanceBase(BaseModel):
Expand All @@ -34,6 +38,7 @@ class ExporterConfigV1Alpha1DriverInstance(RootModel):
root: (
ExporterConfigV1Alpha1DriverInstanceBase
| ExporterConfigV1Alpha1DriverInstanceComposite
| ExporterConfigV1Alpha1DriverInstanceCompositeSimplified
| ExporterConfigV1Alpha1DriverInstanceProxy
)

Expand All @@ -51,6 +56,13 @@ def instantiate(self) -> Driver:

return Composite(children=children)

case ExporterConfigV1Alpha1DriverInstanceCompositeSimplified():
from jumpstarter_driver_composite.driver import Composite

children = {name: child.instantiate() for name, child in self.root.root.items()}

return Composite(children=children)

case ExporterConfigV1Alpha1DriverInstanceProxy():
from jumpstarter_driver_composite.driver import Proxy

Expand Down Expand Up @@ -79,7 +91,9 @@ class ExporterConfigV1Alpha1(BaseModel):
tls: TLSConfigV1Alpha1 = Field(default_factory=TLSConfigV1Alpha1)
token: str

export: dict[str, ExporterConfigV1Alpha1DriverInstance] = Field(default_factory=dict)
export: ExporterConfigV1Alpha1DriverInstance = Field(
default_factory=lambda: ExporterConfigV1Alpha1DriverInstance({})
)

path: Path | None = Field(default=None, exclude=True)

Expand Down Expand Up @@ -137,7 +151,7 @@ async def serve_unix_async(self):
from jumpstarter.exporter import Session

with Session(
root_device=ExporterConfigV1Alpha1DriverInstance(children=self.export).instantiate(),
root_device=self.export.instantiate(),
) as session:
async with session.serve_unix_async() as path:
yield path
Expand All @@ -161,7 +175,7 @@ def channel_factory():

async with Exporter(
channel_factory=channel_factory,
device_factory=ExporterConfigV1Alpha1DriverInstance(children=self.export).instantiate,
device_factory=self.export.instantiate,
tls=self.tls,
) as exporter:
await exporter.serve()
53 changes: 38 additions & 15 deletions packages/jumpstarter/jumpstarter/config/exporter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,13 @@ async def test_exporter_serve(mock_controller):
type="jumpstarter_driver_power.driver.MockPower",
),
"nested": ExporterConfigV1Alpha1DriverInstance(
children={
"tcp": ExporterConfigV1Alpha1DriverInstance(
type="jumpstarter_driver_network.driver.TcpNetwork",
config={
"host": "127.0.0.1",
"port": 8080,
},
)
}
tcp=ExporterConfigV1Alpha1DriverInstance(
type="jumpstarter_driver_network.driver.TcpNetwork",
config={
"host": "127.0.0.1",
"port": 8080,
},
)
),
},
)
Expand Down Expand Up @@ -95,12 +93,22 @@ def test_exporter_config(monkeypatch: pytest.MonkeyPatch, tmp_path: Path):
config:
port: "/dev/ttyUSB0"
baudrate: 115200
nested:
nested-simplified:
custom:
type: "vendorpackage.CustomDriver"
config:
hello: "world"
nested-legacy:
children:
custom:
type: "vendorpackage.CustomDriver"
config:
hello: "world"
hello: "again"
nested-reserved-name:
ref:
type: "vendorpackage.CustomDriver"
config:
hello: "third-time"
"""
path.write_text(
text,
Expand Down Expand Up @@ -136,17 +144,32 @@ def test_exporter_config(monkeypatch: pytest.MonkeyPatch, tmp_path: Path):
"baudrate": 115200,
},
),
"nested": ExporterConfigV1Alpha1DriverInstance(
"nested-simplified": ExporterConfigV1Alpha1DriverInstance(
custom=ExporterConfigV1Alpha1DriverInstance(
type="vendorpackage.CustomDriver",
config={
"hello": "world",
},
)
),
"nested-legacy": ExporterConfigV1Alpha1DriverInstance(
children={
"custom": ExporterConfigV1Alpha1DriverInstance(
type="vendorpackage.CustomDriver",
children={},
config={
"hello": "world",
"hello": "again",
},
)
),
},
),
"nested-reserved-name": ExporterConfigV1Alpha1DriverInstance(
ref=ExporterConfigV1Alpha1DriverInstance(
type="vendorpackage.CustomDriver",
config={
"hello": "third-time",
},
)
),
},
config={},
path=path,
Expand Down