def create_upgrade_task(self, requested_products: list, products: ProductCollection): """ фабричный метод: создать такс с переданными параметрами, с типом COMMAND_UPGRADE сохранить в базе данных зхапустить воркер :param requested_products: :param products: :param parameter_manager: :return: """ title = 'Upgrading products: {0}'.format(', '.join([product_name for product_name in requested_products])) state = { 'requested_products': requested_products, 'products': products.get_names_list(), 'parameters': {} } settings = Core.get_instance().settings.get_state() logging.debug('state: {0}'.format(state)) task = Task( command=Task.COMMAND_UPGRADE, title=title, params=json.dumps(state, sort_keys=True, indent=1), settings=json.dumps(settings, sort_keys=True, indent=1) ) task.save() # production # For debug worker uncomment this #self.task.execute() return task.id
def task2fail(task_id): try: obj = Task.get(Task.id == task_id) obj.status = Task.STATUS_FAILED obj.save() except Task.DoesNotExist: return True
def create_install_task(self, requested_products: list, products: ProductCollection, parameter_manager: ParametersManager): """ фабричный метод: создать такс с переданными параметрами, с типом COMMAND_INSTALL сохранить в базе данных зхапустить воркер :param requested_products: те продукты которые выбрал пользователь :param products: продукты для установки (продукты которые выбрал пользователь + зависимости) :param parameter_manager: :return: номер таска """ title = 'Installing products: {0}'.format(', '.join([product_name for product_name in requested_products])) state = { 'requested_products': requested_products, 'products': products.to_json_list(), 'parameters': parameter_manager.get_state() } settings = Core.get_instance().settings.get_state() for product in products.to_json_list(): state = { 'requested_products': requested_products, 'products': product, 'parameters': parameter_manager.get_state() } state2save = json.dumps(state, sort_keys=True, indent=1) task = Task( command=Task.COMMAND_INSTALL, title=title, params=state2save, settings=json.dumps(settings, sort_keys=True, indent=1) ) task.save() # production # For debug worker uncomment this # self.task.execute() return task.id
def create_uninstall_task(self, products: ProductCollection): """ фабричный метод: создать такс с переданными параметрами, с типом COMMAND_UNINSTALL сохранить в базе данных зхапустить воркер :param requested_products: :param products: :param parameter_manager: :return: """ title = 'Uninstalling products: {0}'.format(', '.join([product.title for product in products])) state = { 'products': products.get_names_list(), } settings = Core.get_instance().settings.get_state() task = Task( command=Task.COMMAND_UNINSTALL, title=title, params=json.dumps(state, sort_keys=True, indent=1), settings=json.dumps(settings, sort_keys=True, indent=1)) task.save() return task.id
def is_alive_task(task_id, core): try: obj = Task.get(Task.id == task_id) # may be wrong if obj.status == Task.STATUS_EXCEPTION: return False if obj.status == Task.STATUS_FAILED: return False if obj.status == Task.STATUS_DONE: return False print("find possible alive task %i pid is %i" % (task_id, obj.pid) ) pid = obj.pid return core.api.os.shell.is_alive(pid) except Task.DoesNotExist: return False
def process_check_new_tasks(self): # User.select().where(User.active == True).order_by(User.username) print("i'm checking a new tasks") query = Task.select().where(Task.status == Task.STATUS_PENDING).order_by(Task.id) if not self.check_free4run(): print("lock is busy") return False # race condition ????? for task in query: print("i have found a new task %s" % str(task)) if TornadoWorker.lock_obj(Task.LOCK, str(task.id)): # if it failed ? self.start_task(task) return True else: return False
def run(self): """ Run task """ # set django env to load django settings.py and get database config # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "web.settings") # from django.core import management # append web module ti python path sys.path.append(os.path.join(self.core.settings.root, 'src', 'web')) from web.taskqueue.models_peewee import TaskPeewee as Task print("start working on task %s" % self.task_id) task = Task.get(Task.id == self.task_id) if task.status != Task.STATUS_PENDING: raise Exception("Incorrect status: " + task.status) # create core with settings for current task settings = None if task.settings: settings = json.loads(task.settings) start(settings) # configure logger logger = logging.getLogger() # remove all handlers logger.handlers = [] # all to output, tornado will write to db from output of this process ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(module)s.%(funcName)s: %(message)s') logger.addHandler(ch) ch.setLevel(logging.INFO) logger.addHandler(ch) self.do_task(task, Task.LOCK) sys.exit(0)
def get_object_or_404(id): try: obj = Task.get(Task.id == id) return obj except Task.DoesNotExist: return []