diff --git a/jupyterhub/orm.py b/jupyterhub/orm.py index 0f1fb437..33190fbc 100644 --- a/jupyterhub/orm.py +++ b/jupyterhub/orm.py @@ -4,9 +4,7 @@ # Distributed under the terms of the Modified BSD License. from datetime import datetime -import errno import json -import socket from tornado import gen from tornado.log import app_log @@ -26,7 +24,7 @@ from sqlalchemy import create_engine from .utils import ( random_port, url_path_join, wait_for_server, wait_for_http_server, - new_token, hash_token, compare_token, + new_token, hash_token, compare_token, can_connect, ) @@ -113,25 +111,7 @@ class Server(Base): def is_up(self): """Is the server accepting connections?""" - try: - socket.create_connection((self.ip or '127.0.0.1', self.port)) - except socket.error as e: - if e.errno == errno.ENETUNREACH: - try: - socket.create_connection((self.ip or '127.0.0.1', self.port)) - except socket.error as e: - if e.errno == errno.ECONNREFUSED: - return False - else: - raise - else: - return True - elif e.errno == errno.ECONNREFUSED: - return False - else: - raise - else: - return True + return can_connect(self.ip or '127.0.0.1', self.port) class Proxy(Base): diff --git a/jupyterhub/utils.py b/jupyterhub/utils.py index 811e7812..9de48598 100644 --- a/jupyterhub/utils.py +++ b/jupyterhub/utils.py @@ -30,22 +30,32 @@ def random_port(): ISO8601_ms = '%Y-%m-%dT%H:%M:%S.%fZ' ISO8601_s = '%Y-%m-%dT%H:%M:%SZ' +def can_connect(ip, port): + """Check if we can connect to an ip:port + + return True if we can connect, False otherwise. + """ + try: + socket.create_connection((ip, port)) + except socket.error as e: + if e.errno != errno.ECONNREFUSED: + app_log.error("Unexpected error connecting to %s:%i %s", + ip, port, e + ) + return False + else: + return True + @gen.coroutine def wait_for_server(ip, port, timeout=10): """wait for any server to show up at ip:port""" loop = ioloop.IOLoop.current() tic = loop.time() while loop.time() - tic < timeout: - try: - socket.create_connection((ip, port)) - except socket.error as e: - if e.errno != errno.ECONNREFUSED: - app_log.error("Unexpected error waiting for %s:%i %s", - ip, port, e - ) - yield gen.sleep(0.1) - else: + if can_connect(ip, port): return + else: + yield gen.sleep(0.1) raise TimeoutError("Server at {ip}:{port} didn't respond in {timeout} seconds".format( **locals() ))