def new_session(self): if hasattr(self, 'session') and self.session: self.session.close() self.Session.close_all() self.session = self.Session() ActivityLog.attach_to(self.session) return self.session
def setup(env): settings = env['request'].registry.settings env['models'] = aybu.manager.models env['engine'] = engine_from_config(settings, 'sqlalchemy.') env['request'].set_db_engine = env['engine'] aybu.manager.models.Base.metadata.bind = env['engine'] aybu.manager.models.Environment.initialize(settings) env['session'] = env['request'].db_session ActivityLog.attach_to(env['session'])
def run(self): self.log.debug("Worker starting ... ") self.socket = self.context.socket(zmq.SUB) self.socket.setsockopt(zmq.SUBSCRIBE, "") # subscribe to all self.socket.connect('inproc://tasks') log = logging.getLogger('aybu') while True: task = Task(uuid=self.socket.recv(), redis_client=self.redis, started=datetime.datetime.now()) session = self.Session() if not hasattr(session, 'activity_log'): ActivityLog.attach_to(session) level = int(task.get('log_level', logging.DEBUG)) handler = RedisPUBHandler(self.config, self.pub_socket, self.context, level=level) handler.set_task(task) log.addHandler(handler) log.setLevel(level) result = None try: module_name = 'aybu.manager.daemon.commands.{}'\ .format(task.command_module) module = __import__(module_name, fromlist=[task.command_name]) function = getattr(module, task.command_name) log.debug('Task received: %s: %s', task, task.command_args) result = function(session, task, **task.command_args) session.commit() except ImportError: session.rollback() task.status = taskstatus.FAILED task.result = "Cannot find resource {}"\ .format(task.command_module) log.exception(task.result) except AttributeError: session.rollback() task.status = taskstatus.FAILED task.result = "Cannot find action {} on {}"\ .format(task.command_name, task.command_module) log.critical(task.result) except Exception: session.rollback() log.exception('Error while executing task') task.status = taskstatus.FAILED task.result = str('Error') else: task.status = taskstatus.FINISHED log.info("Task completed successfully") finally: task['finished'] = datetime.datetime.now() task.result = result or '' self.pub_socket.send_multipart(["{}.finished".format(task.uuid), "task endend"]) session.close() log.removeHandler(handler) del handler self.socket.close()