From ab4162601fb0b0a391ab19e802928a2764fc68d4 Mon Sep 17 00:00:00 2001 From: Manu <4445816+tr4nt0r@users.noreply.github.com> Date: Tue, 5 May 2026 07:45:40 +0200 Subject: [PATCH] Remove YAML import from Duck DNS integration (#169769) --- homeassistant/components/duckdns/__init__.py | 26 +---- .../components/duckdns/config_flow.py | 13 --- homeassistant/components/duckdns/issue.py | 36 +----- homeassistant/components/duckdns/strings.json | 4 - tests/components/duckdns/test_config_flow.py | 108 +----------------- 5 files changed, 4 insertions(+), 183 deletions(-) diff --git a/homeassistant/components/duckdns/__init__.py b/homeassistant/components/duckdns/__init__.py index 6843a9348d4..e7fab85777d 100644 --- a/homeassistant/components/duckdns/__init__.py +++ b/homeassistant/components/duckdns/__init__.py @@ -2,10 +2,6 @@ import logging -import voluptuous as vol - -from homeassistant.config_entries import SOURCE_IMPORT -from homeassistant.const import CONF_ACCESS_TOKEN, CONF_DOMAIN from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv from homeassistant.helpers.typing import ConfigType @@ -16,18 +12,7 @@ from .services import async_setup_services _LOGGER = logging.getLogger(__name__) - -CONFIG_SCHEMA = vol.Schema( - { - DOMAIN: vol.Schema( - { - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_ACCESS_TOKEN): cv.string, - } - ) - }, - extra=vol.ALLOW_EXTRA, -) +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -35,15 +20,6 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async_setup_services(hass) - if DOMAIN not in config: - return True - - hass.async_create_task( - hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data=config[DOMAIN] - ) - ) - return True diff --git a/homeassistant/components/duckdns/config_flow.py b/homeassistant/components/duckdns/config_flow.py index 84e2815f60f..4a2bf9036f2 100644 --- a/homeassistant/components/duckdns/config_flow.py +++ b/homeassistant/components/duckdns/config_flow.py @@ -16,7 +16,6 @@ from homeassistant.helpers.selector import ( from .const import DOMAIN from .helpers import update_duckdns -from .issue import deprecate_yaml_issue _LOGGER = logging.getLogger(__name__) @@ -68,18 +67,6 @@ class DuckDnsConfigFlow(ConfigFlow, domain=DOMAIN): description_placeholders={"url": "https://www.duckdns.org/"}, ) - async def async_step_import(self, import_info: dict[str, Any]) -> ConfigFlowResult: - """Import config from yaml.""" - - self._async_abort_entries_match({CONF_DOMAIN: import_info[CONF_DOMAIN]}) - result = await self.async_step_user(import_info) - if errors := result.get("errors"): - deprecate_yaml_issue(self.hass, import_success=False) - return self.async_abort(reason=errors["base"]) - - deprecate_yaml_issue(self.hass, import_success=True) - return result - async def async_step_reconfigure( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: diff --git a/homeassistant/components/duckdns/issue.py b/homeassistant/components/duckdns/issue.py index 34a23fdbc63..af764ae7f38 100644 --- a/homeassistant/components/duckdns/issue.py +++ b/homeassistant/components/duckdns/issue.py @@ -1,45 +1,11 @@ """Issues for Duck DNS integration.""" -from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant, callback +from homeassistant.core import HomeAssistant from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue from .const import DOMAIN -@callback -def deprecate_yaml_issue(hass: HomeAssistant, *, import_success: bool) -> None: - """Deprecate yaml issue.""" - if import_success: - async_create_issue( - hass, - HOMEASSISTANT_DOMAIN, - f"deprecated_yaml_{DOMAIN}", - is_fixable=False, - issue_domain=DOMAIN, - breaks_in_ha_version="2026.6.0", - severity=IssueSeverity.WARNING, - translation_key="deprecated_yaml", - translation_placeholders={ - "domain": DOMAIN, - "integration_title": "Duck DNS", - }, - ) - else: - async_create_issue( - hass, - DOMAIN, - "deprecated_yaml_import_issue_error", - breaks_in_ha_version="2026.6.0", - is_fixable=False, - issue_domain=DOMAIN, - severity=IssueSeverity.WARNING, - translation_key="deprecated_yaml_import_issue_error", - translation_placeholders={ - "url": "/config/integrations/dashboard/add?domain=duckdns" - }, - ) - - def action_called_without_config_entry(hass: HomeAssistant) -> None: """Deprecate the use of action without config entry.""" diff --git a/homeassistant/components/duckdns/strings.json b/homeassistant/components/duckdns/strings.json index 87262c913e3..9581a1cc111 100644 --- a/homeassistant/components/duckdns/strings.json +++ b/homeassistant/components/duckdns/strings.json @@ -49,10 +49,6 @@ "deprecated_call_without_config_entry": { "description": "Calling the `duckdns.set_txt` action without specifying a config entry is deprecated.\n\nThe `config_entry_id` field will be required in a future release.\n\nPlease update your automations and scripts to include the `config_entry_id` parameter.", "title": "Detected deprecated use of action without config entry" - }, - "deprecated_yaml_import_issue_error": { - "description": "Configuring Duck DNS using YAML is being removed but there was an error when trying to import the YAML configuration.\n\nEnsure the YAML configuration is correct and restart Home Assistant to try again or remove the Duck DNS YAML configuration from your `configuration.yaml` file and continue to [set up the integration]({url}) manually.", - "title": "The Duck DNS YAML configuration import failed" } }, "services": { diff --git a/tests/components/duckdns/test_config_flow.py b/tests/components/duckdns/test_config_flow.py index d5011e6bedc..9909aa2b5a2 100644 --- a/tests/components/duckdns/test_config_flow.py +++ b/tests/components/duckdns/test_config_flow.py @@ -5,12 +5,10 @@ from unittest.mock import AsyncMock import pytest from homeassistant.components.duckdns import DOMAIN -from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER +from homeassistant.config_entries import SOURCE_USER from homeassistant.const import CONF_ACCESS_TOKEN, CONF_DOMAIN -from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant +from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType -from homeassistant.helpers import issue_registry as ir -from homeassistant.setup import async_setup_component from .conftest import NEW_TOKEN, TEST_SUBDOMAIN, TEST_TOKEN @@ -120,108 +118,6 @@ async def test_form_errors( assert len(mock_setup_entry.mock_calls) == 1 -@pytest.mark.usefixtures("mock_update_duckdns") -async def test_import( - hass: HomeAssistant, - mock_setup_entry: AsyncMock, - issue_registry: ir.IssueRegistry, -) -> None: - """Test import flow.""" - - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_IMPORT}, - data={ - CONF_DOMAIN: TEST_SUBDOMAIN, - CONF_ACCESS_TOKEN: TEST_TOKEN, - }, - ) - - assert result["type"] is FlowResultType.CREATE_ENTRY - assert result["title"] == f"{TEST_SUBDOMAIN}.duckdns.org" - assert result["data"] == { - CONF_DOMAIN: TEST_SUBDOMAIN, - CONF_ACCESS_TOKEN: TEST_TOKEN, - } - assert len(mock_setup_entry.mock_calls) == 1 - assert issue_registry.async_get_issue( - domain=HOMEASSISTANT_DOMAIN, - issue_id=f"deprecated_yaml_{DOMAIN}", - ) - - -async def test_import_failed( - hass: HomeAssistant, - mock_setup_entry: AsyncMock, - issue_registry: ir.IssueRegistry, - mock_update_duckdns: AsyncMock, -) -> None: - """Test import flow failed.""" - mock_update_duckdns.return_value = False - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_IMPORT}, - data={ - CONF_DOMAIN: TEST_SUBDOMAIN, - CONF_ACCESS_TOKEN: TEST_TOKEN, - }, - ) - - assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "update_failed" - - assert len(mock_setup_entry.mock_calls) == 0 - - assert issue_registry.async_get_issue( - domain=DOMAIN, - issue_id="deprecated_yaml_import_issue_error", - ) - - -async def test_import_exception( - hass: HomeAssistant, - mock_setup_entry: AsyncMock, - issue_registry: ir.IssueRegistry, - mock_update_duckdns: AsyncMock, -) -> None: - """Test import flow failed unknown.""" - mock_update_duckdns.side_effect = ValueError - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_IMPORT}, - data={ - CONF_DOMAIN: TEST_SUBDOMAIN, - CONF_ACCESS_TOKEN: TEST_TOKEN, - }, - ) - - assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "unknown" - - assert len(mock_setup_entry.mock_calls) == 0 - - assert issue_registry.async_get_issue( - domain=DOMAIN, - issue_id="deprecated_yaml_import_issue_error", - ) - - -@pytest.mark.usefixtures("mock_update_duckdns") -async def test_init_import_flow( - hass: HomeAssistant, - mock_setup_entry: AsyncMock, -) -> None: - """Test yaml triggers import flow.""" - - await async_setup_component( - hass, - DOMAIN, - {"duckdns": {CONF_DOMAIN: TEST_SUBDOMAIN, CONF_ACCESS_TOKEN: TEST_TOKEN}}, - ) - assert len(mock_setup_entry.mock_calls) == 1 - assert len(hass.config_entries.async_entries(DOMAIN)) == 1 - - @pytest.mark.usefixtures("mock_update_duckdns", "mock_setup_entry") async def test_flow_reconfigure( hass: HomeAssistant,