def validate_geometry(geometry_str, nodecount): '''Determine if we have a valid geometry. Used by qalter and bgq_base_system' ''' if get_config_option('bgsystem', 'bgtype') not in ['bgq']: raise ValueError("Alternate location geometries not supported on %s" " systems." % (get_config_option('system', 'type'))) if geometry_str != None: geometry_list = [int(x) for x in geometry_str.split('x')] max_nodes_per_dim = [] max_nodes_per_dim.append(int(get_config_option('system', 'max_A_nodes', sys.maxint))) max_nodes_per_dim.append(int(get_config_option('system', 'max_B_nodes', sys.maxint))) max_nodes_per_dim.append(int(get_config_option('system', 'max_C_nodes', sys.maxint))) max_nodes_per_dim.append(int(get_config_option('system', 'max_D_nodes', sys.maxint))) max_nodes_per_dim.append(int(get_config_option('system', 'max_E_nodes', sys.maxint))) max_geo_nodes = 1 for i in range(0,5): if i <= 3: if nodecount >= 512 and (geometry_list[i] % 4) != 0: raise JobValidationError("Geometry specification %s is invalid." % geometry_str) if max_nodes_per_dim[i] < geometry_list[i]: raise JobValidationError("Geometry specification %s exceeds maximum nodes per dimension." % geometry_str) if geometry_list[i] <= 0: raise JobValidationError("Geometry dimensions must be greater than zero.") max_geo_nodes *= geometry_list[i] if max_geo_nodes > nodecount: raise JobValidationError("Geometry requires more nodes than specified for job.") return True
def validate_job(self, spec): """Validate a job for submission Arguments: spec -- job specification dictionary """ max_nodes = len( self.get_resources([{ "name": "*", "functional": True, "scheduled": True }])) try: spec["nodecount"] = int(spec["nodecount"]) except ValueError: raise JobValidationError("Non-integer node count") if not 0 < spec["nodecount"] <= max_nodes: raise JobValidationError("Node count out of realistic range") if float(spec["time"]) < 15: raise JobValidationError("Walltime less than minimum 15 minutes") if "kernel" in spec: if not (os.path.exists( "/tftpboot/pxelinux.cfg/build-%s" % spec["kernel"]) and os.path.exists( "/tftpboot/pxelinux.cfg/boot-%s" % spec["kernel"])): raise JobValidationError( ("Specified image %s (from -k " + "'kernel' flag does not exist") % spec["kernel"]) if "attrs" in spec: matched_res = self.resources.get_attr_matched_resources( [{ "name": "*", "functional": True, "scheduled": True, "attributes": "*" }], spec["attrs"]) if spec["nodecount"] > len(matched_res): raise JobValidationError("Not enough nodes exist with the " + "attributes to match") return spec
def validate_job(self, spec): """validate a job for submission Arguments: spec -- job specification dictionary """ # spec has {nodes, walltime*, procs, mode, kernel} max_nodes = len(self.all_nodes) sys_type = 'orcm' job_types = ['co', 'vn', 'smp', 'dual', 'script'] spec['mode'] = 'script' try: spec['nodecount'] = int(spec['nodecount']) except: raise JobValidationError("Non-integer node count") if not 0 < spec['nodecount'] <= max_nodes: raise JobValidationError("Node count out of realistic range") if float(spec['time']) < 5 and float(spec['time']) > 0: raise JobValidationError("Walltime less than minimum") if spec['mode'] not in job_types: raise JobValidationError("%s is an invalid mode" % spec['mode']) if not spec['proccount']: spec['proccount'] = spec['nodecount'] else: try: spec['proccount'] = int(spec['proccount']) except: JobValidationError("non-integer proccount") if spec['proccount'] < 1: raise JobValidationError("negative proccount") if spec['proccount'] > spec['nodecount']: if spec['mode'] not in ['vn', 'dual']: raise JobValidationError("proccount too large") # need to handle kernel return spec
def validate_job(self, spec): """validate a job for submission Arguments: spec -- job specification dictionary """ # spec has {nodes, walltime*, procs, mode, kernel} max_nodes = len(self.all_nodes) # FIXME: is bgtype really needed for clusters? try: sys_type = CP.get('bgsystem', 'bgtype') except: sys_type = 'bgl' if sys_type == 'bgp': job_types = ['smp', 'dual', 'vn', 'script'] else: job_types = ['co', 'vn', 'script'] try: spec['nodecount'] = int(spec['nodecount']) except: raise JobValidationError("Non-integer node count") if not 0 < spec['nodecount'] <= max_nodes: raise JobValidationError("Node count out of realistic range") if float(spec['time']) < 5: raise JobValidationError("Walltime less than minimum") if not spec['mode']: if sys_type == 'bgp': spec['mode'] = 'smp' else: spec['mode'] = 'co' if spec['mode'] not in job_types: raise JobValidationError("Invalid mode") if not spec['proccount']: if spec.get('mode', 'co') == 'vn': if sys_type == 'bgl': spec['proccount'] = str(2 * int(spec['nodecount'])) elif sys_type == 'bgp': spec['proccount'] = str(4 * int(spec['nodecount'])) else: self.logger.error("Unknown bgtype %s" % (sys_type)) elif spec.get('mode', 'co') == 'dual': spec['proccount'] = 2 * int(spec['nodecount']) else: spec['proccount'] = spec['nodecount'] else: try: spec['proccount'] = int(spec['proccount']) except: JobValidationError("non-integer proccount") if spec['proccount'] < 1: raise JobValidationError("negative proccount") if spec['proccount'] > spec['nodecount']: if spec['mode'] not in ['vn', 'dual']: raise JobValidationError("proccount too large") if sys_type == 'bgl' and (spec['proccount'] > (2 * spec['nodecount'])): raise JobValidationError("proccount too large") elif sys_type == ' bgp'and (spec['proccount'] > (4 * spec['nodecount'])): raise JobValidationError("proccount too large") # need to handle kernel return spec
def validate_job(self, spec): """validate a job for submission Arguments: spec -- job specification dictionary """ # spec has {nodes, walltime*, procs, mode, kernel} max_nodes = max([int(p.size) for p in self._partitions.values()]) try: sys_type = CP.get('bgsystem', 'bgtype') except: sys_type = 'bgl' if sys_type == 'bgp': job_types = ['smp', 'dual', 'vn', 'script'] else: job_types = ['co', 'vn', 'script'] try: spec['nodecount'] = int(spec['nodecount']) except: raise JobValidationError("Non-integer node count") if not 0 < spec['nodecount'] <= max_nodes: raise JobValidationError("Node count out of realistic range") if float(spec['time']) < 5: raise JobValidationError("Walltime less than minimum") if not spec['mode']: if sys_type == 'bgp': spec['mode'] = 'smp' else: spec['mode'] = 'co' if spec['mode'] not in job_types: raise JobValidationError("Invalid mode") if spec['attrs'].has_key("location"): p_name = spec['attrs']['location'] if not self.partitions.has_key(p_name): raise JobValidationError("Partition %s not found" % p_name) if not spec['proccount']: if spec.get('mode', 'co') == 'vn': if sys_type == 'bgl': spec['proccount'] = str(2 * int(spec['nodecount'])) elif sys_type == 'bgp': spec['proccount'] = str(4 * int(spec['nodecount'])) else: self.logger.error("Unknown bgtype %s" % (sys_type)) elif spec.get('mode', 'co') == 'dual': spec['proccount'] = 2 * int(spec['nodecount']) else: spec['proccount'] = spec['nodecount'] else: try: spec['proccount'] = int(spec['proccount']) except: JobValidationError("non-integer proccount") if spec['proccount'] < 1: raise JobValidationError("negative proccount") if spec['proccount'] > spec['nodecount']: if spec['mode'] not in ['vn', 'dual']: raise JobValidationError("proccount too large") if sys_type == 'bgl' and (spec['proccount'] > (2 * spec['nodecount'])): raise JobValidationError("proccount too large") elif sys_type == ' bgp' and (spec['proccount'] > (4 * spec['nodecount'])): raise JobValidationError("proccount too large") # need to handle kernel return spec