from pydantic import BaseModel, Field from typing import List, Dict, Optional class Nameservers(BaseModel): addresses: List[str] = Field(default_factory=list) search: List[str] = Field(default_factory=list) class EthernetConfig(BaseModel): dhcp4: Optional[bool] = None dhcp6: Optional[bool] = None addresses: Optional[List[str]] = None gateway4: Optional[str] = None gateway6: Optional[str] = None nameservers: Optional[Nameservers] = None optional: Optional[bool] = None class BridgeConfig(BaseModel): interfaces: List[str] = Field(default_factory=list) # ["eth1", "eth2"] dhcp4: Optional[bool] = None dhcp6: Optional[bool] = None addresses: Optional[List[str]] = None gateway4: Optional[str] = None gateway6: Optional[str] = None nameservers: Optional[Nameservers] = None parameters: Optional[dict] = None # allows spanning-tree, port-priority, forward-delay, etc. optional: Optional[bool] = None class NetworkConfig(BaseModel): version: int = 2 renderer: Optional[str] = "networkd" ethernets: Dict[str, EthernetConfig] = Field(default_factory=dict) bridges: Dict[str, BridgeConfig] = Field(default_factory=dict) '''Example usage: { "version": 2, "renderer": "networkd", "ethernets": { "eth0": { "dhcp4": false, "addresses": ["192.168.10.20/24"], "gateway4": "192.168.10.1", "nameservers": { "addresses": ["1.1.1.1", "8.8.8.8"] } }, "eth1": {}, "eth2": {} }, "bridges": { "br0": { "interfaces": ["eth1", "eth2"], "dhcp4": true } } }'''