mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-10 10:46:29 +00:00
Add arch to addon config / hole api (#38)
* Add arch to addon config / hole api * fix wrong copy past
This commit is contained in:
parent
5bd1957337
commit
c2ba02722c
11
API.md
11
API.md
@ -32,16 +32,18 @@ The addons from `addons` are only installed one.
|
|||||||
{
|
{
|
||||||
"version": "INSTALL_VERSION",
|
"version": "INSTALL_VERSION",
|
||||||
"last_version": "LAST_VERSION",
|
"last_version": "LAST_VERSION",
|
||||||
|
"arch": "armhf|aarch64|i386|amd64",
|
||||||
"beta_channel": "true|false",
|
"beta_channel": "true|false",
|
||||||
"addons": [
|
"addons": [
|
||||||
{
|
{
|
||||||
"name": "xy bla",
|
"name": "xy bla",
|
||||||
"slug": "xy",
|
"slug": "xy",
|
||||||
|
"description": "description",
|
||||||
|
"arch": ["armhf", "aarch64", "i386", "amd64"],
|
||||||
"repository": "12345678|null",
|
"repository": "12345678|null",
|
||||||
"version": "LAST_VERSION",
|
"version": "LAST_VERSION",
|
||||||
"installed": "INSTALL_VERSION",
|
"installed": "INSTALL_VERSION",
|
||||||
"detached": "bool",
|
"detached": "bool"
|
||||||
"description": "description"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"addons_repositories": [
|
"addons_repositories": [
|
||||||
@ -60,11 +62,12 @@ Get all available addons
|
|||||||
{
|
{
|
||||||
"name": "xy bla",
|
"name": "xy bla",
|
||||||
"slug": "xy",
|
"slug": "xy",
|
||||||
|
"description": "description",
|
||||||
|
"arch": ["armhf", "aarch64", "i386", "amd64"],
|
||||||
"repository": "core|local|REP_ID",
|
"repository": "core|local|REP_ID",
|
||||||
"version": "LAST_VERSION",
|
"version": "LAST_VERSION",
|
||||||
"installed": "none|INSTALL_VERSION",
|
"installed": "none|INSTALL_VERSION",
|
||||||
"detached": "bool",
|
"detached": "bool"
|
||||||
"description": "description"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"repositories": [
|
"repositories": [
|
||||||
|
@ -108,6 +108,10 @@ class AddonManager(AddonsData):
|
|||||||
_LOGGER.error("Addon %s not exists for install", addon)
|
_LOGGER.error("Addon %s not exists for install", addon)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if self.arch not in self.get_arch(addon):
|
||||||
|
_LOGGER.error("Addon %s not supported on %s", addon, self.arch)
|
||||||
|
return False
|
||||||
|
|
||||||
if self.is_installed(addon):
|
if self.is_installed(addon):
|
||||||
_LOGGER.error("Addon %s is already installed", addon)
|
_LOGGER.error("Addon %s is already installed", addon)
|
||||||
return False
|
return False
|
||||||
|
@ -14,7 +14,7 @@ from ..const import (
|
|||||||
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
|
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
|
||||||
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO,
|
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO,
|
||||||
DOCKER_REPO, ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS,
|
DOCKER_REPO, ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS,
|
||||||
MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL)
|
MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH)
|
||||||
from ..config import Config
|
from ..config import Config
|
||||||
from ..tools import read_json_file, write_json_file
|
from ..tools import read_json_file, write_json_file
|
||||||
|
|
||||||
@ -294,6 +294,12 @@ class AddonsData(Config):
|
|||||||
"""Return url of addon."""
|
"""Return url of addon."""
|
||||||
return self._system_data[addon].get(ATTR_URL)
|
return self._system_data[addon].get(ATTR_URL)
|
||||||
|
|
||||||
|
def get_arch(self, addon):
|
||||||
|
"""Return list of supported arch."""
|
||||||
|
if addon not in self._addons_cache:
|
||||||
|
return self._system_data[addon][ATTR_ARCH]
|
||||||
|
return self._addons_cache[addon][ATTR_ARCH]
|
||||||
|
|
||||||
def get_image(self, addon):
|
def get_image(self, addon):
|
||||||
"""Return image name of addon."""
|
"""Return image name of addon."""
|
||||||
addon_data = self._system_data.get(
|
addon_data = self._system_data.get(
|
||||||
|
@ -5,7 +5,8 @@ from ..const import (
|
|||||||
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP,
|
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP,
|
||||||
ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER,
|
ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER,
|
||||||
STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, MAP_SSL,
|
STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, MAP_SSL,
|
||||||
MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER)
|
MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH,
|
||||||
|
ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386)
|
||||||
|
|
||||||
V_STR = 'str'
|
V_STR = 'str'
|
||||||
V_INT = 'int'
|
V_INT = 'int'
|
||||||
@ -16,12 +17,18 @@ V_URL = 'url'
|
|||||||
|
|
||||||
ADDON_ELEMENT = vol.In([V_STR, V_INT, V_FLOAT, V_BOOL, V_EMAIL, V_URL])
|
ADDON_ELEMENT = vol.In([V_STR, V_INT, V_FLOAT, V_BOOL, V_EMAIL, V_URL])
|
||||||
|
|
||||||
|
ARCH_ALL = [
|
||||||
|
ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386
|
||||||
|
]
|
||||||
|
|
||||||
# pylint: disable=no-value-for-parameter
|
# pylint: disable=no-value-for-parameter
|
||||||
SCHEMA_ADDON_CONFIG = vol.Schema({
|
SCHEMA_ADDON_CONFIG = vol.Schema({
|
||||||
vol.Required(ATTR_NAME): vol.Coerce(str),
|
vol.Required(ATTR_NAME): vol.Coerce(str),
|
||||||
vol.Required(ATTR_VERSION): vol.Coerce(str),
|
vol.Required(ATTR_VERSION): vol.Coerce(str),
|
||||||
vol.Required(ATTR_SLUG): vol.Coerce(str),
|
vol.Required(ATTR_SLUG): vol.Coerce(str),
|
||||||
vol.Required(ATTR_DESCRIPTON): vol.Coerce(str),
|
vol.Required(ATTR_DESCRIPTON): vol.Coerce(str),
|
||||||
|
vol.Optional(ATTR_URL): vol.Url(),
|
||||||
|
vol.Optional(ATTR_ARCH, default=ARCH_ALL): [vol.In(ARCH_ALL)],
|
||||||
vol.Required(ATTR_STARTUP):
|
vol.Required(ATTR_STARTUP):
|
||||||
vol.In([STARTUP_BEFORE, STARTUP_AFTER, STARTUP_ONCE]),
|
vol.In([STARTUP_BEFORE, STARTUP_AFTER, STARTUP_ONCE]),
|
||||||
vol.Required(ATTR_BOOT):
|
vol.Required(ATTR_BOOT):
|
||||||
@ -30,7 +37,6 @@ SCHEMA_ADDON_CONFIG = vol.Schema({
|
|||||||
vol.Optional(ATTR_MAP, default=[]): [
|
vol.Optional(ATTR_MAP, default=[]): [
|
||||||
vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP])
|
vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP])
|
||||||
],
|
],
|
||||||
vol.Optional(ATTR_URL): vol.Url(),
|
|
||||||
vol.Required(ATTR_OPTIONS): dict,
|
vol.Required(ATTR_OPTIONS): dict,
|
||||||
vol.Required(ATTR_SCHEMA): {
|
vol.Required(ATTR_SCHEMA): {
|
||||||
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [
|
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [
|
||||||
|
@ -88,6 +88,11 @@ class APIAddons(object):
|
|||||||
version = body.get(
|
version = body.get(
|
||||||
ATTR_VERSION, self.addons.get_last_version(addon))
|
ATTR_VERSION, self.addons.get_last_version(addon))
|
||||||
|
|
||||||
|
# check if arch supported
|
||||||
|
if self.addons.arch not in self.addons.get_arch(addon):
|
||||||
|
raise RuntimeError(
|
||||||
|
"Addon is not supported on {}".format(self.addons.arch))
|
||||||
|
|
||||||
return await asyncio.shield(
|
return await asyncio.shield(
|
||||||
self.addons.install(addon, version), loop=self.loop)
|
self.addons.install(addon, version), loop=self.loop)
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ from ..const import (
|
|||||||
ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL,
|
ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL,
|
||||||
HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES,
|
HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES,
|
||||||
ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED,
|
ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED,
|
||||||
ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL)
|
ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL, ATTR_ARCH)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -55,6 +55,7 @@ class APISupervisor(object):
|
|||||||
ATTR_DESCRIPTON: values[ATTR_DESCRIPTON],
|
ATTR_DESCRIPTON: values[ATTR_DESCRIPTON],
|
||||||
ATTR_VERSION: values[ATTR_VERSION],
|
ATTR_VERSION: values[ATTR_VERSION],
|
||||||
ATTR_INSTALLED: i_version,
|
ATTR_INSTALLED: i_version,
|
||||||
|
ATTR_ARCH: values[ATTR_ARCH],
|
||||||
ATTR_DETACHED: addon in detached,
|
ATTR_DETACHED: addon in detached,
|
||||||
ATTR_REPOSITORY: values[ATTR_REPOSITORY],
|
ATTR_REPOSITORY: values[ATTR_REPOSITORY],
|
||||||
})
|
})
|
||||||
@ -89,6 +90,7 @@ class APISupervisor(object):
|
|||||||
ATTR_VERSION: HASSIO_VERSION,
|
ATTR_VERSION: HASSIO_VERSION,
|
||||||
ATTR_LAST_VERSION: self.config.last_hassio,
|
ATTR_LAST_VERSION: self.config.last_hassio,
|
||||||
ATTR_BETA_CHANNEL: self.config.upstream_beta,
|
ATTR_BETA_CHANNEL: self.config.upstream_beta,
|
||||||
|
ATTR_ARCH: self.addons.arch,
|
||||||
ATTR_ADDONS: self._addons_list(only_installed=True),
|
ATTR_ADDONS: self._addons_list(only_installed=True),
|
||||||
ATTR_ADDONS_REPOSITORIES: self.config.addons_repositories,
|
ATTR_ADDONS_REPOSITORIES: self.config.addons_repositories,
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ JSON_MESSAGE = 'message'
|
|||||||
RESULT_ERROR = 'error'
|
RESULT_ERROR = 'error'
|
||||||
RESULT_OK = 'ok'
|
RESULT_OK = 'ok'
|
||||||
|
|
||||||
|
ATTR_ARCH = 'arch'
|
||||||
ATTR_HOSTNAME = 'hostname'
|
ATTR_HOSTNAME = 'hostname'
|
||||||
ATTR_OS = 'os'
|
ATTR_OS = 'os'
|
||||||
ATTR_TYPE = 'type'
|
ATTR_TYPE = 'type'
|
||||||
@ -75,3 +76,8 @@ MAP_CONFIG = 'config'
|
|||||||
MAP_SSL = 'ssl'
|
MAP_SSL = 'ssl'
|
||||||
MAP_ADDONS = 'addons'
|
MAP_ADDONS = 'addons'
|
||||||
MAP_BACKUP = 'backup'
|
MAP_BACKUP = 'backup'
|
||||||
|
|
||||||
|
ARCH_ARMHF = 'armhf'
|
||||||
|
ARCH_AARCH64 = 'aarch64'
|
||||||
|
ARCH_AMD64 = 'amd64'
|
||||||
|
ARCH_I386 = 'i386'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user