Set up initial endpoints for backend server.
This commit is contained in:
0
synapse_topology/controller/cli/cli.py
Normal file
0
synapse_topology/controller/cli/cli.py
Normal file
4
synapse_topology/controller/server/__init__.py
Normal file
4
synapse_topology/controller/server/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from . import server
|
||||
|
||||
app = server.app
|
||||
|
||||
0
synapse_topology/controller/server/api.rst
Normal file
0
synapse_topology/controller/server/api.rst
Normal file
47
synapse_topology/controller/server/error_handlers.py
Normal file
47
synapse_topology/controller/server/error_handlers.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from jsonschema import ValidationError
|
||||
from simplejson.errors import JSONDecodeError
|
||||
from synapse_topology.model.errors import (
|
||||
BasConfigInUseError,
|
||||
BaseConfigNotFoundError,
|
||||
ConfigNotFoundError,
|
||||
)
|
||||
|
||||
from . import server
|
||||
|
||||
app = server.app
|
||||
|
||||
|
||||
@app.handle_errors(ValidationError)
|
||||
def validation_error(request, failure):
|
||||
request.setResponseCode(400)
|
||||
return "Invalid post schema {}".format(failure.getErrorMessage())
|
||||
|
||||
|
||||
@app.handle_errors(JSONDecodeError)
|
||||
def json_decode_error(request, failure):
|
||||
request.setResponseCode(400)
|
||||
return "Invalid post json"
|
||||
|
||||
|
||||
@app.handle_errors(BaseConfigNotFoundError)
|
||||
def base_config_not_found(request, failure):
|
||||
request.setResponseCode(500)
|
||||
return "Config file not setup, please initialise it using the /servername endpoint"
|
||||
|
||||
|
||||
@app.handle_errors(ConfigNotFoundError)
|
||||
def config_not_found(request, failure):
|
||||
request.setResponseCode(404)
|
||||
return "The config does not exist"
|
||||
|
||||
|
||||
@app.handle_errors(BasConfigInUseError)
|
||||
def base_config_in_use(request, failure):
|
||||
request.setResponseCode(409)
|
||||
return "Sever name and keys already configured"
|
||||
|
||||
|
||||
@app.handle_errors(Exception)
|
||||
def handle_generic_error(request, failure):
|
||||
request.setResponseCode(500)
|
||||
return "Internal server error\n{}".format(failure)
|
||||
17
synapse_topology/controller/server/schemas.py
Normal file
17
synapse_topology/controller/server/schemas.py
Normal file
@@ -0,0 +1,17 @@
|
||||
SERVERNAME_SCHEMA = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"server_name": {"type": "string", "minlength": 1},
|
||||
"report_stats": {"type": "boolean"},
|
||||
},
|
||||
"required": ["server_name", "report_stats"],
|
||||
}
|
||||
|
||||
BASE_CONFIG_SCHEMA = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"server_name": {"type": "string", "minlength": 1},
|
||||
"report_stats": {"type": "boolean"},
|
||||
},
|
||||
"required": ["server_name", "report_stats"],
|
||||
}
|
||||
48
synapse_topology/controller/server/server.py
Normal file
48
synapse_topology/controller/server/server.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from canonicaljson import json
|
||||
from klein import Klein
|
||||
from synapse_topology import model
|
||||
|
||||
from .schemas import BASE_CONFIG_SCHEMA, SERVERNAME_SCHEMA
|
||||
from .utils import validate_schema
|
||||
|
||||
app = Klein()
|
||||
from . import error_handlers
|
||||
|
||||
|
||||
@app.route("/servername", methods=["GET"])
|
||||
def get_server_name(request):
|
||||
return model.get_server_name()
|
||||
|
||||
|
||||
@app.route("/servername", methods=["POST"])
|
||||
@validate_schema(SERVERNAME_SCHEMA)
|
||||
def set_server_name(request, body):
|
||||
model.generate_base_config(**body)
|
||||
|
||||
|
||||
@app.route("/secretkey", methods=["GET"])
|
||||
def get_secret_key(request):
|
||||
return model.get_secret_key()
|
||||
|
||||
|
||||
@app.route("/config", methods=["GET"])
|
||||
def get_config(request):
|
||||
return str(model.get_config())
|
||||
|
||||
|
||||
@app.route("/config", methods=["POST"])
|
||||
@validate_schema(BASE_CONFIG_SCHEMA)
|
||||
def set_config(request, body):
|
||||
model.set_config(body)
|
||||
|
||||
|
||||
with app.subroute("/config") as app:
|
||||
for config in model.constants.CONFIGS:
|
||||
|
||||
@app.route("/config/{}".format(config), methods=["GET"])
|
||||
def get_sub_config(request, sub_config):
|
||||
return model.get_config(sub_config=config)
|
||||
|
||||
@app.route("/config/{}".format(config), methods=["POST"])
|
||||
def set_sub_config(request, sub_config):
|
||||
model.set_config(json.loads(request.content.read()), sub_config=config)
|
||||
17
synapse_topology/controller/server/utils.py
Normal file
17
synapse_topology/controller/server/utils.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from functools import wraps
|
||||
|
||||
from canonicaljson import json
|
||||
from jsonschema import validate
|
||||
|
||||
|
||||
def validate_schema(schema):
|
||||
def _wrap_validate(func):
|
||||
@wraps(func)
|
||||
def _do_validate(request):
|
||||
body = json.loads(request.content.read())
|
||||
validate(instance=body, schema=schema)
|
||||
return func(request, body)
|
||||
|
||||
return _do_validate
|
||||
|
||||
return _wrap_validate
|
||||
Reference in New Issue
Block a user