summaryrefslogtreecommitdiff
path: root/opendc
diff options
context:
space:
mode:
authorSacheendra talluri <sacheendra.t@gmail.com>2017-04-04 15:34:01 +0200
committerGitHub <noreply@github.com>2017-04-04 15:34:01 +0200
commit693a23d17c8783e51a97fd5a2439b5d1ceaa003c (patch)
treefdad42c44a147e03101925ffd4d62a869bac4490 /opendc
parent59b05ac8425e34cdf41179506cdda357c59b4b12 (diff)
parentfd0376c5a8f018457a11bb0f9602bda366571955 (diff)
Merge pull request #6 from atlarge-research/api-over-http
Access API over HTTP
Diffstat (limited to 'opendc')
-rw-r--r--opendc/api/v1/paths.json48
-rw-r--r--opendc/api/v1/users/endpoint.py2
-rw-r--r--opendc/util/path_parser.py39
-rw-r--r--opendc/util/rest.py5
4 files changed, 92 insertions, 2 deletions
diff --git a/opendc/api/v1/paths.json b/opendc/api/v1/paths.json
new file mode 100644
index 00000000..08908c25
--- /dev/null
+++ b/opendc/api/v1/paths.json
@@ -0,0 +1,48 @@
+[
+ "room-types",
+ "room-types/{name}",
+ "room-types/{name}/allowed-objects",
+ "schedulers",
+ "simulations",
+ "simulations/{simulationId}",
+ "simulations/{simulationId}/authorizations",
+ "simulations/{simulationId}/authorizations/{userId}",
+ "simulations/{simulationId}/datacenters",
+ "simulations/{simulationId}/datacenters/{datacenterId}",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}/tiles",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}/tiles/{tileId}",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}/tiles/{tileId}/rack",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}/tiles/{tileId}/rack/machines",
+ "simulations/{simulationId}/datacenters/{datacenterId}/rooms/{roomId}/tiles/{tileId}/rack/machines/{position}",
+ "simulations/{simulationId}/experiments/",
+ "simulations/{simulationId}/experiments/{experimentId}",
+ "simulations/{simulationId}/experiments/{experimentId}/last-simulated-tick",
+ "simulations/{simulationId}/experiments/{experimentId}/machine-states",
+ "simulations/{simulationId}/experiments/{experimentId}/rack-states",
+ "simulations/{simulationId}/experiments/{experimentId}/room-states",
+ "simulations/{simulationId}/experiments/{experimentId}/statistics/task-durations",
+ "simulations/{simulationId}/experiments/{experimentId}/task-states",
+ "simulations/{simulationId}/paths/",
+ "simulations/{simulationId}/paths/{pathId}",
+ "simulations/{simulationId}/paths/{pathId}/branches",
+ "simulations/{simulationId}/paths/{pathId}/sections",
+ "simulations/{simulationId}/paths/{pathId}/sections/{sectionId}",
+ "specifications/cpus",
+ "specifications/cpus/{id}",
+ "specifications/failure-models",
+ "specifications/failure-models/{id}",
+ "specifications/gpus",
+ "specifications/gpus/{id}",
+ "specifications/memories",
+ "specifications/memories/{id}",
+ "specifications/storages",
+ "specifications/storages/{id}",
+ "specifications/traces",
+ "specifications/traces/{traceId}",
+ "specifications/traces/{traceId}/tasks",
+ "users",
+ "users/{userId}",
+ "users/{userId}/authorizations"
+] \ No newline at end of file
diff --git a/opendc/api/v1/users/endpoint.py b/opendc/api/v1/users/endpoint.py
index 1f43f665..7e381ed5 100644
--- a/opendc/api/v1/users/endpoint.py
+++ b/opendc/api/v1/users/endpoint.py
@@ -43,7 +43,6 @@ def POST(request):
request.check_required_parameters(
body = {
'user': {
- 'googleId': 'string',
'email': 'string'
}
}
@@ -54,6 +53,7 @@ def POST(request):
# Instantiate a User
+ request.params_body['user']['googleId'] = request.google_id
user = User.from_JSON(request.params_body['user'])
# Make sure a User with this Google ID does not already exist
diff --git a/opendc/util/path_parser.py b/opendc/util/path_parser.py
new file mode 100644
index 00000000..2f9528b1
--- /dev/null
+++ b/opendc/util/path_parser.py
@@ -0,0 +1,39 @@
+import json
+import sys
+import re
+
+def parse(version, endpoint_path):
+ """Map an HTTP endpoint path to an API path"""
+
+ # Get possible paths
+ with open('opendc/api/{}/paths.json'.format(version)) as paths_file:
+ paths = json.load(paths_file)
+
+ # Find API path that matches endpoint_path
+ endpoint_path_parts = endpoint_path.strip('/').split('/')
+ paths_parts = [x.split('/') for x in paths if len(x.split('/')) == len(endpoint_path_parts)]
+ path = None
+
+ for path_parts in paths_parts:
+ found = True
+ for (endpoint_part, part) in zip(endpoint_path_parts, path_parts):
+ if not part.startswith('{') and endpoint_part != part:
+ found = False
+ break
+ if found:
+ path = path_parts
+
+ if path is None:
+ return None
+
+ # Extract path parameters
+ parameters = {}
+
+ for (name, value) in zip(path, endpoint_path_parts):
+ if name.startswith('{'):
+ try:
+ parameters[name.strip('{}')] = int(value)
+ except:
+ parameters[name.strip('{}')] = value
+
+ return ('{}/{}'.format(version, '/'.join(path)), parameters)
diff --git a/opendc/util/rest.py b/opendc/util/rest.py
index 65747762..ad53f084 100644
--- a/opendc/util/rest.py
+++ b/opendc/util/rest.py
@@ -13,11 +13,14 @@ with open(sys.argv[1]) as file:
class Request(object):
"""WebSocket message to REST request mapping."""
- def __init__(self, message):
+ def __init__(self, message=None):
""""Initialize a Request from a socket message."""
# Get the Request parameters from the message
+ if message is None:
+ return
+
try:
self.message = message