def test__tryUpdateNodes_sends_work_to_dbtasks(self): nodes_with_tokens = yield deferToDatabase(self.make_nodes_with_tokens) node_messages = { node: [self.make_message() for _ in range(3)] for node, _ in nodes_with_tokens } dbtasks = Mock() dbtasks.addTask = Mock() worker = StatusWorkerService(dbtasks) for node, token in nodes_with_tokens: for message in node_messages[node]: worker.queueMessage(token.key, message) yield worker._tryUpdateNodes() call_args = [ (call_arg[0][1], call_arg[0][2]) for call_arg in dbtasks.addTask.call_args_list ] self.assertThat( call_args, MatchesSetwise( *[ MatchesListwise([Equals(node), Equals(messages)]) for node, messages in node_messages.items() ] ), )
def test__processMessages_doesnt_call_when_node_deleted(self): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") mock_processMessage.return_value = False yield deferToDatabase(worker._processMessages, sentinel.node, [sentinel.message1, sentinel.message2]) self.assertThat(mock_processMessage, MockCalledOnceWith(sentinel.node, sentinel.message1))
def test_processMessageNow_fails_when_in_transaction(self): worker = StatusWorkerService(sentinel.dbtasks) with ExpectedException(TransactionManagementError): yield deferToDatabase( transactional(worker._processMessageNow), sentinel.node, sentinel.message, )
def test_queueMessages_processes_top_level_message_instantly(self): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") message = self.make_message() message['event_type'] = 'finish' nodes_with_tokens = yield deferToDatabase(self.make_nodes_with_tokens) node, token = nodes_with_tokens[0] yield worker.queueMessage(token.key, message) self.assertThat(mock_processMessage, MockCalledOnceWith(node, message))
def test__processMessages_calls_processMessage(self): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") yield deferToDatabase(worker._processMessages, sentinel.node, [sentinel.message1, sentinel.message2]) self.assertThat( mock_processMessage, MockCallsMatch(call(sentinel.node, sentinel.message1), call(sentinel.node, sentinel.message2)))
def test_queueMessages_processes_top_level_status_messages_instantly(self): for name in EVENT_STATUS_MESSAGES.keys(): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") message = self.make_message() message["event_type"] = "start" message["name"] = name nodes_with_tokens = yield deferToDatabase( self.make_nodes_with_tokens) node, token = nodes_with_tokens[0] yield worker.queueMessage(token.key, message) self.assertThat(mock_processMessage, MockCalledOnceWith(node, message))
def test_queueMessages_processes_files_message_instantly(self): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") contents = b'These are the contents of the file.' encoded_content = encode_as_base64(bz2.compress(contents)) message = self.make_message() message['files'] = [{ "path": "sample.txt", "encoding": "uuencode", "compression": "bzip2", "content": encoded_content }] nodes_with_tokens = yield deferToDatabase(self.make_nodes_with_tokens) node, token = nodes_with_tokens[0] yield worker.queueMessage(token.key, message) self.assertThat(mock_processMessage, MockCalledOnceWith(node, message))
def test_queueMessages_handled_invalid_nodekey_with_instant_msg(self): worker = StatusWorkerService(sentinel.dbtasks) mock_processMessage = self.patch(worker, "_processMessage") contents = b"These are the contents of the file." encoded_content = encode_as_base64(bz2.compress(contents)) message = self.make_message() message["files"] = [{ "path": "sample.txt", "encoding": "uuencode", "compression": "bzip2", "content": encoded_content, }] nodes_with_tokens = yield deferToDatabase(self.make_nodes_with_tokens) node, token = nodes_with_tokens[0] yield deferToDatabase(token.delete) yield worker.queueMessage(token.key, message) self.assertThat(mock_processMessage, MockNotCalled())
def processMessage(self, node, payload): worker = StatusWorkerService(sentinel.dbtasks) return worker._processMessage(node, payload)
def test__tryUpdateNodes_returns_None_when_empty_queue(self): worker = StatusWorkerService(sentinel.dbtasks) self.assertIsNone(worker._tryUpdateNodes())
def test__init__(self): worker = StatusWorkerService(sentinel.dbtasks, clock=sentinel.reactor) self.assertEqual(sentinel.dbtasks, worker.dbtasks) self.assertEqual(sentinel.reactor, worker.clock) self.assertEqual(60, worker.step) self.assertEqual((worker._tryUpdateNodes, tuple(), {}), worker.call)
def make_StatusWorkerService(dbtasks): from metadataserver.api_twisted import StatusWorkerService return StatusWorkerService(dbtasks)
def updateLastPing(self, node, payload): worker = StatusWorkerService(sentinel.dbtasks) worker._updateLastPing(node, payload)