From 7516db3600af10c04954b19ffae836c80ac2208c Mon Sep 17 00:00:00 2001
From: "J. Nick Koston" <nick@koston.org>
Date: Thu, 28 Oct 2021 23:22:17 -0500
Subject: [PATCH] Avoid circular import in network integration (#58655)

---
 homeassistant/components/network/__init__.py  | 61 ++---------------
 homeassistant/components/network/websocket.py | 66 +++++++++++++++++++
 2 files changed, 72 insertions(+), 55 deletions(-)
 create mode 100644 homeassistant/components/network/websocket.py

diff --git a/homeassistant/components/network/__init__.py b/homeassistant/components/network/__init__.py
index 024075ba2c1..e8a2c4c80fd 100644
--- a/homeassistant/components/network/__init__.py
+++ b/homeassistant/components/network/__init__.py
@@ -4,22 +4,12 @@ from __future__ import annotations
 from ipaddress import IPv4Address, IPv6Address, ip_interface
 import logging
 
-import voluptuous as vol
-
-from homeassistant.components import websocket_api
-from homeassistant.components.websocket_api.connection import ActiveConnection
 from homeassistant.core import HomeAssistant, callback
 from homeassistant.helpers.typing import ConfigType
 from homeassistant.loader import bind_hass
 
 from . import util
-from .const import (
-    ATTR_ADAPTERS,
-    ATTR_CONFIGURED_ADAPTERS,
-    DOMAIN,
-    IPV4_BROADCAST_ADDR,
-    NETWORK_CONFIG_SCHEMA,
-)
+from .const import DOMAIN, IPV4_BROADCAST_ADDR
 from .models import Adapter
 from .network import Network
 
@@ -107,50 +97,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
 
     _LOGGER.debug("Adapters: %s", network.adapters)
 
-    websocket_api.async_register_command(hass, websocket_network_adapters)
-    websocket_api.async_register_command(hass, websocket_network_adapters_configure)
-
-    return True
-
-
-@websocket_api.require_admin
-@websocket_api.websocket_command({vol.Required("type"): "network"})
-@websocket_api.async_response
-async def websocket_network_adapters(
-    hass: HomeAssistant,
-    connection: ActiveConnection,
-    msg: dict,
-) -> None:
-    """Return network preferences."""
-    network: Network = hass.data[DOMAIN]
-    connection.send_result(
-        msg["id"],
-        {
-            ATTR_ADAPTERS: network.adapters,
-            ATTR_CONFIGURED_ADAPTERS: network.configured_adapters,
-        },
+    # Avoid circular issue: http->network->websocket_api->http
+    from .websocket import (  # pylint: disable=import-outside-toplevel
+        async_register_websocket_commands,
     )
 
+    async_register_websocket_commands(hass)
 
-@websocket_api.require_admin
-@websocket_api.websocket_command(
-    {
-        vol.Required("type"): "network/configure",
-        vol.Required("config", default={}): NETWORK_CONFIG_SCHEMA,
-    }
-)
-@websocket_api.async_response
-async def websocket_network_adapters_configure(
-    hass: HomeAssistant,
-    connection: ActiveConnection,
-    msg: dict,
-) -> None:
-    """Update network config."""
-    network: Network = hass.data[DOMAIN]
-
-    await network.async_reconfig(msg["config"])
-
-    connection.send_result(
-        msg["id"],
-        {ATTR_CONFIGURED_ADAPTERS: network.configured_adapters},
-    )
+    return True
diff --git a/homeassistant/components/network/websocket.py b/homeassistant/components/network/websocket.py
new file mode 100644
index 00000000000..77e01375b75
--- /dev/null
+++ b/homeassistant/components/network/websocket.py
@@ -0,0 +1,66 @@
+"""The Network Configuration integration websocket commands."""
+from __future__ import annotations
+
+import voluptuous as vol
+
+from homeassistant.components import websocket_api
+from homeassistant.components.websocket_api.connection import ActiveConnection
+from homeassistant.core import HomeAssistant, callback
+
+from .const import (
+    ATTR_ADAPTERS,
+    ATTR_CONFIGURED_ADAPTERS,
+    DOMAIN,
+    NETWORK_CONFIG_SCHEMA,
+)
+from .network import Network
+
+
+@callback
+def async_register_websocket_commands(hass: HomeAssistant) -> None:
+    """Register network websocket commands."""
+    websocket_api.async_register_command(hass, websocket_network_adapters)
+    websocket_api.async_register_command(hass, websocket_network_adapters_configure)
+
+
+@websocket_api.require_admin
+@websocket_api.websocket_command({vol.Required("type"): "network"})
+@websocket_api.async_response
+async def websocket_network_adapters(
+    hass: HomeAssistant,
+    connection: ActiveConnection,
+    msg: dict,
+) -> None:
+    """Return network preferences."""
+    network: Network = hass.data[DOMAIN]
+    connection.send_result(
+        msg["id"],
+        {
+            ATTR_ADAPTERS: network.adapters,
+            ATTR_CONFIGURED_ADAPTERS: network.configured_adapters,
+        },
+    )
+
+
+@websocket_api.require_admin
+@websocket_api.websocket_command(
+    {
+        vol.Required("type"): "network/configure",
+        vol.Required("config", default={}): NETWORK_CONFIG_SCHEMA,
+    }
+)
+@websocket_api.async_response
+async def websocket_network_adapters_configure(
+    hass: HomeAssistant,
+    connection: ActiveConnection,
+    msg: dict,
+) -> None:
+    """Update network config."""
+    network: Network = hass.data[DOMAIN]
+
+    await network.async_reconfig(msg["config"])
+
+    connection.send_result(
+        msg["id"],
+        {ATTR_CONFIGURED_ADAPTERS: network.configured_adapters},
+    )
-- 
GitLab