[Ovirt-devel] [PATCH node 3/5] Handle existing HostVGs on the storage

Mike Burns mburns at redhat.com
Wed Feb 24 17:47:49 UTC 2010


Allow the user to install on a device that already contains HostVG.
Fail install if HostVG exists on a different drive.

Signed-off-by: Mike Burns <mburns at redhat.com>
---
 scripts/ovirt-config-storage |   81 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 73 insertions(+), 8 deletions(-)

diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index a16126c..44389f3 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -349,6 +349,24 @@ do_configure()

         printf "\n\nPlease select the disk to use for the HostVG.\n\n"
         HOSTVGDRIVE=$(get_dev_name) || return 0
+        local skipped=false
+        if check_existing_hostvg $HOSTVGDRIVE devs; then
+            for dev in $devs
+            do
+                printf "Removing HostVG on $dev will erase the drive and cannot be undone\n"
+                if ask_yes_or_no "Do you want to remove HostVG from $dev (y/n)?"; then
+                    start_log
+                    if ! wipe_lvm_on_disk $dev; then
+                        stop_log
+                        return 1
+                    fi
+                    stop_log
+                else
+                    skipped=true
+                fi
+            done
+        fi
+        $skipped  && printf "Installation cannot proceed with existing HostVG.\n" && return 0
         get_drive_size $HOSTVGDRIVE HOSTVGDRIVESPACE
         echo $HOSTVGDRIVESPACE
     fi
@@ -488,15 +506,59 @@ EOF
     return ${is_negative-0}
 }

+#Check for an existing HostVG on any device on the system.
+# Return 0 if then is a HostVG found, unless only one found is on $1
+# Return 1 if no HostVG found or only found on $1
+check_existing_hostvg()
+{
+    local install_dev=$1
+    local devices_var=$2
+    if [ -z "$install_dev" ]; then
+        devices="$(pvs -o pv_name,vg_name --noheadings | \
+            grep "HostVG" | awk '{print $1}' )"
+    else
+        devices="$(pvs -o pv_name,vg_name --noheadings | \
+            grep -v ${install_dev} | grep "HostVG" | awk '{print $1}' )"
+    fi
+    rc=1
+    if [ -n "$devices" ]; then
+        printf "\n"
+        printf "There appears to already be an installation on another device:\n"
+        for device in $devices; do
+            get_multipath_devices ${device%p[0-9]} sd_dev
+            sd_dev=$(echo $sd_dev | awk '{print $1}')
+            udi=$(hal-find-by-property --key block.device --string /dev/${sd_dev})
+            printf "\t$device ($(basename "$udi"))\n"
+        done
+        printf "The installation cannot proceed until the device is removed\n"
+        printf "from the system of the HostVG volume group is removed.\n"
+        rc=0
+    fi
+
+    test -z $devices_var || eval $devices_var=$devices
+
+    return $rc
+
+}
+
 # cleanup lvms on selected disk
 # - remove mounted filesystems
 # - remove LVM volumes and groups
 wipe_lvm_on_disk()
 {
+    local dev=${1-$HOSTVGDRIVE}
     unmount_logging
     for vg in $(pvs -o vg_name --noheadings $HOSTVGDRIVE* 2>/dev/null|sort -u); do
+        if pvs -o pv_name,vg_name --noheadings | \
+            grep $vg | grep -v -q $dev* 2>/dev/null; then
+            log "The volume group \"$vg\" spans multiple disks."
+            log "This operation cannot complete.  Please manullay"
+            log "cleanup the storage using standard linux tools."
+            return 1
+        fi
         wipe_volume_group $vg
     done
+    return 0
 }


@@ -867,19 +929,22 @@ if [ "$1" == "AUTO" ]; then
     log "Beginning automatic disk partitioning.\n"
     if [ -n "$OVIRT_INIT" ]; then
         # do not format if HostVG exists on selected disk...
-	pvs -o vg_name --noheadings $HOSTVGDRIVE* 2>/dev/null|grep -q -m1 "HostVG"
-	existingHostVG=$?
+        check_existing_hostvg $HOSTVGDRIVE
+        existingHostVG=$?
         # ... unless overridden by ovirt_firstboot parameter
-	if is_firstboot || [ $existingHostVG -ne 0 ]; then
+        if is_firstboot || [ $existingHostVG -ne 0 ]; then
             if check_partition_sizes; then
-		log "Partitioning hard disk..."
-		perform_partitioning
+		        log "Partitioning hard disk..."
+                perform_partitioning
+                exit $?
             fi
-	else
+        else
             log "Skip disk partitioning, HostVG exists"
-	fi
+            exit 1
+        fi
     else
-	log "Missing device parameter: unable to partition any disk"
+        log "Missing device parameter: unable to partition any disk"
+        exit 2
     fi
 else
     OPTIONS="\"Enable iSCSI Target\" \"Configure Storage\" \"Review\" \"Commit Changes And Quit\" \"Return To Menu\""
-- 
1.6.6.1




More information about the ovirt-devel mailing list