From 04ddbcd2a4cb78c489c2db5241f724461c4d1630 Mon Sep 17 00:00:00 2001 From: Phil Sphicas Date: Mon, 16 Dec 2019 07:26:18 +0000 Subject: [PATCH] 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 --- promenade/schemas/HostSystem.yaml | 166 +++++++++++------------------- promenade/templates/include/up.sh | 45 ++++---- 2 files changed, 82 insertions(+), 129 deletions(-) diff --git a/promenade/schemas/HostSystem.yaml b/promenade/schemas/HostSystem.yaml index 9d145ea8..f12f0b50 100644 --- a/promenade/schemas/HostSystem.yaml +++ b/promenade/schemas/HostSystem.yaml @@ -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 diff --git a/promenade/templates/include/up.sh b/promenade/templates/include/up.sh index 954e8081..fa0c3482 100644 --- a/promenade/templates/include/up.sh +++ b/promenade/templates/include/up.sh @@ -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 #