#!/bin/sh
#
# Copyright (C) 2000-2022 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# This script will test prune algo with "all" option
#
. scripts/functions

TestName="prune-all-test"
JobName=NightlySave

scripts/cleanup
scripts/copy-test-confs

start_test

echo $PWD/build/po > tmp/file-list

dircfg=$conf/bacula-dir.conf

# copy the Default pool to Special pool
cat >> $dircfg <<EOF
Pool {
  Name = NoVolRetention
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = no                     # Prune expired volumes
  Volume Retention = 0 # never
  Job Retention = 1s
  File Retention = 1s
}
Pool {
  Name = Special
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = no                     # Prune expired volumes
  Volume Retention = 365d             # one year
  Job Retention = 10m
  File Retention = 10m
}
Pool {
  Name = Special2
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = no                     # Prune expired volumes
  Volume Retention = 365d             # one year
  Job Retention = 1s
  File Retention = 1s
}
Pool {
  Name = Special3
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365d             # one year
  Job Retention = 1s
  File Retention = 1s
}
Job {
  Name = "prune"
  Type = Admin
  JobDefs = "BackupJob"
  Client = $HOST-fd
  FileSet = "Full Set"
  RunScript {
    Console = "prune jobs all yes"
    Console = "prune volume allfrompool allpools yes"
    RunsWhen = Before
    failjobonerror = no
    runsonclient = no
  }
}
EOF
$bperl -e "extract_resource('$dircfg', 'Client', '$HOST-fd')" | sed "s/$HOST-fd/$HOST-fd2/" >> $conf/bacula-dir.conf
$bperl -e "add_attribute('$dircfg', 'AutoPrune', 'No', 'Client')"
$bperl -e "add_attribute('$dircfg', 'Job Retention', '1s', 'Client')"
$bperl -e "add_attribute('$dircfg', 'File Retention', '1s', 'Client')"

cat <<EOF > ${cwd}/tmp/bconcmds
@output /dev/null
messages
@$out $tmp/log1.out
label storage=File pool=Default volume=TestVolume001
label storage=File pool=Special volume=TestVolume002
label storage=File pool=Special2 volume=TestVolume003
label storage=File pool=Special3 volume=TestVolume004
label storage=File pool=NoVolRetention volume=TestVolume005
label storage=File pool=NoVolRetention volume=TestVolume006
run job=$JobName pool=Default level=full yes
run job=$JobName pool=Default level=full client=$HOST-fd2 yes
wait
messages
@exec "touch $cwd/build/po/fr.po"
run job=$JobName pool=Special level=incremental yes
run job=$JobName pool=Special level=incremental client=$HOST-fd2 yes
wait
messages
@exec "touch $cwd/build/po/de.po"
run job=$JobName pool=Special level=incremental yes
run job=$JobName pool=Special level=incremental client=$HOST-fd2 yes
wait
messages
@exec "touch $cwd/build/po/es.po"
run job=$JobName level=incremental yes
run job=$JobName level=incremental client=$HOST-fd2 yes
wait
messages
run job=$JobName pool=Default level=Differential yes
run job=$JobName pool=Default level=Differential client=$HOST-fd2 yes
wait
messages
@sleep 2
@$out $tmp/log3.out
@################################################################
list jobs
@################################################################
@$out $tmp/log4.out
list jobs
prune jobs all yes
list jobs
run job=$JobName pool=Default level=Differential yes
wait
messages
@################################################################
@$out $tmp/log5.out
list jobs
prune jobs all yes
list jobs
@################################################################
@$out $tmp/log6.out
list jobs
prune jobs client=$HOST-fd yes
list jobs
@exec "touch $cwd/build/po/pl.po"
run job=$JobName pool=Special2 level=Incremental yes
wait
@exec "touch $cwd/build/po/pl.po"
run job=$JobName pool=Special2 level=Incremental yes
wait
@exec "touch $cwd/build/po/pl.po"
run job=$JobName pool=Default level=Incremental yes
wait
run job=$JobName pool=Default level=Differential yes
wait
@exec "touch $cwd/build/po/pl.po"
run job=$JobName pool=Special3 level=Incremental yes
wait
messages
@################################################################
@$out $tmp/log7.out
list jobs
prune jobs all yes
list jobs
@################################################################
@$out $tmp/log8.out
run job=$JobName pool=Default level=Differential yes
wait
messages
list jobs
update volume=TestVolume004 volstatus=Used
run job=prune yes
wait
messages
list jobs
@################################################################
@$out $tmp/log2.out
restore where=${cwd}/tmp/bacula-restores client=$HOST-fd select all storage=File done
yes
wait
messages
@################################################################
@$out $tmp/log10.out
update volume=TestVolume003 volstatus=Used
prune volume allfrompool allpools yes
run job=$JobName pool=Special2 level=Full yes
wait
messages
@################################################################
@$out $tmp/log11.out
delete jobid=1-100 yes
prune volume allfrompool allpools yes
run job=$JobName pool=NoVolRetention level=Full yes
wait
@exec "touch $cwd/build/po/pl.po"
run job=$JobName pool=NoVolRetention level=Incremental yes
wait
@exec "touch $cwd/build/po/fr.po"
run job=$JobName pool=NoVolRetention level=Differential yes
wait
@exec "touch $cwd/build/po/de.po"
run job=$JobName pool=NoVolRetention level=Incremental yes
wait
messages
update volume=TestVolume005 volstatus=Used
list jobs
prune jobs all yes
prune volume allfrompool allpools yes
list jobs
@################################################################
@$out $tmp/log12.out
run job=$JobName pool=NoVolRetention level=Full yes
wait
update volume=TestVolume006 volstatus=Used
list jobs
prune jobs all yes
prune volume allfrompool allpools yes
list jobs
list volumes
quit
EOF

run_bacula

check_for_zombie_jobs storage=File client=$HOST-fd
stop_bacula

check_two_logs

###############################################################################
# Now we will verify that the pruning code is working as expected.  Each time,
# we run 'list jobs', 'prune', 'list jobs'. check_prune_list ensures that jobids
# in argument are present in the first 'list jobs', the 'prune' command deletes
# them (same number), and checks that the last 'list jobs' doesn't contain them
# anymore. See scripts/functions.pm for details.

# Pool:  S  => Special    (10 mins retention)
#        S2 => Special2   (1s retention
#        D  => Default    (nothing specified, client retention used 1s)

# Client $HOST-fd
# Id     1 3 5 7 9
# Pool   S S S D D 
# Level  F I I I D
# Result       x

# Client $HOST-fd2
# Id     2 4 6 8 10
# Pool   S S S D D 
# Level  F I I I D
# Result       x

$bperl -e "check_prune_list('$tmp/log4.out', 7, 8)"
estat=$(($estat + $?))

# Id     1 3 5 9 11
# Pool   S S S D D
# Level  F I I D D
# Result       x
$bperl -e "check_prune_list('$tmp/log5.out', 9)"
estat=$(($estat + $?))

# Here, we prune only with the client settings
# Id     1 3 5 11
# Level  F I I D
# Result   x x
$bperl -e "check_prune_list('$tmp/log6.out', 3, 5)"
estat=$(($estat + $?))

# Id     1 11 12 13 14 15
# Pool   S D  S2 S2 D  D
# Level  F D  I  I  I  D
# Result   x  x  x  x
$bperl -e "check_prune_list('$tmp/log7.out', 11, 12, 13, 14)"
estat=$(($estat + $?))

# Id     1 15 16
# Pool   S D  D
# Level  F D  D
# Result   x
$bperl -e "check_prune_list('$tmp/log8.out', 15, 16)"
estat=$(($estat + $?))

grep TestVolume004 $tmp/log8.out | grep purged > /dev/null
if [ $? != 0 ]; then
    print_debug "ERROR: TestVolume004 must be purged automatically"
    estat=$(($estat + $?))
fi

# Id     21 22 23 24
# Pool   N   N  N  N
# Level  F   I  D  I
# Result     x
$bperl -e "check_prune_list('$tmp/log11.out', 22)"
estat=$(($estat + $?))

# Id     21 23 24 25
# Pool   N   N  N  N
# Level  F   D  I  F
# Result x   x  x
$bperl -e "check_prune_list('$tmp/log12.out', 21, 23, 24)"
estat=$(($estat + $?))

grep TestVolume005 $tmp/log12.out | grep Purged > /dev/null
if [ $? != 0 ]; then
    print_debug "ERROR: The TestVolume005 should be pruned"
    estat=1
fi

end_test
