1 """Support for Amazon Web Services (AWS)."""
4 from collections
import OrderedDict
7 from aiobotocore.session
import AioSession
8 import voluptuous
as vol
10 from homeassistant
import config_entries
31 CONF_SECRET_ACCESS_KEY,
39 _LOGGER = logging.getLogger(__name__)
41 AWS_CREDENTIAL_SCHEMA = vol.Schema(
43 vol.Required(CONF_NAME): cv.string,
44 vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string,
45 vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
46 vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
47 vol.Optional(CONF_VALIDATE, default=
True): cv.boolean,
51 DEFAULT_CREDENTIAL = [
52 {CONF_NAME:
"default", CONF_PROFILE_NAME:
"default", CONF_VALIDATE:
False}
55 SUPPORTED_SERVICES = [
"lambda",
"sns",
"sqs",
"events"]
57 NOTIFY_PLATFORM_SCHEMA = vol.Schema(
59 vol.Optional(CONF_NAME): cv.string,
60 vol.Required(CONF_SERVICE): vol.All(
61 cv.string, vol.Lower, vol.In(SUPPORTED_SERVICES)
63 vol.Required(CONF_REGION): vol.All(cv.string, vol.Lower),
64 vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string,
65 vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
66 vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
67 vol.Exclusive(CONF_CREDENTIAL_NAME, ATTR_CREDENTIALS): cv.string,
68 vol.Optional(CONF_CONTEXT): vol.Coerce(dict),
72 CONFIG_SCHEMA = vol.Schema(
76 vol.Optional(CONF_CREDENTIALS, default=DEFAULT_CREDENTIAL): vol.All(
77 cv.ensure_list, [AWS_CREDENTIAL_SCHEMA]
79 vol.Optional(CONF_NOTIFY, default=[]): vol.All(
80 cv.ensure_list, [NOTIFY_PLATFORM_SCHEMA]
85 extra=vol.ALLOW_EXTRA,
89 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
90 """Set up AWS component."""
91 hass.data[DATA_HASS_CONFIG] = config
93 if (conf := config.get(DOMAIN))
is None:
97 hass.data[DATA_CONFIG] = conf
98 hass.data[DATA_SESSIONS] = OrderedDict()
100 hass.async_create_task(
101 hass.config_entries.flow.async_init(
102 DOMAIN, context={
"source": config_entries.SOURCE_IMPORT}, data=conf
110 """Load a config entry.
112 Validate and save sessions per aws credential.
114 config = hass.data[DATA_HASS_CONFIG]
115 conf = hass.data[DATA_CONFIG]
117 if entry.source == config_entries.SOURCE_IMPORT:
120 hass.async_create_task(hass.config_entries.async_remove(entry.entry_id))
123 if conf != entry.data:
125 hass.config_entries.async_update_entry(entry, data=conf)
134 results = await asyncio.gather(*tasks, return_exceptions=
True)
135 for index, result
in enumerate(results):
136 name = conf[ATTR_CREDENTIALS][index][CONF_NAME]
137 if isinstance(result, Exception):
139 "Validating credential [%s] failed: %s",
146 hass.data[DATA_SESSIONS][name] = result
150 for notify_config
in conf[CONF_NOTIFY]:
151 hass.async_create_task(
152 discovery.async_load_platform(
153 hass, Platform.NOTIFY, DOMAIN, notify_config, config
161 """Validate AWS credential config."""
162 aws_config = credential.copy()
163 del aws_config[CONF_NAME]
164 del aws_config[CONF_VALIDATE]
166 if (profile := aws_config.get(CONF_PROFILE_NAME))
is not None:
167 session = AioSession(profile=profile)
168 del aws_config[CONF_PROFILE_NAME]
169 if CONF_ACCESS_KEY_ID
in aws_config:
170 del aws_config[CONF_ACCESS_KEY_ID]
171 if CONF_SECRET_ACCESS_KEY
in aws_config:
172 del aws_config[CONF_SECRET_ACCESS_KEY]
174 session = AioSession()
176 if credential[CONF_VALIDATE]:
177 async
with session.create_client(
"iam", **aws_config)
as client:
178 await client.get_user()
def _validate_aws_credentials(hass, credential)
bool async_setup(HomeAssistant hass, ConfigType config)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)