Re-sync with master

This commit is contained in:
Min RK
2017-06-21 15:33:01 +02:00
44 changed files with 1256 additions and 832 deletions

View File

@@ -9,9 +9,10 @@ from sqlalchemy import inspect
from tornado import gen
from tornado.log import app_log
from .utils import url_path_join, default_server_name, new_token
from .utils import url_path_join, default_server_name
from . import orm
from .objects import Server
from traitlets import HasTraits, Any, Dict, observe, default
from .spawner import LocalProcessSpawner
@@ -112,24 +113,21 @@ class User(HasTraits):
return self.settings.get('spawner_class', LocalProcessSpawner)
def __init__(self, orm_user, settings, **kwargs):
def __init__(self, orm_user, settings=None, **kwargs):
self.orm_user = orm_user
self.settings = settings
self.settings = settings or {}
self._instances = {}
super().__init__(**kwargs)
hub = self.db.query(orm.Hub).first()
self.allow_named_servers = self.settings.get('allow_named_servers', False)
self.cookie_name = '%s-%s' % (hub.server.cookie_name, quote(self.name, safe=''))
self.base_url = url_path_join(
self.settings.get('base_url', '/'), 'user', self.escaped_name)
self.spawner = self.spawner_class(
user=self,
db=self.db,
hub=hub,
hub=self.settings.get('hub'),
authenticator=self.authenticator,
config=self.settings.get('config'),
)
@@ -173,6 +171,13 @@ class User(HasTraits):
if self.server is None:
return False
return True
@property
def server(self):
if len(self.servers) == 0:
return None
else:
return Server(orm_server=self.servers[0])
@property
def escaped_name(self):
@@ -239,18 +244,17 @@ class User(HasTraits):
server_name = ''
base_url = self.base_url
server = orm.Server(
name = server_name,
cookie_name=self.cookie_name,
orm_server = orm.Server(
name=server_name,
base_url=base_url,
)
self.servers.append(server)
db.add(self)
db.commit()
self.servers.append(orm_server)
api_token = self.new_api_token()
db.commit()
server = Server(orm_server=orm_server)
spawner = self.spawner
# Save spawner's instance inside self._instances
@@ -283,7 +287,7 @@ class User(HasTraits):
client_store.add_client(client_id, api_token,
url_path_join(self.url, 'oauth_callback'),
)
db.commit()
db.commit()
# trigger pre-spawn hook on authenticator
authenticator = self.authenticator
@@ -299,7 +303,7 @@ class User(HasTraits):
ip_port = yield gen.with_timeout(timedelta(seconds=spawner.start_timeout), f)
if ip_port:
# get ip, port info from return value of start()
self.server.ip, self.server.port = ip_port
server.ip, server.port = ip_port
else:
# prior to 0.7, spawners had to store this info in user.server themselves.
# Handle < 0.7 behavior with a warning, assuming info was stored in db by the Spawner.
@@ -337,14 +341,14 @@ class User(HasTraits):
db.commit()
self.waiting_for_response = True
try:
yield self.server.wait_up(http=True, timeout=spawner.http_timeout)
yield server.wait_up(http=True, timeout=spawner.http_timeout)
except Exception as e:
if isinstance(e, TimeoutError):
self.log.warning(
"{user}'s server never showed up at {url} "
"after {http_timeout} seconds. Giving up".format(
user=self.name,
url=self.server.url,
url=server.url,
http_timeout=spawner.http_timeout,
)
)
@@ -352,7 +356,7 @@ class User(HasTraits):
else:
e.reason = 'error'
self.log.error("Unhandled error waiting for {user}'s server to show up at {url}: {error}".format(
user=self.name, url=self.server.url, error=e,
user=self.name, url=server.url, error=e,
))
try:
yield self.stop()