33
44from ..const import (
55 ATTR_NAME , ATTR_VERSION , ATTR_SLUG , ATTR_DESCRIPTON , ATTR_STARTUP ,
6- ATTR_BOOT , ATTR_MAP , ATTR_OPTIONS , ATTR_PORTS , STARTUP_ONCE , STARTUP_AFTER ,
7- STARTUP_BEFORE , STARTUP_INITIALIZE , BOOT_AUTO , BOOT_MANUAL , ATTR_SCHEMA ,
8- ATTR_IMAGE , ATTR_URL , ATTR_MAINTAINER , ATTR_ARCH , ATTR_DEVICES ,
9- ATTR_ENVIRONMENT , ATTR_HOST_NETWORK , ARCH_ARMHF , ARCH_AARCH64 , ARCH_AMD64 ,
10- ARCH_I386 , ATTR_TMPFS , ATTR_PRIVILEGED , ATTR_USER , ATTR_STATE , ATTR_SYSTEM ,
11- STATE_STARTED , STATE_STOPPED , ATTR_LOCATON , ATTR_REPOSITORY , ATTR_TIMEOUT ,
12- ATTR_NETWORK , ATTR_AUTO_UPDATE )
6+ ATTR_BOOT , ATTR_MAP , ATTR_OPTIONS , ATTR_PORTS , STARTUP_ONCE ,
7+ STARTUP_SYSTEM , STARTUP_SERVICES , STARTUP_APPLICATION , STARTUP_INITIALIZE ,
8+ BOOT_AUTO , BOOT_MANUAL , ATTR_SCHEMA , ATTR_IMAGE , ATTR_URL , ATTR_MAINTAINER ,
9+ ATTR_ARCH , ATTR_DEVICES , ATTR_ENVIRONMENT , ATTR_HOST_NETWORK , ARCH_ARMHF ,
10+ ARCH_AARCH64 , ARCH_AMD64 , ARCH_I386 , ATTR_TMPFS , ATTR_PRIVILEGED ,
11+ ATTR_USER , ATTR_STATE , ATTR_SYSTEM , STATE_STARTED , STATE_STOPPED ,
12+ ATTR_LOCATON , ATTR_REPOSITORY , ATTR_TIMEOUT , ATTR_NETWORK ,
13+ ATTR_AUTO_UPDATE )
1314from ..validate import NETWORK_PORT , DOCKER_PORTS
1415
1516
2930 ARCH_ARMHF , ARCH_AARCH64 , ARCH_AMD64 , ARCH_I386
3031]
3132
33+ STARTUP_ALL = [
34+ STARTUP_ONCE , STARTUP_INITIALIZE , STARTUP_SYSTEM , STARTUP_SERVICES ,
35+ STARTUP_APPLICATION
36+ ]
37+
3238PRIVILEGE_ALL = [
3339 "NET_ADMIN"
3440]
3541
3642
43+ def _migrate_startup (value ):
44+ """Migrate startup schema.
45+
46+ REMOVE after 0.50-
47+ """
48+ if value == "before" :
49+ return STARTUP_SERVICES
50+ if value == "after" :
51+ return STARTUP_APPLICATION
52+ return value
53+
54+
3755# pylint: disable=no-value-for-parameter
3856SCHEMA_ADDON_CONFIG = vol .Schema ({
3957 vol .Required (ATTR_NAME ): vol .Coerce (str ),
4361 vol .Optional (ATTR_URL ): vol .Url (),
4462 vol .Optional (ATTR_ARCH , default = ARCH_ALL ): [vol .In (ARCH_ALL )],
4563 vol .Required (ATTR_STARTUP ):
46- vol .In ([STARTUP_BEFORE , STARTUP_AFTER , STARTUP_ONCE ,
47- STARTUP_INITIALIZE ]),
64+ vol .All (_migrate_startup , vol .In (STARTUP_ALL )),
4865 vol .Required (ATTR_BOOT ):
4966 vol .In ([BOOT_AUTO , BOOT_MANUAL ]),
5067 vol .Optional (ATTR_PORTS ): DOCKER_PORTS ,
5673 vol .Optional (ATTR_ENVIRONMENT ): {vol .Match (r"\w*" ): vol .Coerce (str )},
5774 vol .Optional (ATTR_PRIVILEGED ): [vol .In (PRIVILEGE_ALL )],
5875 vol .Required (ATTR_OPTIONS ): dict ,
59- vol .Required (ATTR_SCHEMA ): vol .Any ({
76+ vol .Required (ATTR_SCHEMA ): vol .Any (vol . Schema ( {
6077 vol .Coerce (str ): vol .Any (ADDON_ELEMENT , [
6178 vol .Any (ADDON_ELEMENT , {vol .Coerce (str ): ADDON_ELEMENT })
62- ])
63- }, False ),
79+ ], vol . Schema ({ vol . Coerce ( str ): ADDON_ELEMENT }) )
80+ }) , False ),
6481 vol .Optional (ATTR_IMAGE ): vol .Match (r"\w*/\w*" ),
6582 vol .Optional (ATTR_TIMEOUT , default = 10 ):
6683 vol .All (vol .Coerce (int ), vol .Range (min = 10 , max = 120 ))
@@ -124,8 +141,11 @@ def validate(struct):
124141 typ = raw_schema [key ]
125142 try :
126143 if isinstance (typ , list ):
127- # nested value
128- options [key ] = _nested_validate (typ [0 ], value , key )
144+ # nested value list
145+ options [key ] = _nested_validate_list (typ [0 ], value , key )
146+ elif isinstance (typ , dict ):
147+ # nested value dict
148+ options [key ] = _nested_validate_dict (typ , value , key )
129149 else :
130150 # normal value
131151 options [key ] = _single_validate (typ , value , key )
@@ -161,13 +181,13 @@ def _single_validate(typ, value, key):
161181 elif typ == V_PORT :
162182 return NETWORK_PORT (value )
163183
164- raise vol .Invalid ("Fatal error for {} type {}. " .format (key , typ ))
184+ raise vol .Invalid ("Fatal error for {} type {}" .format (key , typ ))
165185 except ValueError :
166186 raise vol .Invalid (
167187 "Type {} error for '{}' on {}." .format (typ , value , key )) from None
168188
169189
170- def _nested_validate (typ , data_list , key ):
190+ def _nested_validate_list (typ , data_list , key ):
171191 """Validate nested items."""
172192 options = []
173193
@@ -178,7 +198,7 @@ def _nested_validate(typ, data_list, key):
178198 for c_key , c_value in element .items ():
179199 if c_key not in typ :
180200 raise vol .Invalid (
181- "Unknown nested options {}. " .format (c_key ))
201+ "Unknown nested options {}" .format (c_key ))
182202
183203 c_options [c_key ] = _single_validate (typ [c_key ], c_value , c_key )
184204 options .append (c_options )
@@ -187,3 +207,16 @@ def _nested_validate(typ, data_list, key):
187207 options .append (_single_validate (typ , element , key ))
188208
189209 return options
210+
211+
212+ def _nested_validate_dict (typ , data_dict , key ):
213+ """Validate nested items."""
214+ options = {}
215+
216+ for c_key , c_value in data_dict .items ():
217+ if c_key not in typ :
218+ raise vol .Invalid ("Unknow nested dict options {}" .format (c_key ))
219+
220+ options [c_key ] = _single_validate (typ [c_key ], c_value , c_key )
221+
222+ return options
0 commit comments