From 76f43f29616afc28cdc8c79024fa79bb1ab7db0a Mon Sep 17 00:00:00 2001 From: Lincoln Wallace Date: Fri, 3 Jul 2026 15:02:20 -0300 Subject: [PATCH] feat: add virtualization interface Signed-off-by: Lincoln Wallace --- sdkcraft/models/marked_project.py | 8 +++++++- sdkcraft/models/project.py | 16 +++++++++++++++- tests/unit/models/test_project.py | 11 +++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/sdkcraft/models/marked_project.py b/sdkcraft/models/marked_project.py index 7cb27a0b..49ad3b9e 100644 --- a/sdkcraft/models/marked_project.py +++ b/sdkcraft/models/marked_project.py @@ -48,7 +48,13 @@ class OtherPlug(MarkedModel): """Marked project generic plug definition.""" interface: Literal[ - "camera", "custom-device", "desktop", "gpu", "ssh-agent", "tunnel" + "camera", + "custom-device", + "desktop", + "gpu", + "ssh-agent", + "tunnel", + "virtualization", ] diff --git a/sdkcraft/models/project.py b/sdkcraft/models/project.py index faad024c..99a484cf 100644 --- a/sdkcraft/models/project.py +++ b/sdkcraft/models/project.py @@ -182,6 +182,19 @@ class TunnelSlot(models.CraftBaseModel): endpoint: Endpoint = "" +class VirtualizationPlug(models.CraftBaseModel): + """SDKcraft project virtualization plug definition.""" + + interface: Literal["virtualization"] + + def validate_policy(self, name: str) -> None: + """Check plug name.""" + if name != "virtualization": + raise ValueError( + "virtualization interface plugs must be named 'virtualization'" + ) + + type Plug = Annotated[ CameraPlug | CustomDevicePlug @@ -189,7 +202,8 @@ class TunnelSlot(models.CraftBaseModel): | GPUPlug | MountPlug | SSHAgentPlug - | TunnelPlug, + | TunnelPlug + | VirtualizationPlug, Discriminator("interface"), ] type Slot = Annotated[MountSlot | TunnelSlot, Discriminator("interface")] diff --git a/tests/unit/models/test_project.py b/tests/unit/models/test_project.py index a116bc38..9b4b6f81 100644 --- a/tests/unit/models/test_project.py +++ b/tests/unit/models/test_project.py @@ -34,6 +34,7 @@ Plugs, Project, SSHAgentPlug, + VirtualizationPlug, ) @@ -220,6 +221,7 @@ def test_implicit_interfaces(): desktop: desktop gpu: ssh-agent: 'ssh-agent' + virtualization: """) expected = { @@ -227,6 +229,7 @@ def test_implicit_interfaces(): "desktop": DesktopPlug(interface="desktop"), "gpu": GPUPlug(interface="gpu"), "ssh-agent": SSHAgentPlug(interface="ssh-agent"), + "virtualization": VirtualizationPlug(interface="virtualization"), } assert plugs_adapter.validate_python(plugs) == expected @@ -240,6 +243,14 @@ def test_interface_policies(): plugs_adapter.validate_python({"foo": {"interface": "ssh-agent"}}) +def test_virtualization_plug_policy(): + with pytest.raises( + ValidationError, + match="virtualization interface plugs must be named 'virtualization'", + ): + plugs_adapter.validate_python({"foo": {"interface": "virtualization"}}) + + part_adapter: TypeAdapter[Part] = TypeAdapter(Part)