X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Fsteps%2FCheckForNewDisks.py;h=8a5484f94234eb698506f6bad49f12a04aa0eb90;hb=77fa80d9d47d002ea419a97201f2b2d761fc1106;hp=51ed6a3543cd584ed7b67b41ff6ff2808d34b0f0;hpb=7ab7e9dd797333a9fdc8604554e16e192a32144d;p=bootmanager.git diff --git a/source/steps/CheckForNewDisks.py b/source/steps/CheckForNewDisks.py index 51ed6a3..8a5484f 100644 --- a/source/steps/CheckForNewDisks.py +++ b/source/steps/CheckForNewDisks.py @@ -1,10 +1,20 @@ +#!/usr/bin/python + +# Copyright (c) 2003 Intel Corporation +# All rights reserved. +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. + import string import InstallPartitionDisks from Exceptions import * -from systeminfo import systeminfo -import compatibility +import systeminfo import utils +import os + +import ModelOptions def Run( vars, log ): @@ -13,8 +23,8 @@ def Run( vars, log ): Expect the following variables to be set: SYSIMG_PATH the path where the system image will be mounted - BOOT_CD_VERSION A tuple of the current bootcd version MINIMUM_DISK_SIZE any disks smaller than this size, in GB, are not used + NODE_MODEL_OPTIONS the node's model options Set the following variables upon successfully running: ROOT_MOUNTED the node root file system is mounted @@ -24,30 +34,24 @@ def Run( vars, log ): # make sure we have the variables we need try: - BOOT_CD_VERSION= vars["BOOT_CD_VERSION"] - if BOOT_CD_VERSION == "": - raise ValueError, "BOOT_CD_VERSION" - SYSIMG_PATH= vars["SYSIMG_PATH"] if SYSIMG_PATH == "": raise ValueError, "SYSIMG_PATH" MINIMUM_DISK_SIZE= int(vars["MINIMUM_DISK_SIZE"]) + + PARTITIONS= vars["PARTITIONS"] + if PARTITIONS == None: + raise ValueError, "PARTITIONS" + NODE_MODEL_OPTIONS= vars["NODE_MODEL_OPTIONS"] except KeyError, var: raise BootManagerException, "Missing variable in vars: %s\n" % var except ValueError, var: raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var - sysinfo= systeminfo() - - all_devices= sysinfo.get_block_device_list() + all_devices= systeminfo.get_block_device_list(vars, log) - # find out if there are unused disks in all_devices that are greater - # than old cds need extra utilities to run lvm - if BOOT_CD_VERSION[0] == 2: - compatibility.setup_lvm_2x_cd( vars, log ) - # will contain the new devices to add to the volume group new_devices= [] @@ -75,10 +79,10 @@ def Run( vars, log ): "of the volume group.\n" % device ) # this is the lvm partition, if it exists on that device - lvm_partition= "%s1" % device - already_added= utils.sysexec_noerr( "pvdisplay %s | grep -q 'planetlab'" % - lvm_partition ) - + lvm_partition= InstallPartitionDisks.get_partition_path_from_device( device, vars, log ) + cmd = "pvdisplay %s | grep -q 'planetlab'" % lvm_partition + already_added= utils.sysexec_noerr(cmd, log) + if already_added: log.write( "It appears %s is part of the volume group, continuing.\n" % device ) @@ -87,24 +91,30 @@ def Run( vars, log ): # just to be extra paranoid, ignore the device if it already has # an lvm partition on it (new disks won't have this, and that is # what this code is for, so it should be ok). - has_lvm= utils.sysexec_noerr( "sfdisk -l %s | grep -q 'Linux LVM'" % - device ) + cmd = "sfdisk -l %s | grep -q 'Linux LVM'" % device + has_lvm= utils.sysexec_noerr(cmd, log) if has_lvm: - log.write( "It appears %s has/had lvm already setup on "\ - "it, continuing.\n" % device ) - continue + log.write( "It appears %s has lvm already setup on it.\n" % device) + paranoid = False + if paranoid: + log.write("To paranoid to add %s to vservers lvm.\n" % device) + continue - - log.write( "Attempting to add %s to the volume group\n" % device ) - if not InstallPartitionDisks.single_partition_device( device, vars, log ): log.write( "Unable to partition %s, not using it.\n" % device ) continue - log.write( "Successfully initialized %s\n" % device ) + log.write( "Successfully partitioned %s\n" % device ) + + if NODE_MODEL_OPTIONS & ModelOptions.RAWDISK: + log.write( "Running on a raw disk node, not using it.\n" ) + continue part_path= InstallPartitionDisks.get_partition_path_from_device( device, vars, log ) + + log.write( "Attempting to add %s to the volume group\n" % device ) + if not InstallPartitionDisks.create_lvm_physical_volume( part_path, vars, log ): log.write( "Unable to create lvm physical volume %s, not using it.\n" % @@ -123,39 +133,70 @@ def Run( vars, log ): log.write( "Extending planetlab volume group.\n" ) log.write( "Unmounting disks.\n" ) - utils.sysexec_noerr( "chroot %s umount /rcfs" % SYSIMG_PATH, log ) - utils.sysexec_noerr( "umount /dev/planetlab/vservers", log ) - utils.sysexec_noerr( "umount /dev/planetlab/root", log ) + try: + # backwards compat, though, we should never hit this case post PL 3.2 + os.stat("%s/rcfs/taskclass"%SYSIMG_PATH) + utils.sysexec_chroot_noerr( SYSIMG_PATH, "umount /rcfs", log ) + except OSError, e: + pass + + # umount in order to extend disk size + utils.sysexec_noerr( "umount %s/proc" % SYSIMG_PATH, log ) + utils.sysexec_noerr( "umount %s/vservers" % SYSIMG_PATH, log ) + utils.sysexec_noerr( "umount %s" % SYSIMG_PATH, log ) utils.sysexec( "vgchange -an", log ) vars['ROOT_MOUNTED']= 0 - if not utils.sysexec_noerr( "vgextend planetlab %s" % - string.join(new_devices," "), log ): - log.write( "Failed to add physical volumes %s to " \ - "volume group, continuing.\n" % string.join(new_devices," ")) - return 1 - - # now, get the number of unused extents, and extend the vserver - # logical volume by that much. - remaining_extents= \ + while True: + cmd = "vgextend planetlab %s" % string.join(new_devices," ") + if not utils.sysexec_noerr( cmd, log ): + log.write( "Failed to add physical volumes %s to " \ + "volume group, continuing.\n" % string.join(new_devices," ")) + res = 1 + break + + # now, get the number of unused extents, and extend the vserver + # logical volume by that much. + remaining_extents= \ InstallPartitionDisks.get_remaining_extents_on_vg( vars, log ) - log.write( "Extending vservers logical volume.\n" ) - - if not utils.sysexec_noerr("lvextend -l +%s /dev/planetlab/vservers" % - remaining_extents, log): - log.write( "Failed to extend vservers logical volume, continuing\n" ) - return 1 - - log.write( "making the ext3 filesystem match new logical volume size.\n" ) - if not utils.sysexec_noerr("resize2fs /dev/planetlab/vservers",log): - log.write( "Failed to make ext3 file system match, continuing\n" ) - return 1 - - log.write( "Succesfully extended vservers partition by %4.2f GB\n" % - extended_gb_size ) + log.write( "Extending vservers logical volume.\n" ) + utils.sysexec( "vgchange -ay", log ) + cmd = "lvextend -l +%s %s" % (remaining_extents, PARTITIONS["vservers"]) + if not utils.sysexec_noerr(cmd, log): + log.write( "Failed to extend vservers logical volume, continuing\n" ) + res = 1 + break + + log.write( "making the ext filesystem match new logical volume size.\n" ) + + vars['ROOT_MOUNTED']= 1 + cmd = "mount %s %s" % (PARTITIONS["root"],SYSIMG_PATH) + utils.sysexec_noerr( cmd, log ) + cmd = "mount %s %s/vservers" % \ + (PARTITIONS["vservers"],SYSIMG_PATH) + utils.sysexec_noerr( cmd, log ) + cmd = "resize2fs %s" % PARTITIONS["vservers"] + resize = utils.sysexec_noerr(cmd,log) + utils.sysexec_noerr( "umount %s/vservers" % SYSIMG_PATH, log ) + utils.sysexec_noerr( "umount %s" % SYSIMG_PATH, log ) + vars['ROOT_MOUNTED']= 0 + + utils.sysexec( "vgchange -an", log ) + + if not resize: + log.write( "Failed to resize vservers partition, continuing.\n" ) + res = 1 + break + else: + log.write( "Extended vservers partition by %4.2f GB\n" % + extended_gb_size ) + res = 1 + break + else: log.write( "No new disk devices to add to volume group.\n" ) + res = 1 - return 1 + return res