"""Config flow to configure TrueNAS.""" from __future__ import annotations from logging import getLogger from typing import Any import voluptuous as vol from homeassistant.config_entries import CONN_CLASS_LOCAL_POLL, ConfigFlow from homeassistant.const import ( CONF_API_KEY, CONF_HOST, CONF_NAME, CONF_SSL, CONF_VERIFY_SSL, ) from homeassistant.core import callback from homeassistant.data_entry_flow import FlowResult from .const import ( DEFAULT_DEVICE_NAME, DEFAULT_HOST, DEFAULT_SSL, DEFAULT_SSL_VERIFY, DOMAIN, ) from .api import TrueNASAPI _LOGGER = getLogger(__name__) # --------------------------- # configured_instances # --------------------------- @callback def configured_instances(hass): """Return a set of configured instances.""" return { entry.data[CONF_NAME] for entry in hass.config_entries.async_entries(DOMAIN) } # --------------------------- # TrueNASConfigFlow # --------------------------- class TrueNASConfigFlow(ConfigFlow, domain=DOMAIN): """TrueNASConfigFlow class.""" VERSION = 1 CONNECTION_CLASS = CONN_CLASS_LOCAL_POLL async def async_step_import( self, user_input: dict[str, Any] | None = None ) -> FlowResult: """Occurs when a previous entry setup fails and is re-initiated.""" return await self.async_step_user(user_input) async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> FlowResult: """Handle a flow initialized by the user.""" errors = {} if user_input is not None: # Check if instance with this name already exists if user_input[CONF_NAME] in configured_instances(self.hass): errors["base"] = "name_exists" # Test connection api = await self.hass.async_add_executor_job( TrueNASAPI, self.hass, user_input[CONF_HOST], user_input[CONF_API_KEY], user_input[CONF_SSL], user_input[CONF_VERIFY_SSL], ) conn, errorcode = await self.hass.async_add_executor_job( api.connection_test ) if not conn: errors[CONF_HOST] = errorcode _LOGGER.error("TrueNAS connection error (%s)", errorcode) # Save instance if not errors: return self.async_create_entry( title=user_input[CONF_NAME], data=user_input ) return self._show_config_form(user_input=user_input, errors=errors) return self._show_config_form( user_input={ CONF_NAME: DEFAULT_DEVICE_NAME, CONF_HOST: DEFAULT_HOST, CONF_API_KEY: "", CONF_SSL: DEFAULT_SSL, CONF_VERIFY_SSL: DEFAULT_SSL_VERIFY, }, errors=errors, ) def _show_config_form( self, user_input: dict[str, Any] | None, errors: dict[str, Any] | None = None ) -> FlowResult: """Show the configuration form.""" return self.async_show_form( step_id="user", data_schema=vol.Schema( { vol.Required(CONF_NAME, default=user_input[CONF_NAME]): str, vol.Required(CONF_HOST, default=user_input[CONF_HOST]): str, vol.Required(CONF_API_KEY, default=user_input[CONF_API_KEY]): str, vol.Optional(CONF_SSL, default=user_input[CONF_SSL]): bool, vol.Optional( CONF_VERIFY_SSL, default=user_input[CONF_VERIFY_SSL] ): bool, } ), errors=errors, )