diff --git a/nova/console/websocketproxy.py b/nova/console/websocketproxy.py index 4d32ff4328bb..483d4d7eddc3 100644 --- a/nova/console/websocketproxy.py +++ b/nova/console/websocketproxy.py @@ -35,6 +35,12 @@ LOG = logging.getLogger(__name__) class NovaProxyRequestHandlerBase(object): + def address_string(self): + # NOTE(rpodolyaka): override the superclass implementation here and + # explicitly disable the reverse DNS lookup, which might fail on some + # deployments due to DNS configuration and break VNC access completely + return str(self.client_address[0]) + def new_websocket_client(self): """Called after a new WebSocket connection has been established.""" # Reopen the eventlet hub to make sure we don't share an epoll diff --git a/nova/tests/unit/console/test_websocketproxy.py b/nova/tests/unit/console/test_websocketproxy.py index c0526a2cf14d..c40a77c42a1e 100644 --- a/nova/tests/unit/console/test_websocketproxy.py +++ b/nova/tests/unit/console/test_websocketproxy.py @@ -155,3 +155,20 @@ class NovaProxyRequestHandlerBaseTestCase(test.TestCase): self.assertRaises(exception.NovaException, self.wh.new_websocket_client) + + @mock.patch('socket.getfqdn') + def test_address_string_doesnt_do_reverse_dns_lookup(self, getfqdn): + request_mock = mock.MagicMock() + request_mock.makefile().readline.side_effect = [ + 'GET /vnc.html?token=123-456-789 HTTP/1.1\r\n', + '' + ] + server_mock = mock.MagicMock() + client_address = ('8.8.8.8', 54321) + + handler = websocketproxy.NovaProxyRequestHandler( + request_mock, client_address, server_mock) + handler.log_message('log message using client address context info') + + self.assertFalse(getfqdn.called) # no reverse dns look up + self.assertEqual(handler.address_string(), '8.8.8.8') # plain address