promenade/HostSystem/v1 schema cleanup
When the genesis and join package source definitions were split, the .common, .genesis, and .join subkeys were inserted directly under .properties.packages instead of .properties.packages.properties), causing anything under packages to erroneously pass. This change implements the intended validation, allowing packages to be defined under either under .packages.common, or .packages.genesis and .packages.join. The expectation is that the genesis node will end up with the union of what is defined under genesis and common. Required packages (a runtime and socat) need to be defined in at least one of those locations. Similarly, join nodes will have the union of join packages and common packages. Change-Id: I4a658eef6efbba53ba04b2d8b4ea4711ca0b1ab0
This commit is contained in:
parent
3674a86ed8
commit
04ddbcd2a4
|
@ -68,7 +68,6 @@ data:
|
|||
- docker_image
|
||||
- file_path
|
||||
additionalProperties: false
|
||||
|
||||
image:
|
||||
type: string
|
||||
# XXX add regex
|
||||
|
@ -84,9 +83,47 @@ data:
|
|||
url:
|
||||
type: string
|
||||
# XXX add regex
|
||||
|
||||
repos_and_packages:
|
||||
type: object
|
||||
properties:
|
||||
# apt repositories
|
||||
repositories:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/apt_source_line'
|
||||
# apt repository keys
|
||||
keys:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/public_key'
|
||||
# required packages
|
||||
required:
|
||||
type: object
|
||||
properties:
|
||||
docker:
|
||||
$ref: '#/definitions/package'
|
||||
runtime:
|
||||
$ref: '#/definitions/package'
|
||||
socat:
|
||||
$ref: '#/definitions/package'
|
||||
# a container runtime is required
|
||||
# using either docker or runtime key
|
||||
oneOf:
|
||||
- required:
|
||||
- docker
|
||||
- required:
|
||||
- runtime
|
||||
# socat is required
|
||||
required:
|
||||
- socat
|
||||
additionalProperties: false
|
||||
# additional packages
|
||||
additional:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/package'
|
||||
additionalProperties: false
|
||||
type: object
|
||||
|
||||
properties:
|
||||
files:
|
||||
type: array
|
||||
|
@ -121,108 +158,19 @@ data:
|
|||
- helm
|
||||
- monitoring_image
|
||||
additionalProperties: false
|
||||
|
||||
packages:
|
||||
type: object
|
||||
common:
|
||||
type: object
|
||||
properties:
|
||||
additional:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/package'
|
||||
keys:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/public_key'
|
||||
|
||||
required:
|
||||
type: object
|
||||
properties:
|
||||
oneOf:
|
||||
- docker:
|
||||
$ref: '#/definitions/package'
|
||||
- runtime:
|
||||
$ref: '#/definitions/package'
|
||||
socat:
|
||||
$ref: '#/definitions/package'
|
||||
additionalProperties: false
|
||||
|
||||
repositories:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/apt_source_line'
|
||||
|
||||
required:
|
||||
- required
|
||||
additionalProperties: false
|
||||
|
||||
genesis:
|
||||
type: object
|
||||
properties:
|
||||
additional:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/package'
|
||||
keys:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/public_key'
|
||||
|
||||
required:
|
||||
type: object
|
||||
properties:
|
||||
oneOf:
|
||||
- docker:
|
||||
$ref: '#/definitions/package'
|
||||
- runtime:
|
||||
$ref: '#/definitions/package'
|
||||
socat:
|
||||
$ref: '#/definitions/package'
|
||||
additionalProperties: false
|
||||
|
||||
repositories:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/apt_source_line'
|
||||
|
||||
required:
|
||||
- required
|
||||
additionalProperties: false
|
||||
|
||||
join:
|
||||
type: object
|
||||
properties:
|
||||
additional:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/package'
|
||||
keys:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/public_key'
|
||||
|
||||
required:
|
||||
type: object
|
||||
properties:
|
||||
oneOf:
|
||||
- docker:
|
||||
$ref: '#/definitions/package'
|
||||
- runtime:
|
||||
$ref: '#/definitions/package'
|
||||
socat:
|
||||
$ref: '#/definitions/package'
|
||||
additionalProperties: false
|
||||
|
||||
repositories:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/apt_source_line'
|
||||
|
||||
required:
|
||||
- required
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
common:
|
||||
type: object
|
||||
$ref: '#/definitions/repos_and_packages'
|
||||
genesis:
|
||||
type: object
|
||||
$ref: '#/definitions/repos_and_packages'
|
||||
join:
|
||||
type: object
|
||||
$ref: '#/definitions/repos_and_packages'
|
||||
additionalProperties: false
|
||||
validation:
|
||||
type: object
|
||||
properties:
|
||||
|
@ -233,8 +181,18 @@ data:
|
|||
type: string
|
||||
additionalProperties: false
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- images
|
||||
- packages
|
||||
allOf:
|
||||
# ensure that required packages are defined for genesis node
|
||||
# (either in .packages.genesis or .packages.common)
|
||||
- anyOf:
|
||||
- {properties:{packages:{properties:{common:{required:[required]}}}}}
|
||||
- {properties:{packages:{properties:{genesis:{required:[required]}}}}}
|
||||
# ensure that required packages are defined for join nodes
|
||||
# (either in .packages.join or .packages.common)
|
||||
- anyOf:
|
||||
- {properties:{packages:{properties:{common:{required:[required]}}}}}
|
||||
- {properties:{packages:{properties:{join:{required:[required]}}}}}
|
||||
additionalProperties: false
|
||||
|
|
|
@ -94,32 +94,27 @@ while true; do
|
|||
fi
|
||||
done
|
||||
|
||||
{% for role in roles %}
|
||||
while true; do
|
||||
if ! DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confold" -y --no-install-recommends \
|
||||
{%- for package in config['HostSystem:packages.' + role + '.additional'] | default([]) %}
|
||||
{{ package }} \
|
||||
{%- endfor %}
|
||||
{%- if config['HostSystem:packages.' + role + '.required.docker'] is defined %}
|
||||
{{ config['HostSystem:packages.' + role + '.required.docker'] }} \
|
||||
{%- elif config['HostSystem:packages.' + role + '.required.runtime'] is defined %}
|
||||
{{ config['HostSystem:packages.' + role + '.required.runtime'] }} \
|
||||
{%- endif %}
|
||||
{%- if config['HostSystem:packages.' + role + '.required.socat'] is defined %}
|
||||
{{ config['HostSystem:packages.' + role + '.required.socat'] }} \
|
||||
{%- endif %}
|
||||
;then
|
||||
now=$(date +%s)
|
||||
if [[ ${now} -gt ${end} ]]; then
|
||||
log Failed to install apt packages.
|
||||
exit 1
|
||||
fi
|
||||
sleep 10
|
||||
else
|
||||
break
|
||||
while true; do
|
||||
if ! DEBIAN_FRONTEND=noninteractive apt-get install -o Dpkg::Options::="--force-confold" -y --no-install-recommends \
|
||||
{%- for role in roles %}
|
||||
{%- for package in config['HostSystem:packages.' + role + '.required'].values() | default([]) %}
|
||||
{{ package }} \
|
||||
{%- endfor %}
|
||||
{%- for package in config['HostSystem:packages.' + role + '.additional'] | default([]) %}
|
||||
{{ package }} \
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
;then
|
||||
now=$(date +%s)
|
||||
if [[ ${now} -gt ${end} ]]; then
|
||||
log Failed to install apt packages.
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
{% endfor %}
|
||||
sleep 10
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Start core processes
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue