{% if software_type == slap_software_type -%} {% set use_ipv6 = slapparameter_dict.get('use-ipv6', False) -%} {% set database_list = slapparameter_dict.get('database-list', [{'name': 'erp5', 'user': 'user', 'password': 'insecure'}]) -%} {% for database_count in range(slapparameter_dict.get('test-database-amount', 0)) -%} {% do database_list.append({'name': 'erp5_test_' ~ database_count, 'user': 'testuser_' ~ database_count, 'password': 'testpassword' ~ database_count}) -%} {% endfor -%} {% set binlog_parameter_dict = slapparameter_dict.get('mariadb-binlogs', {'expire-days': 0}) -%} {% set binlog_expire_days = slapparameter_dict.get('expire-days', 7) %} [buildout] parts = publish-mariadb-url logrotate logrotate-entry-mariadb cron cron-entry-logrotate cron-entry-mariadb-backup binary-link update-mysql mysqld promise eggs-directory = {{ eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }} offline = true [publish-mariadb-url] recipe = slapos.cookbook:publish.serialised {% if use_ipv6 -%} {% set address = "[${my-cnf-parameters:ip}]" -%} {% else -%} {% set address = "${my-cnf-parameters:ip}" -%} {% endif -%} {# TODO: support any number of databases -#} {% set database = database_list[0] %} url = mysql://{{ database['user'] }}:{{ database['password'] }}@{{ address }}:${my-cnf-parameters:port}/{{ database['name'] }} [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:output}" -u root --all-databases {% if binlog_expire_days %}--flush-logs --master-data=2 {% endif %}| gzip > "${directory:mariadb-backup-full}/$(date "+%Y%m%d%H%M%S").sql.gz" # TODO: expire full backups [my-cnf-parameters] {% if use_ipv6 -%} ip = {{ (ipv6_set | list)[0] }} {% else -%} ip = {{ (ipv4_set | list)[0] }} {% endif -%} port = 45678 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-size = {{ slapparameter_dict.get('innodb-buffer-size', '') }} innodb-log-file-size = {{ slapparameter_dict.get('innodb-log-file-size', '') }} innodb-log-buffer-size = {{ slapparameter_dict.get('innodb-log-buffer-size', '') }} relaxed_writes = {{ dumps(slapparameter_dict.get('mariadb-relaxed-writes', 0)) }} {% if binlog_expire_days -%} binlog-path = ${directory:mariadb-backup-incremental}/binlog # XXX: binlog rotation happens along with other log's rotation binlog-expire-days = {{ binlog_expire_days }} {% 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) }} [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:output} mysql = ${binary-wrap-mysql:output} init-script = ${init-script:rendered} mysql_tzinfo_to_sql = ${binary-wrap-mysql_tzinfo_to_sql:output} [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:output}" -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 = {{ parameter_dict['coreutils-location'] }}/bin/basename {{ parameter_dict['coreutils-location'] }}/bin/cat {{ parameter_dict['coreutils-location'] }}/bin/cp {{ parameter_dict['coreutils-location'] }}/bin/ls {{ parameter_dict['coreutils-location'] }}/bin/tr {{ parameter_dict['coreutils-location'] }}/bin/uname {{ parameter_dict['gettext-location'] }}/lib/gettext/hostname {{ parameter_dict['grep-location'] }}/bin/grep {{ parameter_dict['sed-location'] }}/bin/sed [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}" output = ${directory:bin}/${:command} [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} {% endif %}