Exemple #1
0
class TestMonitor(unittest.TestCase):
    def setUp(self):
        self.poller = PollerSpy()
        self.scale_workers = ScaleWorkersSpy()
        self.create_poller = lambda: self.poller
        self.monitor = Monitor(self.create_poller, self.emit,
                               self.scale_workers,
                               self.poller.has_next_message)
        self.emmited_messages = []

    def test_monitor_forwards_messages_to_socketio(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "STARTED",
                                      1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      2).SerializeToString(),
        ]
        self.run_monitor(messages)

        expected_messages = [
            {
                "address": "tcp://127.0.0.1:1",
                "model": "en-GB",
                "status": "STARTED",
                "time": 1
            },
            {
                "address": "tcp://127.0.0.1:1",
                "model": "en-GB",
                "status": "WORKING",
                "time": 2
            },
        ]

        self.assertThatMonitorForwardedMessages(expected_messages)

    def test_monitor_saves_worker_statuses(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "STARTED",
                                      1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "WORKING",
                                      2).SerializeToString(),
        ]
        self.run_monitor(messages)

        expected_messages = [
            {
                "address": "tcp://127.0.0.1:1",
                "model": "en-GB",
                "status": "STARTED",
                "time": 1
            },
            {
                "address": "tcp://127.0.0.1:2",
                "model": "en-GB",
                "status": "WORKING",
                "time": 2
            },
        ]

        self.assertEqual(expected_messages, self.monitor.get_statuses())

    def test_monitor_will_add_new_workers_when_all_workers_are_working(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      1).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [{"en-GB": +1}]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)

    def test_monitor_will_not_add_new_workers_when_it_is_currently_adding_new_workers(
            self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      2).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [{"en-GB": +1}, {}]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)

    def test_monitor_will_add_new_workers_when_it_finished_scaling_and_it_needs_new_workers(
            self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      2).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "STARTED",
                                      3).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING",
                                      4).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "WORKING",
                                      5).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [{"en-GB": +1}, {}, {}, {}, {"en-GB": +1}]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)

    def run_monitor(self, messages):
        self.poller.add_messages([{"master": message} for message in messages])
        self.monitor.run()

    def assertThatMonitorForwardedMessages(self, messages):
        forwarded_messages = self.emmited_messages
        self.assertEqual(messages, forwarded_messages)

    def emit(self, message):
        self.emmited_messages.append(message)
Exemple #2
0
class TestMonitor(unittest.TestCase):

    def setUp(self):
        self.poller = PollerSpy()
        self.scale_workers = ScaleWorkersSpy()
        self.create_poller = lambda: self.poller
        self.monitor = Monitor(self.create_poller, self.emit, self.scale_workers, self.poller.has_next_message)
        self.emmited_messages = []

    def test_monitor_forwards_messages_to_socketio(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "STARTED", 1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 2).SerializeToString(),
        ]
        self.run_monitor(messages)

        expected_messages = [
            {"address": "tcp://127.0.0.1:1", "model": "en-GB", "status": "STARTED", "time": 1},
            {"address": "tcp://127.0.0.1:1", "model": "en-GB", "status": "WORKING", "time": 2},
        ]

        self.assertThatMonitorForwardedMessages(expected_messages)

    def test_monitor_saves_worker_statuses(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "STARTED", 1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "WORKING", 2).SerializeToString(),
        ]
        self.run_monitor(messages)

        expected_messages = [
            {"address": "tcp://127.0.0.1:1", "model": "en-GB", "status": "STARTED", "time": 1},
            {"address": "tcp://127.0.0.1:2", "model": "en-GB", "status": "WORKING", "time": 2},
        ]

        self.assertEqual(expected_messages, self.monitor.get_statuses())

    def test_monitor_will_add_new_workers_when_all_workers_are_working(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 1).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [
            {"en-GB": +1}
        ]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)

    def test_monitor_will_not_add_new_workers_when_it_is_currently_adding_new_workers(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 2).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [{"en-GB": +1}, {}]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)

    def test_monitor_will_add_new_workers_when_it_finished_scaling_and_it_needs_new_workers(self):
        messages = [
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 1).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 2).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "STARTED", 3).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:1", "en-GB", "WORKING", 4).SerializeToString(),
            createWorkerStatusMessage("tcp://127.0.0.1:2", "en-GB", "WORKING", 5).SerializeToString()
        ]
        self.run_monitor(messages)

        expected_messages = [{"en-GB": +1}, {}, {}, {}, {"en-GB": +1}]
        self.assertEqual(expected_messages, self.scale_workers.scaling_history)


    def run_monitor(self, messages):
        self.poller.add_messages([{"master": message} for message in messages])
        self.monitor.run()

    def assertThatMonitorForwardedMessages(self, messages):
        forwarded_messages = self.emmited_messages
        self.assertEqual(messages, forwarded_messages)

    def emit(self, message):
        self.emmited_messages.append(message)