diff --git a/services/notebooks/notebooks_service.py b/services/notebooks/notebooks_service.py index d68945d42b..bef88aa410 100644 --- a/services/notebooks/notebooks_service.py +++ b/services/notebooks/notebooks_service.py @@ -20,10 +20,12 @@ import hashlib import json import os +import string from urllib.parse import urljoin from functools import wraps import docker +import escapism import gitlab import requests from flask import Flask, Response, abort, make_response, redirect, request @@ -44,6 +46,18 @@ app = Flask(__name__) +def _server_name(namespace, project, commit_sha): + """Form a DNS-safe server name.""" + escape = lambda x: escapism.escape( + x, safe=set(string.ascii_lowercase + string.digits) + ) + return '{namespace}-{project}-{commit_sha}'.format( + namespace=escape(namespace)[:10], + project=escape(project)[:10], + commit_sha=commit_sha[:7] + ).lower() + + def authenticated(f): """Decorator for authenticating with the Hub""" @@ -97,11 +111,7 @@ def whoami(user): @authenticated def launch_notebook(user, namespace, project, commit_sha, notebook=None): """Launch user server with a given name.""" - server_name = '{namespace}-{project}-{commit_sha}'.format( - namespace=namespace[:10], - project=project[:10], - commit_sha=commit_sha[:7] - ) + server_name = _server_name(namespace, project, commit_sha) headers = {auth.auth_header_name: 'token {0}'.format(auth.api_token)}