Package: fai-client
Version: 3.2.17~lenny1, 3.2.20

So the basic problem is that the setup-storage script doesn't properly
find the logical volumes it's supposed to preserve when they exist.

Here's a full example:

- First, a disk_config

# TEST
# 2009-06-01
# bpkroth
#
# This file is a disk_config file uses the setup-storage syntax to create an
# LVM'd vm server disk layout that preserves partitions.  It is expected to
# be at least 12G.
#

# Setup the first disk to use an msdos partition table and two partitions, one
# for /boot and the rest for LVM.

disk_config disk1 bootable:1 fstabkey:label
# preserve_reinstall:2
primary         /boot                   256M            ext3    defaults,rw 
createopts="-L boot"
primary         -                       10G-            -       -

# Setup LVM to contain all the system partitions.
# Make sure that /local.hd is preserved unless it doesn't exist and gets
# to claim almost all of whatever's left.  It leaves a little bit in
# case we need to resize later.
 
vg vg disk1.2

disk_config     lvm fstabkey:label preserve_reinstall:vg-localhd
vg-swap         swap                    512M-1G         swap    sw 
createopts="-L swap"
vg-root         /                       4G-8G           ext3    
defaults,rw,errors=remount-ro createopts="-L root"
vg-var          /var                    1G-2G           ext3    defaults,rw 
createopts="-L var"
vg-localhd      /local.hd               1-90%           ext3    
defaults,rw,nosuid,nodev createopts="-L local.hd -m 1"


- Next, run the config:

# parted /dev/sda mklabel msdos # necessary for fresh VMDKs.
# flag_initial=1 disklist=sda setup-storage -X -f /tmp/TEST

- Next, remove a logical volume:
# lvremove -f vg/root

- Run setup storage again (without flag_initial) to reinstall the
  partition.  Dies with this message:
Preserved volume vg/localhd does not exist.

Now, the problem happens to be that in Commands.pm two hashes are used,
FAI::config{volumes}{lv} and FAI::current_lvm_config{vg}{volumes}{lv},
except their keys are lv and /dev/vg/lv respectively.

Also, while testing that one I discovered that in Volumes.pm a bad
concatenation error occurs if the volume group exists but is empty.

Here's the error message for that one:
Use of uninitialized value in concatenation (.) or string at 
/usr/share/fai/setup-storage//Volumes.pm line 313.
Use of uninitialized value in concatenation (.) or string at 
/usr/share/fai/setup-storage//Volumes.pm line 313.
INTERNAL ERROR in setup-storage:
convert_unit
Please report this error to the Debian Bug Tracking System.

Attached is a patch to deal with both of these problems.

Brian
diff -rubB lib/setup-storage/Commands.pm 
/pong/usr5/b/bpkroth/tmp/setup-storage/Commands.pm
--- lib/setup-storage/Commands.pm       2009-06-08 08:00:59.000000000 -0500
+++ /pong/usr5/b/bpkroth/tmp/setup-storage/Commands.pm  2009-06-08 
08:19:42.000000000 -0500
@@ -374,7 +374,21 @@
   my $lv_resize_pre = "";
   # remove, resize, create the logical volumes
   # remove all volumes that do not exist anymore or need not be preserved
-  foreach my $lv (keys %{ $FAI::current_lvm_config{$vg}{volumes} }) {
+
+  # FIXME:
+  # There's a problem with this code since the
+  # FAI::current_lvm_config{vg}{volumes} hash has keys of the form /dev/vg/lv,
+  # but the FAI::configs{config}{volumes} hash has keys of the form lv.  I've
+  # tried to fix this in the few places I caught it so far as preserving
+  # partitions was concerned, but that's all.  I imagine this causes problems
+  # elsewhere as well.
+  # 2009-06-07
+  # bpkroth
+
+  foreach my $lv_path (keys %{ $FAI::current_lvm_config{$vg}{volumes} }) {
+    my $lv = $lv_path;
+    $lv =~ s#/dev/$vg/##;
+    print STDERR "lv: $lv\n";
     # skip preserved/resized volumes
     if (defined ( $FAI::configs{$config}{volumes}{$lv})
       && ($FAI::configs{$config}{volumes}{$lv}{size}{preserve} == 1)) {
@@ -391,24 +405,25 @@
 
   # now create or resize the configured logical volumes
   foreach my $lv (keys %{ $FAI::configs{$config}{volumes} }) {
+    my $lv_path = "/dev/$vg/$lv";
     # reference to the size of the current logical volume
     my $lv_size = (\%FAI::configs)->{$config}->{volumes}->{$lv}->{size};
     # skip preserved partitions, but ensure that they exist
     if ($lv_size->{preserve}) {
-      defined ($FAI::current_lvm_config{$vg}{volumes}{$lv})
-        or die "Preserved volume $vg/$lv does not exist\n";
+      defined ($FAI::current_lvm_config{$vg}{volumes}{$lv_path}) or
+        die "Preserved volume $vg/$lv does not exist\n";
       warn "$vg/$lv will be preserved\n";
       next;
     }
 
     # resize the volume
     if ($lv_size->{resize}) {
-      defined ($FAI::current_lvm_config{$vg}{volumes}{$lv})
+      defined ($FAI::current_lvm_config{$vg}{volumes}{$lv_path})
         or die "Resized volume $vg/$lv does not exist\n";
       warn "$vg/$lv will be resized\n";
 
       if ($lv_size->{eff_size} <
-        $FAI::current_lvm_config{$vg}{volumes}{$lv}{size})
+        $FAI::current_lvm_config{$vg}{volumes}{$lv_path}{size})
       {
         &FAI::push_command( "parted -s /dev/$vg/$lv resize 1 0 " . 
$lv_size->{eff_size} .  "B",
           "vg_enabled_$vg,$lv_rm_pre", "lv_shrink_$vg/$lv" );
Only in lib/setup-storage: .svn
diff -rubB lib/setup-storage/Volumes.pm 
/pong/usr5/b/bpkroth/tmp/setup-storage/Volumes.pm
--- lib/setup-storage/Volumes.pm        2009-06-08 08:00:59.000000000 -0500
+++ /pong/usr5/b/bpkroth/tmp/setup-storage/Volumes.pm   2009-06-08 
08:19:53.000000000 -0500
@@ -308,9 +308,29 @@
 
     # store the vg size in MB
     my %vg_info = get_volume_group_information($vg);
+
+    # FIXME:
+    # If the volume group exists but is empty, this results in the following 
error:
+    # Use of uninitialized value in concatenation (.) or string at 
/usr/share/fai/setup-storage//Volumes.pm line 313.
+    # Use of uninitialized value in concatenation (.) or string at 
/usr/share/fai/setup-storage//Volumes.pm line 313.
+    # INTERNAL ERROR in setup-storage:
+    # convert_unit
+    # Please report this error to the Debian Bug Tracking System.
+    # 2009-06-07
+    # bpkroth
+    #
+    #$FAI::current_lvm_config{$vg}{size} =
+    #  &FAI::convert_unit( $vg_info{alloc_pe_size} .
+    #    $vg_info{alloc_pe_size_unit} );
+    my $unit_to_convert;
+    if ($vg_info{alloc_pe_size} && $vg_info{alloc_pe_size_unit}) {
+       $unit_to_convert = $vg_info{alloc_pe_size} . 
$vg_info{alloc_pe_size_unit};
+    }
+    else {
+        $unit_to_convert = '0M';
+    }
     $FAI::current_lvm_config{$vg}{size} =
-      &FAI::convert_unit( $vg_info{alloc_pe_size} .
-        $vg_info{alloc_pe_size_unit} );
+      &FAI::convert_unit( $unit_to_convert );
 
       # store the logical volumes and their sizes
     my %lv_info = get_logical_volume_information($vg);

Reply via email to