root-common.cfg.in 4.8 KB
Newer Older
1 2 3 4
{% macro section(name) %}{% do part_list.append(name) %}{{ name }}{% endmacro -%}
{% set part_list = [] -%}

{% set sla_dict = {} -%}
5
{% for sla, ref_list in six.iteritems(slapparameter_dict.get('sla-dict', {})) -%}
6 7 8 9 10
{%   do sla_dict.update(dict.fromkeys(ref_list, sla)) -%}
{% endfor -%}

{% macro sla(name, required=False) -%}
{% if required or name in sla_dict -%}
11
{%  for k, (v,) in six.iteritems(urllib_parse.parse_qs(sla_dict.pop(name), strict_parsing=1)) -%}
12 13 14 15 16 17 18
sla-{{ k }} = {{ v }}
{%  endfor -%}
{% else -%}
sla-computer_guid = ${slap-connection:computer-id}
{% endif -%}
{% endmacro -%}

19 20 21 22 23 24 25 26 27 28 29 30 31 32
{% macro apply_overrides(dict_, reference) -%}
{% for key in list(dict_) -%}
{%   if key.endswith('!') -%}
{%     for pattern, value in dict_.pop(key, ()) -%}
{%       set m = re.match(pattern, reference) -%}
{%       if m and m.group() == reference %}{# PY3: fullmatch -#}
{%         do dict_.__setitem__(key[:-1], value) -%}
{%         break -%}
{%       endif -%}
{%     endfor -%}
{%   endif -%}
{% endfor -%}
{% endmacro -%}

33 34 35 36 37 38 39 40 41 42 43
{% macro common_section() -%}
[request-common-base]
recipe = slapos.cookbook:request.serialised
software-url = ${slap-connection:software-release-url}
server-url = ${slap-connection:server-url}
key-file = ${slap-connection:key-file}
cert-file = ${slap-connection:cert-file}
computer-id = ${slap-connection:computer-id}
partition-id = ${slap-connection:partition-id}

[buildout]
44
extends = {{ template_monitor }}
45 46 47 48 49 50 51
parts =
  publish
  {{ part_list | join('\n\t') }}

{{- assert(not sla_dict, sla_dict) }}
{% endmacro -%}

Julien Muchembled's avatar
Julien Muchembled committed
52
{% macro request_neo(parameter_dict, software_type, prefix='node-', monitor_base_url_dict=None) -%}
53 54 55
{% set section_id_list = [] -%}
[{{ prefix }}request-common]
<= request-common-base
56
config-masters = {{ '${' ~ prefix ~ 'cluster:masters}' }}
57
config-cluster = {{ parameter_dict['cluster'] }}
58 59 60
{% set replicas = parameter_dict.get('replicas', 0) -%}
config-partitions = {{ dumps(parameter_dict.get('partitions', 12)) }}
config-replicas = {{ dumps(replicas) }}
61 62 63 64 65
config-ssl = {{ dumps((
  parameter_dict.get('_ca'),
  parameter_dict.get('_cert'),
  parameter_dict.get('_key'),
  ) if parameter_dict.get('ssl', 1) else ()) }}
66 67 68
config-upstream-cluster = {{ dumps(parameter_dict.get('upstream-cluster', '')) }}
config-upstream-masters = {{ dumps(parameter_dict.get('upstream-masters', '')) }}
software-type = {{ software_type }}
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

{% set node_list = parameter_dict.get('node-list') -%}
{% if node_list == None -%}
{%   set node_list = [] -%}
{%   for i in range(parameter_dict.get('node-count', 1)) -%}
{%     set x = parameter_dict.copy() -%}
{%     do apply_overrides(x, prefix ~ i) -%}
{%     do node_list.append(x.get('node', {})) -%}
{%   endfor -%}
{% else %}{# BBB -#}
{%   do assert('node-count' not in parameter_dict) -%}
{%   do assert('node' not in parameter_dict) -%}
{%   do assert('node!' not in parameter_dict) -%}
{% endif -%}
{% do assert(node_list) -%}

85
{% set storage_count = [] -%}
86 87 88 89
{% for node in node_list -%}
{%   do storage_count.append(node.get('storage-count', 1)) -%}
{% endfor -%}
config-autostart = {{ dumps(sum(storage_count)) }}
90
{%- do assert(replicas < len(node_list)) %}
91
{%- set monitor = set() %}
92
{%- for node in node_list %}
93 94 95 96 97 98 99 100 101
{%-   set port = node.get('monitor') %}
{%-   if port %}
{%-     do monitor.add(node.get('admin') != 0 and port) %}
{%-   endif %}
{%- endfor %}
{%- if False in monitor %}
{%-   do monitor.remove(False) %}
{%-   do assert(monitor) %}
{%- endif %}
102 103
{%- for i, node in enumerate(node_list) %}
{%-   set section_id =  prefix ~ i %}
104
{%-   if node.get('master') == 0 and not node.get('monitor') %}
105 106
{%-     do node.setdefault('admin', 0) %}
{%-   endif %}
107 108 109
{%-   if monitor or node.get('admin') == 0 %}
{%-     do node.setdefault('monitor', 0) %}
{%-   endif %}
110 111
{%-   for x in 'admin', 'master', 'storage-count' if node.get(x, 1) %}
{%-     do section_id_list.append(section_id) %}
112

113 114
[{{section_id}}]
<= {{ prefix }}request-common
115
name = {{ section_id }}
Julien Muchembled's avatar
Julien Muchembled committed
116 117 118
return =
  master
  admin
119 120 121
{%-   set port = node.pop('monitor', None) %}
{%-   if port != 0 or node.get('admin') != 0 and not monitor %}
{%-     if port != 0 %}
Julien Muchembled's avatar
Julien Muchembled committed
122
  monitor-base-url
123 124 125 126
{%-       if monitor_base_url_dict != None %}
{%-         do monitor_base_url_dict.__setitem__('neo',
              '${' ~ section_id ~ ':connection-monitor-base-url}') %}
{%-       endif %}
Julien Muchembled's avatar
Julien Muchembled committed
127
config-monitor-passwd = ${monitor-htpasswd:passwd}
128 129 130 131 132 133
{%-     endif %}
{%-     if port %}
config-monitor-port = {{ dumps(port) }}
{%-     else %}
{%-       do monitor.add(None) %}
{%-     endif %}
Julien Muchembled's avatar
Julien Muchembled committed
134
config-monitor = {{ dumps(parameter_dict.get('monitor', {})) }}
135
{%-   endif %}
136
{%-   for k, v in six.iteritems(node) %}
137
config-{{ k }} = {{ dumps(v) }}
138
{%-   endfor %}
139
{{ sla(section_id) }}
140 141 142

{%-     break %}
{%-   endfor %}
143
{%- endfor %}
144
{%- do assert(len(monitor) == 1, monitor) %}
145

146 147 148
[{{section(prefix ~ 'cluster')}}]
recipe = slapos.cookbook:neoppod.cluster
nodes = {{ ' '.join(section_id_list) }}
149
{% endmacro -%}