diff --git a/bootstrap/bootstrap.py b/bootstrap/bootstrap.py index 3a42fb2..70bdbf8 100644 --- a/bootstrap/bootstrap.py +++ b/bootstrap/bootstrap.py @@ -16,6 +16,7 @@ import os import subprocess import sys import logging +import shutil def get_os_release_variable(key): @@ -31,8 +32,10 @@ def get_os_release_variable(key): "source /etc/os-release && echo ${{{key}}}".format(key=key) ]).decode().strip() -def main(): - +def validate_host(): + """ + Make sure TLJH is installable in current host + """ # Support only Ubuntu 18.04+ distro = get_os_release_variable('ID') version = float(get_os_release_variable('VERSION_ID')) @@ -43,6 +46,21 @@ def main(): print('The Littlest JupyterHub requires Ubuntu 18.04 or higher') sys.exit(1) + if sys.version_info < (3, 5): + print("bootstrap.py must be run with at least Python 3.5") + sys.exit(1) + + if not (shutil.which('systemd') and shutil.which('systemctl')): + print("Systemd is required to run TLJH") + # Only fail running inside docker if systemd isn't present + if os.path.exists('/.dockerenv'): + print("Running inside a docker container without systemd isn't supported") + print("We recommend against running a production TLJH instance inside a docker container") + print("For local development, see http://tljh.jupyter.org/en/latest/contributing/dev-setup.html") + sys.exit(1) + +def main(): + validate_host() install_prefix = os.environ.get('TLJH_INSTALL_PREFIX', '/opt/tljh') hub_prefix = os.path.join(install_prefix, 'hub') diff --git a/integration-tests/test_bootstrap.py b/integration-tests/test_bootstrap.py index 5bf143f..fa02b68 100644 --- a/integration-tests/test_bootstrap.py +++ b/integration-tests/test_bootstrap.py @@ -2,14 +2,9 @@ Test running bootstrap script in different circumstances """ import subprocess +from textwrap import dedent - -def test_ubuntu_too_old(): - """ - Error with a useful message when running in older Ubuntu - """ - container_name = 'old-distro-test' - +def run_bootstrap(container_name, image): # stop container if it is already running subprocess.run([ 'docker', 'rm', '-f', container_name @@ -17,7 +12,7 @@ def test_ubuntu_too_old(): # Start a detached Ubuntu 16.04 container subprocess.check_call([ - 'docker', 'run', '--detach', '--name', container_name, 'ubuntu:16.04', + 'docker', 'run', '--detach', '--name', container_name, image, '/bin/bash', '-c', 'sleep 1000s' ]) # Install python3 inside the ubuntu container @@ -35,10 +30,27 @@ def test_ubuntu_too_old(): 'bootstrap/', f'{container_name}:/srv' ]) - # Run bootstrap script, validate that it fails appropriately - output = subprocess.run([ + # Run bootstrap script, return the output + return subprocess.run([ 'docker', 'exec', '-i', container_name, 'python3', '/srv/bootstrap/bootstrap.py' ], check=False, stdout=subprocess.PIPE, encoding='utf-8') + +def test_ubuntu_too_old(): + """ + Error with a useful message when running in older Ubuntu + """ + output = run_bootstrap('old-distro-test', 'ubuntu:16.04') assert output.stdout == 'The Littlest JupyterHub requires Ubuntu 18.04 or higher\n' - assert output.returncode == 1 \ No newline at end of file + assert output.returncode == 1 + + +def test_inside_no_systemd_docker(): + output = run_bootstrap('plain-docker-test', 'ubuntu:18.04') + assert output.stdout.strip() == dedent(""" + Systemd is required to run TLJH + Running inside a docker container without systemd isn't supported + We recommend against running a production TLJH instance inside a docker container + For local development, see http://tljh.jupyter.org/en/latest/contributing/dev-setup.html + """).strip() + assert output.returncode == 1