Skip to content

Commit 67fe1ea

Browse files
authored
feat: Add mDNS/LLMNR properties Network API (#173)
1 parent 6195e1b commit 67fe1ea

File tree

5 files changed

+48
-6
lines changed

5 files changed

+48
-6
lines changed

aiohasupervisor/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
IPv4Config,
100100
IPv6,
101101
IPv6Config,
102+
MulticastDnsMode,
102103
NetworkInfo,
103104
NetworkInterface,
104105
NetworkInterfaceConfig,
@@ -235,6 +236,7 @@
235236
"MountUsage",
236237
"MountsInfo",
237238
"MountsOptions",
239+
"MulticastDnsMode",
238240
"NFSMountRequest",
239241
"NFSMountResponse",
240242
"NetworkInfo",

aiohasupervisor/models/network.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ class AuthMethod(StrEnum):
4949
WPA_PSK = "wpa-psk"
5050

5151

52+
class MulticastDnsMode(StrEnum):
53+
"""Multicast DNS working mode."""
54+
55+
DEFAULT = "default"
56+
OFF = "off"
57+
RESOLVE = "resolve"
58+
ANNOUNCE = "announce"
59+
60+
5261
# --- OBJECTS ----
5362

5463

@@ -110,6 +119,8 @@ class NetworkInterface(ResponseData):
110119
ipv6: IPv6
111120
wifi: Wifi | None
112121
vlan: Vlan | None
122+
mdns: MulticastDnsMode
123+
llmnr: MulticastDnsMode
113124

114125

115126
@dataclass(frozen=True, slots=True)
@@ -169,6 +180,8 @@ class NetworkInterfaceConfig(Options):
169180
ipv4: IPv4Config | None = None
170181
ipv6: IPv6Config | None = None
171182
wifi: WifiConfig | None = None
183+
mdns: MulticastDnsMode | None = None
184+
llmnr: MulticastDnsMode | None = None
172185
enabled: bool | None = None
173186

174187

@@ -196,3 +209,5 @@ class VlanConfig(Options):
196209

197210
ipv4: IPv4Config | None = None
198211
ipv6: IPv6Config | None = None
212+
mdns: MulticastDnsMode | None = None
213+
llmnr: MulticastDnsMode | None = None

tests/fixtures/network_info.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
"ready": true
2525
},
2626
"wifi": null,
27-
"vlan": null
27+
"vlan": null,
28+
"mdns": "default",
29+
"llmnr": "default"
2830
}
2931
],
3032
"docker": {

tests/fixtures/network_interface_info.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"ready": true
2323
},
2424
"wifi": null,
25-
"vlan": null
25+
"vlan": null,
26+
"mdns": "announce",
27+
"llmnr": "announce"
2628
}
2729
}

tests/test_network.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from aiohasupervisor.models import (
1111
InterfaceMethod,
1212
IPv4Config,
13+
MulticastDnsMode,
1314
NetworkInterfaceConfig,
1415
VlanConfig,
1516
)
@@ -45,6 +46,8 @@ async def test_network_info(
4546
assert result.interfaces[0].ipv6.gateway is None
4647
assert result.interfaces[0].wifi is None
4748
assert result.interfaces[0].vlan is None
49+
assert result.interfaces[0].mdns is MulticastDnsMode.DEFAULT
50+
assert result.interfaces[0].llmnr is MulticastDnsMode.DEFAULT
4851

4952
assert result.docker.interface == "hassio"
5053
assert result.docker.address.compressed == "172.30.32.0/23"
@@ -89,6 +92,8 @@ async def test_network_interface_info(
8992
assert result.ipv6.gateway is None
9093
assert result.wifi is None
9194
assert result.vlan is None
95+
assert result.mdns is MulticastDnsMode.ANNOUNCE
96+
assert result.llmnr is MulticastDnsMode.ANNOUNCE
9297

9398

9499
async def test_network_update_interface(
@@ -102,13 +107,25 @@ async def test_network_update_interface(
102107
address=[IPv4Interface("192.168.1.2/24")],
103108
gateway=IPv4Address("192.168.1.1"),
104109
nameservers=[IPv4Address("192.168.1.1")],
105-
)
110+
),
111+
mdns=MulticastDnsMode.OFF,
106112
)
107113
assert (
108114
await supervisor_client.network.update_interface("end0", config=config) is None
109115
)
110-
assert responses.requests.keys() == {
111-
("POST", URL(f"{SUPERVISOR_URL}/network/interface/end0/update"))
116+
117+
request_key = ("POST", URL(f"{SUPERVISOR_URL}/network/interface/end0/update"))
118+
assert responses.requests.keys() == {request_key}
119+
120+
assert len(responses.requests[request_key]) == 1
121+
assert responses.requests[request_key][0].kwargs["json"] == {
122+
"ipv4": {
123+
"address": ["192.168.1.2/24"],
124+
"gateway": "192.168.1.1",
125+
"method": "static",
126+
"nameservers": ["192.168.1.1"],
127+
},
128+
"mdns": "off",
112129
}
113130

114131

@@ -132,7 +149,11 @@ async def test_network_access_points(
132149

133150
@pytest.mark.parametrize(
134151
"config",
135-
[None, NetworkInterfaceConfig(ipv4=IPv4Config(method=InterfaceMethod.AUTO))],
152+
[
153+
None,
154+
NetworkInterfaceConfig(ipv4=IPv4Config(method=InterfaceMethod.AUTO)),
155+
NetworkInterfaceConfig(mdns=MulticastDnsMode.OFF),
156+
],
136157
)
137158
async def test_network_save_vlan(
138159
responses: aioresponses,

0 commit comments

Comments
 (0)