def handle_task(self): flag = self.find_flag() if flag: failed = False try: self.handle_flag(flag) except MuleTaskFailed: failed = True finally: self.unlock_flag(flag) self.remove_logger() self.task_completed() if failed: return True if flag.name in SINGLE_SHOT_FLAGS: ApplicationFlag.objects(application=flag.application, name=flag.name, pending=False).delete() else: flag.update(pull__pending_backends=self.backend) ApplicationFlag.objects(application=flag.application, name=flag.name, pending_backends__size=0).delete() self.cleanup() return True return False
def reset_pending_state(self, lock): if lock.flag in SINGLE_SHOT_FLAGS: ApplicationFlag.objects( application=lock.application, name=lock.flag, pending=False).update_one(set__pending=True) else: ApplicationFlag.objects( application=lock.application, name=lock.flag, pending_backends__ne=lock.backend).update_one( add_to_set__pending_backends=lock.backend)
def handle_task(self): task_handled = super(Command, self).handle_task() if task_handled: return task_handled if self.last_app_check and self.last_app_check >= ( datetime.now() - timedelta(seconds=60)): return False self.last_app_check = datetime.now() for app in ApplicationRunPlan.objects( backends__backend=self.backend).distinct('application'): if app.flags: continue if not self.is_application_running(app): log.info(_("Application {name} is not running, " "starting").format(name=app.name)) ApplicationFlag.objects( application=app, name=IsStartingFlag.name).update_one( add_to_set__pending_backends=self.backend, upsert=True) elif not self.is_vassal_config_valid(app): log.info(_("Application {name} vassal config is invalid, " "restarting").format(name=app.name)) ApplicationFlag.objects( application=app, name=NeedsRestartFlag.name).update_one( add_to_set__pending_backends=self.backend, upsert=True) else: run_plan = app.run_plan if run_plan and not run_plan.is_valid(): log.info(_("Application {name} run plan is invalid, " "rescheduling").format(name=app.name)) ApplicationFlag.objects( application=app, name=NeedsReschedulingFlag.name).update_one( unset__pending=True, upsert=True)
def flag_filter(self): single_shot_flags = [] multi_show_flags = [] for flag in self.mule_flags: if flag in SINGLE_SHOT_FLAGS: single_shot_flags.append(flag) else: multi_show_flags.append(flag) return ApplicationFlag.objects( ( Q(pending__ne=False) & Q(name__in=single_shot_flags) & Q(application__nin=FlagLock.objects( flag__in=single_shot_flags).distinct('application')) ) | ( Q(pending_backends=self.backend) & Q(name__in=multi_show_flags) & Q(application__nin=FlagLock.objects( flag__in=multi_show_flags, backend=self.backend).distinct('application')) ) )