def get_task_status_json(cls): def create_task_events(start_time): """Create a list of task events, tracing the task from pending to assigned to running""" return [ TaskEvent(timestamp=start_time, status=0, message="looking for a host"), TaskEvent(timestamp=start_time + 10, status=9, message="found a host"), TaskEvent(timestamp=start_time + 20, status=2, message="running") ] def create_scheduled_task(instance, start_time): task = ScheduledTask(assignedTask=AssignedTask( taskId="task_%s" % instance, slaveId="random_machine_id", slaveHost="junk.nothing", task=TaskConfig(job=JobKey(role="nobody", environment="prod", name='flibber'), owner=Identity(role="nobody"), environment="prod", jobName="flibber", isService=False, numCpus=2, ramMb=2048, diskMb=4096, priority=7, maxTaskFailures=3, production=False, requestedPorts=["http"]), assignedPorts={"http": 1001}, instanceId=instance), status=2, failureCount=instance + 4, taskEvents=create_task_events(start_time), ancestorId="random_task_ancestor%s" % instance) return task resp = cls.create_simple_success_response() scheduleStatus = ScheduleStatusResult() scheduleStatus.tasks = [ create_scheduled_task(0, 123456), create_scheduled_task(1, 234567) ] resp.result = Result(scheduleStatusResult=scheduleStatus) return resp
def get_task_status_json(cls): def create_task_events(start_time): """Create a list of task events, tracing the task from pending to assigned to running""" return [ TaskEvent(timestamp=start_time, status=0, message="looking for a host"), TaskEvent(timestamp=start_time + 10, status=9, message="found a host"), TaskEvent(timestamp=start_time + 20, status=2, message="running") ] def create_scheduled_task(instance, start_time): task = ScheduledTask() task.assignedTask = AssignedTask() task.assignedTask.taskId = "task_%s" % instance task.assignedTask.slaveId = "random_machine_id" task.assignedTask.slaveHost = "junk.nothing" task.assignedTask.task = TaskConfig() task.assignedTask.task.owner = Identity(role="nobody") task.assignedTask.task.environment = "prod" task.assignedTask.task.jobName = "flibber" task.assignedTask.task.isService = False task.assignedTask.task.numCpus = 2 task.assignedTask.task.ramMb = 2048 task.assignedTask.task.diskMb = 4096 task.assignedTask.task.priority = 7 task.assignedTask.task.maxTaskFailures = 3 task.assignedTask.task.production = False task.assignedTask.task.requestedPorts = ["http"] task.assignedTask.assignedPorts = {"http": 1001} task.assignedTask.instanceId = 0 task.status = 2 task.failureCount = instance + 4 task.taskEvents = create_task_events(start_time) task.ancestorId = "random_task_ancestor%s" % instance return task resp = cls.create_simple_success_response() scheduleStatus = ScheduleStatusResult() scheduleStatus.tasks = [ create_scheduled_task(0, 123456), create_scheduled_task(1, 234567) ] resp.result.scheduleStatusResult = scheduleStatus return resp
def mock_scheduler(cls, response_code=None): scheduler = Mock() response_code = ResponseCode.OK if response_code is None else response_code resp = Response(responseCode=response_code, messageDEPRECATED='test') resp.result = Result(scheduleStatusResult=ScheduleStatusResult(tasks=cls.create_tasks())) scheduler.getTasksWithoutConfigs.return_value = resp return scheduler
def test_kill_job_with_empty_instances_batched(self): """Test kill client-side API logic.""" mock_context = FakeAuroraCommandContext() with contextlib.nested( patch('apache.aurora.client.cli.jobs.Job.create_context', return_value=mock_context), patch('apache.aurora.client.factory.CLUSTERS', new=self.TEST_CLUSTERS)): api = mock_context.get_api('west') # set up an empty instance list in the getTasksWithoutConfigs response status_response = self.create_simple_success_response() status_response.result = Result( scheduleStatusResult=ScheduleStatusResult(tasks=[])) mock_context.add_expected_query_result(status_response) api.kill_job.return_value = self.create_simple_success_response() with temporary_file() as fp: fp.write(self.get_valid_config()) fp.flush() cmd = AuroraCommandLine() cmd.execute([ 'job', 'kill', '--config=%s' % fp.name, self.get_instance_spec('0,2,4-13') ]) assert api.kill_job.call_count == 0
def create_mock_status_query_result(cls, scheduleStatus): query_result = cls.create_simple_success_response() query_result.result = Result(scheduleStatusResult=ScheduleStatusResult(tasks=[ cls.create_scheduled_task(0, initial_time=1000, status=scheduleStatus), cls.create_scheduled_task(1, initial_time=1004, status=scheduleStatus) ])) return query_result
def mock_get_tasks(self, tasks, response_code=None): response_code = ResponseCode.OK if response_code is None else response_code resp = Response(responseCode=response_code, details=[ResponseDetail(message='test')]) resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=tasks)) self._scheduler.getTasksWithoutConfigs.return_value = resp
def setup_get_tasks_status_calls(cls, scheduler): status_response = cls.create_simple_success_response() scheduler.getTasksStatus.return_value = status_response scheduler.getTasksWithoutConfigs.return_value = status_response task_config = TaskConfig(numCpus=1.0, ramMb=10, diskMb=1, job=JobKey(role='bozo', environment='test', name='hello')) # This should be a list of ScheduledTask's. tasks = [] for i in range(20): task_status = create_autospec(spec=ScheduledTask, instance=True) task_status.assignedTask = create_autospec(spec=AssignedTask, instance=True) task_status.assignedTask.instanceId = i task_status.assignedTask.taskId = "Task%s" % i task_status.assignedTask.slaveId = "Slave%s" % i task_status.slaveHost = "Slave%s" % i task_status.assignedTask.task = task_config tasks.append(task_status) status_response.result = Result( scheduleStatusResult=ScheduleStatusResult(tasks=tasks))
def expect_get_tasks(self, tasks, ignore_ids=None, response_code=ResponseCode.OK): scheduled = [] for index, task in enumerate(tasks): if not ignore_ids or index not in ignore_ids: scheduled.append(ScheduledTask(assignedTask=AssignedTask(task=task, instanceId=index))) response = make_response(response_code) response.result = Result(scheduleStatusResult=ScheduleStatusResult(tasks=scheduled)) query = TaskQuery(jobKeys=[self._job_key], statuses=ACTIVE_STATES) self._scheduler.getTasksStatus(query).AndReturn(response)
def mock_status_active_tasks(self, instance_ids): tasks = [] for i in instance_ids: tasks.append(ScheduledTask( status=ScheduleStatus.RUNNING, assignedTask=AssignedTask(task=TaskConfig(), instanceId=i) )) response = make_response(result=Result(scheduleStatusResult=ScheduleStatusResult(tasks=tasks))) self.mock_scheduler.getTasksWithoutConfigs(IgnoreArg()).AndReturn(response)
def mock_scheduler(cls, response_code=None): scheduler = create_autospec(spec=SchedulerThriftApiSpec, instance=True) response_code = ResponseCode.OK if response_code is None else response_code resp = Response(responseCode=response_code, details=[ResponseDetail(message='test')]) resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=cls.create_tasks())) scheduler.getTasksWithoutConfigs.return_value = resp return scheduler
def get_task_status_json(cls): def create_task_events(start_time): """Create a list of task events, tracing the task from pending to assigned to running""" return [ TaskEvent(timestamp=start_time, status=0, message="looking for a host"), TaskEvent(timestamp=start_time + 10, status=9, message="found a host"), TaskEvent(timestamp=start_time + 20, status=2, message="running") ] def create_scheduled_task(instance, start_time): task = ScheduledTask( assignedTask=AssignedTask( taskId="task_%s" % instance, slaveId="random_machine_id", slaveHost="junk.nothing", task=TaskConfig( job=JobKey(role="nobody", environment="prod", name='flibber'), owner=Identity(role="nobody"), environment="prod", jobName="flibber", isService=False, numCpus=2, ramMb=2048, diskMb=4096, priority=7, maxTaskFailures=3, production=False, requestedPorts=["http"]), assignedPorts={"http": 1001}, instanceId=instance), status=2, failureCount=instance + 4, taskEvents=create_task_events(start_time), ancestorId="random_task_ancestor%s" % instance) return task resp = cls.create_simple_success_response() scheduleStatus = ScheduleStatusResult() scheduleStatus.tasks = [ create_scheduled_task(0, 123456), create_scheduled_task(1, 234567) ] resp.result.scheduleStatusResult = scheduleStatus return resp
def create_mock_status_query_result(cls, scheduleStatus): mock_query_result = cls.create_simple_success_response() if scheduleStatus == ScheduleStatus.INIT: # status query result for before job is launched. tasks = [] else: mock_task_one = cls.create_scheduled_task(0, initial_time=1000, status=scheduleStatus) mock_task_two = cls.create_scheduled_task(1, initial_time=1004, status=scheduleStatus) tasks = [mock_task_one, mock_task_two] mock_query_result.result = Result(scheduleStatusResult=ScheduleStatusResult(tasks=tasks)) return mock_query_result
def expect_get_statuses(self, instance_ids=WATCH_INSTANCES, num_calls=EXPECTED_CYCLES): tasks = [self.create_task(instance_id) for instance_id in instance_ids] response = Response(responseCode=ResponseCode.OK, messageDEPRECATED='test') response.result = Result() response.result.scheduleStatusResult = ScheduleStatusResult( tasks=tasks) query = self.get_tasks_status_query(instance_ids) for x in range(int(num_calls)): self._scheduler.getTasksWithoutConfigs(query).AndReturn(response)
def expect_get_statuses(self, instance_ids=WATCH_INSTANCES, num_calls=EXPECTED_CYCLES): tasks = [self.create_task(instance_id) for instance_id in instance_ids] response = Response( responseCode=ResponseCode.OK, details=[ResponseDetail(message='test')], result=Result(scheduleStatusResult=ScheduleStatusResult( tasks=tasks))) query = self.get_tasks_status_query(instance_ids) for _ in range(int(num_calls)): self._scheduler.getTasksWithoutConfigs( query, retry=True).AndReturn(response)
def mock_status_active_tasks(self, instance_ids): tasks = [] for i in instance_ids: tasks.append( ScheduledTask(status=ScheduleStatus.RUNNING, assignedTask=AssignedTask(task=TaskConfig(), instanceId=i))) response = Response(responseCode=ResponseCode.OK, messageDEPRECATED='test') response.result = Result() response.result.scheduleStatusResult = ScheduleStatusResult( tasks=tasks) self.mock_scheduler.getTasksWithoutConfigs( IgnoreArg()).AndReturn(response)
def expect_get_tasks(self, tasks, ignore_ids=None, response_code=None): response_code = ResponseCode.OK if response_code is None else response_code response = Response(responseCode=response_code, messageDEPRECATED='test') scheduled = [] for index, task in enumerate(tasks): if not ignore_ids or index not in ignore_ids: scheduled.append( ScheduledTask(assignedTask=AssignedTask(task=task, instanceId=index))) response.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=scheduled)) query = TaskQuery(owner=Identity(role=self._job_key.role), environment=self._job_key.environment, jobName=self._job_key.name, statuses=ACTIVE_STATES) self._scheduler.getTasksStatus(query).AndReturn(response)
def test_kill_job_with_empty_instances_batched(self): """Test kill client-side API logic.""" mock_context = FakeAuroraCommandContext() with contextlib.nested( patch('apache.aurora.client.cli.jobs.Job.create_context', return_value=mock_context)): api = mock_context.get_api('west') mock_context.add_expected_query_result( self.create_query_call_result(), job_key=self.TEST_JOBKEY) # set up an empty instance list in the getTasksWithoutConfigs response status_response = self.create_simple_success_response() status_response.result = Result( scheduleStatusResult=ScheduleStatusResult(tasks=[])) mock_context.add_expected_query_result(status_response) api.kill_job.return_value = self.create_simple_success_response() cmd = AuroraCommandLine() cmd.execute(['job', 'kill', self.get_instance_spec('0,2,4-13')]) assert api.kill_job.call_count == 0 self.assert_query(api, times=2)
def create_response(cls, tasks, response_code=None): response_code = ResponseCode.OK if response_code is None else response_code resp = Response(responseCode=response_code, messageDEPRECATED='test') resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=tasks)) return resp
def create_nojob_status_response(cls): resp = cls.create_simple_success_response() resp.result.scheduleStatusResult = ScheduleStatusResult() resp.result.scheduleStatusResult.tasks = [] return resp
def create_response(cls, tasks, response_code=ResponseCode.OK): return Response( responseCode=response_code, details=[ResponseDetail(message='test')], result=Result(scheduleStatusResult=ScheduleStatusResult( tasks=tasks)))
def create_empty_status(cls): resp = cls.create_simple_success_response() resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=None)) return resp
def create_status_response(cls): resp = cls.create_simple_success_response() resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=cls.create_scheduled_tasks())) return resp
def create_empty_task_result(cls): status_response = cls.create_simple_success_response() status_response.result = Result( scheduleStatusResult=ScheduleStatusResult(tasks=[])) return status_response
def create_status_with_metadata(cls): resp = cls.create_simple_success_response() resp.result = Result(scheduleStatusResult=ScheduleStatusResult( tasks=set(cls.create_mock_scheduled_task_with_metadata()))) return resp