From 54cb28c5474ab3977af24c6efe62962913578994 Mon Sep 17 00:00:00 2001 From: Tomas Barton Date: Tue, 3 May 2022 13:45:52 +0200 Subject: [PATCH] [BC] Support grouping backups by cluster name (#5) * Rename instance attribute `cluster` to `db_cluster` * Support grouping backups by cluster name --- manifests/cron_backup.pp | 3 ++- manifests/instance.pp | 23 ++++++++++++++++++---- spec/classes/instance_spec.rb | 37 ++++++++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/manifests/cron_backup.pp b/manifests/cron_backup.pp index f07584e..002a5f6 100644 --- a/manifests/cron_backup.pp +++ b/manifests/cron_backup.pp @@ -3,6 +3,7 @@ # Typically on a catalog (backup) server. define pgprobackup::cron_backup( String $id, + String $cluster, String $host_group, Pgprobackup::Backup_type $backup_type, String $server_address, @@ -123,7 +124,7 @@ @@cron { "pgprobackup_${backup_type}_${server_address}-${host_group}": command => @("CMD"/L), - ${binary} ${backup_cmd} --instance ${id} -b ${backup_type} ${stream}--remote-host=${server_address}\ + ${binary} ${backup_cmd} --instance ${cluster} -b ${backup_type} ${stream}--remote-host=${server_address}\ --remote-user=${remote_user} --remote-port=${remote_port} -U ${db_user} -d ${db_name}\ ${logging}${retention}${_threads}${_temp_slot}${_slot}${_validate}${_compress}${_timeout} | -CMD diff --git a/manifests/instance.pp b/manifests/instance.pp index aa3776f..30cae86 100644 --- a/manifests/instance.pp +++ b/manifests/instance.pp @@ -4,10 +4,18 @@ # # @param id # Unique identifier within `host_group` +# @param cluster +# Could be used to group primary with standby servers # @param server_address # Address used for connecting to the DB server # @param server_port # DB port +# @param db_name +# Database used for backups +# @param db_user +# User connecting to database +# @param db_cluster +# Postgresql cluster e.g. `main` # @param db_dir # PostgreSQL home directory # @param manage_dbuser @@ -58,13 +66,14 @@ # include pgprobackup::instance class pgprobackup::instance( String $id = $::hostname, + Optional[String] $cluster = undef, String $server_address = $::fqdn, - String $cluster = 'main', Integer $server_port = 5432, Boolean $manage_dbuser = true, String $db_dir = '/var/lib/postgresql', String $db_name = $pgprobackup::db_name, String $db_user = $pgprobackup::db_user, + String $db_cluster = 'main', Variant[String,Sensitive[String]] $db_password = '', Optional[String] $seed = undef, String $remote_user = 'postgres', @@ -98,6 +107,11 @@ Optional[Integer] $archive_timeout = undef, ) inherits pgprobackup { + $_cluster = $cluster ? { + undef => $id, + default => $cluster + } + class {'pgprobackup::install': versions => [$version], package_name => $package_name, @@ -204,12 +218,12 @@ @@exec { "pgprobackup_add_instance_${::fqdn}-${host_group}": command => @("CMD"/L), - pg_probackup-${version} add-instance -B ${backup_dir} --instance ${id} \ + pg_probackup-${version} add-instance -B ${backup_dir} --instance ${_cluster} \ --remote-host=${server_address} --remote-user=${remote_user} \ - --remote-port=${remote_port} -D ${db_dir}/${version}/${cluster} + --remote-port=${remote_port} -D ${db_dir}/${version}/${db_cluster} | -CMD path => ['/usr/bin'], - onlyif => "test ! -d ${backup_dir}/backups/${id}", + onlyif => "test ! -d ${backup_dir}/backups/${_cluster}", tag => "pgprobackup_add_instance-${host_group}", user => $backup_user, # note: error output might not be captured require => Package["${package_name}-${version}"], @@ -236,6 +250,7 @@ # declare cron job, use defaults from instance create_resources(pgprobackup::cron_backup, {"cron_backup-${host_group}-${server_address}-${backup_type}" => $schedule} , { id => $id, + cluster => $_cluster, db_name => $db_name, db_user => $db_user, version => $version, diff --git a/spec/classes/instance_spec.rb b/spec/classes/instance_spec.rb index 06b0634..bb49c0e 100644 --- a/spec/classes/instance_spec.rb +++ b/spec/classes/instance_spec.rb @@ -56,13 +56,14 @@ } }, version: '12', + db_cluster: 'dev', } end it { expect(exported_resources).to contain_exec('pgprobackup_add_instance_psql.localhost-common').with( tag: 'pgprobackup_add_instance-common', - command: 'pg_probackup-12 add-instance -B /var/lib/pgbackup --instance foo --remote-host=psql.localhost --remote-user=postgres --remote-port=22 -D /var/lib/postgresql/12/main', + command: 'pg_probackup-12 add-instance -B /var/lib/pgbackup --instance foo --remote-host=psql.localhost --remote-user=postgres --remote-port=22 -D /var/lib/postgresql/12/dev', ) } @@ -633,6 +634,40 @@ end end + context 'with cluster grouping' do + let(:params) do + { + backups: { + common: { + DELTA: {}, + FULL: {}, + } + }, + version: '13', + id: 'psql01a', + cluster: 'psql01', + } + end + + ['DELTA', 'FULL'].each do |backup| + cmd = '[ -x /usr/bin/pg_probackup-13 ] && /usr/bin/pg_probackup-13 backup'\ + " -B /var/lib/pgbackup --instance psql01 -b #{backup} --stream"\ + ' --remote-host=psql.localhost --remote-user=postgres --remote-port=22'\ + ' -U backup -d backup --log-filename=psql01a.log'\ + ' --log-level-file=info --log-directory=/var/lib/pgbackup/log' + + it { + expect(exported_resources).to contain_cron("pgprobackup_#{backup}_psql.localhost-common") + .with( + command: cmd, + user: 'pgbackup', + hour: '4', + minute: '0', + ) + } + end + end + context 'install specific package version' do let(:params) do {