mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Remove deprecated YAML configuration from ONVIF (#70395)
* Remove deprecated YAML configuration from ONVIF * remove async_setup completely
This commit is contained in:
parent
489e70bd7f
commit
9008a76bd4
@ -2,13 +2,8 @@
|
|||||||
from onvif.exceptions import ONVIFAuthError, ONVIFError, ONVIFTimeoutError
|
from onvif.exceptions import ONVIFAuthError, ONVIFError, ONVIFTimeoutError
|
||||||
|
|
||||||
from homeassistant.components.ffmpeg import CONF_EXTRA_ARGUMENTS
|
from homeassistant.components.ffmpeg import CONF_EXTRA_ARGUMENTS
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_HOST,
|
|
||||||
CONF_NAME,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_PORT,
|
|
||||||
CONF_USERNAME,
|
|
||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
HTTP_BASIC_AUTHENTICATION,
|
HTTP_BASIC_AUTHENTICATION,
|
||||||
HTTP_DIGEST_AUTHENTICATION,
|
HTTP_DIGEST_AUTHENTICATION,
|
||||||
@ -16,51 +11,17 @@ from homeassistant.const import (
|
|||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
from homeassistant.helpers import config_per_platform
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
CONF_RTSP_TRANSPORT,
|
CONF_RTSP_TRANSPORT,
|
||||||
CONF_SNAPSHOT_AUTH,
|
CONF_SNAPSHOT_AUTH,
|
||||||
DEFAULT_ARGUMENTS,
|
DEFAULT_ARGUMENTS,
|
||||||
DEFAULT_NAME,
|
|
||||||
DEFAULT_PASSWORD,
|
|
||||||
DEFAULT_PORT,
|
|
||||||
DEFAULT_USERNAME,
|
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
RTSP_TRANS_PROTOCOLS,
|
RTSP_TRANS_PROTOCOLS,
|
||||||
)
|
)
|
||||||
from .device import ONVIFDevice
|
from .device import ONVIFDevice
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
||||||
"""Set up the ONVIF component."""
|
|
||||||
# Import from yaml
|
|
||||||
configs = {}
|
|
||||||
for p_type, p_config in config_per_platform(config, "camera"):
|
|
||||||
if p_type != DOMAIN:
|
|
||||||
continue
|
|
||||||
|
|
||||||
config = p_config.copy()
|
|
||||||
if config[CONF_HOST] not in configs:
|
|
||||||
configs[config[CONF_HOST]] = {
|
|
||||||
CONF_HOST: config[CONF_HOST],
|
|
||||||
CONF_NAME: config.get(CONF_NAME, DEFAULT_NAME),
|
|
||||||
CONF_PASSWORD: config.get(CONF_PASSWORD, DEFAULT_PASSWORD),
|
|
||||||
CONF_PORT: config.get(CONF_PORT, DEFAULT_PORT),
|
|
||||||
CONF_USERNAME: config.get(CONF_USERNAME, DEFAULT_USERNAME),
|
|
||||||
}
|
|
||||||
|
|
||||||
for conf in configs.values():
|
|
||||||
hass.async_create_task(
|
|
||||||
hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": SOURCE_IMPORT}, data=conf
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
"""Set up ONVIF from a config entry."""
|
"""Set up ONVIF from a config entry."""
|
||||||
if DOMAIN not in hass.data:
|
if DOMAIN not in hass.data:
|
||||||
|
@ -261,10 +261,6 @@ class OnvifFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
finally:
|
finally:
|
||||||
await device.close()
|
await device.close()
|
||||||
|
|
||||||
async def async_step_import(self, user_input):
|
|
||||||
"""Handle import."""
|
|
||||||
return await self.async_step_configure(user_input)
|
|
||||||
|
|
||||||
|
|
||||||
class OnvifOptionsFlowHandler(config_entries.OptionsFlow):
|
class OnvifOptionsFlowHandler(config_entries.OptionsFlow):
|
||||||
"""Handle ONVIF options."""
|
"""Handle ONVIF options."""
|
||||||
|
@ -5,10 +5,7 @@ LOGGER = logging.getLogger(__package__)
|
|||||||
|
|
||||||
DOMAIN = "onvif"
|
DOMAIN = "onvif"
|
||||||
|
|
||||||
DEFAULT_NAME = "ONVIF Camera"
|
DEFAULT_PORT = 80
|
||||||
DEFAULT_PORT = 5000
|
|
||||||
DEFAULT_USERNAME = "admin"
|
|
||||||
DEFAULT_PASSWORD = "888888"
|
|
||||||
DEFAULT_ARGUMENTS = "-pred 1"
|
DEFAULT_ARGUMENTS = "-pred 1"
|
||||||
|
|
||||||
CONF_DEVICE_ID = "deviceid"
|
CONF_DEVICE_ID = "deviceid"
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
"""Test ONVIF config flow."""
|
"""Test ONVIF config flow."""
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from onvif.exceptions import ONVIFError
|
|
||||||
from zeep.exceptions import Fault
|
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries, data_entry_flow
|
||||||
from homeassistant.components.onvif import config_flow
|
from homeassistant.components.onvif import config_flow
|
||||||
|
|
||||||
@ -13,7 +10,6 @@ from . import (
|
|||||||
NAME,
|
NAME,
|
||||||
PASSWORD,
|
PASSWORD,
|
||||||
PORT,
|
PORT,
|
||||||
SERIAL_NUMBER,
|
|
||||||
URN,
|
URN,
|
||||||
USERNAME,
|
USERNAME,
|
||||||
setup_mock_device,
|
setup_mock_device,
|
||||||
@ -107,8 +103,6 @@ async def test_flow_discovered_devices(hass):
|
|||||||
assert result["step_id"] == "configure"
|
assert result["step_id"] == "configure"
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.onvif.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
||||||
) as mock_setup_entry:
|
) as mock_setup_entry:
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
@ -120,7 +114,6 @@ async def test_flow_discovered_devices(hass):
|
|||||||
)
|
)
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
assert len(mock_setup_entry.mock_calls) == 1
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||||
@ -290,8 +283,6 @@ async def test_flow_manual_entry(hass):
|
|||||||
assert result["step_id"] == "configure"
|
assert result["step_id"] == "configure"
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.onvif.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
||||||
) as mock_setup_entry:
|
) as mock_setup_entry:
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
@ -306,7 +297,6 @@ async def test_flow_manual_entry(hass):
|
|||||||
)
|
)
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
assert len(mock_setup_entry.mock_calls) == 1
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||||
@ -320,189 +310,6 @@ async def test_flow_manual_entry(hass):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_not_implemented(hass):
|
|
||||||
"""Test that config flow uses Serial Number when no MAC available."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera, patch(
|
|
||||||
"homeassistant.components.onvif.ONVIFDevice"
|
|
||||||
) as mock_device, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
|
||||||
) as mock_setup_entry:
|
|
||||||
setup_mock_onvif_camera(mock_onvif_camera, with_interfaces_not_implemented=True)
|
|
||||||
setup_mock_device(mock_device)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
||||||
assert result["title"] == f"{NAME} - {SERIAL_NUMBER}"
|
|
||||||
assert result["data"] == {
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_no_mac(hass):
|
|
||||||
"""Test that config flow uses Serial Number when no MAC available."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera, patch(
|
|
||||||
"homeassistant.components.onvif.ONVIFDevice"
|
|
||||||
) as mock_device, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.onvif.async_setup_entry", return_value=True
|
|
||||||
) as mock_setup_entry:
|
|
||||||
setup_mock_onvif_camera(mock_onvif_camera, with_interfaces=False)
|
|
||||||
setup_mock_device(mock_device)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
||||||
assert result["title"] == f"{NAME} - {SERIAL_NUMBER}"
|
|
||||||
assert result["data"] == {
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_no_mac_or_serial(hass):
|
|
||||||
"""Test that config flow fails when no MAC or Serial Number available."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera:
|
|
||||||
setup_mock_onvif_camera(
|
|
||||||
mock_onvif_camera, with_interfaces=False, with_serial=False
|
|
||||||
)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
||||||
assert result["reason"] == "no_mac"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_no_h264(hass):
|
|
||||||
"""Test that config flow fails when no MAC available."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera:
|
|
||||||
setup_mock_onvif_camera(mock_onvif_camera, with_h264=False)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
||||||
assert result["reason"] == "no_h264"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_onvif_api_error(hass):
|
|
||||||
"""Test that config flow fails when ONVIF API fails."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera:
|
|
||||||
setup_mock_onvif_camera(mock_onvif_camera)
|
|
||||||
mock_onvif_camera.create_devicemgmt_service = MagicMock(
|
|
||||||
side_effect=ONVIFError("Could not get device mgmt service")
|
|
||||||
)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
||||||
assert result["reason"] == "onvif_error"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_import_onvif_auth_error(hass):
|
|
||||||
"""Test that config flow fails when ONVIF API fails."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.onvif.config_flow.get_device"
|
|
||||||
) as mock_onvif_camera:
|
|
||||||
setup_mock_onvif_camera(mock_onvif_camera)
|
|
||||||
mock_onvif_camera.create_devicemgmt_service = MagicMock(
|
|
||||||
side_effect=Fault("Auth Error")
|
|
||||||
)
|
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
config_flow.DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
config_flow.CONF_NAME: NAME,
|
|
||||||
config_flow.CONF_HOST: HOST,
|
|
||||||
config_flow.CONF_PORT: PORT,
|
|
||||||
config_flow.CONF_USERNAME: USERNAME,
|
|
||||||
config_flow.CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
||||||
assert result["step_id"] == "configure"
|
|
||||||
assert result["errors"]["base"] == "cannot_connect"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_option_flow(hass):
|
async def test_option_flow(hass):
|
||||||
"""Test config flow options."""
|
"""Test config flow options."""
|
||||||
entry, _, _ = await setup_onvif_integration(hass)
|
entry, _, _ = await setup_onvif_integration(hass)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user