Merge "templates: separate genesis and join sources"

This commit is contained in:
Zuul 2019-06-06 19:56:26 +00:00 committed by Gerrit Code Review
commit aea0c9d1e9
9 changed files with 261 additions and 89 deletions

View File

@ -46,44 +46,127 @@ data:
helm: helm:
helm: lachlanevenson/k8s-helm:v2.14.0 helm: lachlanevenson/k8s-helm:v2.14.0
packages: packages:
repositories: common:
- deb http://apt.dockerproject.org/repo ubuntu-xenial main repositories:
keys: - deb http://apt.dockerproject.org/repo ubuntu-xenial main
- |- keys:
-----BEGIN PGP PUBLIC KEY BLOCK----- - |-
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
TvBR8Q== TvBR8Q==
=Fm3p =Fm3p
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
additional: additional:
- ceph-common - ceph-common
- curl - curl
- jq - jq
required: required:
docker: docker-engine docker: docker-engine
socat: socat socat: socat
genesis:
repositories:
- deb http://apt.dockerproject.org/repo ubuntu-xenial main
keys:
- |-
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFWln24BEADrBl5p99uKh8+rpvqJ48u4eTtjeXAWbslJotmC/CakbNSqOb9o
ddfzRvGVeJVERt/Q/mlvEqgnyTQy+e6oEYN2Y2kqXceUhXagThnqCoxcEJ3+KM4R
mYdoe/BJ/J/6rHOjq7Omk24z2qB3RU1uAv57iY5VGw5p45uZB4C4pNNsBJXoCvPn
TGAs/7IrekFZDDgVraPx/hdiwopQ8NltSfZCyu/jPpWFK28TR8yfVlzYFwibj5WK
dHM7ZTqlA1tHIG+agyPf3Rae0jPMsHR6q+arXVwMccyOi+ULU0z8mHUJ3iEMIrpT
X+80KaN/ZjibfsBOCjcfiJSB/acn4nxQQgNZigna32velafhQivsNREFeJpzENiG
HOoyC6qVeOgKrRiKxzymj0FIMLru/iFF5pSWcBQB7PYlt8J0G80lAcPr6VCiN+4c
NKv03SdvA69dCOj79PuO9IIvQsJXsSq96HB+TeEmmL+xSdpGtGdCJHHM1fDeCqkZ
hT+RtBGQL2SEdWjxbF43oQopocT8cHvyX6Zaltn0svoGs+wX3Z/H6/8P5anog43U
65c0A+64Jj00rNDr8j31izhtQMRo892kGeQAaaxg4Pz6HnS7hRC+cOMHUU4HA7iM
zHrouAdYeTZeZEQOA7SxtCME9ZnGwe2grxPXh/U/80WJGkzLFNcTKdv+rwARAQAB
tDdEb2NrZXIgUmVsZWFzZSBUb29sIChyZWxlYXNlZG9ja2VyKSA8ZG9ja2VyQGRv
Y2tlci5jb20+iQI4BBMBAgAiBQJVpZ9uAhsvBgsJCAcDAgYVCAIJCgsEFgIDAQIe
AQIXgAAKCRD3YiFXLFJgnbRfEAC9Uai7Rv20QIDlDogRzd+Vebg4ahyoUdj0CH+n
Ak40RIoq6G26u1e+sdgjpCa8jF6vrx+smpgd1HeJdmpahUX0XN3X9f9qU9oj9A4I
1WDalRWJh+tP5WNv2ySy6AwcP9QnjuBMRTnTK27pk1sEMg9oJHK5p+ts8hlSC4Sl
uyMKH5NMVy9c+A9yqq9NF6M6d6/ehKfBFFLG9BX+XLBATvf1ZemGVHQusCQebTGv
0C0V9yqtdPdRWVIEhHxyNHATaVYOafTj/EF0lDxLl6zDT6trRV5n9F1VCEh4Aal8
L5MxVPcIZVO7NHT2EkQgn8CvWjV3oKl2GopZF8V4XdJRl90U/WDv/6cmfI08GkzD
YBHhS8ULWRFwGKobsSTyIvnbk4NtKdnTGyTJCQ8+6i52s+C54PiNgfj2ieNn6oOR
7d+bNCcG1CdOYY+ZXVOcsjl73UYvtJrO0Rl/NpYERkZ5d/tzw4jZ6FCXgggA/Zxc
jk6Y1ZvIm8Mt8wLRFH9Nww+FVsCtaCXJLP8DlJLASMD9rl5QS9Ku3u7ZNrr5HWXP
HXITX660jglyshch6CWeiUATqjIAzkEQom/kEnOrvJAtkypRJ59vYQOedZ1sFVEL
MXg2UCkD/FwojfnVtjzYaTCeGwFQeqzHmM241iuOmBYPeyTY5veF49aBJA1gEJOQ
TvBR8Q==
=Fm3p
-----END PGP PUBLIC KEY BLOCK-----
additional:
- ceph-common
- curl
- jq
required:
docker: docker-engine
socat: socat
join:
repositories:
- deb http://apt.dockerproject.org/repo ubuntu-xenial main
keys:
- |-
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFWln24BEADrBl5p99uKh8+rpvqJ48u4eTtjeXAWbslJotmC/CakbNSqOb9o
ddfzRvGVeJVERt/Q/mlvEqgnyTQy+e6oEYN2Y2kqXceUhXagThnqCoxcEJ3+KM4R
mYdoe/BJ/J/6rHOjq7Omk24z2qB3RU1uAv57iY5VGw5p45uZB4C4pNNsBJXoCvPn
TGAs/7IrekFZDDgVraPx/hdiwopQ8NltSfZCyu/jPpWFK28TR8yfVlzYFwibj5WK
dHM7ZTqlA1tHIG+agyPf3Rae0jPMsHR6q+arXVwMccyOi+ULU0z8mHUJ3iEMIrpT
X+80KaN/ZjibfsBOCjcfiJSB/acn4nxQQgNZigna32velafhQivsNREFeJpzENiG
HOoyC6qVeOgKrRiKxzymj0FIMLru/iFF5pSWcBQB7PYlt8J0G80lAcPr6VCiN+4c
NKv03SdvA69dCOj79PuO9IIvQsJXsSq96HB+TeEmmL+xSdpGtGdCJHHM1fDeCqkZ
hT+RtBGQL2SEdWjxbF43oQopocT8cHvyX6Zaltn0svoGs+wX3Z/H6/8P5anog43U
65c0A+64Jj00rNDr8j31izhtQMRo892kGeQAaaxg4Pz6HnS7hRC+cOMHUU4HA7iM
zHrouAdYeTZeZEQOA7SxtCME9ZnGwe2grxPXh/U/80WJGkzLFNcTKdv+rwARAQAB
tDdEb2NrZXIgUmVsZWFzZSBUb29sIChyZWxlYXNlZG9ja2VyKSA8ZG9ja2VyQGRv
Y2tlci5jb20+iQI4BBMBAgAiBQJVpZ9uAhsvBgsJCAcDAgYVCAIJCgsEFgIDAQIe
AQIXgAAKCRD3YiFXLFJgnbRfEAC9Uai7Rv20QIDlDogRzd+Vebg4ahyoUdj0CH+n
Ak40RIoq6G26u1e+sdgjpCa8jF6vrx+smpgd1HeJdmpahUX0XN3X9f9qU9oj9A4I
1WDalRWJh+tP5WNv2ySy6AwcP9QnjuBMRTnTK27pk1sEMg9oJHK5p+ts8hlSC4Sl
uyMKH5NMVy9c+A9yqq9NF6M6d6/ehKfBFFLG9BX+XLBATvf1ZemGVHQusCQebTGv
0C0V9yqtdPdRWVIEhHxyNHATaVYOafTj/EF0lDxLl6zDT6trRV5n9F1VCEh4Aal8
L5MxVPcIZVO7NHT2EkQgn8CvWjV3oKl2GopZF8V4XdJRl90U/WDv/6cmfI08GkzD
YBHhS8ULWRFwGKobsSTyIvnbk4NtKdnTGyTJCQ8+6i52s+C54PiNgfj2ieNn6oOR
7d+bNCcG1CdOYY+ZXVOcsjl73UYvtJrO0Rl/NpYERkZ5d/tzw4jZ6FCXgggA/Zxc
jk6Y1ZvIm8Mt8wLRFH9Nww+FVsCtaCXJLP8DlJLASMD9rl5QS9Ku3u7ZNrr5HWXP
HXITX660jglyshch6CWeiUATqjIAzkEQom/kEnOrvJAtkypRJ59vYQOedZ1sFVEL
MXg2UCkD/FwojfnVtjzYaTCeGwFQeqzHmM241iuOmBYPeyTY5veF49aBJA1gEJOQ
TvBR8Q==
=Fm3p
-----END PGP PUBLIC KEY BLOCK-----
additional:
- ceph-common
- curl
- jq
required:
docker: docker-engine
socat: socat
... ...

View File

@ -92,10 +92,11 @@ class Builder:
def build_genesis_script(self): def build_genesis_script(self):
LOG.info('Building genesis script') LOG.info('Building genesis script')
genesis_roles = ['common', 'genesis']
sub_config = self.config.extract_genesis_config() sub_config = self.config.extract_genesis_config()
tarball = renderer.build_tarball_from_roles( tarball = renderer.build_tarball_from_roles(
config=sub_config, config=sub_config,
roles=['common', 'genesis'], roles=genesis_roles,
file_specs=self.file_cache.values()) file_specs=self.file_cache.values())
(encrypted_tarball, decrypt_setup_command, decrypt_command, (encrypted_tarball, decrypt_setup_command, decrypt_command,
@ -109,7 +110,8 @@ class Builder:
'decrypt_setup_command': decrypt_setup_command, 'decrypt_setup_command': decrypt_setup_command,
'decrypt_teardown_command': decrypt_teardown_command, 'decrypt_teardown_command': decrypt_teardown_command,
'encrypted_tarball': encrypted_tarball, 'encrypted_tarball': encrypted_tarball,
}) },
roles=genesis_roles)
def _build_genesis_validate_script(self): def _build_genesis_validate_script(self):
sub_config = self.config.extract_genesis_config() sub_config = self.config.extract_genesis_config()
@ -129,13 +131,14 @@ class Builder:
validate_script) validate_script)
def build_node_script(self, node_name): def build_node_script(self, node_name):
build_roles = ['common', 'join']
sub_config = self.config.extract_node_config(node_name) sub_config = self.config.extract_node_config(node_name)
file_spec_paths = [ file_spec_paths = [
f['path'] for f in self.config.get_path('HostSystem:files', []) f['path'] for f in self.config.get_path('HostSystem:files', [])
] ]
file_specs = [self.file_cache[p] for p in file_spec_paths] file_specs = [self.file_cache[p] for p in file_spec_paths]
tarball = renderer.build_tarball_from_roles( tarball = renderer.build_tarball_from_roles(
config=sub_config, roles=['common', 'join'], file_specs=file_specs) config=sub_config, roles=build_roles, file_specs=file_specs)
(encrypted_tarball, decrypt_setup_command, decrypt_command, (encrypted_tarball, decrypt_setup_command, decrypt_command,
decrypt_teardown_command) = _encrypt_node(sub_config, tarball) decrypt_teardown_command) = _encrypt_node(sub_config, tarball)
@ -148,7 +151,8 @@ class Builder:
'decrypt_setup_command': decrypt_setup_command, 'decrypt_setup_command': decrypt_setup_command,
'decrypt_teardown_command': decrypt_teardown_command, 'decrypt_teardown_command': decrypt_teardown_command,
'encrypted_tarball': encrypted_tarball, 'encrypted_tarball': encrypted_tarball,
}) },
roles=build_roles)
def _build_node_validate_script(self, node_name): def _build_node_validate_script(self, node_name):
sub_config = self.config.extract_node_config(node_name) sub_config = self.config.extract_node_config(node_name)

View File

@ -82,10 +82,13 @@ def render_template_into_bundler(*, bundler, config, destination_path,
bundler.add(path=destination_path, data=data, mode=mode) bundler.add(path=destination_path, data=data, mode=mode)
def render_template(config, *, template, context=None): def render_template(config, *, template, context=None, roles=None):
if context is None: if context is None:
context = {} context = {}
if roles is None:
roles = {}
template_contents = pkg_resources.resource_string( template_contents = pkg_resources.resource_string(
'promenade', os.path.join('templates', template)) 'promenade', os.path.join('templates', template))
@ -93,7 +96,7 @@ def render_template(config, *, template, context=None):
template_obj = env.from_string(template_contents.decode('utf-8')) template_obj = env.from_string(template_contents.decode('utf-8'))
try: try:
return template_obj.render(config=config, **context) return template_obj.render(config=config, roles=roles, **context)
except jinja2.exceptions.TemplateRuntimeError as e: except jinja2.exceptions.TemplateRuntimeError as e:
LOG.exception('Error rendering template (%s)' % template) LOG.exception('Error rendering template (%s)' % template)
raise exceptions.TemplateRenderException( raise exceptions.TemplateRenderException(

View File

@ -124,36 +124,104 @@ data:
packages: packages:
type: object type: object
properties: common:
additional: type: object
type: array properties:
items: additional:
$ref: '#/definitions/package' type: array
keys: items:
type: array $ref: '#/definitions/package'
items: keys:
$ref: '#/definitions/public_key' type: array
items:
$ref: '#/definitions/public_key'
required:
type: object
properties:
docker:
$ref: '#/definitions/package'
socat:
$ref: '#/definitions/package'
required:
- docker
- socat
additionalProperties: false
repositories:
type: array
items:
$ref: '#/definitions/apt_source_line'
required: required:
type: object - required
properties: additionalProperties: false
docker:
$ref: '#/definitions/package' genesis:
socat: type: object
properties:
additional:
type: array
items:
$ref: '#/definitions/package' $ref: '#/definitions/package'
keys:
type: array
items:
$ref: '#/definitions/public_key'
required: required:
- docker type: object
- socat properties:
additionalProperties: false docker:
$ref: '#/definitions/package'
socat:
$ref: '#/definitions/package'
required:
- docker
- socat
additionalProperties: false
repositories: repositories:
type: array type: array
items: items:
$ref: '#/definitions/apt_source_line' $ref: '#/definitions/apt_source_line'
required: required:
- required - required
additionalProperties: false 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:
docker:
$ref: '#/definitions/package'
socat:
$ref: '#/definitions/package'
required:
- docker
- socat
additionalProperties: false
repositories:
type: array
items:
$ref: '#/definitions/apt_source_line'
required:
- required
additionalProperties: false
validation: validation:
type: object type: object

View File

@ -32,11 +32,13 @@ set +x
log log
log === Adding APT Keys=== log === Adding APT Keys===
set -x set -x
{%- for key in config.get_path('HostSystem:packages.keys', []) %} {% for role in roles %}
{%- for key in config.get_path('HostSystem:packages.' + role + '.keys', []) %}
apt-key add - <<"ENDKEY" apt-key add - <<"ENDKEY"
{{ key }} {{ key }}
ENDKEY ENDKEY
{%- endfor %} {%- endfor %}
{%- endfor %}
# Disable swap # Disable swap
# #
@ -79,24 +81,28 @@ while true; do
fi fi
done done
end=$(($(date +%s) + 600)) {% for role in roles %}
while true; do {%- if config['HostSystem:packages.' + role + '.repositories'] is defined %}
if ! DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ end=$(($(date +%s) + 600))
{%- for package in config['HostSystem:packages.additional'] | default([]) %} while true; do
{{ package }} \ if ! DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
{%- endfor %} {%- for package in config['HostSystem:packages.' + role + '.additional'] | default([]) %}
{{ config['HostSystem:packages.required.docker'] }} \ {{ package }} \
{{ config['HostSystem:packages.required.socat'] }}; then {%- endfor %}
now=$(date +%s) {{ config['HostSystem:packages.' + role + '.required.docker'] }} \
if [[ ${now} -gt ${end} ]]; then {{ config['HostSystem:packages.' + role + '.required.socat'] }}; then
log Failed to install apt packages. now=$(date +%s)
exit 1 if [[ ${now} -gt ${end} ]]; then
fi log Failed to install apt packages.
sleep 10 exit 1
else fi
break sleep 10
fi else
done break
fi
done
{%- endif %}
{% endfor %}
# Start core processes # Start core processes
# #

View File

@ -1,3 +1,3 @@
{%- for repo in config.get_path('HostSystem:packages.repositories', []) %} {%- for repo in config.get_path('HostSystem:packages.common.repositories', []) %}
{{ repo }} {{ repo }}
{%- endfor %} {%- endfor %}

View File

@ -0,0 +1,3 @@
{%- for repo in config.get_path('HostSystem:packages.genesis.repositories', []) %}
{{ repo }}
{%- endfor %}

View File

@ -0,0 +1,3 @@
{%- for repo in config.get_path('HostSystem:packages.join.repositories', []) %}
{{ repo }}
{%- endfor %}

View File

@ -10,6 +10,8 @@ log () {
TO_RM=( TO_RM=(
"/etc/apt/apt.conf.d/20-proxy.conf" "/etc/apt/apt.conf.d/20-proxy.conf"
"/etc/apt/sources.list.d/promenade-sources.list" "/etc/apt/sources.list.d/promenade-sources.list"
"/etc/apt/sources.list.d/promenade-genesis-sources.list"
"/etc/apt/sources.list.d/promenade-join-sources.list"
"/etc/cni" "/etc/cni"
"/etc/coredns" "/etc/coredns"
"/etc/docker/daemon.json" "/etc/docker/daemon.json"