{% import "root_common" as root_common with context -%} {% import "caucase" as caucase with context %} {% 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} -%} {% set has_posftix = slapparameter_dict.get('smtp', {}).get('postmaster') -%} {% set jupyter_dict = slapparameter_dict.get('jupyter', {}) -%} {% set has_jupyter = jupyter_dict.get('enable', jupyter_enable_default.lower() in ('true', 'yes')) -%} {% set jupyter_zope_family = jupyter_dict.get('zope-family', '') -%} {% set wcfs_dict = slapparameter_dict.get('wcfs', {}) -%} {% set wcfs_enable = wcfs_dict.get('enable', wcfs_enable_default.lower() in ('true', 'yes')) -%} {% set with_max_rlimit_nofile_enable = slapparameter_dict.get( 'with-max-rlimit-nofile', with_max_rlimit_nofile_enable_default.lower() in ('true', 'yes')) %} {% set test_runner_enabled = slapparameter_dict.get('test-runner', {}).get('enabled', True) -%} {% set test_runner_node_count = slapparameter_dict.get('test-runner', {}).get('node-count', 3) -%} {% set test_runner_extra_database_count = slapparameter_dict.get('test-runner', {}).get('extra-database-count', 3) -%} {% set test_runner_total_database_count = test_runner_node_count * (1 + test_runner_extra_database_count) -%} {# Backward compatibility for mariadb.test-database-amount #} {% set mariadb_test_database_amount = slapparameter_dict.get('mariadb', {}).get('test-database-amount') -%} {% if mariadb_test_database_amount is not none -%} {% set test_runner_total_database_count = mariadb_test_database_amount %} {% set test_runner_enabled = mariadb_test_database_amount > 0 %} {% endif -%} {# Backward compatibility for cloudooo-url #} {% if slapparameter_dict.get('cloudooo-url') -%} {% do slapparameter_dict.setdefault('cloudooo-url-list', slapparameter_dict['cloudooo-url'].split(',')) %} {% endif -%} {% set test_runner_random_activity_priority = slapparameter_dict.get('test-runner', {}).get('random-activity-priority') -%} {% set monitor_base_url_dict = {} -%} {% set monitor_dict = slapparameter_dict.get('monitor', {}) %} {% set use_ipv6 = slapparameter_dict.get('use-ipv6', False) -%} {% set partition_thread_count_list = [] -%} {% set zope_partition_dict = slapparameter_dict.get('zope-partition-dict', {'1': {}}) -%} {% set zope_family_override_dict = slapparameter_dict.get('family-override', {}) -%} {% for zope_parameter_dict in six.itervalues(zope_partition_dict) -%} {# Apply some zope_parameter_dict default values, to avoid duplication. -#} {% do zope_parameter_dict.setdefault('thread-amount', 4) -%} {% do zope_parameter_dict.setdefault('instance-count', 1) -%} {% do partition_thread_count_list.append(zope_parameter_dict['thread-amount'] * zope_parameter_dict['instance-count']) -%} {% endfor -%} [request-common] <= request-common-base config-use-ipv6 = {{ dumps(slapparameter_dict.get('use-ipv6', False)) }} config-computer-memory-percent-threshold = {{ dumps(monitor_dict.get('computer-memory-percent-threshold', 80)) }} {% set caucase_dict = slapparameter_dict.get('caucase', {}) -%} {% set caucase_url = caucase_dict.get('url', '') -%} {% macro request(name, software_type, config_key, config, ret={'url': True}, key_config={}) -%} {% 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 six.iteritems(ret) -%} {% if publish -%} {% do publish_dict.__setitem__(name ~ '-' ~ ret, '${' ~ section ~ ':connection-' ~ ret ~ '}') %} {% endif -%} {% if ret == "monitor-base-url" -%} {% do monitor_base_url_dict.__setitem__(section, '${' ~ section ~ ':connection-' ~ ret ~ '}') -%} {% endif -%} {% endfor -%} {{ root_common.sla(name) }} {% for k, v in six.iteritems(config) -%} config-{{ k }} = {{ dumps(v) }} {% endfor -%} {% for k, v in six.iteritems(key_config) -%} config-{{ k }} = {{ '${' ~ v ~ '}' }} {% endfor -%} config-name = {{ name }} {% endmacro -%} [directory] recipe = slapos.cookbook:mkdirectory bin = ${buildout:directory}/bin service-on-watch = ${buildout:directory}/etc/service srv = ${buildout:directory}/srv tmp = ${buildout:directory}/tmp {% set balancer_dict = slapparameter_dict.setdefault('balancer', {}) -%} {% do balancer_dict.setdefault('ssl', {}) %} {% if caucase_url %} {% do balancer_dict['ssl'].setdefault('caucase-url', caucase_url) -%} [balancer-updated-caucase-url] # Promise to wait for balancer partition to use the provided URL, for cases where the # caucase URL is changed recipe = slapos.cookbook:check_parameter value = ${publish:caucase-http-url} expected-not-value = expected-value = {{ caucase_url }} path = ${directory:bin}/${:_buildout_section_name_} [balancer-updated-caucase-url-promise] <= monitor-promise-base promise = check_command_execute name = ${:_buildout_section_name_}.py config-command = ${balancer-updated-caucase-url:path} {% do root_common.section("balancer-updated-caucase-url-promise") -%} {% endif %} {% do balancer_dict.setdefault('tcpv4-port', 2150) -%} {% do balancer_dict.__setitem__('haproxy-server-check-path', balancer_dict.get('haproxy-server-check-path', '/') % {'site-id': site_id}) -%} {% set routing_path_template_field_dict = {"site-id": site_id} -%} {% macro expandRoutingPath(output, input) -%} {% for outer_prefix, inner_prefix in input -%} {% do output.append((outer_prefix, inner_prefix % routing_path_template_field_dict)) -%} {% endfor -%} {% endmacro -%} {% set path_routing_list = [] -%} {% do expandRoutingPath( path_routing_list, balancer_dict.get( 'path-routing-list', (('/', '/'), ), ), ) -%} {% do balancer_dict.__setitem__('path-routing-list', path_routing_list) -%} {% set family_path_routing_dict = {} -%} {% for name, family_path_routing_list in balancer_dict.get( 'family-path-routing-dict', {}, ).items() -%} {% set path_routing_list = [] -%} {% do expandRoutingPath(path_routing_list, family_path_routing_list) -%} {% do family_path_routing_dict.__setitem__(name, path_routing_list) -%} {% endfor -%} {% do balancer_dict.__setitem__('family-path-routing-dict', family_path_routing_dict) -%} {{ request('memcached-persistent', 'kumofs', 'kumofs', {'tcpv4-port': 2000}, {'url': True, 'monitor-base-url': False}, key_config={'monitor-passwd': 'monitor-htpasswd:passwd'}) }} {{ request('memcached-volatile', 'kumofs', 'memcached', {'tcpv4-port': 2010, 'ram-storage-size': 64}, {'url': True, 'monitor-base-url': False}, key_config={'monitor-passwd': 'monitor-htpasswd:passwd'}) }} {# Notes on max-connection-count: On a standard ERP5, each transaction can have 4 connections to mariadb: activities, catalog, deferred and transactionless. Count 5 to have some headroom. Multiply by the total number of zope threads for all processes from all partitions to get the expected number of connections. Add 50 for have some more zope-independent headroom (automated probes, replication, ...). -#} {{ request('mariadb', 'mariadb', 'mariadb', { 'tcpv4-port': 2099, 'max-slowqueries-threshold': monitor_dict.get('max-slowqueries-threshold', 1000), 'slowest-query-threshold': monitor_dict.get('slowest-query-threshold', ''), 'test-database-amount': test_runner_total_database_count, 'max-connection-count': sum(partition_thread_count_list) * 5 + 50, }, { 'database-list': True, 'test-database-list': True, 'monitor-base-url': False, }, key_config={'monitor-passwd': 'monitor-htpasswd:passwd'}, ) }} {% if has_posftix -%} {{ request('smtp', 'postfix', 'smtp', {'tcpv4-port': 2025, 'smtpd-sasl-user': 'erp5@nowhere'}, key_config={'smtpd-sasl-password': 'publish-early:smtpd-sasl-password', 'monitor-passwd': 'monitor-htpasswd:passwd'}) }} {%- else %} [request-smtp] # Placeholder smtp service URL connection-url = smtp://127.0.0.2:0/ {%- endif %} {# 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, name, 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)) -%} {% set neo = [] -%} {% for server_type, server_dict in six.iteritems(storage_dict) -%} {% if server_type == 'neo' -%} {% set ((name, server_dict),) = server_dict.items() -%} {% do neo.append(server_dict.get('cluster')) -%} {% do server_dict.update(cluster='${publish-early:neo-cluster}') -%} {{ root_common.request_neo(server_dict, 'zodb-neo', 'neo-', monitor_base_url_dict) }} {% set client_dict = zodb_dict[name].setdefault('storage-dict', {}) -%} {% for k in 'ssl', '_ca', '_cert', '_key' -%} {% do k in server_dict and client_dict.setdefault(k, server_dict[k]) -%} {% endfor -%} {% else -%} {{ assert(server_type == 'zeo', server_type) -}} {# 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', 'monitor-base-url')), key_config={'monitor-passwd': 'monitor-htpasswd:passwd'}) }} {% endif -%} {% endfor -%} [request-zodb-base] config-zodb-dict = {{ dumps(zodb_dict) }} {% for server_type, server_dict in six.iteritems(storage_dict) -%} {% if server_type == 'neo' -%} config-neo-cluster = ${publish-early:neo-cluster} config-neo-name = {{ list(server_dict.keys())[0] }} config-neo-masters = ${publish-early:neo-masters} {% else -%} 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 -%} {% endfor -%} {% set zope_address_list_id_dict = {} -%} {% if zope_partition_dict -%} [request-zope-base] <= request-common request-zodb-base return = zope-address-list hosts-dict monitor-base-url software-release-url {%- if test_runner_enabled %} test-runner-address-list {% endif %} {% set bt5_default_list = default_bt5.split() -%} {% if has_jupyter -%} {% do bt5_default_list.append('erp5_data_notebook') -%} {% endif -%} config-bt5 = {{ dumps(slapparameter_dict.get('bt5', ' '.join(bt5_default_list))) }} config-bt5-repository-url = {{ dumps(slapparameter_dict.get('bt5-repository-url', local_bt5_repository)) }} config-cloudooo-url-list = {{ dumps(slapparameter_dict.get('cloudooo-url-list', default_cloudooo_url_list)) }} config-deadlock-debugger-password = ${publish-early:deadlock-debugger-password} config-developer-list = {{ dumps(slapparameter_dict.get('developer-list', [inituser_login])) }} config-selenium-server-configuration-dict = {{ dumps(slapparameter_dict.get('selenium-server-configuration-dict', {})) }} config-hosts-dict = {{ dumps(slapparameter_dict.get('hosts-dict', {})) }} config-computer-hosts-dict = {{ dumps(slapparameter_dict.get('computer-hosts-dict', {})) }} config-hostalias-dict = {{ dumps(slapparameter_dict.get('hostalias-dict', {})) }} config-id-store-interval = {{ dumps(slapparameter_dict.get('id-store-interval')) }} config-zope-longrequest-logger-error-threshold = {{ dumps(monitor_dict.get('zope-longrequest-logger-error-threshold', 20)) }} config-zope-longrequest-logger-maximum-delay = {{ dumps(monitor_dict.get('zope-longrequest-logger-maximum-delay', 0)) }} config-inituser-login = {{ dumps(inituser_login) }} config-inituser-password-hashed = ${publish-early:inituser-password-hashed} config-kumofs-url = ${request-memcached-persistent:connection-url} config-memcached-url = ${request-memcached-volatile:connection-url} config-monitor-passwd = ${monitor-htpasswd:passwd} config-mysql-test-url-list = ${request-mariadb:connection-test-database-list} config-mysql-url-list = ${request-mariadb:connection-database-list} config-python-hash-seed = {{ dumps(slapparameter_dict.get('python-hash-seed', '')) }} config-site-id = {{ dumps(site_id) }} config-smtp-url = ${request-smtp:connection-url} config-timezone = {{ dumps(slapparameter_dict.get('timezone', 'UTC')) }} config-cloudooo-retry-count = {{ slapparameter_dict.get('cloudooo-retry-count', 2) }} config-wendelin-core-zblk-fmt = {{ dumps(slapparameter_dict.get('wendelin-core-zblk-fmt', '')) }} config-test-runner-enabled = {{ dumps(test_runner_enabled) }} config-test-runner-node-count = {{ dumps(test_runner_node_count) }} config-test-runner-random-activity-priority = {{ dumps(test_runner_random_activity_priority) }} config-wcfs_enable = {{ dumps(wcfs_enable) }} config-test-runner-configuration = {{ dumps(slapparameter_dict.get('test-runner', {})) }} software-type = zope {% set global_publisher_timeout = slapparameter_dict.get('publisher-timeout', 300) -%} {% set global_activity_timeout = slapparameter_dict.get('activity-timeout') -%} {% set zope_family_dict = {} -%} {% set zope_family_name_list = [] -%} {% set ssl_authentication_dict = {} -%} {% set balancer_timeout_dict = {} -%} {% set jupyter_zope_family_default = [] -%} {% for custom_name, zope_parameter_dict in six.iteritems(zope_partition_dict) -%} {% set partition_name = 'zope-' ~ custom_name -%} {% set section_name = 'request-' ~ partition_name -%} {% set check_software_url_section_name = 'check-software-url' ~ partition_name -%} {% set promise_software_url_section_name = 'promise-software-url' ~ partition_name -%} {% set check_test_runner_url_section_name = 'check-test-runner-url' ~ partition_name -%} {% set promise_test_runner_url_section_name = 'promise-test-runner-url' ~ partition_name -%} {% set zope_family = zope_parameter_dict.get('family', 'default') -%} {% do zope_family_name_list.append(zope_family) %} {# # default jupyter zope family is first zope family. -#} {# # use list.append() to update it, because in jinja2 set changes only local scope. -#} {% if not jupyter_zope_family_default -%} {% do jupyter_zope_family_default.append(zope_family) -%} {% endif -%} {% do zope_family_dict.setdefault(zope_family, []).append(section_name) -%} {% do ssl_authentication_dict.__setitem__(zope_family, zope_parameter_dict.get('ssl-authentication', False)) -%} {% set current_zope_family_override_dict = zope_family_override_dict.get(zope_family, {}) -%} {% do balancer_timeout_dict.__setitem__(zope_family, current_zope_family_override_dict.get('publisher-timeout', global_publisher_timeout)) -%} [{{ section_name }}] <= request-zope-base name = {{ partition_name }} {% do monitor_base_url_dict.__setitem__(section_name, '${' ~ section_name ~ ':connection-monitor-base-url}') -%} {{ root_common.sla(partition_name) }} config-name = {{ dumps(custom_name) }} config-instance-count = {{ dumps(zope_parameter_dict['instance-count']) }} config-private-dev-shm = {{ zope_parameter_dict.get('private-dev-shm', '') }} config-thread-amount = {{ dumps(zope_parameter_dict['thread-amount']) }} config-timerserver-interval = {{ dumps(zope_parameter_dict.get('timerserver-interval', 1)) }} 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-large-file-threshold = {{ dumps(zope_parameter_dict.get('large-file-threshold', "10MB")) }} config-port-base = {{ dumps(zope_parameter_dict.get('port-base', 2200)) }} config-with-max-rlimit-nofile = {{ dumps(with_max_rlimit_nofile_enable) }} {# BBB: zope_parameter_dict used to contain 'webdav', so fallback to it -#} config-webdav = {{ dumps(current_zope_family_override_dict.get('webdav', zope_parameter_dict.get('webdav', False))) }} config-publisher-timeout = {{ dumps(current_zope_family_override_dict.get('publisher-timeout', global_publisher_timeout)) }} config-activity-timeout = {{ dumps(current_zope_family_override_dict.get('activity-timeout', global_activity_timeout)) }} {% if test_runner_enabled -%} config-test-runner-balancer-url-list = ${publish-early:{{ zope_family }}-test-runner-url-list} [{{ check_test_runner_url_section_name }}] # Promise to wait for zope partition to receive the expected test-runner URL recipe = slapos.cookbook:check_parameter value = {{ '${' ~ section_name ~ ':config-test-runner-balancer-url-list}' }} expected-not-value = not-ready expected-value = path = ${directory:bin}/${:_buildout_section_name_} [{{ promise_test_runner_url_section_name }}] <= monitor-promise-base promise = check_command_execute name = ${:_buildout_section_name_}.py config-command = {{ '${' ~ check_test_runner_url_section_name ~ ':path}' }} {% do root_common.section(promise_test_runner_url_section_name) -%} {% endif -%} [{{ check_software_url_section_name }}] # Promise to wait for zope partition to use the expected software URL, # used on upgrades. recipe = slapos.cookbook:check_parameter value = {{ '${' ~ section_name ~ ':connection-software-release-url}' }} expected-not-value = expected-value = ${slap-connection:software-release-url} path = ${directory:bin}/${:_buildout_section_name_} [{{ promise_software_url_section_name }}] <= monitor-promise-base promise = check_command_execute name = ${:_buildout_section_name_}.py config-command = {{ '${' ~ check_software_url_section_name ~ ':path}' }} {% do root_common.section(promise_software_url_section_name) -%} {% endfor -%} {# if not explicitly configured, connect jupyter to first zope family, which -#} {# will be 'default' if zope families are not configured also -#} {% if not jupyter_zope_family and jupyter_zope_family_default -%} {% set jupyter_zope_family = jupyter_zope_family_default[0] -%} {% endif -%} {# We need to concatenate lists that we cannot read as lists, so this gets hairy. -#} {% 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 -%} {% do publish_dict.__setitem__('family-' ~ family_name, '${request-balancer:connection-' ~ family_name ~ '}' ) -%} {% do publish_dict.__setitem__('family-' ~ family_name ~ '-v6', '${request-balancer:connection-' ~ family_name ~ '-v6}' ) -%} {% endfor -%} {# We request a default frontend when exactly only one zope family exists #} {% set frontend_parameter_dict = slapparameter_dict.get( 'frontend', {'default': { 'zope-family': list(zope_family_dict)[0] }} if len(zope_family_dict) == 1 else {} ) -%} [request-frontend-base] <= request-common recipe = slapos.cookbook:request shared = true return = secure_access {{ root_common.sla('frontend', default_to_same_computer=False) }} {% for frontend_name, frontend_parameters in frontend_parameter_dict.items() -%} {% set frontend_full_name = 'frontend-' ~ frontend_name -%} {% set request_frontend_name = 'request-frontend-' ~ frontend_name -%} {% set frontend_software_url = frontend_parameters.get('software-url', 'http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg') -%} {% set frontend_software_type = frontend_parameters.get('software-type', '') -%} {% do frontend_parameters.__setitem__('internal-path', frontend_parameters.get('internal-path', '/%(site-id)s') % {'site-id': site_id}) %} {% set frontend_instance_parameters = frontend_parameters.get('instance-parameters', {}) -%} {% if frontend_instance_parameters.setdefault('type', '') == '' -%} {% do frontend_instance_parameters.setdefault('authenticate-to-backend', 'true') -%} {% set zope_family_name = frontend_parameters['zope-family'] -%} {% do assert(zope_family_name in zope_family_dict, 'Unknown family %s for frontend %s' % (zope_family_name, frontend_name)) -%} {% do frontend_instance_parameters.setdefault('url', '${request-balancer:connection-url-backend-' ~ frontend_name ~ '}') -%} {% endif %} [{{ request_frontend_name }}] <= request-frontend-base name = {{ frontend_full_name }} software-url = {{ frontend_software_url }} {% if frontend_software_type %} software-type = {{ frontend_software_type }} {% endif %} {{ root_common.sla(frontend_full_name, default_to_same_computer=False) }} {% for name, value in frontend_instance_parameters.items() -%} config-{{ name }} = {{ value }} {% endfor -%} {% set promise_frontend_section_name = 'promise-' ~ request_frontend_name %} [{{ promise_frontend_section_name }}] <= monitor-promise-base promise = check_url_available name = ${:_buildout_section_name_}.py config-url = {{ "${" }}{{ request_frontend_name }}:connection-secure_access} config-ignore-code = 1 config-allow-redirects = 0 {% do root_common.section(promise_frontend_section_name) -%} {% do publish_dict.__setitem__('url-frontend-' ~ frontend_name, '${' ~ request_frontend_name ~ ':connection-secure_access}' ) -%} {% endfor -%} {% if has_jupyter -%} {# request jupyter connected to balancer of proper zope family -#} {{ request('jupyter', 'jupyter', 'jupyter', {}, key_config={'erp5-url': 'request-balancer:connection-' ~ jupyter_zope_family}) }} {%- endif %} {% if wcfs_enable -%} {# request WCFS connected to ZODB -#} {% do root_common.section('request-wcfs') -%} {{ request('wcfs', 'wcfs', 'wcfs', {}, {}) }} [request-wcfs] <= request-common request-zodb-base {%- endif %} {% set balancer_ret_dict = {'monitor-base-url': False, 'caucase-http-url': False} -%} {% for family in zope_family_dict -%} {% do balancer_ret_dict.__setitem__(family, False) -%} {% do balancer_ret_dict.__setitem__(family + '-v6', False) -%} {% if test_runner_enabled -%} {% do balancer_ret_dict.__setitem__(family + '-test-runner-url-list', False) -%} {% endif -%} {% endfor -%} {% for frontend_name in frontend_parameter_dict -%} {% do balancer_ret_dict.__setitem__('url-backend-' ~ frontend_name, False) -%} {% endfor -%} {% set balancer_key_config_dict = { 'monitor-passwd': 'monitor-htpasswd:passwd', } -%} {% for zope_section_id, name in zope_address_list_id_dict.items() -%} {% do balancer_key_config_dict.__setitem__( name, zope_section_id + ':connection-zope-address-list', ) -%} {% if test_runner_enabled -%} {% do balancer_key_config_dict.__setitem__( name + '-test-runner-address-list', zope_section_id + ':connection-test-runner-address-list', ) -%} {% endif -%} {% endfor -%} {{ request( name='balancer', software_type='balancer', config_key='balancer', config={ 'zope-family-dict': zope_family_parameter_dict, 'frontend-parameter-dict': frontend_parameter_dict, 'ssl-authentication-dict': ssl_authentication_dict, 'timeout-dict': balancer_timeout_dict, 'apachedex-promise-threshold': monitor_dict.get('apachedex-promise-threshold', 70), 'apachedex-configuration': monitor_dict.get( 'apachedex-configuration', [ '--logformat', '%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i" %{ms}T', '--erp5-base', '+erp5', '.*/VirtualHostRoot/erp5(/|\\?|$)', '--base', '+other', '/', '--skip-user-agent', 'Zabbix', '--error-detail', '--js-embed', '--quiet', ], ), }, ret=balancer_ret_dict, key_config=balancer_key_config_dict, ) }} {% do publish_dict.__setitem__('caucase-http-url', '${request-balancer:connection-caucase-http-url}' ) -%} {% endif -%}{# if zope_partition_dict -#} [publish] <= monitor-publish recipe = slapos.cookbook:publish.serialised -extends = publish-early {% if zope_address_list_id_dict -%} {# Pick any published hosts-dict, they are expected to be identical - and there is no way to check here. -#} hosts-dict = {{ '${' ~ next(iter(zope_address_list_id_dict)) ~ ':connection-hosts-dict}' }} {% endif -%} {% for name, value in publish_dict.items() -%} {{ name }} = {{ value }} {% endfor -%} {% if test_runner_enabled -%} {% for zope_family_name in zope_family_name_list -%} {{ zope_family_name }}-test-runner-url-list = ${request-balancer:connection-{{ zope_family_name }}-test-runner-url-list} {% endfor -%} {% endif -%} [publish-early] recipe = slapos.cookbook:publish-early -init = inituser-password gen-password:passwd inituser-password-hashed gen-password:passwd-ldap-salted-sha1 deadlock-debugger-password gen-deadlock-debugger-password:passwd {%- if has_posftix %} smtpd-sasl-password gen-smtpd-sasl-password:passwd {%- endif %} {%- if test_runner_enabled %} {%- for zope_family_name in zope_family_name_list %} {{ zope_family_name }}-test-runner-url-list default-balancer-test-runner-url-list:{{ zope_family_name }} {%- endfor %} {%- endif %} {%- if neo %} neo-cluster gen-neo-cluster:name neo-admins neo-cluster:admins neo-masters neo-cluster:masters {%- if neo[0] %} neo-cluster = {{ dumps(neo[0]) }} {%- endif %} {%- endif %} {%- set deadlock_debugger_password = slapparameter_dict.get('deadlock-debugger-password') -%} {%- if deadlock_debugger_password %} deadlock-debugger-password = {{ dumps(deadlock_debugger_password) }} {% endif %} {%- if test_runner_enabled %} [default-balancer-test-runner-url-list] recipe = {%- for zope_family_name in zope_family_name_list %} {{ zope_family_name }} = not-ready {%- endfor %} {%- endif %} [gen-password] recipe = slapos.cookbook:generate.password storage-path = {%- set inituser_password = slapparameter_dict.get('inituser-password') %} {%- if inituser_password %} passwd = {{ dumps(inituser_password) }} {%- endif %} [gen-deadlock-debugger-password] <= gen-password [gen-neo-cluster-base] <= gen-password [gen-neo-cluster] name = neo-${gen-neo-cluster-base:passwd} [gen-smtpd-sasl-password] < = gen-password {{ root_common.common_section() }} [monitor-conf-parameters] monitor-title = ERP5 password = ${monitor-htpasswd:passwd} [monitor-base-url-dict] {% for key, value in monitor_base_url_dict.items() -%} {{ key }} = {{ value }} {% endfor %}