diff --git a/example/vagrant-input-config.yaml b/example/vagrant-input-config.yaml index f7794f7a..af3c8f1f 100644 --- a/example/vagrant-input-config.yaml +++ b/example/vagrant-input-config.yaml @@ -50,3 +50,15 @@ spec: - 8.8.4.4 #http_proxy: http://proxy.example.com:8080 #https_proxy: https://proxy.example.com:8080 +--- +apiVersion: promenade/v1 +kind: Versions +metadata: + cluster: example + name: example + target: all +spec: + images: + promenade: quay.io/attcomdev/promenade:latest + packages: + docker: docker.io=1.12.6-0ubuntu1~16.04.1 diff --git a/promenade/config.py b/promenade/config.py index 95a204c1..8b01478f 100644 --- a/promenade/config.py +++ b/promenade/config.py @@ -33,6 +33,7 @@ class Document: 'Node', 'PrivateKey', 'PublicKey', + 'Versions', } def __init__(self, data): @@ -68,6 +69,9 @@ class Document: def __getitem__(self, key): return self.data['spec'][key] + def get(self, key, default=None): + return self.data['spec'].get(key, default) + class Configuration: def __init__(self, documents): diff --git a/promenade/generator.py b/promenade/generator.py index fd8d0d90..4e9c6f46 100644 --- a/promenade/generator.py +++ b/promenade/generator.py @@ -33,6 +33,7 @@ class Generator: def generate_all(self, output_dir): cluster = self.input_config['Cluster'] network = self.input_config['Network'] + versions = self.input_config['Versions'] cluster_name = cluster.metadata['name'] LOG.info('Generating configuration for cluster "%s"', cluster_name) @@ -91,6 +92,7 @@ class Generator: network, sa_pub, sa_priv, + versions, ] for hostname, data in cluster['nodes'].items(): @@ -142,6 +144,7 @@ class Generator: node, proxy_cert, proxy_cert_key, + versions, ] role_specific_documents = [] diff --git a/promenade/renderer.py b/promenade/renderer.py index 82f57467..9b44b8a1 100644 --- a/promenade/renderer.py +++ b/promenade/renderer.py @@ -38,7 +38,9 @@ class Renderer: LOG.debug('Templating "%s" into "%s"', path, target_path) - env = jinja2.Environment(undefined=jinja2.StrictUndefined) + env = jinja2.Environment( + loader=jinja2.PackageLoader('promenade', 'templates/include'), + undefined=jinja2.StrictUndefined) env.filters['b64enc'] = _base64_encode with open(path) as f: diff --git a/promenade/templates/genesis/etc/kubernetes/asset-loader/assets/configmap-promenade-join.yaml b/promenade/templates/genesis/etc/kubernetes/asset-loader/assets/configmap-promenade-join.yaml new file mode 100644 index 00000000..f2f3eb69 --- /dev/null +++ b/promenade/templates/genesis/etc/kubernetes/asset-loader/assets/configmap-promenade-join.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: drydock +spec: {} + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: promenade-join-sh + namespace: drydock +data: + join.sh: |- +{%- filter indent(4, True) %} +{% include "up.sh" %} +{%- endfilter %} diff --git a/promenade/templates/include/up.sh b/promenade/templates/include/up.sh new file mode 100644 index 00000000..79963e31 --- /dev/null +++ b/promenade/templates/include/up.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root." 1>&2 + exit 1 +fi + +if [ "x$1" = "x" ]; then + echo "Path to node configuration required." 1>&2 + exit 1 +fi + +set -ex + +#Proxy Variables +http_proxy={{ config['Network'].get('http_proxy', '') }} +https_proxy={{ config['Network'].get('https_proxy', '') }} +no_proxy={{ config['Network'].get('no_proxy', '') }} + +DOCKER_HTTP_PROXY=${DOCKER_HTTP_PROXY:-${HTTP_PROXY:-${http_proxy}}} +DOCKER_HTTPS_PROXY=${DOCKER_HTTPS_PROXY:-${HTTPS_PROXY:-${https_proxy}}} +DOCKER_NO_PROXY=${DOCKER_NO_PROXY:-${NO_PROXY:-${no_proxy}}} + + +mkdir -p /etc/docker +cat < /etc/docker/daemon.json +{ + "live-restore": true, + "storage-driver": "overlay2" +} +EOS + +#Configuration for Docker Behind a Proxy +mkdir -p /etc/systemd/system/docker.service.d + +#Set HTTPS Proxy Variable +cat < /etc/systemd/system/docker.service.d/http-proxy.conf +[Service] +Environment="HTTP_PROXY=${DOCKER_HTTP_PROXY}" +EOF + +#Set HTTPS Proxy Variable +cat < /etc/systemd/system/docker.service.d/https-proxy.conf +[Service] +Environment="HTTPS_PROXY=${DOCKER_HTTPS_PROXY}" +EOF + +#Set No Proxy Variable +cat < /etc/systemd/system/docker.service.d/no-proxy.conf +[Service] +Environment="NO_PROXY=${DOCKER_NO_PROXY}" +EOF + +#Reload systemd and docker if present +systemctl daemon-reload +systemctl restart docker || true + +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq +apt-get install -y -qq --no-install-recommends \ + {{ config['Versions']['packages']['docker'] }} + +if [ -f "${PROMENADE_LOAD_IMAGE}" ]; then + echo === Loading updated promenade image === + docker load -i "${PROMENADE_LOAD_IMAGE}" +fi + +docker run -t --rm \ + --net host \ + -v /:/target \ + {{ config['Versions']['images']['promenade'] }} \ + promenade \ + -v \ + up \ + --hostname $(hostname) \ + --config-path /target$(realpath $1) 2>&1 + +touch /var/lib/prom.done