def test_resource_in_resource_map(self): """ Test _release_resource() with a valid resource. This should remove the resource from the database. """ # Set up two workers now = datetime.utcnow() worker_1 = Worker(name=WORKER_1, last_heartbeat=now) worker_1.save() worker_2 = Worker(name=WORKER_2, last_heartbeat=now) worker_2.save() # Set up two reserved resources reserved_resource_1 = ReservedResource(task_id=str(uuid.uuid4()), worker_name=worker_1.name, resource_id='resource_1') reserved_resource_1.save() reserved_resource_2 = ReservedResource(task_id=str(uuid.uuid4()), worker_name=worker_2.name, resource_id='resource_2') reserved_resource_2.save() # This should remove resource_2 from the _resource_map. tasks._release_resource(reserved_resource_2.task_id) # resource_2 should have been removed from the database self.assertEqual(ReservedResource.objects.count(), 1) rr_1 = ReservedResource.objects.get(task_id=reserved_resource_1.task_id) self.assertEqual(rr_1['worker_name'], reserved_resource_1.worker_name) self.assertEqual(rr_1['resource_id'], 'resource_1')
def test__release_resource_task_count_one(self): """ Test _release_resource() with a resource that has a task count of one. This should remove the resource from the database. """ # Set up two workers now = datetime.utcnow() worker_1 = Worker(WORKER_1, now) worker_1.save() worker_2 = Worker(WORKER_2, now) worker_2.save() # Set up two reserved resources reserved_resource_1 = ReservedResource('resource_1', worker_1.name, 7) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', worker_2.name, 1) reserved_resource_2.save() # This should remove resource_2 from the _resource_map. tasks._release_resource('resource_2') # resource_2 should have been removed from the database rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 1) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7)
def test_calls_on_failure_handler_if_task_id_is_not_final(self): self.mock_task_status.objects.filter.return_value = [mock.Mock()] mock_task = mock.Mock() self.mock_task.return_value = mock_task mock_task_id = mock.Mock() tasks._release_resource(mock_task_id) self.assertTrue(mock_task.on_failure.called)
def test__release_resource_task_count_two(self): """ Test _release_resource() with a resource that has a task count of two. This should simply decrement the task_count for the resource, but should not remove it from the database. """ # Set up two workers now = datetime.utcnow() worker_1 = Worker(WORKER_1, now) worker_1.save() worker_2 = Worker(WORKER_2, now) worker_2.save() # Set up two resource reservations, using our workers from above reserved_resource_1 = ReservedResource('resource_1', worker_1.name, 7) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', worker_2.name, 2) reserved_resource_2.save() # This should reduce the reserved_resource_2 num_reservations to 1. tasks._release_resource('resource_2') # Make sure the ReservedResources are also correct rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 2) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7) rr_2 = rrc.find_one({'_id': reserved_resource_2.name}) self.assertEqual(rr_2['assigned_queue'], reserved_resource_2.assigned_queue) self.assertEqual(rr_2['num_reservations'], 1)
def test_resource_not_in_resource_map(self): """ Test _release_resource() with a resource that is not in the database. This should be gracefully handled, and result in no changes to the database. """ # Set up two workers worker_1 = Worker(WORKER_1, datetime.utcnow()) worker_1.save() worker_2 = Worker(WORKER_2, datetime.utcnow()) worker_2.save() # Set up two resource reservations, using our workers from above reserved_resource_1 = ReservedResource(uuid.uuid4(), worker_1.name, 'resource_1') reserved_resource_1.save() reserved_resource_2 = ReservedResource(uuid.uuid4(), worker_2.name, 'resource_2') reserved_resource_2.save() # This should not raise any Exception, but should also not alter either the Worker # collection or the ReservedResource collection tasks._release_resource('made_up_resource_id') # Make sure that the workers collection has not been altered self.assertEqual(Worker.objects().count(), 2) worker_1 = Worker.objects().get(name=worker_1.name) self.assertTrue(worker_1) worker_2 = Worker.objects().get(name=worker_2.name) self.assertTrue(worker_2) # Make sure that the reserved resources collection has not been altered rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 2) rr_1 = rrc.find_one({'_id': reserved_resource_1.task_id}) self.assertEqual(rr_1['worker_name'], reserved_resource_1.worker_name) self.assertEqual(rr_1['resource_id'], 'resource_1') rr_2 = rrc.find_one({'_id': reserved_resource_2.task_id}) self.assertEqual(rr_2['worker_name'], reserved_resource_2.worker_name) self.assertEqual(rr_2['resource_id'], 'resource_2')
def test_resource_in_resource_map(self): """ Test _release_resource() with a valid resource. This should remove the resource from the database. """ # Set up two workers now = datetime.utcnow() worker_1 = Worker(WORKER_1, now) worker_1.save() worker_2 = Worker(WORKER_2, now) worker_2.save() # Set up two reserved resources reserved_resource_1 = ReservedResource(uuid.uuid4(), worker_1.name, 'resource_1') reserved_resource_1.save() reserved_resource_2 = ReservedResource(uuid.uuid4(), worker_2.name, 'resource_2') reserved_resource_2.save() # This should remove resource_2 from the _resource_map. tasks._release_resource(reserved_resource_2.task_id) # resource_2 should have been removed from the database rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 1) rr_1 = rrc.find_one({'_id': reserved_resource_1.task_id}) self.assertEqual(rr_1['worker_name'], reserved_resource_1.worker_name) self.assertEqual(rr_1['resource_id'], 'resource_1')
def test_deletes_reserved_resource(self): mock_task_id = mock.Mock() tasks._release_resource(mock_task_id) self.mock_reserved_resource.objects.assert_called_once_with( task_id=mock_task_id) self.mock_reserved_resource.objects.return_value.delete.assert_called_once_with( )
def test_resource_not_in_resource_map(self): """ Test _release_resource() with a resource that is not in the database. This should be gracefully handled, and result in no changes to the database. """ # Set up two workers worker_1 = Worker(name=WORKER_1, last_heartbeat=datetime.utcnow()) worker_1.save() worker_2 = Worker(name=WORKER_2, last_heartbeat=datetime.utcnow()) worker_2.save() # Set up two resource reservations, using our workers from above reserved_resource_1 = ReservedResource(task_id=str(uuid.uuid4()), worker_name=worker_1.name, resource_id='resource_1') reserved_resource_1.save() reserved_resource_2 = ReservedResource(task_id=str(uuid.uuid4()), worker_name=worker_2.name, resource_id='resource_2') reserved_resource_2.save() # This should not raise any Exception, but should also not alter either the Worker # collection or the ReservedResource collection tasks._release_resource('made_up_resource_id') # Make sure that the workers collection has not been altered self.assertEqual(Worker.objects().count(), 2) worker_1 = Worker.objects().get(name=worker_1.name) self.assertTrue(worker_1) worker_2 = Worker.objects().get(name=worker_2.name) self.assertTrue(worker_2) # Make sure that the reserved resources collection has not been altered self.assertEqual(ReservedResource.objects.count(), 2) rr_1 = ReservedResource.objects.get( task_id=reserved_resource_1.task_id) self.assertEqual(rr_1['worker_name'], reserved_resource_1.worker_name) self.assertEqual(rr_1['resource_id'], 'resource_1') rr_2 = ReservedResource.objects.get( task_id=reserved_resource_2.task_id) self.assertEqual(rr_2['worker_name'], reserved_resource_2.worker_name) self.assertEqual(rr_2['resource_id'], 'resource_2')
def test__release_resource_task_count_two(self): """ Test _release_resource() with a resource that has a task count of two. This should simply decrement the task_count for the resource, but should not remove it from the database. """ # Set up two available queues now = datetime.utcnow() available_queue_1 = AvailableQueue(RESERVED_WORKER_1, now, 7) available_queue_1.save() available_queue_2 = AvailableQueue(RESERVED_WORKER_2, now, 2) available_queue_2.save() # Set up two resource reservations, using our available_queues from above reserved_resource_1 = ReservedResource('resource_1', available_queue_1.name, available_queue_1.num_reservations) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', available_queue_2.name, available_queue_2.num_reservations) reserved_resource_2.save() # This should reduce the reserved_resource_2 num_reservations to 1, and should also reduce # available_queue_2's num_reservations to 1. tasks._release_resource('resource_2') # Make sure that the AvailableQueues are correct aqc = AvailableQueue.get_collection() self.assertEqual(aqc.count(), 2) aq_1 = aqc.find_one({'_id': available_queue_1.name}) self.assertEqual(aq_1['num_reservations'], 7) aq_2 = aqc.find_one({'_id': available_queue_2.name}) self.assertEqual(aq_2['num_reservations'], 1) # Make sure the ReservedResources are also correct rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 2) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7) rr_2 = rrc.find_one({'_id': reserved_resource_2.name}) self.assertEqual(rr_2['assigned_queue'], reserved_resource_2.assigned_queue) self.assertEqual(rr_2['num_reservations'], 1)
def test__release_resource_not_in__resource_map(self): """ Test _release_resource() with a resource that is not in the database. This should be gracefully handled, and result in no changes to the database. """ # Set up two available queues available_queue_1 = AvailableQueue(RESERVED_WORKER_1, datetime.utcnow(), 7) available_queue_1.save() available_queue_2 = AvailableQueue(RESERVED_WORKER_2, datetime.utcnow(), 3) available_queue_2.save() # Set up two resource reservations, using our available_queues from above reserved_resource_1 = ReservedResource('resource_1', available_queue_1.name, available_queue_1.num_reservations) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', available_queue_2.name, available_queue_2.num_reservations) reserved_resource_2.save() # This should not raise any Exception, but should also not alter either the AvailableQueue # collection or the ReservedResource collection tasks._release_resource('made_up_resource_id') # Make sure that the available queues collection has not been altered aqc = AvailableQueue.get_collection() self.assertEqual(aqc.count(), 2) aq_1 = aqc.find_one({'_id': available_queue_1.name}) self.assertEqual(aq_1['num_reservations'], 7) aq_2 = aqc.find_one({'_id': available_queue_2.name}) self.assertEqual(aq_2['num_reservations'], 3) # Make sure that the reserved resources collection has not been altered rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 2) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7) rr_2 = rrc.find_one({'_id': reserved_resource_2.name}) self.assertEqual(rr_2['assigned_queue'], reserved_resource_2.assigned_queue) self.assertEqual(rr_2['num_reservations'], 3)
def test__release_resource_not_in__resource_map(self): """ Test _release_resource() with a resource that is not in the database. This should be gracefully handled, and result in no changes to the database. """ # Set up two workers worker_1 = Worker(WORKER_1, datetime.utcnow()) worker_1.save() worker_2 = Worker(WORKER_2, datetime.utcnow()) worker_2.save() # Set up two resource reservations, using our workers from above reserved_resource_1 = ReservedResource('resource_1', worker_1.name, 7) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', worker_2.name, 3) reserved_resource_2.save() # This should not raise any Exception, but should also not alter either the Worker # collection or the ReservedResource collection tasks._release_resource('made_up_resource_id') # Make sure that the workers collection has not been altered worker_collection = Worker.get_collection() self.assertEqual(worker_collection.count(), 2) worker_1 = worker_collection.find_one({'_id': worker_1.name}) self.assertTrue(worker_1) worker_2 = worker_collection.find_one({'_id': worker_2.name}) self.assertTrue(worker_2) # Make sure that the reserved resources collection has not been altered rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 2) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7) rr_2 = rrc.find_one({'_id': reserved_resource_2.name}) self.assertEqual(rr_2['assigned_queue'], reserved_resource_2.assigned_queue) self.assertEqual(rr_2['num_reservations'], 3)
def test__release_resource_task_count_one(self): """ Test _release_resource() with a resource that has a task count of one. This should remove the resource from the database. """ # Set up two available queues now = datetime.utcnow() available_queue_1 = AvailableQueue(RESERVED_WORKER_1, now, 7) available_queue_1.save() available_queue_2 = AvailableQueue(RESERVED_WORKER_2, now, 1) available_queue_2.save() # Set up two reserved resources reserved_resource_1 = ReservedResource('resource_1', available_queue_1.name, available_queue_1.num_reservations) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', available_queue_2.name, available_queue_2.num_reservations) reserved_resource_2.save() # This should remove resource_2 from the _resource_map, and should reduce the queue's task # count to 0. tasks._release_resource('resource_2') # available_queue_2 should have had its num_reservations reduced to 0, and the other one # should have remained the same aqc = AvailableQueue.get_collection() self.assertEqual(aqc.count(), 2) aq_1 = aqc.find_one({'_id': available_queue_1.name}) self.assertEqual(aq_1['num_reservations'], 7) aq_2 = aqc.find_one({'_id': available_queue_2.name}) self.assertEqual(aq_2['num_reservations'], 0) # resource_2 should have been removed from the database rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 1) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7)
def test__release_resource_queue_task_count_zero(self): """ Test _release_resource() with a resource that has a queue with a task count of zero. This should not decrement the queue task count into the negative range. """ # Set up two available queues, the second with a task count of 0 now = datetime.utcnow() available_queue_1 = AvailableQueue(RESERVED_WORKER_1, now, 7) available_queue_1.save() available_queue_2 = AvailableQueue(RESERVED_WORKER_2, now, 0) available_queue_2.save() # Set up two reserved resources, and let's make it so the second one is out of sync with its # queue's task count by setting its num_reservations to 1 reserved_resource_1 = ReservedResource('resource_1', available_queue_1.name, available_queue_1.num_reservations) reserved_resource_1.save() reserved_resource_2 = ReservedResource('resource_2', available_queue_2.name, 1) reserved_resource_2.save() # This should remove resource_2 from the _resource_map, but should leave the queue's task # count at 0. tasks._release_resource('resource_2') # The _available_queue_task_counts should remain as they were before, since we don't want # queue lengths below zero aqc = AvailableQueue.get_collection() self.assertEqual(aqc.count(), 2) aq_1 = aqc.find_one({'_id': available_queue_1.name}) self.assertEqual(aq_1['num_reservations'], 7) aq_2 = aqc.find_one({'_id': available_queue_2.name}) self.assertEqual(aq_2['num_reservations'], 0) # resource_2 should have been removed from the database rrc = ReservedResource.get_collection() self.assertEqual(rrc.count(), 1) rr_1 = rrc.find_one({'_id': reserved_resource_1.name}) self.assertEqual(rr_1['assigned_queue'], reserved_resource_1.assigned_queue) self.assertEqual(rr_1['num_reservations'], 7)
def test_deletes_reserved_resource(self): mock_task_id = mock.Mock() tasks._release_resource(mock_task_id) self.mock_reserved_resource.objects.assert_called_once_with(task_id=mock_task_id) self.mock_reserved_resource.objects.return_value.delete.assert_called_once_with()
def test_finds_running_task_by_uuid(self): mock_task_id = mock.Mock() tasks._release_resource(mock_task_id) filter_obj = self.mock_task_status.objects.filter filter_obj.assert_called_once_with(task_id=mock_task_id, state=self.mock_constants.CALL_RUNNING_STATE)
def test_finds_running_task_by_uuid(self): mock_task_id = mock.Mock() tasks._release_resource(mock_task_id) filter_obj = self.mock_task_status.objects.filter filter_obj.assert_called_once_with( task_id=mock_task_id, state=self.mock_constants.CALL_RUNNING_STATE)