def __init__(self): """ Provides some convenient variables for commands. Also sets requires_* parameters for some sets of commands. All of the command objects are singletons (or Borg). """ self.dbf = DbFactory() self.config = Config() self.az = AuthorizationBroker() self.formatter = ResponseFormatter() self.catalog = StatusCatalog() # Force the instance to have local copies of the class defaults... # This allows resources.py to modify instances without worrying # about inheritance issues (classes sharing required or optional # parameters). self.required_parameters = self.required_parameters[:] self.optional_parameters = self.optional_parameters[:] # Parameter checks are filled in automatically based on input.xml. This # lets us do some rudimentary checks before the actual command is # invoked. self.parameter_checks = {} # The parameter types are filled in automatically based on input.xml. self.parameter_types = {} # This is the pivot of the above, filled in at the same time. It is a # dictionary of type names to lists of parameters. self.parameters_by_type = {} self.action = self.__module__ package_prefix = "aquilon.worker.commands." if self.action.startswith(package_prefix): self.action = self.action[len(package_prefix):] # self.command is set correctly in resources.py after parsing input.xml self.command = self.action # The readonly and format flags are done here for convenience # and simplicity. They could be overridden by the __init__ # method of any show/search/cat commands that do not want these # defaults. Some 'one-off' commands (like ping and status) # just set the variables themselves. if self.action.startswith("show") or self.action.startswith("search"): self.requires_readonly = True self.requires_format = True if self.action.startswith("cat"): self.requires_format = True self.requires_readonly = True self._is_lock_free = True if not self.requires_readonly \ and self.config.get('broker', 'mode') == 'readonly': self.badmode = 'readonly' else: self.badmode = False self._update_render(self.render) if not self.defer_to_thread: if self.requires_azcheck or self.requires_transaction: self.defer_to_thread = True log.msg("Forcing defer_to_thread to True because of " "required authorization or transaction for %s" % self.command) # Not sure how to handle formatting with deferred... self.requires_format = False