From 2fea13e268727ee2f8bf711776c5b58e9eb5b52c Mon Sep 17 00:00:00 2001 From: Mark Huang Date: Fri, 21 Jul 2006 16:13:11 +0000 Subject: [PATCH] - MyPLC 0.4 RC2 --- source/BootManager.py | 70 +++++++++++++++++++------ source/steps/ChainBootNode.py | 7 +-- source/steps/GetAndUpdateNodeDetails.py | 32 ++--------- source/steps/InstallBootstrapRPM.py | 5 ++ source/steps/InstallPartitionDisks.py | 27 +++++++--- source/steps/InstallWriteConfig.py | 58 ++++++++++++-------- source/steps/ValidateNodeInstall.py | 41 +++++++++------ 7 files changed, 149 insertions(+), 91 deletions(-) diff --git a/source/BootManager.py b/source/BootManager.py index b49d978..5519af4 100755 --- a/source/BootManager.py +++ b/source/BootManager.py @@ -74,6 +74,8 @@ BIN_PATH= ('/usr/local/bin', '/usr/local/planetlab/bin') +# the set of valid node run states +NodeRunStates = {} class log: @@ -141,7 +143,10 @@ class BootManager: VARS_FILE = "configuration" - def __init__(self, log): + def __init__(self, log, forceState): + # override machine's current state from the command line + self.forceState = forceState + # this contains a set of information used and updated # by each step self.VARS= {} @@ -282,19 +287,26 @@ class BootManager: UpdateBootStateWithPLC.Run( self.VARS, self.LOG ) StartDebug.Run( self.VARS, self.LOG ) + global NodeRunStates # setup state -> function hash table - states = {'new':_newRun, - 'inst':_newRun, - 'rins':_rinsRun, - 'boot':_bootRun, - 'dbg':_debugRun} + NodeRunStates['new'] = _newRun + NodeRunStates['inst'] = _newRun + NodeRunStates['rins'] = _rinsRun + NodeRunStates['boot'] = _bootRun + NodeRunStates['dbg'] = _debugRun + try: InitializeBootManager.Run( self.VARS, self.LOG ) ReadNodeConfiguration.Run( self.VARS, self.LOG ) AuthenticateWithPLC.Run( self.VARS, self.LOG ) GetAndUpdateNodeDetails.Run( self.VARS, self.LOG ) - stateRun = states.get(self.VARS['BOOT_STATE'],_badRun) + # override machine's current state from the command line + if self.forceState is not None: + self.VARS['BOOT_STATE']= self.forceState + UpdateBootStateWithPLC.Run( self.VARS, self.LOG ) + + stateRun = NodeRunStates.get(self.VARS['BOOT_STATE'],_badRun) stateRun() except KeyError, e: @@ -330,11 +342,16 @@ class BootManager: SendHardwareConfigToPLC.Run( self.VARS, self.LOG ) - -if __name__ == "__main__": - - # set to 0 if no error occurred - error= 1 +def main(argv): + global NodeRunStates + NodeRunStates = {'new':None, + 'inst':None, + 'rins':None, + 'boot':None, + 'dbg':None} + + # set to 1 if error occurred + error= 0 # all output goes through this class so we can save it and post # the data back to PlanetLab central @@ -344,7 +361,26 @@ if __name__ == "__main__": strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) ) try: - bm= BootManager(LOG) + forceState = None + if len(argv) == 2: + fState = argv[1] + if NodeRunStates.has_key(fState): + forceState = fState + else: + LOG.LogEntry("FATAL: cannot force node run state to=%s" % fState) + error = 1 + except: + traceback.print_exc(file=LOG.OutputFile) + traceback.print_exc() + + if error: + LOG.LogEntry( "BootManager finished at: %s" % \ + strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) ) + LOG.Upload() + return error + + try: + bm= BootManager(LOG,forceState) if bm.CAN_RUN == 0: LOG.LogEntry( "Unable to initialize BootManager." ) else: @@ -355,14 +391,18 @@ if __name__ == "__main__": LOG.LogEntry( "\nDone!" ); else: LOG.LogEntry( "\nError occurred!" ); - + error = 1 except: traceback.print_exc(file=LOG.OutputFile) traceback.print_exc() LOG.LogEntry( "BootManager finished at: %s" % \ strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) ) - LOG.Upload() + + return error + +if __name__ == "__main__": + error = main(sys.argv) sys.exit(error) diff --git a/source/steps/ChainBootNode.py b/source/steps/ChainBootNode.py index 55beeb2..e2d2e89 100644 --- a/source/steps/ChainBootNode.py +++ b/source/steps/ChainBootNode.py @@ -11,8 +11,7 @@ from systeminfo import systeminfo import BootAPI import notify_messages -from GetAndUpdateNodeDetails import SMP_OPT - +import ModelOptions def Run( vars, log ): """ @@ -128,7 +127,7 @@ def Run( vars, log ): # get the kernel version option = '' - if NODE_MODEL_OPTIONS & SMP_OPT: + if NODE_MODEL_OPTIONS & ModelOptions.SMP: option = 'smp' log.write( "Copying kernel and initrd for booting.\n" ) @@ -244,6 +243,8 @@ def Run( vars, log ): kargs = "root=/dev/mapper/planetlab-root ramdisk_size=8192" + if NODE_MODEL_OPTIONS & ModelOptions.SMP: + kargs = kargs + " " + "acpi=off" try: kargsfb = open("/kargs.txt","r") moreargs = kargsfb.readline() diff --git a/source/steps/GetAndUpdateNodeDetails.py b/source/steps/GetAndUpdateNodeDetails.py index b3d3ab0..be39ef8 100644 --- a/source/steps/GetAndUpdateNodeDetails.py +++ b/source/steps/GetAndUpdateNodeDetails.py @@ -2,23 +2,7 @@ import string from Exceptions import * import BootAPI - -MINHW_OPT = 0x001 -SMP_OPT = 0x002 -X86_64_OPT = 0x004 -INTEL_OPT = 0x008 -AMD_OPT = 0x010 -NUMA_OPT = 0x020 -LAST_OPT = 0x040 - -modeloptions = {'smp':SMP_OPT, - 'x64':X86_64_OPT, - 'i64':X86_64_OPT|INTEL_OPT, - 'a64':X86_64_OPT|AMD_OPT, - 'i32':INTEL_OPT, - 'a32':AMD_OPT, - 'numa':NUMA_OPT, - 'minhw':MINHW_OPT} +import ModelOptions def Run( vars, log ): """ @@ -92,19 +76,11 @@ def Run( vars, log ): # parse in the model options from the node_model string model= vars['NODE_MODEL'] - modelinfo = string.split(model,'/') - options= 0 - for mi in modelinfo: - info = string.strip(mi) - info = info.lower() - options = options | modeloptions.get(info,0) - - print "node model options = %d" % options + options= ModelOptions.Get(model) vars['NODE_MODEL_OPTIONS']=options - # if the end of NODE_MODEL string contains the minhw string, skip hardware - # requirement checks (overrides configuration) - if options & MINHW_OPT: + # Check if we should skip hardware requirement check + if options & ModelOptions.MINHW: vars['SKIP_HARDWARE_REQUIREMENT_CHECK']=1 log.write( "node model indicates override to hardware requirements.\n" ) diff --git a/source/steps/InstallBootstrapRPM.py b/source/steps/InstallBootstrapRPM.py index c8baead..56ebc09 100644 --- a/source/steps/InstallBootstrapRPM.py +++ b/source/steps/InstallBootstrapRPM.py @@ -172,6 +172,11 @@ def Run( vars, log ): file(SYSIMG_PATH + "/usr/boot/boot_server", "w").write(boot_server) shutil.copy("/usr/bootme/pubring.gpg", SYSIMG_PATH + "/usr/boot/pubring.gpg") + # For backward compatibility + if os.path.exists("/usr/bootme"): + utils.makedirs(SYSIMG_PATH + "/mnt/cdrom") + shutil.copytree("/usr/bootme", SYSIMG_PATH + "/mnt/cdrom/bootme") + # Import the GPG key into the RPM database so that RPMS can be verified utils.makedirs(SYSIMG_PATH + "/etc/pki/rpm-gpg") utils.sysexec("gpg --homedir=/root --export --armor" \ diff --git a/source/steps/InstallPartitionDisks.py b/source/steps/InstallPartitionDisks.py index fcece53..f36e2e9 100644 --- a/source/steps/InstallPartitionDisks.py +++ b/source/steps/InstallPartitionDisks.py @@ -50,7 +50,7 @@ import utils import BootServerRequest import compatibility - +import ModelOptions def Run( vars, log ): """ @@ -96,6 +96,8 @@ def Run( vars, log ): if BOOT_CD_VERSION == "": raise ValueError, "BOOT_CD_VERSION" + NODE_MODEL_OPTIONS= vars["NODE_MODEL_OPTIONS"] + except KeyError, var: raise BootManagerException, "Missing variable in vars: %s\n" % var except ValueError, var: @@ -183,11 +185,24 @@ def Run( vars, log ): # make swap utils.sysexec( "mkswap %s" % PARTITIONS["swap"], log ) - # make root file system - utils.sysexec( "mkfs.ext2 -j %s" % PARTITIONS["root"], log ) - - # make vservers file system - utils.sysexec( "mkfs.ext2 -m 0 -j %s" % PARTITIONS["vservers"], log ) + # check if badhd option has been set + option = '' + txt = '' + if NODE_MODEL_OPTIONS & ModelOptions.BADHD: + option = '-c' + txt = " with bad block search enabled, which may take a while" + + # filesystems partitions names and their corresponding + # reserved-blocks-percentages + filesystems = {"root":5,"vservers":0} + + # make the file systems + for fs in filesystems.keys(): + # get the reserved blocks percentage + rbp = filesystems[fs] + devname = PARTITIONS[fs] + log.write("formatting %s partition (%s)%s.\n" % (fs,devname,txt)) + utils.sysexec( "mkfs.ext2 -q %s -m %d -j %s" % (option,rbp,devname), log ) # save the list of block devices in the log log.write( "Block devices used (in lvm):\n" ) diff --git a/source/steps/InstallWriteConfig.py b/source/steps/InstallWriteConfig.py index b6038c9..a0dfac5 100644 --- a/source/steps/InstallWriteConfig.py +++ b/source/steps/InstallWriteConfig.py @@ -46,8 +46,7 @@ from Exceptions import * import utils from systeminfo import systeminfo import BootAPI - -from GetAndUpdateNodeDetails import SMP_OPT +import ModelOptions def Run( vars, log ): @@ -107,8 +106,6 @@ def Run( vars, log ): if BOOT_CD_VERSION == "": raise ValueError, "BOOT_CD_VERSION" - NODE_MODEL_OPTIONS= vars["NODE_MODEL_OPTIONS"] - except KeyError, var: raise BootManagerException, "Missing variable in vars: %s\n" % var except ValueError, var: @@ -223,23 +220,19 @@ def Run( vars, log ): log.write( "Making initrd\n" ) # trick mkinitrd in case the current environment does not have device mapper - fake_root_lvm= 0 + fake_root_lvm= False if not os.path.exists( "%s/%s" % (SYSIMG_PATH,PARTITIONS["mapper-root"]) ): - fake_root_lvm= 1 + fake_root_lvm= True utils.makedirs( "%s/dev/mapper" % SYSIMG_PATH ) rootdev= file( "%s/%s" % (SYSIMG_PATH,PARTITIONS["mapper-root"]), "w" ) rootdev.close() - option = '' - if NODE_MODEL_OPTIONS & SMP_OPT: - option = 'smp' - initrd= os.readlink( "%s/boot/initrd-boot%s" % (SYSIMG_PATH,option) ) - kernel_version= initrd.replace("initrd-", "").replace(".img", "") + initrd, kernel_version= getKernelVersion(vars,log) utils.removefile( "%s/boot/%s" % (SYSIMG_PATH, initrd) ) utils.sysexec( "chroot %s mkinitrd /boot/initrd-%s.img %s" % \ (SYSIMG_PATH, kernel_version, kernel_version), log ) - if fake_root_lvm == 1: + if fake_root_lvm == True: utils.removefile( "%s/%s" % (SYSIMG_PATH,PARTITIONS["mapper-root"]) ) log.write( "Writing node install version\n" ) @@ -411,21 +404,12 @@ def write_modprobeconf_file( vars, log, filename = "/etc/modprobe.conf"): if SYSIMG_PATH == "": raise ValueError, "SYSIMG_PATH" - 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 - - # get the kernel version - option = '' - if NODE_MODEL_OPTIONS & SMP_OPT: - option = 'smp' - initrd= os.readlink( "%s/boot/initrd-boot%s" % (SYSIMG_PATH,option) ) - kernel_version= initrd.replace("initrd-", "").replace(".img", "") - + initrd, kernel_version= getKernelVersion(vars,log) sysinfo= systeminfo() sysmods= sysinfo.get_system_modules(SYSIMG_PATH, kernel_version) if sysmods is None: @@ -458,3 +442,33 @@ def write_modprobeconf_file( vars, log, filename = "/etc/modprobe.conf"): return (eth_count,scsi_count) +def getKernelVersion( vars, log): + # make sure we have the variables we need + try: + SYSIMG_PATH= vars["SYSIMG_PATH"] + if SYSIMG_PATH == "": + raise ValueError, "SYSIMG_PATH" + + 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 + + option = '' + if NODE_MODEL_OPTIONS & ModelOptions.SMP: + option = 'smp' + try: + os.stat("%s/boot/kernel-boot%s" % (SYSIMG_PATH,option)) + os.stat("%s/boot/initrd-boot%s" % (SYSIMG_PATH,option)) + except OSError, e: + # smp kernel is not there; remove option from modeloptions + # such that the rest of the code base thinks we are just + # using the base kernel. + NODE_MODEL_OPTIONS = NODE_MODEL_OPTIONS & ~ModelOptions.SMP + vars["NODE_MODEL_OPTIONS"] = NODE_MODEL_OPTIONS + log.write( "WARNING: Couldn't locate smp kernel.\n") + option = '' + initrd= os.readlink( "%s/boot/initrd-boot%s" % (SYSIMG_PATH,option) ) + kernel_version= initrd.replace("initrd-", "").replace(".img", "") + return (initrd, kernel_version) diff --git a/source/steps/ValidateNodeInstall.py b/source/steps/ValidateNodeInstall.py index d5de397..7b7ed8a 100644 --- a/source/steps/ValidateNodeInstall.py +++ b/source/steps/ValidateNodeInstall.py @@ -4,7 +4,7 @@ from Exceptions import * import utils from systeminfo import systeminfo import compatibility -from GetAndUpdateNodeDetails import SMP_OPT +import ModelOptions def Run( vars, log ): @@ -94,22 +94,29 @@ def Run( vars, log ): vars['ROOT_MOUNTED']= 1 - # get the kernel version - option = '' - if NODE_MODEL_OPTIONS & SMP_OPT: - option = 'smp' - - files = ("kernel-boot%s" % option, "initrd-boot%s" % option) - valid= 1 - for filepath in files: - if not os.access("%s/boot/%s"%(SYSIMG_PATH,filepath),os.F_OK|os.R_OK): - log.write( "Node not properly installed:\n") - log.write( "\tmissing file /boot/%s\n" % filepath ) - valid= 0 - - if not valid: + # check if the base kernel is installed + try: + os.stat("%s/boot/kernel-boot" % SYSIMG_PATH) + os.stat("%s/boot/initrd-boot" % SYSIMG_PATH) + except OSError, e: + log.write( "FATAL: Couldn't locate base kernel.\n") return 0 + # check if the model specified kernel is installed + option = '' + if NODE_MODEL_OPTIONS & ModelOptions.SMP: + option = 'smp' + try: + os.stat("%s/boot/kernel-boot%s" % (SYSIMG_PATH,option)) + os.stat("%s/boot/initrd-boot%s" % (SYSIMG_PATH,option)) + except OSError, e: + # smp kernel is not there; remove option from modeloptions + # such that the rest of the code base thinks we are just + # using the base kernel. + NODE_MODEL_OPTIONS = NODE_MODEL_OPTIONS & ~ModelOptions.SMP + vars["NODE_MODEL_OPTIONS"] = NODE_MODEL_OPTIONS + log.write( "WARNING: Couldn't locate smp kernel.\n") + # write out the node id to /etc/planetlab/node_id. if this fails, return # 0, indicating the node isn't a valid install. try: @@ -118,9 +125,9 @@ def Run( vars, log ): node_id_file.write( str(NODE_ID) ) node_id_file.close() node_id_file= None - log.write( "Updated /etc/planetlab/node_id" ) + log.write( "Updated /etc/planetlab/node_id\n" ) except IOError, e: - log.write( "Unable to write out /etc/planetlab/node_id" ) + log.write( "Unable to write out /etc/planetlab/node_id\n" ) return 0 log.write( "Everything appears to be ok\n" ) -- 2.43.0