{% macro assert(x) %}{{ ("",)[not x] }}{% endmacro -%} {% set sla_dict = {} -%} {% for sla, ref_list in slapparameter_dict.get('sla-dict', {}).iteritems() -%} {% do sla_dict.update(dict.fromkeys(ref_list, sla)) -%} {% endfor -%} {% set frontend_dict = slapparameter_dict.get('frontend', {}) -%} {% set has_frontend = frontend_dict.get('software-url', '') != '' -%} {% set site_id = slapparameter_dict.get('site-id', 'erp5') -%} {% set inituser_login = slapparameter_dict.get('inituser-login', 'zope') -%} {% set publish_dict = {'site-id': site_id, 'inituser-login': inituser_login} -%} [request-common] 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} config-use-ipv6 = {{ dumps(slapparameter_dict.get('use-ipv6', False)) }} {% macro sla(name, required=False) -%} {% if required or name in sla_dict -%} {% for k, (v,) in urlparse.parse_qs(slap_dict.pop(name), strict_parsing=1).iteritems() -%} sla-{{ k }} = {{ dumps(v) }} {% endfor -%} {% endif -%} {% endmacro -%} {% macro request(name, software_type, config_key, config, ret={'url': True}) -%} {% do config.update(slapparameter_dict.get(config_key, {})) -%} {% set section = 'request-' ~ name -%} [{{ section }}] < = request-common name = {{ name }} software-type = {{ software_type }} return = {{ ' '.join(ret) }} {% for ret, publish in ret.iteritems() -%} {% if publish -%} {% do publish_dict.__setitem__(name ~ '-' ~ ret, '${' ~ section ~ ':connection-' ~ ret ~ '}')%} {% endif -%} {% endfor -%} {{ sla(name) }} {% for k, v in config.iteritems() -%} config-{{ k }} = {{ dumps(v) }} {% endfor -%} {% endmacro -%} {{ request('memcached-persistent', 'kumofs', 'kumofs', {'tcpv4-port': 2000}) }} {{ request('memcached-volatile', 'kumofs', 'memcached', {'tcpv4-port': 2010, 'ram-storage-size': 64}) }} {{ request('cloudooo', 'cloudooo', 'cloudooo', {'tcpv4-port': 2020}) }} {{ request('mariadb', 'mariadb', 'mariadb', {'tcpv4-port': 2099}, {'database-list': True, 'test-database-list': True}) }} {# ZODB -#} {% set zodb_dict = {} -%} {% set storage_dict = {} -%} {% set mountpoints = set() -%} {% for zodb in slapparameter_dict.get('zodb') or ({'type': 'zeo', 'server': {}},) -%} {% do mountpoints.add(zodb.setdefault('mount-point', '/')) -%} {% set name = zodb.pop('name', 'root') -%} {% do assert(name not in zodb_dict) -%} {% do zodb_dict.__setitem__(name, zodb) -%} {% if 'server' in zodb -%} {% do storage_dict.setdefault(zodb['type'], {}).__setitem__(name, zodb.pop('server')) -%} {% endif -%} {% endfor -%} {% do assert(len(mountpoints) == len(zodb_dict)) %} {% for server_type, server_dict in storage_dict.iteritems() -%} {% do assert(server_type == 'zeo') -%} {# BBB: for compatibility, keep 'zodb' as partition_reference for ZEO -#} {{ request('zodb', 'zodb-' ~ server_type, 'zodb-' ~ server_type, {'tcpv4-port': 2100, 'zodb-dict': server_dict}, dict.fromkeys(('storage-dict', 'tidstorage-ip', 'tidstorage-port'))) }} {% endfor -%} [inituser-password] {% set inituser_password = slapparameter_dict.get('inituser-password') -%} {% if inituser_password -%} passwd = {{ dumps(inituser_password) }} {% else -%} recipe = slapos.cookbook:generate.password {% endif -%} [deadlock-debugger-password] {% set deadlock_debugger_password = slapparameter_dict.get('deadlock-debugger-password') -%} {% if deadlock_debugger_password -%} passwd = {{ dumps(deadlock_debugger_password) }} {% else -%} recipe = slapos.cookbook:generate.password {% endif -%} [request-zope-base] < = request-common return = zope-address-list hosts-dict config-bt5 = {{ dumps(slapparameter_dict.get('bt5', 'erp5_full_text_myisam_catalog erp5_configurator_standard erp5_configurator_maxma_demo erp5_configurator_ung erp5_configurator_run_my_doc')) }} config-bt5-repository-url = {{ dumps(slapparameter_dict.get('bt5-repository-url', local_bt5_repository)) }} config-cloudooo-url = ${request-cloudooo:connection-url} config-deadlock-debugger-password = ${deadlock-debugger-password:passwd} config-developer-list = {{ dumps(slapparameter_dict.get('developer-list', [inituser_login])) }} config-hosts-dict = {{ dumps(slapparameter_dict.get('hosts-dict', {})) }} config-hostalias-dict = {{ dumps(slapparameter_dict.get('hostalias-dict', {})) }} config-inituser-login = {{ dumps(inituser_login) }} config-inituser-password = ${inituser-password:passwd} config-kumofs-url = ${request-memcached-persistent:connection-url} config-memcached-url = ${request-memcached-volatile:connection-url} config-mysql-test-url-list = ${request-mariadb:connection-test-database-list} config-mysql-url-list = ${request-mariadb:connection-database-list} config-site-id = {{ dumps(site_id) }} config-smtp-url = {{ dumps(slapparameter_dict.get('smtp-url', 'smtp://localhost:25/')) }} config-timezone = {{ dumps(slapparameter_dict.get('timezone', 'UTC')) }} config-zodb-dict = {{ dumps(zodb_dict) }} {% if storage_dict -%} config-zodb-zeo = ${request-zodb:connection-storage-dict} config-tidstorage-ip = ${request-zodb:connection-tidstorage-ip} config-tidstorage-port = ${request-zodb:connection-tidstorage-port} {% endif -%} software-type = zope {% set zope_family_dict = {} -%} {% for custom_name, zope_parameter_dict in slapparameter_dict.get('zope-partition-dict', {'1': {}}).items() -%} {% set partition_name = 'zope-' ~ custom_name -%} {% set section_name = 'request-' ~ partition_name -%} {% do zope_family_dict.setdefault(zope_parameter_dict.get('family', 'default'), []).append(section_name) -%} [{{ section_name }}] < = request-zope-base name = {{ partition_name }} {{ sla(partition_name) }} config-name = {{ dumps(custom_name) }} config-instance-count = {{ dumps(zope_parameter_dict.get('instance-count', 1)) }} config-thread-amount = {{ dumps(zope_parameter_dict.get('thread-amount', 4)) }} config-timerserver-interval = {{ dumps(zope_parameter_dict.get('timerserver-interval', 5)) }} config-longrequest-logger-interval = {{ dumps(zope_parameter_dict.get('longrequest-logger-interval', -1)) }} config-longrequest-logger-timeout = {{ dumps(zope_parameter_dict.get('longrequest-logger-timeout', 1)) }} config-port-base = {{ dumps(zope_parameter_dict.get('port-base', 2200)) }} config-webdav = {{ dumps(zope_parameter_dict.get('webdav', False)) }} {% endfor -%} {# We need to concatenate lists that we cannot read as lists, so this gets hairy. -#} {% set zope_address_list_id_dict = {} -%} {% set zope_family_parameter_dict = {} -%} {% for family_name, zope_section_id_list in zope_family_dict.items() -%} {% for zope_section_id in zope_section_id_list -%} {% set parameter_name = 'zope-family-entry-' ~ zope_section_id -%} {% do zope_address_list_id_dict.__setitem__(zope_section_id, parameter_name) -%} {% do zope_family_parameter_dict.setdefault(family_name, []).append(parameter_name) -%} {% endfor -%} {% if has_frontend -%} {% set frontend_name = 'frontend-' ~ family_name -%} {% set publishable = frontend_name ~ ':connection-site_url' -%} [{{ frontend_name }}] < = request-frontend-base name = {{ frontend_name }} config-url = ${request-balancer:{{ family_name }}-v6} {% else -%} {% set publishable = 'request-balancer:connection-' ~ family_name -%} {% endif -%} {% do publish_dict.__setitem__('family-' ~ family_name, '${' ~ publishable ~ '}' ) -%} {% endfor -%} {% set balancer_dict = slapparameter_dict.get('balancer', {}) -%} [request-balancer] < = request-common name = balancer software-type = balancer {{ sla('balancer') }} return = {%- for family in zope_family_dict %} {{ family }} {{ family }}-v6 {% endfor -%} config-zope-family-dict = {{ dumps(zope_family_parameter_dict) }} config-tcpv4-port = {{ dumps(balancer_dict.get('tcpv4-port', 2150)) }} {% for zope_section_id, name in zope_address_list_id_dict.items() -%} config-{{ name }} = {{ ' ${' ~ zope_section_id ~ ':connection-zope-address-list}' }} {% endfor -%} # XXX: should those really be same for all families ? config-haproxy-server-check-path = {{ dumps(balancer_dict.get('haproxy-server-check-path', '/') % {'site-id': site_id}) }} config-backend-path = {{ dumps(balancer_dict.get('apache-backend-path', '/') % {'site-id': site_id}) }} config-ssl = {{ dumps(balancer_dict.get('ssl', {})) }} [request-frontend-base] {% if has_frontend -%} < = request-common software-url = {{ dumps(frontend_dict['software-url']) }} software-type = {{ dumps(frontend_dict.get('software-type', 'RootSoftwareInstance')) }} {{ sla('frontend', True) }} slave = true {% set config_dict = { 'type': 'zope', } -%} {% if frontend_dict.get('domain') -%} {% do config_dict.__setitem__('custom_domain', frontend_dict['domain']) -%} {% endif -%} {% for name, value in config_dict.items() -%} config-{{ name }} = {{ value }} {% endfor -%} return = site_url {% endif -%} [publish] recipe = slapos.cookbook:publish.serialised deadlock-debugger-password = ${deadlock-debugger-password:passwd} inituser-password = ${inituser-password:passwd} {# Pick any published hosts-dict, they are expected to be identical - and there is no way to check here. -#} hosts-dict = {{ '${' ~ zope_address_list_id_dict.keys()[0] ~ ':connection-hosts-dict}' }} {% for name, value in publish_dict.items() -%} {{ name }} = {{ value }} {% endfor -%} [buildout] parts = publish {{- assert(not sla_dict) }}