def _reserve_resource(resource_id): """ When you wish you queue a task that needs to reserve a resource, you should make a call to this function() first, queueing it in the RESOURCE_MANAGER_QUEUE. This Task will return the name of the queue you should put your task in. Please be sure to also add a task to run _queue_release_resource() in the same queue name that this function returns to you. It is important that _release_resource() is called after your task is completed, regardless of whether your task completes successfully or not. :param resource_id: The name of the resource you wish to reserve for your task. The system will ensure that no other tasks that want that same reservation will run concurrently with yours. :type resource_id: basestring :return: The name of a queue that you should put your task in :rtype: basestring """ reserved_resource = resources.get_or_create_reserved_resource(resource_id) if reserved_resource.assigned_queue is None: # The assigned_queue will be None if the reserved_resource was just created, so we'll # need to assign a queue to it reserved_resource.assigned_queue = resources.get_least_busy_available_queue().name reserved_resource.save() else: # The assigned_queue is set, so we just need to increment the num_reservations on the # reserved resource reserved_resource.increment_num_reservations() AvailableQueue(reserved_resource.assigned_queue).increment_num_reservations() return reserved_resource.assigned_queue
def test_get(self): """ Test for the case when the requested resource does exist. """ # Let's add two ReservedResources just to make sure that it doesn't return the wrong # resource. rr_1 = ReservedResource('resource_1') rr_1.save() rr_2 = ReservedResource('resource_2', 'some_queue', 7) rr_2.save() rr_2 = resources.get_or_create_reserved_resource('resource_2') # Assert that the returned instance is correct self.assertEqual(type(rr_2), ReservedResource) self.assertEqual(rr_2.name, 'resource_2') self.assertEqual(rr_2.assigned_queue, 'some_queue') # The resource should have 7 reservations self.assertEqual(rr_2.num_reservations, 7) # Now we need to assert that the DB is still correct rrc = rr_2.get_collection() self.assertEqual( rrc.find_one({'_id': 'resource_2'})['num_reservations'], 7) self.assertEqual( rrc.find_one({'_id': 'resource_2'})['assigned_queue'], 'some_queue')
def _reserve_resource(resource_id): """ When you wish you queue a task that needs to reserve a resource, you should make a call to this function() first, queueing it in the RESOURCE_MANAGER_QUEUE. This Task will return the name of the queue you should put your task in. Please be sure to also add a task to run _queue_release_resource() in the same queue name that this function returns to you. It is important that _release_resource() is called after your task is completed, regardless of whether your task completes successfully or not. :param resource_id: The name of the resource you wish to reserve for your task. The system will ensure that no other tasks that want that same reservation will run concurrently with yours. :type resource_id: basestring :return: The name of a queue that you should put your task in :rtype: basestring """ reserved_resource = resources.get_or_create_reserved_resource(resource_id) if reserved_resource.assigned_queue is None: # The assigned_queue will be None if the reserved_resource was just created, so we'll # need to assign a queue to it # get the dedicated queue name by adding '.dq' to the end of the worker name reserved_resource.assigned_queue = resources.get_least_busy_available_queue().name + '.dq' reserved_resource.save() else: # The assigned_queue is set, so we just need to increment the num_reservations on the # reserved resource reserved_resource.increment_num_reservations() # Remove the '.dq' from the queue name to get the worker name worker_name = reserved_resource.assigned_queue.rstrip('.dq') aqc = Criteria(filters={'_id': worker_name}) aq_list = list(resources.filter_available_queues(aqc)) aq_list[0].increment_num_reservations() return reserved_resource.assigned_queue
def _reserve_resource(resource_id): """ When you wish you queue a task that needs to reserve a resource, you should make a call to this function() first, queueing it in the RESOURCE_MANAGER_QUEUE. This Task will return the name of the queue you should put your task in. Please be sure to also add a task to run _queue_release_resource() in the same queue name that this function returns to you. It is important that _release_resource() is called after your task is completed, regardless of whether your task completes successfully or not. :param resource_id: The name of the resource you wish to reserve for your task. The system will ensure that no other tasks that want that same reservation will run concurrently with yours. :type resource_id: basestring :return: The name of a queue that you should put your task in :rtype: basestring """ reserved_resource = resources.get_or_create_reserved_resource(resource_id) if reserved_resource.assigned_queue is None: # The assigned_queue will be None if the reserved_resource was just created, so we'll # need to assign a queue to it reserved_resource.assigned_queue = resources.get_least_busy_worker( ).queue_name reserved_resource.save() else: # The assigned_queue is set, so we just need to increment the num_reservations on the # reserved resource reserved_resource.increment_num_reservations() return reserved_resource.assigned_queue
def test_create(self): """ Test for the case when the requested resource does not exist. """ # Let's add an ReservedResource just to make sure that it doesn't return any existing # resource. rr_1 = ReservedResource('resource_1') rr_1.save() rr_2 = resources.get_or_create_reserved_resource('resource_2') # Assert that the returned instance is correct self.assertEqual(type(rr_2), ReservedResource) self.assertEqual(rr_2.name, 'resource_2') # By default, the assigned_queue should be set to None self.assertEqual(rr_2.assigned_queue, None) # A new resource should default to 1 reservations self.assertEqual(rr_2.num_reservations, 1) # Now we need to assert that it made it to the database as well rrc = rr_2.get_collection() self.assertEqual(rrc.find_one({'_id': 'resource_2'})['num_reservations'], 1) self.assertEqual(rrc.find_one({'_id': 'resource_2'})['assigned_queue'], None)
def test_get(self): """ Test for the case when the requested resource does exist. """ # Let's add two ReservedResources just to make sure that it doesn't return the wrong # resource. rr_1 = ReservedResource('resource_1') rr_1.save() rr_2 = ReservedResource('resource_2', 'some_queue', 7) rr_2.save() rr_2 = resources.get_or_create_reserved_resource('resource_2') # Assert that the returned instance is correct self.assertEqual(type(rr_2), ReservedResource) self.assertEqual(rr_2.name, 'resource_2') self.assertEqual(rr_2.assigned_queue, 'some_queue') # The resource should have 7 reservations self.assertEqual(rr_2.num_reservations, 7) # Now we need to assert that the DB is still correct rrc = rr_2.get_collection() self.assertEqual(rrc.find_one({'_id': 'resource_2'})['num_reservations'], 7) self.assertEqual(rrc.find_one({'_id': 'resource_2'})['assigned_queue'], 'some_queue')
def test_create(self): """ Test for the case when the requested resource does not exist. """ # Let's add an ReservedResource just to make sure that it doesn't return any existing # resource. rr_1 = ReservedResource('resource_1') rr_1.save() rr_2 = resources.get_or_create_reserved_resource('resource_2') # Assert that the returned instance is correct self.assertEqual(type(rr_2), ReservedResource) self.assertEqual(rr_2.name, 'resource_2') # By default, the assigned_queue should be set to None self.assertEqual(rr_2.assigned_queue, None) # A new resource should default to 1 reservations self.assertEqual(rr_2.num_reservations, 1) # Now we need to assert that it made it to the database as well rrc = rr_2.get_collection() self.assertEqual( rrc.find_one({'_id': 'resource_2'})['num_reservations'], 1) self.assertEqual( rrc.find_one({'_id': 'resource_2'})['assigned_queue'], None)