Imported Upstream version 3.2.0
[debian/amanda] / installcheck / Amanda_Recovery_Planner.pl
index fd8e3148fd21714469bb631617aabfb5c7176b57..3e382c4e124ffff5286293719949d988f05e0676 100644 (file)
@@ -24,6 +24,7 @@ use warnings;
 
 use lib "@amperldir@";
 use Installcheck::Run;
+use Installcheck::Catalogs;
 use Amanda::Config qw( :init :getconf config_dir_relative );
 use Amanda::Changer;
 use Amanda::Debug;
@@ -33,7 +34,7 @@ use Amanda::MainLoop;
 use Amanda::Header;
 use Amanda::Xfer qw( :constants );
 
-# and disable Debug's die() and warn() overrides
+# disable Debug's die() and warn() overrides
 Amanda::Debug::disable_die_override();
 
 # put the debug messages somewhere
@@ -44,103 +45,16 @@ my $testconf;
 $testconf = Installcheck::Run->setup();
 $testconf->write();
 
+# install the 'bigdb' catalog to test against
+my $cat = Installcheck::Catalogs::load("bigdb");
+$cat->install();
+
 my $cfg_result = config_init($CONFIG_INIT_EXPLICIT_NAME, 'TESTCONF');
 if ($cfg_result != $CFGERR_OK) {
     my ($level, @errors) = Amanda::Config::config_errors();
     die(join "\n", @errors);
 }
 
-##
-# Fill in some fake logfiles
-
-my $logdir = config_dir_relative(getconf($CNF_LOGDIR));
-my $tapelist_fn = config_dir_relative(getconf($CNF_TAPELIST));
-my $holdingdir = "$Installcheck::TMP/holding";
-my %holding_filenames;
-my $write_timestamp;
-my $output;
-
-sub make_holding_file {
-    my ($name, $dump) = @_;
-
-    my $dir = "$holdingdir/$dump->{dump_timestamp}";
-    my $safe_disk = $dump->{'diskname'};
-    $safe_disk =~ tr{/}{_};
-    my $filename = "$dir/$dump->{hostname}.$safe_disk";
-    mkpath($dir);
-
-    # save the filename for later
-    $holding_filenames{$name} = $filename;
-
-    # (note that multi-chunk holding files are not used at this point)
-    my $hdr = Amanda::Header->new();
-    $hdr->{'type'} = $Amanda::Header::F_DUMPFILE;
-    $hdr->{'datestamp'} = $dump->{'dump_timestamp'};
-    $hdr->{'dumplevel'} = $dump->{'level'};
-    $hdr->{'name'} = $dump->{'hostname'};
-    $hdr->{'disk'} = $dump->{'diskname'};
-    $hdr->{'program'} = "INSTALLCHECK";
-    $hdr->{'is_partial'} = ($dump->{'status'} ne 'OK');
-
-    open(my $fh, ">", $filename) or die("opening '$filename': $!");
-    print $fh $hdr->to_string(32768,32768);
-
-    # transfer some data to that file
-    my $xfer = Amanda::Xfer->new([
-       Amanda::Xfer::Source::Pattern->new(1024*$dump->{'kb'}, "+-+-+-+-"),
-       Amanda::Xfer::Dest::Fd->new($fh),
-    ]);
-
-    $xfer->start(sub {
-       my ($src, $msg, $xfer) = @_;
-       if ($msg->{type} == $XMSG_ERROR) {
-           die $msg->{elt} . " failed: " . $msg->{message};
-       } elsif ($msg->{'type'} == $XMSG_DONE) {
-           $src->remove();
-           Amanda::MainLoop::quit();
-       }
-    });
-    Amanda::MainLoop::run();
-    close($fh);
-
-    return $filename;
-}
-
-open (my $tapelist, ">", $tapelist_fn);
-while (<DATA>) {
-    # skip comments
-    next if (/^#/ or /^\S*$/);
-
-    # add to tapelist
-    if (/^:tapelist (\d+) (\S+)\s*$/) {
-       print $tapelist "$1 $2 reuse\n";
-       next;
-    }
-
-    # new logfile
-    if (/^::: (.*)/) {
-       open $output, ">", "$logdir/$1" or die("Could not open $1 for writing: $!");
-       next;
-    }
-
-    # new holding-disk file
-    if (/^:holding (\S+) (\S+) (\S+) (\S+) (\d+) (\S+) (\d+)/) {
-       my $dump = {
-           'dump_timestamp' => $2,     'hostname' => $3,           'diskname' => $4,
-           'level' => $5+0,            'status' => $6,             'kb' => $7,
-       };
-       make_holding_file($1, $dump);
-       next;
-    }
-
-
-    die("syntax error") if (/^:/);
-
-    print $output $_;
-}
-close($output);
-close($tapelist);
-
 ##
 ## Tests!
 ###
@@ -161,7 +75,7 @@ sub make_plan_sync {
 }
 
 sub ds {
-    return Amanda::Cmdline::dumpspec_t->new($_[0], $_[1], $_[2], $_[3]);
+    return Amanda::Cmdline::dumpspec_t->new($_[0], $_[1], $_[2], $_[3], undef);
 }
 
 sub is_plan {
@@ -230,28 +144,23 @@ is_plan(make_plan_sync(
     "simple plan for just one dump");
 
 is_plan(make_plan_sync(
-           dumpspec => ds("somebox", "^/lib"),
+           dumpspec => ds("somebox", "^/usr/bin"),
            changer => $changer),
     [
-       [   "somebox", "/lib", "20080111000000", 0, [
-               'Conf-001' => 1,
+        [   'somebox', '/usr/bin', '20080313133333', 1, [
+               'Conf-003' => 1,
            ],
-       ],
-       [   "somebox", "/lib", "20080313133333", 0, [
-               'Conf-003' => 2,
-               'Conf-003' => 3,
-               'Conf-003' => 4,
-               'Conf-003' => 5,
-               'Conf-003' => 6,
-               'Conf-003' => 7,
-               'Conf-003' => 8,
-               'Conf-003' => 9,
-               'Conf-003' => 10,
-               'Conf-003' => 11,
+        ],
+        [   'somebox', '/usr/bin', '20080515155555', 1, [
+               'Conf-006' => 1,
+           ]
+        ],
+        [   'somebox', '/usr/bin', '20080616166666', 1, [
+               'Conf-007' => 1,
            ],
-       ],
+        ],
     ],
-    "plan for two dumps, in order by tape write time");
+    "plan for three dumps, in order by tape write time");
 
 is_plan(make_plan_sync(
            dumpspec => ds("otherbox", "^/lib"),
@@ -261,17 +170,21 @@ is_plan(make_plan_sync(
                '20080414144444/otherbox._lib',
            ],
        ],
-       [   "otherbox", "/lib", "20080313133333", 0, [
-               'Conf-003', 13,
+       [   'otherbox', '/lib', '20080313133333', 0, [
+               'Conf-003' => 14,
+           ],
+       ],
+       [   "otherbox", "/lib", "20080511151555", 0, [
+               'Conf-006', 13,
            ],
        ],
     ],
-    "plan for a two dumps, one on holding disk; holding dumps prioritized first");
+    "plan for three dumps, one on holding disk; holding dumps prioritized first");
 
 is_plan(make_plan_sync(
            dumpspecs => [
                ds("somebox", "^/lib", "20080111"),
-               ds("euclid", "/home/dustin/code/backuppc"),
+               ds("somebox", "^/lib", "20080222"),
            ],
            changer => $changer),
     [
@@ -279,13 +192,9 @@ is_plan(make_plan_sync(
                'Conf-001' => 1,
            ],
        ],
-       [   "euclid", "/home/dustin/code/backuppc", "20100127172011", 0, [
-               'Conf-013' => 1,
-               'Conf-013' => 2,
-               'Conf-013' => 3,
-               'Conf-014' => 1,
-               'Conf-014' => 2,
-               'Conf-014' => 3,
+       [       'somebox', '/lib', '20080222222222', 0, [
+               'Conf-002' => 1,
+               'Conf-002' => 2,
            ],
        ],
     ],
@@ -341,7 +250,7 @@ is_plan(make_plan_sync(
 
 is_plan(make_plan_sync(
            dumpspec => ds("oldbox", "^/opt", "20080414144444"),
-           holding_file => $holding_filenames{'oldbox_opt_20080414144444_holding'}),
+           holding_file => $cat->holding_filename('oldbox_opt_20080414144444_holding')),
     [
        [   "oldbox", "/opt", "20080414144444", 0, [
                '20080414144444/oldbox._opt',
@@ -351,7 +260,7 @@ is_plan(make_plan_sync(
     "make_plan creates an appropriate plan for an explicit holding-disk recovery");
 
 is_plan(make_plan_sync(
-           holding_file => $holding_filenames{'oldbox_opt_20080414144444_holding'}),
+           holding_file => $cat->holding_filename('oldbox_opt_20080414144444_holding')),
     [
        [   "oldbox", "/opt", "20080414144444", 0, [
                '20080414144444/oldbox._opt',
@@ -361,20 +270,24 @@ is_plan(make_plan_sync(
     "same, without a dumpspec");
 
 is_plan(make_plan_sync(
-           dumpspec => ds("euclid", "/home/dustin/code/backuppc"),
+           dumpspec => ds("somebox", "/lib", "20080515155555"),
            filelist => [
-               'Conf-013' => [1, 2, 3],
-               'Conf-014' => [1, 2, 3],
+               'Conf-006' => [2, 3, 4, 5,       8, 9, 10, 11],
+               #  (make_plan should fill in files 6 and 7)
            ],
            changer => $changer),
     [
-       [   "euclid", "/home/dustin/code/backuppc", "20100127172011", 0, [
-               'Conf-013' => 1,
-               'Conf-013' => 2,
-               'Conf-013' => 3,
-               'Conf-014' => 1,
-               'Conf-014' => 2,
-               'Conf-014' => 3,
+       [   'somebox', '/lib', '20080515155555', 0, [
+               'Conf-006' => 2,
+               'Conf-006' => 3,
+               'Conf-006' => 4,
+               'Conf-006' => 5,
+               'Conf-006' => 6,
+               'Conf-006' => 7,
+               'Conf-006' => 8,
+               'Conf-006' => 9,
+               'Conf-006' => 10,
+               'Conf-006' => 11,
            ],
        ],
     ],
@@ -382,163 +295,23 @@ is_plan(make_plan_sync(
 
 is_plan(make_plan_sync(
            filelist => [
-               'Conf-013' => [1, 2, 3],
-               'Conf-014' => [1, 2, 3],
+               'Conf-006' => [2, 3, 4, 5,       8, 9, 10, 11],
+               #  (make_plan should fill in files 6 and 7)
            ],
            changer => $changer),
     [
-       [   "euclid", "/home/dustin/code/backuppc", "20100127172011", 0, [
-               'Conf-013' => 1,
-               'Conf-013' => 2,
-               'Conf-013' => 3,
-               'Conf-014' => 1,
-               'Conf-014' => 2,
-               'Conf-014' => 3,
+       [   'somebox', '/lib', '20080515155555', 0, [
+               'Conf-006' => 2,
+               'Conf-006' => 3,
+               'Conf-006' => 4,
+               'Conf-006' => 5,
+               'Conf-006' => 6,
+               'Conf-006' => 7,
+               'Conf-006' => 8,
+               'Conf-006' => 9,
+               'Conf-006' => 10,
+               'Conf-006' => 11,
            ],
        ],
     ],
     "plan based on filelist, without a dumpspec");
-
-__DATA__
-# a short-datestamp logfile with only a single, single-part file in it
-::: log.20080111.0
-:tapelist 20080111 Conf-001
-DISK planner somebox /lib
-START planner date 20080111
-START driver date 20080111
-STATS driver hostname somebox
-STATS driver startup time 0.051
-FINISH planner date 20080111 time 82.721
-START taper datestamp 20080111 label Conf-001 tape 1
-SUCCESS dumper somebox /lib 20080111 0 [sec 0.209 kb 1970 kps 9382.2 orig-kb 1970]
-SUCCESS chunker somebox /lib 20080111 0 [sec 0.305 kb 420 kps 1478.7]
-STATS driver estimate somebox /lib 20080111 0 [sec 1 nkb 2002 ckb 480 kps 385]
-PART taper Conf-001 1 somebox /lib 20080111 1/1 0 [sec 4.813543 kb 419 kps 87.133307]
-DONE taper somebox /lib 20080111 1 0 [sec 4.813543 kb 419 kps 87.133307]
-FINISH driver date 20080111 time 2167.581
-
-# a logfile with several dumps in it, one of which comes in many parts, and one of which is
-# from a previous run
-::: log.20080313133333.0
-:tapelist 20080313133333 Conf-003
-DISK planner somebox /usr/bin
-DISK planner somebox /lib
-DISK planner otherbox /lib
-DISK planner otherbox /usr/bin
-START planner date 20080313133333
-START driver date 20080313133333
-STATS driver hostname somebox
-STATS driver startup time 0.059
-INFO planner Full dump of somebox:/lib promoted from 2 days ahead.
-FINISH planner date 20080313133333 time 0.286
-SUCCESS dumper somebox /usr/bin 20080313133333 1 [sec 0.001 kb 20 kps 10352.0 orig-kb 20]
-SUCCESS chunker somebox /usr/bin 20080313133333 1 [sec 1.023 kb 20 kps 50.8]
-STATS driver estimate somebox /usr/bin 20080313133333 1 [sec 0 nkb 52 ckb 64 kps 1024]
-START taper datestamp 20080313133333 label Conf-003 tape 1
-PART taper Conf-003 1 somebox /usr/bin 20080313133333 1/1 1 [sec 0.000370 kb 20 kps 54054.054054]
-DONE taper somebox /usr/bin 20080313133333 1 1 [sec 0.000370 kb 20 kps 54054.054054]
-# a multi-part dump
-SUCCESS dumper somebox /lib 20080313133333 0 [sec 0.189 kb 3156 kps 50253.1 orig-kb 3156]
-SUCCESS chunker somebox /lib 20080313133333 0 [sec 5.250 kb 3156 kps 1815.5]
-STATS driver estimate somebox /lib 20080313133333 0 [sec 1 nkb 3156 ckb 3156 kps 9500]
-PART taper Conf-003 2 somebox /lib 20080313133333 1/10 0 [sec 0.005621 kb 1024 kps 182173.990393]
-PART taper Conf-003 3 somebox /lib 20080313133333 2/10 0 [sec 0.006527 kb 1024 kps 156886.777999]
-PART taper Conf-003 4 somebox /lib 20080313133333 3/10 0 [sec 0.005854 kb 1024 kps 174923.129484]
-PART taper Conf-003 5 somebox /lib 20080313133333 4/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 6 somebox /lib 20080313133333 5/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 7 somebox /lib 20080313133333 6/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 8 somebox /lib 20080313133333 7/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 9 somebox /lib 20080313133333 8/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 10 somebox /lib 20080313133333 9/10 0 [sec 0.007344 kb 1024 kps 147993.746743]
-PART taper Conf-003 11 somebox /lib 20080313133333 10/10 0 [sec 0.001919 kb 284 kps 147993.746743]
-DONE taper somebox /lib 20080313133333 10 0 [sec 0.051436 kb 3156 kps 184695.543977]
-SUCCESS dumper otherbox /lib 20080313133333 0 [sec 0.001 kb 190 kps 10352.0 orig-kb 20]
-SUCCESS chunker otherbox /lib 20080313133333 0 [sec 1.023 kb 190 kps 50.8]
-STATS driver estimate otherbox /lib 20080313133333 0 [sec 0 nkb 190 ckb 190 kps 1024]
-# this dump is from a previous run, with an older dump_timestamp
-PART taper Conf-003 12 otherbox /usr/bin 20080311131133 1/1 0 [sec 0.002733 kb 240 kps 136425.648022]
-DONE taper otherbox /usr/bin 20080311131133 1 0 [sec 0.002733 kb 240 kps 136425.648022]
-PART taper Conf-003 13 otherbox /lib 20080313133333 1/1 0 [sec 0.001733 kb 190 kps 136425.648022]
-DONE taper otherbox /lib 20080313133333 1 0 [sec 0.001733 kb 190 kps 136425.648022]
-FINISH driver date 20080313133333 time 24.777
-
-# A logfile with some partial parts (PARTPARTIAL) in it
-::: log.20080414144444.0
-:tapelist 20080414144444 Conf-004
-:tapelist 20080414144444 Conf-005
-DISK planner otherbox /lib
-START planner date 20080414144444
-START driver date 20080414144444
-STATS driver hostname otherbox
-STATS driver startup time 0.075
-INFO taper Will write new label `Conf-004' to new (previously non-amanda) tape
-FINISH planner date 20080414144444 time 2.139
-SUCCESS dumper otherbox /lib 20080414144444 1 [sec 0.003 kb 60 kps 16304.3 orig-kb 60]
-SUCCESS chunker otherbox /lib 20080414144444 1 [sec 1.038 kb 60 kps 88.5]
-STATS driver estimate otherbox /lib 20080414144444 1 [sec 0 nkb 92 ckb 96 kps 1024]
-START taper datestamp 20080414144444 label Conf-004 tape 1
-PARTPARTIAL taper Conf-004 1 otherbox /lib 20080414144444 1/1 1 [sec 0.000707 kb 32 kps 45261.669024] ""
-INFO taper Will request retry of failed split part.
-INFO taper Will write new label `Conf-005' to new (previously non-amanda) tape
-START taper datestamp 20080414144444 label Conf-005 tape 2
-PARTPARTIAL taper Conf-005 1 otherbox /lib 20080414144444 1/1 1 [sec 0.000540 kb 32 kps 59259.259259] ""
-INFO taper Will request retry of failed split part.
-WARNING driver Out of tapes; going into degraded mode.
-PARTIAL taper otherbox /lib 20080414144444 1 1 [sec 0.000540 kb 32 kps 59259.259259] "full-up"
-# a completely failed dump
-FAIL taper otherbox /boot 20080414144444 0 "no-space"
-FINISH driver date 20080414144444 time 6.959
-
-# a spanned dump (yep, a real dump)
-::: log.20100127172011.0
-:tapelist 20100127172011 Conf-013
-:tapelist 20100127172011 Conf-014
-INFO amdump amdump pid 30186
-INFO planner planner pid 30207
-START planner date 20100127172011
-DISK planner euclid /home/dustin/code/backuppc
-INFO planner Adding new disk euclid:/home/dustin/code/backuppc.
-INFO driver driver pid 30208
-START driver date 20100127172011
-STATS driver hostname euclid
-INFO dumper dumper pid 30220
-STATS driver startup time 0.097
-INFO dumper dumper pid 30222
-INFO dumper dumper pid 30221
-INFO dumper dumper pid 30213
-INFO taper taper pid 30210
-FINISH planner date 20100127172011 time 1.224
-INFO planner pid-done 30207
-INFO taper Will write new label `Conf-013' to new tape
-INFO chunker chunker pid 30255
-INFO dumper gzip pid 30259
-SUCCESS dumper euclid /home/dustin/code/backuppc 20100127172011 0 [sec 0.933 kb 2770 kps 2968.5 orig-kb 2770]
-SUCCESS chunker euclid /home/dustin/code/backuppc 20100127172011 0 [sec 0.943 kb 2770 kps 2970.1]
-INFO chunker pid-done 30255
-STATS driver estimate euclid /home/dustin/code/backuppc 20100127172011 0 [sec 2 nkb 2802 ckb 2816 kps 1024]
-INFO dumper pid-done 30259
-START taper datestamp 20100127172011 label Conf-013 tape 1
-PART taper Conf-013 1 euclid /home/dustin/code/backuppc 20100127172011 1/-1 0 [sec 0.000763 kb 512 kps 670972.950092]
-PART taper Conf-013 2 euclid /home/dustin/code/backuppc 20100127172011 2/-1 0 [sec 0.000770 kb 512 kps 664770.167400]
-PART taper Conf-013 3 euclid /home/dustin/code/backuppc 20100127172011 3/-1 0 [sec 0.000877 kb 512 kps 583952.261903]
-PARTPARTIAL taper Conf-013 4 euclid /home/dustin/code/backuppc 20100127172011 4/-1 0 [sec 0.000689 kb 352 kps 510888.307044] "No space left on device"
-INFO taper Will request retry of failed split part.
-INFO taper tape Conf-013 kb 1536 fm 4 [OK]
-INFO taper Will write new label `Conf-014' to new tape
-START taper datestamp 20100127172011 label Conf-014 tape 2
-PART taper Conf-014 1 euclid /home/dustin/code/backuppc 20100127172011 4/-1 0 [sec 0.001346 kb 512 kps 380377.004130]
-PART taper Conf-014 2 euclid /home/dustin/code/backuppc 20100127172011 5/-1 0 [sec 0.001338 kb 512 kps 382524.888399]
-PART taper Conf-014 3 euclid /home/dustin/code/backuppc 20100127172011 6/-1 0 [sec 0.000572 kb 210 kps 367336.443449]
-DONE taper euclid /home/dustin/code/backuppc 20100127172011 6 0 [sec 0.005666 kb 2770 kps 488860.596548]
-INFO dumper pid-done 30213
-INFO dumper pid-done 30220
-INFO dumper pid-done 30222
-INFO taper tape Conf-014 kb 1234 fm 3 [OK]
-INFO dumper pid-done 30221
-INFO taper pid-done 30210
-FINISH driver date 20100127172011 time 4.197
-INFO driver pid-done 30208
-
-# holding-disk
-:holding otherbox_lib_20080414144444_holding 20080414144444 otherbox /lib 1 OK 256
-:holding oldbox_opt_20080414144444_holding 20080414144444 oldbox /opt 0 OK 1298