2024-02-14 10:02:07 +01:00
|
|
|
"""Web Server Gateway Interface with autoreload to render spawner template.
|
|
|
|
|
|
|
|
Usage: `python -m render`
|
|
|
|
|
|
|
|
"""
|
|
|
|
from traceback import format_exc
|
|
|
|
|
|
|
|
from flask import Flask, render_template, request
|
2024-02-14 18:45:57 +01:00
|
|
|
from glicid_spawner.form import TEMPLATES, options_from_form
|
2024-02-14 15:19:31 +01:00
|
|
|
from glicid_spawner.micromamba import MicromambaEnv
|
|
|
|
from glicid_spawner.resources import CPU, GPU, RAM
|
2024-02-14 10:02:07 +01:00
|
|
|
from livereload import Server
|
|
|
|
|
2024-02-14 18:45:57 +01:00
|
|
|
# Dummy username and python environments
|
|
|
|
USERNAME = 'john-doe'
|
|
|
|
ENVS = [
|
|
|
|
MicromambaEnv('USER', 'foo', f'/{USERNAME}/envs/foo'),
|
|
|
|
MicromambaEnv('USER', 'bar', f'/{USERNAME}/envs/bar'),
|
|
|
|
MicromambaEnv('GLOBAL', 'baz', '/global/envs/baz'),
|
|
|
|
]
|
2024-02-14 15:19:31 +01:00
|
|
|
OPTIONS = {
|
2024-02-14 18:45:57 +01:00
|
|
|
'username': USERNAME,
|
|
|
|
'envs': ENVS,
|
|
|
|
'cpus': CPU,
|
|
|
|
'rams': RAM,
|
|
|
|
'gpus': GPU,
|
2024-02-14 15:19:31 +01:00
|
|
|
}
|
|
|
|
|
2024-02-14 10:02:07 +01:00
|
|
|
|
|
|
|
# Flask app
|
|
|
|
app = Flask(__name__)
|
|
|
|
app.debug = True
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/')
|
|
|
|
def home():
|
|
|
|
"""Form spawner home page."""
|
|
|
|
return render_template(
|
2024-02-14 18:45:57 +01:00
|
|
|
'form.html',
|
|
|
|
spawner_options_form=TEMPLATES.get_template('spawner_form.jinja').render(**OPTIONS),
|
|
|
|
options=OPTIONS,
|
2024-02-14 10:02:07 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/submit', methods=['POST'])
|
|
|
|
def submit():
|
|
|
|
"""Reformat form data and extract spawner options.
|
|
|
|
|
|
|
|
https://jupyterhub.readthedocs.io/en/stable/reference/spawners.html#spawner-options-from-form
|
|
|
|
|
|
|
|
"""
|
|
|
|
formdata = dict(request.form.lists())
|
|
|
|
|
|
|
|
# Trying to parse the options from the formdata
|
|
|
|
try:
|
|
|
|
return render_template(
|
|
|
|
'options.html', formdata=formdata, options=options_from_form(formdata)
|
|
|
|
)
|
|
|
|
except Exception:
|
|
|
|
return render_template('options.html', formdata=formdata, err=format_exc())
|
|
|
|
|
|
|
|
|
|
|
|
def server_autoreload():
|
|
|
|
"""Start auto-reload server."""
|
|
|
|
server = Server(app.wsgi_app)
|
|
|
|
server.serve()
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
server_autoreload()
|