AETHER-1717 Validate JSON in request

Change-Id: Ia3891f6c1ff85a05f98031185ebd02576b968328
diff --git a/edge-monitoring/edge_monitoring_server.py b/edge-monitoring/edge_monitoring_server.py
index f8f8c91..aa4d7e5 100755
--- a/edge-monitoring/edge_monitoring_server.py
+++ b/edge-monitoring/edge_monitoring_server.py
@@ -12,6 +12,7 @@
 from icalevents.icalevents import events
 from flask import Flask, jsonify, abort, request, Response
 import prometheus_client as prom
+import jsonschema
 
 # URL of maintenance calendar
 SECRET_ICAL_URL = os.environ.get("SECRET_ICAL_URL")
@@ -24,6 +25,64 @@
 NO_RESULT_THRESHOLD = 720
 
 app = Flask(__name__)
+
+edgeSchema = {
+    "type": "object",
+    "properties": {
+        "name": {"type": "string"},
+        "status": {
+            "type": "object",
+            "properties": {
+                "control_plane": {"type": "string"},
+                "user_plane": {"type": "string"}
+            },
+            "required": ["control_plane", "user_plane"]
+        },
+        "speedtest": {
+            "type": "object",
+            "properties": {
+                "ping": {
+                    "type": "object",
+                    "properties": {
+                        "dns": {
+                            "type": "object",
+                            "properties": {
+                                "min": {"type": "number"},
+                                "avg": {"type": "number"},
+                                "max": {"type": "number"},
+                                "stddev": {"type": "number"}
+                            },
+                            "required": ["min", "avg", "max", "stddev"]
+                        }
+                    }
+                },
+                "iperf": {
+                    "type": "object",
+                    "properties": {
+                        "cluster": {
+                            "type": "object",
+                            "properties": {
+                                "downlink": {"type": "number"},
+                                "uplink": {"type": "number"}
+                            },
+                            "required": ["downlink", "uplink"]
+                        }
+                    }
+                }
+            }
+        },
+        "signal_quality": {
+            "type": "object",
+            "properties": {
+                "rsrq": {"type": "number"},
+                "rsrp": {"type": "number"}
+            },
+            "required": ["rsrq", "rsrp"]
+        }
+    },
+    "required": ["name", "status"]
+}
+
 edges = [
     {
         'name': 'ace-example',
@@ -305,11 +364,10 @@
 @app.route('/edges', methods=['POST'])
 @app.route('/testresults', methods=['POST'])
 def create_or_update_edge():
-    if not request.json:
-        abort(400)
-    if 'name' not in request.json:
-        abort(400)
-    if 'status' not in request.json:
+    try:
+        jsonschema.validate(instance=request.json, schema=edgeSchema)
+    except jsonschema.exceptions.ValidationError as err:
+        print(err)
         abort(400)
 
     req_edge = {