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:
Phil Sphicas 2019-12-16 07:26:18 +00:00
parent 3674a86ed8
commit 04ddbcd2a4
2 changed files with 82 additions and 129 deletions

View File

@ -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

View File

@ -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
#