spawner/render/__main__.py

70 lines
1.7 KiB
Python

"""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
from glicid_spawner.form import TEMPLATES, options_from_form
from glicid_spawner.micromamba import MicromambaEnv
from glicid_spawner.resources import CPU, GPU, RAM
from livereload import Server
# 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'),
]
OPTIONS = {
'username': USERNAME,
'envs': ENVS,
'cpus': CPU,
'rams': RAM,
'gpus': GPU,
}
# Flask app
app = Flask(__name__)
app.debug = True
@app.route('/')
def home():
"""Form spawner home page."""
return render_template(
'form.html',
spawner_options_form=TEMPLATES.get_template('spawner_form.jinja').render(**OPTIONS),
options=OPTIONS,
)
@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()