def test_wait_for_active_stops_looping_on_success(self, server_details): """ wait_for_active stops looping when it encounters the active state. """ clock = Clock() server_status = ['BUILD', 'ACTIVE'] def _server_status(*args, **kwargs): return succeed({'server': {'status': server_status.pop(0)}}) server_details.side_effect = _server_status d = wait_for_active(self.log, 'http://url/', 'my-auth-token', 'serverId', clock=clock) # This gets called once immediately then every 5 seconds. self.assertEqual(server_details.call_count, 1) clock.advance(5) self.assertEqual(server_details.call_count, 2) clock.advance(5) # This has not been called a 3rd time because we encountered the active # state and the looping call stopped. self.assertEqual(server_details.call_count, 2) self.successResultOf(d)
def test_wait_for_active(self, server_details): """ wait_for_active will poll server_details until the status transitions to our expected status at which point it will return the complete server_details. """ clock = Clock() server_status = ['BUILD'] def _server_status(*args, **kwargs): return succeed({'server': {'status': server_status[0]}}) server_details.side_effect = _server_status d = wait_for_active(self.log, 'http://url/', 'my-auth-token', 'serverId', clock=clock) server_details.assert_called_with('http://url/', 'my-auth-token', 'serverId') self.assertEqual(server_details.call_count, 1) server_status[0] = 'ACTIVE' clock.advance(5) server_details.assert_called_with('http://url/', 'my-auth-token', 'serverId') self.assertEqual(server_details.call_count, 2) result = self.successResultOf(d) self.assertEqual(result['server']['status'], server_status[0])
def test_wait_for_active_errors(self, server_details): """ wait_for_active will errback it's Deferred if it encounters a non-active state transition. """ clock = Clock() server_status = ['BUILD', 'ERROR'] def _server_status(*args, **kwargs): return succeed({'server': {'status': server_status.pop(0)}}) server_details.side_effect = _server_status d = wait_for_active(self.log, 'http://url/', 'my-auth-token', 'serverId', clock=clock) clock.advance(5) failure = self.failureResultOf(d) self.assertTrue(failure.check(UnexpectedServerStatus)) self.assertEqual(failure.value.server_id, 'serverId') self.assertEqual(failure.value.status, 'ERROR') self.assertEqual(failure.value.expected_status, 'ACTIVE')
def test_wait_for_active_stops_looping_on_timeout(self, server_details): """ wait_for_active stops looping when the timeout passes """ clock = Clock() server_details.side_effect = lambda *args, **kwargs: succeed( {'server': {'status': 'BUILD'}}) d = wait_for_active(self.log, 'http://url/', 'my-auth-token', 'serverId', interval=5, timeout=6, clock=clock) # This gets called once immediately then every 5 seconds. self.assertEqual(server_details.call_count, 1) clock.advance(5) self.assertEqual(server_details.call_count, 2) self.assertNoResult(d) clock.advance(1) self.failureResultOf(d, CancelledError) # instance id was previously bound by launch_server self.log.msg.assert_called_with(mock.ANY, timeout=6, time_building=6) # the loop has stopped clock.advance(5) self.assertEqual(server_details.call_count, 2)
def test_wait_for_active_stops_looping_on_timeout(self, server_details): """ wait_for_active stops looping when the timeout passes """ clock = Clock() server_details.side_effect = lambda *args, **kwargs: succeed( {'server': { 'status': 'BUILD' }}) d = wait_for_active(self.log, 'http://url/', 'my-auth-token', 'serverId', interval=5, timeout=6, clock=clock) # This gets called once immediately then every 5 seconds. self.assertEqual(server_details.call_count, 1) clock.advance(5) self.assertEqual(server_details.call_count, 2) self.assertNoResult(d) clock.advance(1) self.failureResultOf(d, CancelledError) # instance id was previously bound by launch_server self.log.msg.assert_called_with(mock.ANY, timeout=6, time_building=6) # the loop has stopped clock.advance(5) self.assertEqual(server_details.call_count, 2)