{% macro replicate(namebase, nbbackup, typeexport, typeimport, heriteLeader='', heriteBackup='', slapparameter_dict={}) %} {% set sla_parameter_dict = {} -%} # 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 -%} ## Tells the Backupable recipe that we want a backup [resilient] recipe = slapos.cookbook:request config-namebase = {{namebase}} software-url = ${slap-connection:software-release-url} ## Every request is double to provide the 3 IPs. ## First, we request with ip-list parameter hardcoded. ## Then, we request the same thing without this. ## XXX-Cedric: is it useful? [request-{{namebase}}] <= resilient slap-connection {{heriteLeader}} software-type = {{typeexport}} name = {{namebase}}0 return = ssh-public-key ssh-url notification-id ip config = # Resilient related parameters number authorized-key notify ip-list namebase {% if slapparameter_dict is defined %} # Software Instance related parameters {% for parameter_name in slapparameter_dict.keys() %}{{parameter_name}} {% endfor %} {% endif %} config-number = 0 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 %} config-ip-list = # Bubble up all the instance parameters to the requested export instance. {% if slapparameter_dict is defined %} {% for parameter_name, parameter_value in slapparameter_dict.items() %}config-{{parameter_name}} = {{parameter_value}} {% endfor %} {% endif %} {% if sla_parameter_dict -%} {% 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 -%} {% if sla_dict %} sla = {{ ' '.join(sla_dict.keys()) }} {% for key, value in sla_dict.iteritems() -%} sla-{{ key }} = {{ value }} {% endfor -%} {% endif -%} {% endif -%} {% 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}} return = ssh-public-key ssh-url notification-url ip pbs-notification-id = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}}-push config = number authorized-key on-notification ip-list namebase config-number = {{id}} config-authorized-key = ${request-pbs-{{namebase}}-{{id}}:connection-ssh-key} config-on-notification = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${:pbs-notification-id} config-ip-list = {% if sla_parameter_dict -%} {% 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 -%} {% if sla_dict %} sla = {{ ' '.join(sla_dict.keys()) }} {% for key, value in sla_dict.iteritems() -%} sla-{{ key }} = {{ value }} {% endfor -%} {% endif %} {% endif %} {% endfor -%} [iplist] config-ip-list = ${request-{{namebase}}:connection-ip}{% for j in range(1,nbbackup|int) %} ${request-{{namebase}}-pseudo-replicating-{{j}}:connection-ip}{% endfor %} [request-{{namebase}}-2] <= request-{{namebase}} iplist {% for id in range(1,nbbackup|int) %} [request-{{namebase}}-pseudo-replicating-{{id}}-2] <= request-{{namebase}}-pseudo-replicating-{{id}} iplist {% endfor %} ## The PBS and their push / pull slaves ## Adding a PBS provides resiliency ## Adding a backup server provides availability ## Having 3 backups pulling from the same PBS provides ##only availability, not resiliency [request-pbs-common] <= slap-connection recipe = slapos.cookbook:request software-url = ${slap-connection:software-release-url} software-type = pull-backup {% for id in range(1,nbbackup|int) %} [request-pbs-{{namebase}}-{{id}}] <= request-pbs-common name = PBS ({{namebase}} / {{id}}) return = ssh-key notification-url feeds-url slave = false {% if sla_parameter_dict -%} {% 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 -%} {% if sla_dict %} sla = {{ ' '.join(sla_dict.keys()) }} {% for key, value in sla_dict.iteritems() -%} sla-{{ key }} = {{ value }} {% endfor %} {% endif %} {% endif %} [request-pull-backup-server-{{namebase}}-{{id}}] <= request-pbs-common name = PBS {{id}} pulling from ${request-{{namebase}}:name} config = url name type server-key on-notification notify notification-id title remove-backup-older-than config-url = ${request-{{namebase}}:connection-ssh-url} 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 config-name = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}} config-title = Pulling from {{namebase}} config-remove-backup-older-than = {{ slapparameter_dict.get('remove-backup-older-than', '3B') }} slave = true sla = instance_guid sla-instance_guid = ${request-pbs-{{namebase}}-{{id}}:instance_guid} [request-pull-backup-server-{{namebase}}-backup-{{id}}] <= request-pbs-common name = PBS pushing on ${request-{{namebase}}-pseudo-replicating-{{id}}:name} config = url name type server-key on-notification notify notification-id title config-url = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-ssh-url} 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} config-name = ${slap-connection:computer-id}-${slap-connection:partition-id}-{{namebase}}-{{id}} config-title = Pushing to {{namebase}} backup {{id}} slave = true sla = instance_guid sla-instance_guid = ${request-pbs-{{namebase}}-{{id}}:instance_guid} {% endfor %} [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 %} {% endmacro %}