def __init__(self, source=None # Open file or path to file with limit set ): """Construct a limit processor. The 'source' argument can be one of three types: string - Path to a file to open and read. file - Open file handle to read. None - The limit processor becomes inert and passes all limits unconditionally. """ # If we were given no source, put the processor into an inert # mode where everything passes. self.inert = source is None if self.inert: return # # Load the validation data # validation_path = os.path.join(os.path.dirname(__file__), 'pscheduler-limits-validate.json') # TODO: Throw something nicer than IOError if this fails. validation_file = open(validation_path, 'r') # NOTE: Don't max_schema this. The limit validation file is # tied to this module. try: validation = pscheduler.json_load(validation_file) except Exception as ex: raise ValueError("Invalid validation file: %s" % (str(ex))) finally: validation_file.close() # # Inhale the source and validate it # if type(source) is str or type(source) is unicode: source = open(source, 'r') elif type(source) is file: pass # We're good with this. else: raise ValueError("Source must be a file or path") # At this point, source is a file. assert type(source) is file limit_config = pscheduler.json_load(source) valid, message = pscheduler.json_validate(limit_config, validation) if not valid: raise ValueError("Invalid limit file: %s" % message) # # Set up all of the stages # self.identifiers = IdentifierSet(limit_config['identifiers']) self.classifiers = ClassifierSet(limit_config['classifiers'], self.identifiers) self.rewriter = Rewriter(limit_config['rewrite']) \ if 'rewrite' in limit_config else None self.limits = LimitSet(limit_config['limits']) self.applications = ApplicationSet(limit_config['applications'], self.classifiers, self.limits) try: self.prioritizer = Prioritizer(limit_config["priority"]) except KeyError: self.prioritizer = None