def test_updating_slave_to_nonexistent_state_should_raise_bad_request_error(self): master = ClusterMaster() slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, 10) slave = master.get_slave(slave_url=slave_url) with self.assertRaises(BadRequestError): master.handle_slave_state_update(slave, 'NONEXISTENT_STATE')
def test_updating_slave_to_shutdown_should_call_slave_set_shutdown_mode(self): master = ClusterMaster() slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, 10) slave = master.get_slave(slave_url=slave_url) slave.set_shutdown_mode = Mock() master.handle_slave_state_update(slave, SlaveState.SHUTDOWN) slave.set_shutdown_mode.assert_called_once_with()
def test_updating_slave_to_disconnected_state_should_reset_slave_current_build_id(self): master = ClusterMaster() slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, num_executors=10) slave = master.get_slave(slave_url=slave_url) slave.current_build_id = 4 master.handle_slave_state_update(slave, SlaveState.DISCONNECTED) self.assertIsNone(slave.current_build_id)
def test_updating_slave_to_disconnected_state_should_mark_slave_as_dead(self): master = ClusterMaster() slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, num_executors=10) slave = master.get_slave(slave_url=slave_url) self.assertTrue(slave.is_alive()) master.handle_slave_state_update(slave, SlaveState.DISCONNECTED) self.assertFalse(slave.is_alive())
def test_updating_slave_to_setup_completed_state_should_tell_build_to_begin_subjob_execution(self): master = ClusterMaster() fake_build = MagicMock() master.get_build = MagicMock(return_value=fake_build) slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, 10) slave = master.get_slave(slave_url=slave_url) master.handle_slave_state_update(slave, SlaveState.SETUP_COMPLETED) fake_build.begin_subjob_executions_on_slave.assert_called_once_with(slave)
def test_updating_slave_to_setup_completed_state_should_tell_build_to_begin_subjob_execution(self): master = ClusterMaster() fake_build = MagicMock(spec_set=Build) master.get_build = MagicMock(return_value=fake_build) slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, 10) slave = master.get_slave(slave_url=slave_url) mock_scheduler = self.mock_scheduler_pool.get(fake_build) master.handle_slave_state_update(slave, SlaveState.SETUP_COMPLETED) mock_scheduler.begin_subjob_executions_on_slave.assert_called_once_with(slave)
def test_updating_slave_to_idle_state_does_not_mark_build_finished_when_slaves_not_done( self): master = ClusterMaster() slave1 = Slave('', 1) slave2 = Slave('', 1) slave3 = Slave('', 1) slave1.current_build_id = 1 slave2.current_build_id = None slave3.current_build_id = 1 build1 = Build(BuildRequest({})) master._all_slaves_by_url = {'1': slave1, '2': slave2, '3': slave3} master._all_builds_by_id = {1: build1} build1._build_id = 1 build1.finish = MagicMock() master.handle_slave_state_update(slave1, SlaveState.IDLE) self.assertFalse(build1.finish.called)
def test_updating_slave_to_setup_completed_state_should_tell_build_to_begin_subjob_execution(self): master = ClusterMaster() slave_registry = SlaveRegistry.singleton() fake_build = MagicMock(spec_set=Build) master.get_build = MagicMock(return_value=fake_build) slave_url = 'raphael.turtles.gov' master.connect_slave(slave_url, 10) slave = slave_registry.get_slave(slave_url=slave_url) mock_scheduler = self.mock_scheduler_pool.get(fake_build) scheduler_begin_event = Event() mock_scheduler.begin_subjob_executions_on_slave.side_effect = lambda **_: scheduler_begin_event.set() master.handle_slave_state_update(slave, SlaveState.SETUP_COMPLETED) was_called = scheduler_begin_event.wait(timeout=5) self.assertTrue(was_called, 'scheduler.begin_subjob_executions_on_slave should be called in response ' 'to slave setup completing.') _, call_kwargs = mock_scheduler.begin_subjob_executions_on_slave.call_args self.assertEqual(call_kwargs.get('slave'), slave)