server/server.py (81 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import subprocess
from pathlib import Path
from urllib.parse import urlparse
from flask import Flask, request, send_from_directory
from flask.json import jsonify
from werkzeug.utils import secure_filename
URLS = []
ALLOWED_EXTENSIONS = set(["html", "htm"])
path = Path("files")
path.mkdir(exist_ok=True)
app = Flask("klaatu_server")
app.secret_key = "secret key"
app.config["UPLOAD_FOLDER"] = path.absolute()
app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024
app.config["SERVER_TYPE"] = os.getenv("KLAATU_SERVER_TYPE", "client")
def allowed_file(filename):
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/test_results", methods=["POST", "GET"])
def test_results():
request_file = request.files["file"]
if request.method == "POST":
if request_file and allowed_file(request_file.filename):
filename = secure_filename(request_file.filename)
request_file.save(os.path.join(app.config["UPLOAD_FOLDER"], filename))
resp = jsonify({"message": "File successfully uploaded"})
resp.status_code = 201
return resp
elif request.method == "GET":
item = send_from_directory(os.path.join(app.config["UPLOAD_FOLDER"]), filename)
return item
@app.route(
"/experiment",
methods=["POST", "GET", "DELETE", "PUT"],
)
def submit():
if request.method == "POST":
request_data = request.get_json()
url = urlparse(request_data["experiment_url"])
# build url
experiment_name = request_data["experiment_url"].split("/")[-2]
URLS.append(f"{url.scheme}://{url.netloc}/api/v6/experiments/{experiment_name}")
resp = jsonify("")
resp.status_code = 201
if request.method == "PUT":
request_data = request.get_json()
experiment_name = request_data["url"].split("/")[-2]
for count, item in enumerate(URLS):
if experiment_name in item:
URLS[count] = {item: "tested"}
resp = jsonify("Success")
resp.status_code = 200
if request.method == "GET":
resp = jsonify(URLS)
resp.status_code = 200
if request.method == "DELETE":
URLS.clear()
resp = jsonify("URLS cleared")
resp.status_code = 200
return resp
@app.route(
"/run",
methods=["POST"],
)
def run():
test_location = os.getenv("TESTS_DIR")
os.chdir(test_location)
command = "pipenv run pytest"
subprocess.Popen(
command, shell=True
)
resp = jsonify("Success")
resp.status_code = 200
return resp
@app.route("/", methods=["GET"])
def ping():
resp = jsonify("Hello")
resp.status_code = 200
return resp
if __name__ == "__main__":
port = int(os.environ.get("PORT", 1378))
app.run(debug=True, host="0.0.0.0", port=port)