{% if software_type == slap_software_type -%} {% set use_ipv6 = slapparameter_dict.get('use-ipv6', False) -%} {% set next_port = 2000 -%} {% set part_list = [] -%} {% set storage_dict = {} -%} {% set zodb_dict = {} -%} {% set tidstorage_dict = slapparameter_dict.get('tidstorage-dict') -%} {% set known_tid_storage_identifier_dict = {} -%} {% set default_zodb_path = buildout_directory ~ '/srv/zodb' -%} {% set zodb_backup_path = buildout_directory ~ '/srv/backup/zodb' -%} {% set default_tidstorage_timestamp_path = buildout_directory ~ '/srv/backup/tidstorage' -%} {% macro section(name) %}{% do part_list.append(name) %}{{ name }}{% endmacro -%} {# XXX: This template only supports exactly one IPv6 per partition. No more (undefined result), no less (IndexError). -#} {% set ipv4 = (ipv4_set | list)[0] -%} {% set tidstorage_ip = ipv4 -%} {% set tidstorage_port = 6001 -%} {% set bin_directory = parameter_dict['buildout-bin-directory'] -%} [zeo-base] recipe = slapos.cookbook:zeo log-path = ${directory:log}/${:base-name}.log pid-path = ${directory:run}/${:base-name}.pid conf-path = ${directory:etc}/${:base-name}.conf wrapper-path = ${directory:services}/${:base-name} binary-path = {{ bin_directory }}/runzeo ip = {{ ipv4 }} {% if use_ipv6 -%} {% set ipv6 = (ipv6_set | list)[0] -%} [ipv6toipv4-base] recipe = slapos.cookbook:ipv6toipv4 runner-path = ${directory:services}/${:base-name} 6tunnel-path = {{ parameter_dict['6tunnel'] }}/bin/6tunnel shell-path = {{ parameter_dict['dash'] }}/bin/dash ipv4 = {{ ipv4 }} ipv6 = {{ ipv6 }} {% endif -%} {% for export_id, mountpoint_dict in slapparameter_dict['zodb-dict'].items() -%} {% do storage_dict.setdefault( mountpoint_dict.get('storage-family', 'default'), [] ).append(( export_id, mountpoint_dict.get('mount-point', '/'), mountpoint_dict.get('cache-size', -1), mountpoint_dict.get('storage-dict', {}), )) -%} {% endfor -%} {% for storage_family, export_list in storage_dict.items() -%} {% set known_tid_storage_identifier_host = (ipv4, local_current_port) -%} {% set client_dict = {} -%} {% for export_id, mount_point, cache_size, storage_dict in export_list -%} {% do storage_dict.__setitem__('path', storage_dict.get('path', '%(zodb)s/' ~ export_id ~ '.fs') % {'zodb': default_zodb_path}) -%} {% do client_dict.update(storage_dict.get('client', {})) -%} {% do client_dict.__setitem__('storage', export_id) -%} {# XXX: I would like to raise if export_id is present in zodb_dict -#} {% do zodb_dict.__setitem__(export_id, [ mount_point, cache_size, client_dict, ]) -%} {% if tidstorage_dict is not None -%} {% do known_tid_storage_identifier_dict.__setitem__( (known_tid_storage_identifier_host, export_id), ( storage_dict['path'], tidstorage_dict.get('zodb-dict', {}).get(export_id, '%(backup)s/' ~ export_id) % {'backup': zodb_backup_path}, mount_point, ), ) -%} {% endif -%} {% endfor -%} {% set zeo_section_name = 'zeo-' ~ storage_family %} [{{ zeo_section_name }}] < = zeo-base base-name = zeo-{{ storage_family }} port = {{ next_port }} {% set storage_list = [] -%} {% for storage_name, _, _, storage_dict in export_list -%} {% do storage_list.append((storage_name, storage_dict['path'])) -%} {% endfor -%} storage = {{ dumps(storage_list) }} [{{ section(zeo_section_name ~ "-promise") }}] recipe = slapos.cookbook:check_port_listening hostname = {{ "${" ~ zeo_section_name ~ ":ip}" }} port = {{ next_port }} path = ${directory:promises}/zeo-{{ storage_family }} {% if use_ipv6 -%} {% do client_dict.__setitem__('server', '[' ~ ipv6 ~ ']:' ~ next_port) -%} {% set tunnel_section_name = zeo_section_name ~ "-tunnel" -%} [{{ tunnel_section_name }}] < = ipv6toipv4-base base-name = zeo-tunnel-{{ storage_family }} ipv6-port = {{ next_port }} ipv4-port = {{ next_port }} [{{ section(tunnel_section_name ~ "-promise") }}] recipe = slapos.cookbook:check_port_listening hostname = {{ "${" ~ tunnel_section_name ~ ":ipv6}" }} port = {{ next_port }} path = ${directory:promises}/zeo-tunnel-{{ storage_family }} {% else -%} {% do client_dict.__setitem__('server', ipv4 ~ ':' ~ next_port) -%} {% endif -%} {% set next_port = next_port + 1 -%} {% endfor -%} {% if tidstorage_dict is not None -%} [tidstorage] recipe = slapos.cookbook:tidstorage known-tid-storage-identifier-dict = {{ dumps(known_tid_storage_identifier_dict) }} configuration-path = ${directory:etc}/tidstorage.py ip = {{ tidstorage_ip }} port = {{ tidstorage_port }} timestamp-file-path = {{ tidstorage_dict.get('timestamp-path', '%(backup)s/repozo_tidstorage_timestamp.log' % {'backup': default_tidstorage_timestamp_path}) }} logfile-name = ${directory:log}/tidstorage.log pidfile-name = ${directory:run}/tidstorage.pid status-file = ${directory:tidstorage}/tidstorage.tid tidstorage-repozo-binary = {{ bin_directory }}/tidstorage_repozo tidstoraged-binary = {{ bin_directory }}/tidstoraged repozo-binary = {{ bin_directory }}/repozo tidstorage-wrapper = ${directory:services}/tidstoraged repozo-wrapper = ${buildout:bin-directory}/tidstorage-repozo [{{ section("promise-tidstorage") }}] recipe = slapos.cookbook:check_port_listening hostname = ${tidstorage:ip} port = ${tidstorage:port} path = ${directory:promises}/tidstorage {% if use_ipv6 -%} [tidstorage-tunnel] < = ipv6toipv4-base base-name = tidstorage-tunnel ipv4-port = ${tidstorage:port} ipv6-port = ${tidstorage:port} [{{ section("promise-tidstorage-tunnel") }}] recipe = slapos.cookbook:check_port_listening hostname = ${tidstorage-tunnel:ipv6} port = ${tidstorage-tunnel:ipv6-port} path = ${directory:promises}/tidstorage {% endif -%} [{{ section("cron-entry-tidstorage-backup") }}] # TODO: # - configurable periodicity # - configurable full/incremental # - configurable retention recipe = slapos.cookbook:cron.d cron-entries = ${cron:cron-entries} name = tidstorage frequency = 0 0 * * * command = ${tidstorage:repozo-wrapper} [{{ section("logrotate-tidstorage") }}] recipe = slapos.cookbook:logrotate.d logrotate-entries = ${logrotate:logrotate-entries} backup = ${logrotate:backup} name = tidstorage log = ${tidstorage:logfile-name} post = {{ bin_directory }}/killpidfromfile ${tidstorage:pidfile-name} SIGHUP {% else -%} [tidstorage] ip = port = [tidstorage-tunnel] ipv6 = ipv6-port = {% endif -%} [publish] recipe = slapos.cookbook:publish.serialised zodb-storage-type = zeoclient zodb-dict = {{ dumps(zodb_dict) }} {% if use_ipv6 -%} tidstorage-ip = ${tidstorage-tunnel:ipv6} tidstorage-port = ${tidstorage-tunnel:ipv6-port} {% else -%} tidstorage-ip = ${tidstorage:ip} tidstorage-port = ${tidstorage:port} {% endif -%} [directory] recipe = slapos.cookbook:mkdirectory etc = ${buildout:directory}/etc services = ${:etc}/run promises = ${:etc}/promise var = ${buildout:directory}/var log = ${:var}/log run = ${:var}/run backup-zodb = {{ zodb_backup_path }} zodb = {{ default_zodb_path }} tidstorage = {{ default_tidstorage_timestamp_path }} [buildout] extends = {{ parameter_dict['instance-logrotate-cfg'] }} parts += {{ part_list | join('\n ') }} publish eggs-directory = {{ eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }} offline = true {% endif %}