{% if software_type == slap_software_type -%} {% set part_list = [] -%} {% macro section(name) %}{% do part_list.append(name) %}{{ name }}{% endmacro -%} {% set use_ipv6 = slapparameter_dict.get('use-ipv6', False) -%} {% set database_list = slapparameter_dict.get('database-list', [{'name': 'erp5', 'user': 'user', 'password': 'insecure'}]) -%} {% set test_database_list = [] %} {% for database_count in range(slapparameter_dict.get('test-database-amount', 30)) -%} {% do test_database_list.append({'name': 'erp5_test_' ~ database_count, 'user': 'testuser_' ~ database_count, 'password': 'testpassword' ~ database_count}) -%} {% endfor -%} {% set catalog_backup = slapparameter_dict.get('catalog-backup', {}) -%} {% set full_backup_retention_days = catalog_backup.get('full-retention-days', 7) -%} {% set incremental_backup_retention_days = catalog_backup.get('incremental-retention-days', full_backup_retention_days) -%} {% set port = slapparameter_dict['tcpv4-port'] %} {% if use_ipv6 -%} {% set ip = (ipv6_set | list)[0] -%} {% else -%} {% set ip = (ipv4_set | list)[0] -%} {% endif -%} [publish-mariadb-url] recipe = slapos.cookbook:publish.serialised {% macro render_database_list(database_list) -%} {% set publish_database_list = [] -%} {% for database in database_list -%} {% do publish_database_list.append("mysql://" ~ database['user'] ~ ":" ~ database['password'] ~ "@" ~ ip ~ ":" ~ port ~ "/" ~ database['name']) -%} {% endfor -%} {{ dumps(publish_database_list) }} {% endmacro -%} database-list = {{ render_database_list(database_list) }} test-database-list = {{ render_database_list(test_database_list) }} {% if full_backup_retention_days > -1 -%} [{{ section('cron-entry-mariadb-backup') }}] <= cron recipe = slapos.cookbook:cron.d name = mariadb-backup frequency = 0 22 * * * {# When binlogs are enabled: # flush-logs: used so no manipulation on binlogs is needed to restore from # full + binlogs. The first binlog after a dump starts from dump snapshot and # can be fully restored. # master-data: use value "2" as we are not in a replication case #} command = "${binary-wrap-mysqldump:wrapper-path}" -u root --all-databases {% if incremental_backup_retention_days > -1 %}--flush-logs --master-data=2 {% endif %}| {{ parameter_dict['gzip-location'] }}/bin/gzip > "${directory:mariadb-backup-full}/$({{ parameter_dict['coreutils-location'] }}/bin/date "+%Y%m%d%H%M%S").sql.gz" {# KEEP GLOB PATTERN IN SYNC with generated filenames above # YYYYmmddHHMMSS -#} file-glob = ??????????????.sql.gz {% if full_backup_retention_days > 0 -%} [{{ section("cron-entry-mariadb-backup-expire") }}] <= cron recipe = slapos.cookbook:cron.d name = mariadb-backup-expire frequency = 0 22 * * * command = {{ parameter_dict['findutils-location'] }}/bin/find "${directory:mariadb-backup-full}" -maxdepth 1 -name "${cron-entry-mariadb-backup:file-glob}" -daystart -mtime +{{ full_backup_retention_days }} -delete {%- endif %} {%- endif %} [my-cnf-parameters] ip = {{ ip }} port = {{ port }} socket = ${directory:run}/mariadb.sock data-directory = ${directory:mariadb-data} pid-file = ${directory:run}/mariadb.pid error-log = ${directory:log}/mariadb_error.log slow-query-log = ${directory:log}/mariadb_slowquery.log innodb-buffer-pool-size = {{ dumps(slapparameter_dict.get('innodb-buffer-pool-size', 0)) }} innodb-log-file-size = {{ dumps(slapparameter_dict.get('innodb-log-file-size', 0)) }} innodb-log-buffer-size = {{ dumps(slapparameter_dict.get('innodb-log-buffer-size', 0)) }} relaxed-writes = {{ dumps(slapparameter_dict.get('mariadb-relaxed-writes', False)) }} {% if incremental_backup_retention_days > -1 -%} binlog-path = ${directory:mariadb-backup-incremental}/binlog # XXX: binlog rotation happens along with other log's rotation binlog-expire-days = {{ incremental_backup_retention_days }} {% else %} binlog-path = {% endif -%} [my-cnf] recipe = slapos.recipe.template:jinja2 rendered = ${directory:etc}/mariadb.cnf template = {{ parameter_dict['template-my-cnf'] }} context = section parameter_dict my-cnf-parameters [init-script-parameters] database-list = {{ dumps(database_list + test_database_list) }} [init-script] recipe = slapos.recipe.template:jinja2 # XXX: is there a better location ? rendered = ${directory:etc}/mariadb_initial_setup.sql template = {{ parameter_dict['template-mariadb-initial-setup'] }} context = section parameter_dict init-script-parameters [update-mysql] recipe = slapos.cookbook:generic.mysql.wrap_update_mysql output = ${directory:services}/mariadb_update binary = ${binary-wrap-mysql_upgrade:wrapper-path} mysql = ${binary-wrap-mysql:wrapper-path} init-script = ${init-script:rendered} mysql_tzinfo_to_sql = ${binary-wrap-mysql_tzinfo_to_sql:wrapper-path} [mysqld] recipe = slapos.cookbook:generic.mysql.wrap_mysqld output = ${directory:services}/mariadb binary = {{ parameter_dict['mariadb-location'] }}/bin/mysqld configuration-file = ${my-cnf:rendered} data-directory = ${my-cnf-parameters:data-directory} mysql-install-binary = {{ parameter_dict['mariadb-location'] }}/scripts/mysql_install_db mysql-base-directory = {{ parameter_dict['mariadb-location'] }} [mariadb-instance] # Options user = user parallel-test-database-amount = {{ slapparameter_dict.get('test-database-amount', 30) }} database = erp5 test-user = erp5_test test-database = erp5_test mysql-test-database-base = testdb mysql-test-user-base = testuser [logrotate] recipe = slapos.cookbook:logrotate # Binaries logrotate-binary = {{ parameter_dict['logrotate-location'] }}/usr/sbin/logrotate gzip-binary = {{ parameter_dict['gzip-location'] }}/bin/gzip gunzip-binary = {{ parameter_dict['gzip-location'] }}/bin/gunzip # Directories wrapper = ${directory:bin}/logrotate conf = ${directory:etc}/logrotate.conf logrotate-entries = ${directory:logrotate-entries} backup = ${directory:logrotate-backup} state-file = ${directory:srv}/logrotate.status [logrotate-entry-mariadb] <= logrotate recipe = slapos.cookbook:logrotate.d name = mariadb log = ${my-cnf-parameters:error-log} ${my-cnf-parameters:slow-query-log} post = "${binary-wrap-mysql:wrapper-path}" -B -u root -e "FLUSH LOGS" [cron] recipe = slapos.cookbook:cron dcrond-binary = {{ parameter_dict['dcron-location'] }}/sbin/crond cron-entries = ${directory:cron-entries} crontabs = ${directory:crontabs} cronstamps = ${directory:cronstamps} catcher = ${cron-simplelogger:wrapper} binary = ${directory:services}/crond [cron-simplelogger] recipe = slapos.cookbook:simplelogger wrapper = ${directory:bin}/cron_simplelogger log = ${directory:log}/cron.log [cron-entry-logrotate] <= cron recipe = slapos.cookbook:cron.d name = logrotate frequency = 0 0 * * * command = ${logrotate:wrapper} [binary-link] recipe = slapos.cookbook:symbolic.link target-directory = ${directory:bin} link-binary = {{ dumps(parameter_dict['link-binary']) }} [binary-wrap-base] recipe = slapos.cookbook:wrapper # Note: --defaults-file must be the first argument, otherwise wrapped binary # will reject it. command-line = "{{ parameter_dict['mariadb-location'] }}/bin/${:command}" --defaults-file="${my-cnf:rendered}" wrapper-path = ${directory:bin}/${:command} parameters-extra = true [binary-wrap-mysql] < = binary-wrap-base command = mysql [binary-wrap-mysqldump] < = binary-wrap-base command = mysqldump [binary-wrap-mysql_upgrade] < = binary-wrap-base command = mysql_upgrade [binary-wrap-mysql_tzinfo_to_sql] < = binary-wrap-base command = mysql_tzinfo_to_sql [directory] recipe = slapos.cookbook:mkdirectory bin = ${buildout:directory}/bin etc = ${buildout:directory}/etc services = ${:etc}/run promise = ${:etc}/promise cron-entries = ${:etc}/cron.d crontabs = ${:etc}/crontabs cronstamps = ${:etc}/cronstamps logrotate-entries = ${:etc}/logrotate.d srv = ${buildout:directory}/srv backup = ${:srv}/backup mariadb-backup-full = ${:backup}/mariadb-full mariadb-backup-incremental = ${:backup}/mariadb-incremental logrotate-backup = ${:backup}/logrotate mariadb-data = ${:srv}/mariadb var = ${buildout:directory}/var log = ${:var}/log run = ${:var}/run [promise] recipe = slapos.cookbook:check_port_listening path = ${directory:promise}/mariadb hostname = ${my-cnf-parameters:ip} port = ${my-cnf-parameters:port} [buildout] parts = publish-mariadb-url logrotate logrotate-entry-mariadb cron cron-entry-logrotate cron-entry-mariadb-backup cron-entry-mariadb-backup-expire binary-link update-mysql mysqld promise {{ part_list | join('\n ') }} eggs-directory = {{ eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }} offline = true {% endif %}