2018-09-13 17:27:02 +01:00
|
|
|
import os
|
|
|
|
|
|
|
|
from flask import jsonify
|
|
|
|
from flask import request
|
|
|
|
from flask.blueprints import Blueprint
|
|
|
|
|
|
|
|
import core_utils
|
|
|
|
import websocket_routes
|
|
|
|
from core.enumerations import EventTypes, NodeTypes
|
|
|
|
from core.misc import nodeutils
|
|
|
|
|
|
|
|
coreemu = None
|
|
|
|
|
|
|
|
api = Blueprint("session_api", __name__)
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions")
|
|
|
|
def get_sessions():
|
|
|
|
sessions = []
|
|
|
|
for session in coreemu.sessions.itervalues():
|
|
|
|
sessions.append({
|
|
|
|
"id": session.session_id,
|
|
|
|
"state": session.state,
|
|
|
|
"nodes": session.get_node_count()
|
|
|
|
})
|
|
|
|
return jsonify(sessions=sessions)
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions", methods=["POST"])
|
|
|
|
@core_utils.synchronized
|
|
|
|
def create_session():
|
|
|
|
session = coreemu.create_session()
|
|
|
|
session.set_state(EventTypes.DEFINITION_STATE)
|
|
|
|
|
|
|
|
# set session location
|
|
|
|
session.location.setrefgeo(47.57917, -122.13232, 2.0)
|
2018-09-20 18:11:51 +01:00
|
|
|
session.location.refscale = 150000.0
|
2018-09-13 17:27:02 +01:00
|
|
|
|
|
|
|
# add handlers
|
|
|
|
session.event_handlers.append(websocket_routes.broadcast_event)
|
|
|
|
session.node_handlers.append(websocket_routes.broadcast_node)
|
2018-09-17 19:57:47 +01:00
|
|
|
session.config_handlers.append(websocket_routes.broadcast_config)
|
|
|
|
session.link_handlers.append(websocket_routes.broadcast_link)
|
|
|
|
session.exception_handlers.append(websocket_routes.broadcast_exception)
|
|
|
|
session.file_handlers.append(websocket_routes.broadtcast_file)
|
2018-09-13 17:27:02 +01:00
|
|
|
|
|
|
|
response_data = jsonify(
|
|
|
|
id=session.session_id,
|
|
|
|
state=session.state,
|
|
|
|
url="/sessions/%s" % session.session_id
|
|
|
|
)
|
|
|
|
return response_data, 201
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions/<int:session_id>", methods=["DELETE"])
|
|
|
|
@core_utils.synchronized
|
|
|
|
def delete_session(session_id):
|
|
|
|
result = coreemu.delete_session(session_id)
|
|
|
|
if result:
|
|
|
|
return jsonify()
|
|
|
|
else:
|
|
|
|
return jsonify(error="session does not exist"), 404
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions/<int:session_id>/options")
|
|
|
|
def get_session_options(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
config = session.options.get_configs()
|
|
|
|
|
|
|
|
config_options = []
|
|
|
|
for configuration in session.options.configurations():
|
|
|
|
value = config[configuration.id]
|
|
|
|
config_options.append({
|
|
|
|
"label": configuration.label,
|
|
|
|
"name": configuration.id,
|
|
|
|
"value": value,
|
|
|
|
"type": configuration.type.value,
|
|
|
|
"select": configuration.options
|
|
|
|
})
|
|
|
|
|
|
|
|
response = []
|
|
|
|
for config_group in session.emane.emane_config.config_groups():
|
|
|
|
start = config_group.start - 1
|
|
|
|
stop = config_group.stop
|
|
|
|
response.append({
|
|
|
|
"name": config_group.name,
|
|
|
|
"options": config_options[start: stop]
|
|
|
|
})
|
|
|
|
|
|
|
|
return jsonify(groups=response)
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions/<int:session_id>/options", methods=["PUT"])
|
|
|
|
@core_utils.synchronized
|
|
|
|
def set_session_options(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
data = request.get_json() or {}
|
|
|
|
values = data["values"]
|
|
|
|
config = {x["name"]: x["value"] for x in values}
|
|
|
|
session.options.set_configs(config)
|
|
|
|
return jsonify()
|
|
|
|
|
|
|
|
|
2018-09-20 00:32:25 +01:00
|
|
|
@api.route("/sessions/<int:session_id>/location", methods=["PUT"])
|
|
|
|
def set_session_location(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
data = request.get_json() or {}
|
|
|
|
position = data["position"]
|
|
|
|
location = data["location"]
|
|
|
|
session.location.refxyz = (position["x"], position["y"], position["z"])
|
|
|
|
session.location.setrefgeo(location["latitude"], location["longitude"], location["altitude"])
|
|
|
|
session.location.refscale = data["scale"]
|
|
|
|
return jsonify()
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions/<int:session_id>/location")
|
|
|
|
def get_session_location(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
x, y, z = session.location.refxyz
|
|
|
|
lat, lon, alt = session.location.refgeo
|
|
|
|
return jsonify({
|
|
|
|
"position": {
|
|
|
|
"x": x,
|
|
|
|
"y": y,
|
|
|
|
"z": z,
|
|
|
|
},
|
|
|
|
"location": {
|
|
|
|
"latitude": lat,
|
|
|
|
"longitude": lon,
|
|
|
|
"altitude": alt
|
|
|
|
},
|
|
|
|
"scale": session.location.refscale
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2018-09-13 17:27:02 +01:00
|
|
|
@api.route("/sessions/<int:session_id>")
|
|
|
|
def get_session(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
|
|
|
|
nodes = []
|
|
|
|
links = []
|
|
|
|
for node in session.objects.itervalues():
|
2018-09-19 17:29:53 +01:00
|
|
|
if not isinstance(node.objid, int):
|
|
|
|
continue
|
|
|
|
|
2018-09-13 17:27:02 +01:00
|
|
|
emane_model = None
|
|
|
|
if nodeutils.is_node(node, NodeTypes.EMANE):
|
|
|
|
emane_model = node.model.name
|
|
|
|
|
|
|
|
services = [x.name for x in getattr(node, "services", [])]
|
|
|
|
nodes.append({
|
|
|
|
"id": node.objid,
|
|
|
|
"name": node.name,
|
|
|
|
"type": nodeutils.get_node_type(node.__class__).value,
|
|
|
|
"model": getattr(node, "type", None),
|
|
|
|
"position": {
|
|
|
|
"x": node.position.x,
|
|
|
|
"y": node.position.y,
|
|
|
|
"z": node.position.z
|
|
|
|
},
|
|
|
|
"services": services,
|
|
|
|
"emane": emane_model,
|
|
|
|
"url": "/sessions/%s/nodes/%s" % (session_id, node.objid)
|
|
|
|
})
|
|
|
|
|
|
|
|
links_data = node.all_link_data(0)
|
|
|
|
for link_data in links_data:
|
|
|
|
link = core_utils.convert_link(session, link_data)
|
|
|
|
links.append(link)
|
|
|
|
|
|
|
|
return jsonify(
|
|
|
|
state=session.state,
|
|
|
|
nodes=nodes,
|
|
|
|
links=links
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@api.route("/sessions/<int:session_id>/state", methods=["PUT"])
|
|
|
|
@core_utils.synchronized
|
|
|
|
def set_session_state(session_id):
|
|
|
|
session = core_utils.get_session(coreemu, session_id)
|
|
|
|
|
|
|
|
data = request.get_json()
|
|
|
|
try:
|
|
|
|
state = EventTypes(data["state"])
|
|
|
|
session.set_state(state)
|
|
|
|
|
|
|
|
if state == EventTypes.INSTANTIATION_STATE:
|
|
|
|
# create session directory if it does not exist
|
|
|
|
if not os.path.exists(session.session_dir):
|
|
|
|
os.mkdir(session.session_dir)
|
|
|
|
session.instantiate()
|
|
|
|
elif state == EventTypes.SHUTDOWN_STATE:
|
|
|
|
session.shutdown()
|
|
|
|
elif state == EventTypes.DATACOLLECT_STATE:
|
|
|
|
session.data_collect()
|
|
|
|
elif state == EventTypes.DEFINITION_STATE:
|
|
|
|
session.clear()
|
|
|
|
|
|
|
|
return jsonify()
|
|
|
|
except KeyError:
|
|
|
|
return jsonify(error="invalid state"), 404
|