template-replicated.cfg.in 12.5 KB
Newer Older
1
{% macro replicate(namebase, nbbackup, typeexport, typeimport, heriteLeader='', heriteBackup='', slapparameter_dict={}, monitor_parameter_dict={}) %}
2 3

{% set sla_parameter_dict = {} -%}
4 5 6
{% set monitor_dict = monitor_parameter_dict.get('parameter', {}) -%}
{% set monitor_return = ' '.join(monitor_parameter_dict.get('return', [])) -%}
{% set monitor_url_list = [] -%}
7 8 9 10 11 12 13 14 15
# prepare sla-parameters
{% if slapparameter_dict is defined -%}
{%   for key in slapparameter_dict.keys() -%}
{%     if key.startswith('-sla-') -%}
{%       do sla_parameter_dict.__setitem__(key, slapparameter_dict.pop(key)) -%}
{%     endif -%}
{%   endfor -%}
{% endif -%}

16

17 18 19 20
[resilient-directory]
recipe = slapos.cookbook:mkdirectory
home = ${buildout:directory}
etc = ${:home}/etc
21
bin = ${:home}/bin
22 23


24 25
## Tells the Backupable recipe that we want a backup
[resilient]
26
recipe = slapos.cookbook:request
27
config-namebase = {{namebase}}
28
software-url = ${slap-connection:software-release-url}
29 30 31 32 33 34 35

[request-{{namebase}}]
<= resilient
   slap-connection
   {{heriteLeader}}
software-type = {{typeexport}}
name = {{namebase}}0
36
return = ssh-public-key resilient-ssh-url notification-id ip {{ monitor_return }}
37

Marco Mariani's avatar
Marco Mariani committed
38
config-number = 0
39 40
config-authorized-key = {% for id in range(1,nbbackup|int) %} ${request-pbs-{{namebase}}-{{id}}:connection-ssh-key}{% endfor %}
config-notify = {% for id in range(1,nbbackup|int) %} ${request-pbs-{{namebase}}-{{id}}:connection-notification-url}{% endfor %}
41
config-name = {{namebase}}0
42
# Bubble up all the instance parameters to the requested export instance.
43
{% if slapparameter_dict is defined %}
44
{% for parameter_name, parameter_value in six.iteritems(slapparameter_dict) %}
45
{% if parameter_value is string %}
46
config-{{parameter_name}} = {{ parameter_value.split('\n') | join('\n  ') }}
47 48 49
{% else %}
config-{{parameter_name}} = {{ parameter_value }}
{% endif %}
50
{% endfor %}
51
{% endif %}
52
{% for key, value in six.iteritems(monitor_dict) -%}
53 54
config-{{ key }} = {{ value }}
{% endfor -%}
55 56 57
{% if sla_parameter_dict == {} -%}
sla-mode = unique_by_network
{% else %}
58 59 60 61 62 63 64 65 66 67 68 69
{%   set sla_key_main = "-sla-%s%s-" % (namebase, 0) -%}
{%   set sla_key_secondary = "-sla-%s-" % (0) -%}
{%   set sla_key_main_length = sla_key_main | length -%}
{%   set sla_key_secondary_length = sla_key_secondary | length -%}
{%   set sla_dict = {} -%}
{%   for key in sla_parameter_dict.keys() -%}
{%     if key.startswith(sla_key_main) -%}
{%       do sla_dict.__setitem__(key[sla_key_main_length:], sla_parameter_dict.get(key)) -%}
{%     elif key.startswith(sla_key_secondary) and not sla_dict.has_key(key[sla_key_secondary_length:]) -%}
{%         do sla_dict.__setitem__(key[sla_key_secondary_length:], sla_parameter_dict.get(key)) -%}
{%     endif -%}
{%   endfor -%}
70
{%   for key, value in six.iteritems(sla_dict) -%}
71
sla-{{ key }} = {{ value }}
72
{%   endfor -%}
73
{% endif -%}
74

75 76 77 78
{% if 'monitor-base-url' in monitor_return and not monitor_parameter_dict.get('set-monitor-url', False) -%}
{% do monitor_url_list.append('${request-' ~ namebase ~ ':connection-monitor-base-url}') -%}
{% endif -%}

79 80 81 82 83 84 85 86 87 88 89
{% for id in range(1,nbbackup|int) %}

[request-{{namebase}}-pseudo-replicating-{{id}}]
<= slap-connection
   resilient
   {{heriteBackup}}
recipe = slapos.cookbook:request
name = {{namebase}}{{id}}

software-url = ${slap-connection:software-release-url}
software-type = {{typeimport}}
90
return = ssh-public-key resilient-ssh-url notification-url ip takeover-url takeover-password  {{ monitor_return }}
91

92
pbs-notification-id = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}}-push
93

94 95 96
{% for extra_parameter_for_pseudo_replicating_instance in ["software-root", "buildout-shared-folder"] %}
{% if slapparameter_dict.get(extra_parameter_for_pseudo_replicating_instance) %}
config-{{ extra_parameter_for_pseudo_replicating_instance }} = {{ slapparameter_dict.get(extra_parameter_for_pseudo_replicating_instance) }}
97
{% endif %}
98
{% endfor %}
99

Marco Mariani's avatar
Marco Mariani committed
100
config-number = {{id}}
101
config-name = {{namebase}}{{id}}
102 103
config-authorized-key = ${request-pbs-{{namebase}}-{{id}}:connection-ssh-key}
config-on-notification = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${:pbs-notification-id}
104
{% for key, value in six.iteritems(monitor_dict) -%}
105 106
config-{{ key }} = {{ value }}
{% endfor -%}
107 108 109
{% if sla_parameter_dict == {} -%}
sla-mode = unique_by_network
{% else %}
110 111 112 113 114 115 116 117 118 119 120 121
{%   set sla_key_main = "-sla-%s%s-" % (namebase, id) -%}
{%   set sla_key_secondary = "-sla-%s-" % (id) -%}
{%   set sla_key_main_length = sla_key_main | length -%}
{%   set sla_key_secondary_length = sla_key_secondary | length -%}
{%   set sla_dict = {} -%}
{%   for key in sla_parameter_dict.keys() -%}
{%     if key.startswith(sla_key_main) -%}
{%       do sla_dict.__setitem__(key[sla_key_main_length:], sla_parameter_dict.get(key)) -%}
{%     elif key.startswith(sla_key_secondary) and not sla_dict.has_key(key[sla_key_secondary_length:]) -%}
{%         do sla_dict.__setitem__(key[sla_key_secondary_length:], sla_parameter_dict.get(key)) -%}
{%     endif -%}
{%   endfor -%}
122
{%   for key, value in six.iteritems(sla_dict) -%}
123
sla-{{ key }} = {{ value }}
124
{%   endfor -%}
125
{% endif %}
126

127
[publish-connection-information]
128
feed-url-{{namebase}}-{{id}}-push = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${request-{{namebase}}-pseudo-replicating-{{id}}:pbs-notification-id}
129 130
takeover-{{namebase}}-{{id}}-url = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-takeover-url}
takeover-{{namebase}}-{{id}}-password = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-takeover-password}
131

132 133 134 135
{% if 'monitor-base-url' in monitor_return -%}
{% do monitor_url_list.append('${request-' ~ namebase ~ '-pseudo-replicating-' ~ id ~ ':connection-monitor-base-url}') -%}
{% endif -%}

136
{% endfor -%}
137

138

139

140
[resilient-request-{{namebase}}-public-key-promise-bin]
141 142 143 144
# Check that public-key-value parameter exists and is not empty
# XXX: maybe we should consider empty values to be non-nexistent.
recipe = collective.recipe.template
# XXX: don't use system executable
145 146
input = inline:#!/bin/bash
  PUBLIC_KEY_CONTENT="${request-{{namebase}}:connection-ssh-public-key}"
147
  if [[ ! -n "$PUBLIC_KEY_CONTENT" || "$PUBLIC_KEY_CONTENT" == *None* ]]; then
148 149
    exit 1
  fi
150
output = ${resilient-directory:bin}/resilient-request-{{namebase}}-public-key
151 152
mode = 700

153 154 155 156 157 158 159
[resilient-request-{{namebase}}-public-key-promise]
<= monitor-promise-base
module = check_command_execute
name = resilient-request-{{namebase}}-public-key.py
config-command = ${resilient-request-{{namebase}}-public-key-promise-bin:output}


160
{% for id in range(1,nbbackup|int) %}
161

162
[resilient-request-{{namebase}}-pseudo-replicating-{{id}}-public-key-promise-bin]
163 164 165 166
# Check that public-key-value parameter exists and is not empty
# XXX: maybe we should consider empty values to be non-nexistent.
recipe = collective.recipe.template
# XXX: don't use system executable
167 168
input = inline:#!/bin/bash
  PUBLIC_KEY_CONTENT="${request-{{namebase}}-pseudo-replicating-{{id}}:connection-ssh-public-key}"
169
  if [[ ! -n "$PUBLIC_KEY_CONTENT" || "$PUBLIC_KEY_CONTENT" == *None* ]]; then
170 171
    exit 1
  fi
172
output = ${resilient-directory:bin}/resilient-request-{{namebase}}-pseudo-replicating-{{id}}-public-key
173 174
mode = 700

175 176 177 178 179 180
[resilient-request-{{namebase}}-pseudo-replicating-{{id}}-public-key-promise]
<= monitor-promise-base
module = check_command_execute
name = resilient-request-{{namebase}}-pseudo-replicating-{{id}}-public-key.py
config-command = ${resilient-request-{{namebase}}-pseudo-replicating-{{id}}-public-key-promise-bin:output}

181 182 183 184 185 186 187 188
{% endfor %}



## The PBS and their push / pull slaves
## Adding a PBS provides resiliency
## Adding a backup server provides availability

Cédric de Saint Martin's avatar
Cédric de Saint Martin committed
189
## Having 3 backups pulling from the same PBS provides
190 191
##only availability, not resiliency

192
[request-pbs-common]
193 194 195 196
<= slap-connection
recipe = slapos.cookbook:request
software-url = ${slap-connection:software-release-url}
software-type = pull-backup
197 198 199 200 201 202

{% for id in range(1,nbbackup|int) %}

[request-pbs-{{namebase}}-{{id}}]
<= request-pbs-common
name = PBS ({{namebase}} / {{id}})
203
config-ignore-known-hosts-file = ${slap-parameter:ignore-known-hosts-file}
204
config-monitor-title = PBS ${slap-connection:computer-id}-{{namebase}}-{{id}}
205
{% for key, value in six.iteritems(monitor_dict) -%}
206 207 208
config-{{ key }} = {{ value }}
{% endfor -%}
return = ssh-key notification-url feeds-url  {{ monitor_return }}
209
slave = false
210 211 212
{% if sla_parameter_dict == {} -%}
sla-mode = unique_by_network
{% else %}
213 214 215 216 217 218 219 220 221 222 223 224
{%   set sla_key_main = "-sla-%s%s-" % ("pbs", id) -%}
{%   set sla_key_secondary = "-sla-%s-" % (id) -%}
{%   set sla_key_main_length = sla_key_main | length -%}
{%   set sla_key_secondary_length = sla_key_secondary | length -%}
{%   set sla_dict = {} -%}
{%   for key in sla_parameter_dict.keys() -%}
{%     if key.startswith(sla_key_main) -%}
{%       do sla_dict.__setitem__(key[sla_key_main_length:], sla_parameter_dict.get(key)) -%}
{%     elif key.startswith(sla_key_secondary) and not sla_dict.has_key(key[sla_key_secondary_length:]) -%}
{%         do sla_dict.__setitem__(key[sla_key_secondary_length:], sla_parameter_dict.get(key)) -%}
{%     endif -%}
{%   endfor -%}
225
{%   for key, value in six.iteritems(sla_dict) -%}
226
sla-{{ key }} = {{ value }}
227
{%   endfor %}
228 229
{% endif %}

230
[resilient-request-pbs-{{namebase}}-{{id}}-public-key-promise-bin]
231 232 233 234
# Check that public-key-value parameter exists and is not empty
# XXX: maybe we should consider empty values to be non-nexistent.
recipe = collective.recipe.template
# XXX: don't use system executable
235 236
input = inline:#!/bin/bash
  PUBLIC_KEY_CONTENT="${request-pbs-{{namebase}}-{{id}}:connection-ssh-key}"
237
  if [[ ! -n "$PUBLIC_KEY_CONTENT" || "$PUBLIC_KEY_CONTENT" == *None* ]]; then
238 239
    exit 1
  fi
240
output = ${resilient-directory:bin}/resilient-request-pbs-{{namebase}}-{{id}}-public-key
241 242
mode = 700

243 244 245
[resilient-request-pbs-{{namebase}}-{{id}}-public-key-promise]
<= monitor-promise-base
module = check_command_execute
246
name = resilient-request-pbs-{{namebase}}-{{id}}-public-key.py
247
config-command = ${resilient-request-pbs-{{namebase}}-{{id}}-public-key-promise-bin:output}
248 249

[request-pull-backup-server-{{namebase}}-{{id}}]
250
<= request-pbs-common
251
name = PBS {{id}} pulling from ${request-{{namebase}}:name}
252
config-url = ${request-{{namebase}}:connection-resilient-ssh-url}
253 254 255 256 257
config-type = pull
config-server-key = ${request-{{namebase}}:connection-ssh-public-key}
config-on-notification = ${request-{{namebase}}:connection-notification-id}
config-notify = ${request-pbs-{{namebase}}-{{id}}:connection-notification-url}
config-notification-id = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}}-pull
258
config-name = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}}
259
config-title = Pulling from {{namebase}}
260
config-remove-backup-older-than = {{ slapparameter_dict.get('remove-backup-older-than', '2W') }}
261
slave = true
262
sla-instance_guid = ${request-pbs-{{namebase}}-{{id}}:instance_guid}
263

264
[publish-connection-information]
265 266
feed-url-{{namebase}}-{{id}}-pull = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${request-pull-backup-server-{{namebase}}-{{id}}:config-notification-id}

267 268 269 270 271 272 273 274 275 276 277
{% if 'monitor-base-url' in monitor_return -%}
{% do monitor_url_list.append('${request-pbs-' ~ namebase ~ '-' ~ id ~ ':connection-monitor-base-url}') -%}
{% endif -%}

{% if monitor_parameter_dict.get('set-monitor-url', False) -%}
[request-{{namebase}}]
config-monitor-url-list = {{ monitor_url_list | join(' ') }}
{% else -%}
[monitor-conf-parameters]
monitor-url-list = {{ monitor_url_list | join(' ') }}
{% endif -%}
278

279
[request-pull-backup-server-{{namebase}}-backup-{{id}}]
280
<= request-pbs-common
281
name = PBS pushing on ${request-{{namebase}}-pseudo-replicating-{{id}}:name}
282
config-url = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-resilient-ssh-url}
283 284 285 286 287
config-type = push
config-server-key = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-ssh-public-key}
config-on-notification = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${request-pull-backup-server-{{namebase}}-{{id}}:config-notification-id}
config-notify = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-notification-url}
config-notification-id = ${request-{{namebase}}-pseudo-replicating-{{id}}:pbs-notification-id}
288
config-name = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}}
289 290
config-title = Pushing to {{namebase}} backup {{id}}
slave = true
291
sla-instance_guid = ${request-pbs-{{namebase}}-{{id}}:instance_guid}
292 293
{% endfor %}

294 295 296 297 298 299 300
[slap-parameter]
# Default parameters for distributed deployment
# I.e state "backup1 of maria should go there, ..."
{% for id in range(1,nbbackup|int) %}
{{namebase}}{{id}}-computer-guid =
pbs-{{namebase}}{{id}}-computer-guid =
{% endfor %}
301
ignore-known-hosts-file = false
302

303
{% endmacro %}