def launch_tasks_for_offers(self, driver: MesosSchedulerDriver, offers) -> List[TaskInfo]: """For each offer tries to launch all tasks that can fit in there. Declines offer if no fitting tasks found.""" launched_tasks: List[TaskInfo] = [] for offer in offers: with self.constraint_state_lock: try: tasks, new_state = self.tasks_and_state_for_offer( driver, offer, self.constraint_state) if tasks is not None and len(tasks) > 0: driver.launchTasks([offer.id], tasks) for task in tasks: self.task_store.add_task_if_doesnt_exist( task["task_id"]["value"], health=None, mesos_task_state=TASK_STAGING, offer=offer, resources=task["resources"], ) launched_tasks.extend(tasks) self.constraint_state = new_state else: driver.declineOffer(offer.id) except ConstraintFailAllTasksError: self.log( "Offer failed constraints for every task, rejecting 60s" ) filters = {"refuse_seconds": 60} driver.declineOffer(offer.id, filters) return launched_tasks
def test_decline_offer(mocker): ID = str(uuid.uuid4()) sched = mocker.Mock() framework = {'id': {'value': ID}} master = mocker.Mock() driver = MesosSchedulerDriver(sched, framework, master) driver._send = mocker.Mock() offer_ids = [str(uuid.uuid4()) for _ in range(random.randint(1, 10))] driver.declineOffer(offer_ids) driver._send.assert_called_once_with({ 'type': 'DECLINE', 'framework_id': { 'value': ID }, 'decline': { 'offer_ids': offer_ids } })
def resourceOffers(self, driver: MesosSchedulerDriver, offers): if self.frozen: return if self.within_reconcile_backoff(): self.log("Declining all offers since we started reconciliation too recently") for offer in offers: driver.declineOffer(offer.id) else: for idx, offer in enumerate(offers): if offer.agent_id.value in self.blacklisted_slaves: log.critical("Ignoring offer %s from blacklisted slave %s" % (offer.id.value, offer.agent_id.value)) filters = {'refuse_seconds': self.blacklist_timeout} driver.declineOffer(offer.id, filters) del offers[idx] self.launch_tasks_for_offers(driver, offers)