Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
except OSError as error:
future.set_exception(ValueError(command))
return future
def finish(returncode):
if returncode:
future.set_exception(ValueError(command))
else:
future.set_result(process.stdout)
process.set_exit_callback(finish)
return future
class OpenShiftSpawner(Spawner):
def __init__(self, *args, **kwargs):
print('OpenShiftSpawner()', args, kwargs)
super().__init__(*args, **kwargs)
# Make sure username matches the restrictions for DNS labels.
safe_chars = set(string.ascii_lowercase + string.digits)
safe_username = ''.join([s if s in safe_chars else '-'
for s in self.user.name.lower()])
hostname = os.environ['HOSTNAME']
self.service = '-'.join(hostname.split('-')[:-2])
self.appid = '%s-nb-%s' % (self.service, safe_username)
ret = yield thread_pool.submit(function, *args, **kwargs)
return ret
except (ClientError, WaiterError, NetworkError, RemoteCmdExecutionError, EOFError, SSHException, ChannelException) as e:
#EOFError can occur in fabric
logger.error("Failure in %s with args %s and kwargs %s" % (function.__name__, args, kwargs))
logger.info("retrying %s, (~%s seconds elapsed)" % (function.__name__, attempt * 3))
yield gen.sleep(timeout)
else:
logger.error("Failure in %s with args %s and kwargs %s" % (function.__name__, args, kwargs))
yield gen.sleep(0.1) #this line exists to allow the logger time to print
return ("RETRY_FAILED")
#########################################################################################################
#########################################################################################################
class InstanceSpawner(Spawner):
""" A Spawner that starts an EC2 instance for each user.
Warnings:
- Because of db.commit() calls within Jupyterhub's code between yield calls in jupyterhub.user.spawn(),
setting an attribute on self.user.server results in ORM calls and incomplete jupyterhub.sqlite Server
entries. Be careful of setting self.user.server attributes too early in this spawner.start().
In this spawner's start(), self.user.server.ip and self.user.server.port are set immediately before the
return statement to alleviate the edge case where they are not always set in Jupyterhub v0.6.1. An
improvement is made in developmental version Jupyterhub v0.7.0 where they are explicitly set.
- It's possible for the logger to be terminated before log is printed. If your stack traces do not match up
with your log statements, insert a brief sleep into the code where your are logging to allow time for log to
flush.
"""
def __init_subclass__(cls, **kwargs):
super().__init_subclass__()
missing = []
for attr in ('start', 'stop', 'poll'):
if getattr(Spawner, attr) is getattr(cls, attr):
missing.append(attr)
if missing:
raise NotImplementedError(
"class `{}` needs to redefine the `start`,"
"`stop` and `poll` methods. `{}` not redefined.".format(
cls.__name__, '`, `'.join(missing)
)
request = HTTPRequest('http://169.254.169.254/latest/meta-data/iam/security-credentials/' + aws_iam_role, method='GET')
creds = json.loads((await AsyncHTTPClient().fetch(request)).body.decode('utf-8'))
self.aws_access_key_id = creds['AccessKeyId']
self.aws_secret_access_key = creds['SecretAccessKey']
self.pre_auth_headers = {
'x-amz-security-token': creds['Token'],
}
self.expiration = datetime.datetime.strptime(creds['Expiration'], '%Y-%m-%dT%H:%M:%SZ')
return AwsCreds(
access_key_id=self.aws_access_key_id,
secret_access_key=self.aws_secret_access_key,
pre_auth_headers=self.pre_auth_headers,
)
class FargateSpawner(Spawner):
aws_region = Unicode(config=True)
aws_ecs_host = Unicode(config=True)
task_role_arn = Unicode(config=True)
task_cluster_name = Unicode(config=True)
task_container_name = Unicode(config=True)
task_definition_arn = Unicode(config=True)
task_security_groups = List(trait=Unicode, config=True)
task_subnets = List(trait=Unicode, config=True)
notebook_port = Int(config=True)
notebook_scheme = Unicode(config=True)
notebook_args = List(trait=Unicode, config=True)
authentication_class = Type(FargateSpawnerAuthentication, config=True)
authentication = Instance(FargateSpawnerAuthentication)
child_class = Type(LocalProcessSpawner, Spawner,
config=True,
help="""The class to wrap for spawning single-user servers.
Should be a subclass of Spawner.
"""
)
child_config = Dict(default_value={},
config=True,
help="Dictionary of config values to apply to wrapped spawner class."
)
child_state = Dict(default_value={})
child_spawner = Instance(Spawner, allow_none=True)
def construct_child(self):
if self.child_spawner is None:
self.child_spawner = self.child_class(
user = self.user,
db = self.db,
hub = self.hub,
authenticator = self.authenticator,
oauth_client_id = self.oauth_client_id,
server = self._server,
config = self.config,
**self.child_config
)
# initial state will always be wrong since it will see *our* state
self.child_spawner.clear_state()
if self.child_state:
and `data` is the POST form data from the login page.
"""
).tag(config=True)
authenticator = Instance(Authenticator)
@default('authenticator')
def _authenticator_default(self):
return self.authenticator_class(parent=self, db=self.db)
allow_named_servers = Bool(False,
help="Allow named single-user servers per user"
).tag(config=True)
# class for spawning single-user servers
spawner_class = Type(LocalProcessSpawner, Spawner,
help="""The class to use for spawning single-user servers.
Should be a subclass of Spawner.
"""
).tag(config=True)
db_url = Unicode('sqlite:///jupyterhub.sqlite',
help="url for the database. e.g. `sqlite:///jupyterhub.sqlite`"
).tag(config=True)
@observe('db_url')
def _db_url_changed(self, change):
new = change['new']
if '://' not in new:
# assume sqlite, if given as a plain filename
self.db_url = 'sqlite:///%s' % new
# Ensure that default_server_name doesn't do anything if named servers aren't allowed
_default_server_name = Unicode(
help="Non-configurable version exposed to JupyterHub."
)
@default('_default_server_name')
def _set_default_server_name(self):
if self.allow_named_servers:
return self.default_server_name
else:
return ""
# class for spawning single-user servers
spawner_class = EntryPointType(
default_value=LocalProcessSpawner,
klass=Spawner,
entry_point_group="jupyterhub.spawners",
help="""The class to use for spawning single-user servers.
Should be a subclass of :class:`jupyterhub.spawner.Spawner`.
.. versionchanged:: 1.0
spawners may be registered via entry points,
e.g. `c.JupyterHub.spawner_class = 'localprocess'`
""",
).tag(config=True)
concurrent_spawn_limit = Integer(
100,
help="""
Maximum number of concurrent users that can be spawning at a time.
"""
A Spawner for JupyterHub that runs each user's server in a separate docker container
"""
import os
from concurrent.futures import ThreadPoolExecutor
import docker
from tornado import gen
from jupyterhub.spawner import Spawner
from IPython.utils.traitlets import Unicode
class DockerSpawner(Spawner):
_executor = None
@property
def executor(self):
"""single global executor"""
cls = self.__class__
if cls._executor is None:
cls._executor = ThreadPoolExecutor(1)
return cls._executor
_client = None
@property
def client(self):
"""single global client instance"""
cls = self.__class__
if cls._client is None:
import os
import pwd
import subprocess
from traitlets import Bool, Unicode, List, Dict
import asyncio
from systemdspawner import systemd
from jupyterhub.spawner import Spawner
from jupyterhub.utils import random_port
class SystemdSpawner(Spawner):
user_workingdir = Unicode(
None,
allow_none=True,
help="""
Path to start each notebook user on.
{USERNAME} and {USERID} are expanded.
Defaults to the home directory of the user.
Not respected if dynamic_users is set to True.
"""
).tag(config=True)
username_template = Unicode(
'{USERNAME}',
from traitlets import Any, Integer, List, Unicode, default, observe
from marathon import MarathonClient
from marathon.models.app import MarathonApp, MarathonHealthCheck
from marathon.models.container import MarathonContainerPortMapping, \
MarathonContainer, MarathonContainerVolume, MarathonDockerContainer
from marathon.models.constraint import MarathonConstraint
from marathon.exceptions import NotFoundError
from jupyterhub.spawner import Spawner
from .volumenaming import default_format_volume_name
import jupyterhub
_jupyterhub_xy = '%i.%i' % (jupyterhub.version_info[:2])
class MarathonSpawner(Spawner):
app_image = Unicode("jupyterhub/singleuser:%s" % _jupyterhub_xy, config=True)
app_prefix = Unicode(
"jupyter",
help=dedent(
"""
Prefix for app names. The full app name for a particular
user will be /.
"""
)
).tag(config=True)
marathon_host = Unicode(
u'',
help="Hostname of Marathon server").tag(config=True)