def _find_conflicts(self, resources): """ Find conflicting tasks, if any, and provide the following: * a task response, (accepted, postponed, rejected) * a (possibly empty) set of blocking call request ids * a list of blocking "reasons" in the form of TaskResource instances * a list of task resources corresponding to the given resources @param resources: dictionary of resources and their proposed operations @type resources: dict @return: tuple of objects described above @rtype: tuple """ if not resources: return dispatch_constants.CALL_ACCEPTED_RESPONSE, set(), [], [] postponing_call_requests = set() postponing_reasons = [] rejecting_call_requests = set() rejecting_reasons = [] call_resource_collection = CallResource.get_collection() call_resources = resource_dict_to_call_resources(resources) or_query = filter_dicts(call_resources, ('resource_type', 'resource_id')) cursor = call_resource_collection.find({'$or': or_query}) for call_resource in cursor: proposed_operation = resources[call_resource['resource_type']][call_resource['resource_id']] queued_operation = call_resource['operation'] postponing_operations = get_postponing_operations(proposed_operation) if queued_operation in postponing_operations: postponing_call_requests.add(call_resource['call_request_id']) reason = filter_dicts([call_resource], ('resource_type', 'resource_id'))[0] reason['operation'] = queued_operation if reason not in postponing_reasons: postponing_reasons.append(reason) rejecting_operations = get_rejecting_operations(proposed_operation) if queued_operation in rejecting_operations: rejecting_call_requests.add(call_resource['call_request_id']) reason = filter_dicts([call_resource], ('resource_type', 'resource_id'))[0] reason['operation'] = queued_operation if reason not in rejecting_reasons: rejecting_reasons.append(reason) if rejecting_call_requests: return dispatch_constants.CALL_REJECTED_RESPONSE, rejecting_call_requests, rejecting_reasons, call_resources if postponing_call_requests: return dispatch_constants.CALL_POSTPONED_RESPONSE, postponing_call_requests, postponing_reasons, call_resources return dispatch_constants.CALL_ACCEPTED_RESPONSE, set(), [], call_resources
def coordinator_dequeue_callback(call_request, call_report): """ Callback to be executed upon call completion that will clean up the coordinator's accounting data pertaining to the call. @param call_request: call request for the call @type call_request: L{call.CallRequest} instance @param call_report: call report for the call @type call_report: L{call.CallReport} instance """ collection = CallResource.get_collection() collection.remove({'call_request_id': call_request.id}, safe=True)
def resource_dict_to_call_resources(resource_dict): """ Convert a resources dictionary to a list of task resource instances @param resource_dict: dict in the form of {resource_type: {resource_id: [operations list]}} @type resource_dict: dict @return: list of call resource objects pertaining to the values of the resource_dict @rtype: list of L{CallResource} instances """ call_resources = [] for resource_type, resource_operations in resource_dict.items(): for resource_id, operation in resource_operations.items(): call_resource = CallResource(None, resource_type, resource_id, operation) call_resources.append(call_resource) return call_resources
def setUp(self): super(CoordinatorTests, self).setUp() self.coordinator = coordinator.Coordinator() self._task_queue_factory = dispatch_factory._task_queue dispatch_factory._task_queue = mock.Mock() # replace the task queue self.collection = CallResource.get_collection()
def __init__(self, task_state_poll_interval=0.5): self.task_state_poll_interval = task_state_poll_interval self.call_resource_collection = CallResource.get_collection()
def _find_conflicts(self, resources): """ Find conflicting tasks, if any, and provide the following: * a task response, (accepted, postponed, rejected) * a (possibly empty) set of blocking call request ids * a list of blocking "reasons" in the form of TaskResource instances * a list of task resources corresponding to the given resources @param resources: dictionary of resources and their proposed operations @type resources: dict @return: tuple of objects described above @rtype: tuple """ if not resources: return dispatch_constants.CALL_ACCEPTED_RESPONSE, set(), [], [] postponing_call_requests = set() postponing_reasons = [] rejecting_call_requests = set() rejecting_reasons = [] call_resource_collection = CallResource.get_collection() call_resources = resource_dict_to_call_resources(resources) or_query = filter_dicts(call_resources, ('resource_type', 'resource_id')) cursor = call_resource_collection.find({'$or': or_query}) for call_resource in cursor: proposed_operation = resources[call_resource['resource_type']][ call_resource['resource_id']] queued_operation = call_resource['operation'] postponing_operations = get_postponing_operations( proposed_operation) if queued_operation in postponing_operations: postponing_call_requests.add(call_resource['call_request_id']) reason = filter_dicts([call_resource], ('resource_type', 'resource_id'))[0] reason['operation'] = queued_operation if reason not in postponing_reasons: postponing_reasons.append(reason) rejecting_operations = get_rejecting_operations(proposed_operation) if queued_operation in rejecting_operations: rejecting_call_requests.add(call_resource['call_request_id']) reason = filter_dicts([call_resource], ('resource_type', 'resource_id'))[0] reason['operation'] = queued_operation if reason not in rejecting_reasons: rejecting_reasons.append(reason) if rejecting_call_requests: return dispatch_constants.CALL_REJECTED_RESPONSE, rejecting_call_requests, rejecting_reasons, call_resources if postponing_call_requests: return dispatch_constants.CALL_POSTPONED_RESPONSE, postponing_call_requests, postponing_reasons, call_resources return dispatch_constants.CALL_ACCEPTED_RESPONSE, set( ), [], call_resources