diff --git a/manifests/cron/db_purge.pp b/manifests/cron/db_purge.pp new file mode 100644 index 0000000..7d36fe6 --- /dev/null +++ b/manifests/cron/db_purge.pp @@ -0,0 +1,116 @@ +# +# Copyright (C) 2023 Red Hat Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# == Class: watcher::cron::db_purge +# +# Purge soft-deleted or orphaned records from database. +# +# === Parameters +# +# [*ensure*] +# (optional) Ensure cron jobs present or absent +# Defaults to present. +# +# [*minute*] +# (optional) Defaults to '1'. +# +# [*hour*] +# (optional) Defaults to '0'. +# +# [*monthday*] +# (optional) Defaults to '*'. +# +# [*month*] +# (optional) Defaults to '*'. +# +# [*weekday*] +# (optional) Defaults to '*'. +# +# [*user*] +# (optional) User with access to watcher files. +# Defaults to 'watcher'. +# +# [*age*] +# (optional) Number of days prior to today for deletion, +# e.g. value 60 means to purge deleted rows that have the "deleted_at" +# column greater than 60 days ago. +# Defaults to 30 +# +# [*destination*] +# (optional) Path to file to which rows should be archived +# Defaults to '/var/log/watcher/watcher-rowsflush.log'. +# +# [*maxdelay*] +# (optional) In Seconds. Should be a positive integer. +# Induces a random delay before running the cronjob to avoid running +# all cron jobs at the same time on all hosts this job is configured. +# Defaults to 0. +# +# [*exclude_orphans*] +# (optional) Flag to indicate whether orhans should be excluded from +# deletion. +# Defaults to false +# +# [*max_number*] +# (optional) Max number of objects expected to be deleted. +# Defaults to undef +# +class watcher::cron::db_purge ( + Enum['present', 'absent'] $ensure = 'present', + $minute = 1, + $hour = 0, + $monthday = '*', + $month = '*', + $weekday = '*', + $user = $::watcher::params::user, + $age = 30, + $destination = '/var/log/watcher/watcher-rowsflush.log', + $maxdelay = 0, + $exclude_orphans = false, + $max_number = undef, +) inherits watcher::params { + + validate_legacy(Boolean, 'validate_bool', $exclude_orphans) + + include watcher::deps + + $sleep = $maxdelay ? { + 0 => '', + default => "sleep `expr \${RANDOM} \\% ${maxdelay}`; ", + } + + $exclude_orphans_opt = $exclude_orphans ? { + true => ' -e', + default => '', + } + + $max_number_opt = $max_number ? { + undef => '', + default => " -n ${max_number}", + } + + cron { 'watcher-db-manage purge': + ensure => $ensure, + command => "${sleep}watcher-db-manage purge -d ${age}${exclude_orphans_opt}${max_number_opt} >>${destination} 2>&1", + environment => 'PATH=/bin:/usr/bin:/usr/sbin SHELL=/bin/sh', + user => $user, + minute => $minute, + hour => $hour, + monthday => $monthday, + month => $month, + weekday => $weekday, + require => Anchor['watcher::db::upgrade::end'], + } +} diff --git a/releasenotes/notes/cron-db_purge-43ea67b564185d97.yaml b/releasenotes/notes/cron-db_purge-43ea67b564185d97.yaml new file mode 100644 index 0000000..89750bc --- /dev/null +++ b/releasenotes/notes/cron-db_purge-43ea67b564185d97.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The new ``watcher::cron::db_purge`` class has been added. This class can be + used to configure cron job to periodically purge deleted or orphaned + objects from database. diff --git a/spec/classes/watcher_cron_db_purge_spec.rb b/spec/classes/watcher_cron_db_purge_spec.rb new file mode 100644 index 0000000..8aba1f1 --- /dev/null +++ b/spec/classes/watcher_cron_db_purge_spec.rb @@ -0,0 +1,99 @@ +require 'spec_helper' + +describe 'watcher::cron::db_purge' do + let :params do + { + :minute => 1, + :hour => 0, + :monthday => '*', + :month => '*', + :weekday => '*', + :user => 'watcher', + :age => '30', + :maxdelay => 0, + :destination => '/var/log/watcher/watcher-rowsflush.log' + } + end + + shared_examples 'watcher::cron::db_purge' do + context 'with required parameters' do + it { is_expected.to contain_cron('watcher-db-manage purge').with( + :ensure => :present, + :command => "watcher-db-manage purge -d #{params[:age]} >>#{params[:destination]} 2>&1", + :environment => 'PATH=/bin:/usr/bin:/usr/sbin SHELL=/bin/sh', + :user => params[:user], + :minute => params[:minute], + :hour => params[:hour], + :monthday => params[:monthday], + :month => params[:month], + :weekday => params[:weekday], + :require => 'Anchor[watcher::db::upgrade::end]' + )} + end + + context 'with ensure set to absent' do + before :each do + params.merge!( + :ensure => :absent + ) + end + + it { should contain_cron('watcher-db-manage purge').with_ensure(:absent) } + end + + context 'with required parameters with max delay enabled' do + before :each do + params.merge!( + :maxdelay => 600 + ) + end + + it { should contain_cron('watcher-db-manage purge').with( + :ensure => :present, + :command => "sleep `expr ${RANDOM} \\% #{params[:maxdelay]}`; watcher-db-manage purge -d #{params[:age]} >>#{params[:destination]} 2>&1", + :environment => 'PATH=/bin:/usr/bin:/usr/sbin SHELL=/bin/sh', + :user => params[:user], + :minute => params[:minute], + :hour => params[:hour], + :monthday => params[:monthday], + :month => params[:month], + :weekday => params[:weekday], + :require => 'Anchor[watcher::db::upgrade::end]' + )} + end + + context 'with additional parameters' do + before :each do + params.merge!( + :exclude_orphans => true, + :max_number => 100, + ) + end + + it { should contain_cron('watcher-db-manage purge').with( + :ensure => :present, + :command => "watcher-db-manage purge -d #{params[:age]} -e -n #{params[:max_number]} >>#{params[:destination]} 2>&1", + :environment => 'PATH=/bin:/usr/bin:/usr/sbin SHELL=/bin/sh', + :user => params[:user], + :minute => params[:minute], + :hour => params[:hour], + :monthday => params[:monthday], + :month => params[:month], + :weekday => params[:weekday], + :require => 'Anchor[watcher::db::upgrade::end]' + )} + end + end + + on_supported_os({ + :supported_os => OSDefaults.get_supported_os + }).each do |os,facts| + context "on #{os}" do + let (:facts) do + facts.merge!(OSDefaults.get_facts()) + end + + it_behaves_like 'watcher::cron::db_purge' + end + end +end