From 3dc95868171a517df2a3f7fe8c68c57ddb4f4158 Mon Sep 17 00:00:00 2001 From: "Blake J. Harnden" Date: Thu, 13 Sep 2018 13:10:41 -0700 Subject: [PATCH] updated set mobility to upload file to a upload directory and mark files used by set mobility config to look for the file within this directory --- .../com/core/client/rest/CoreRestClient.java | 13 ++++++- .../java/com/core/data/MobilityConfig.java | 5 +++ .../main/java/com/core/ui/MobilityDialog.java | 1 + .../main/java/com/core/utils/WebUtils.java | 21 +++++++++-- webapp/app.py | 13 +++++++ webapp/core_utils.py | 2 ++ webapp/mobility_routes.py | 36 ++++++------------- webapp/xml_routes.py | 2 +- 8 files changed, 63 insertions(+), 30 deletions(-) diff --git a/corefx/src/main/java/com/core/client/rest/CoreRestClient.java b/corefx/src/main/java/com/core/client/rest/CoreRestClient.java index b11b5e33..c7c751cd 100644 --- a/corefx/src/main/java/com/core/client/rest/CoreRestClient.java +++ b/corefx/src/main/java/com/core/client/rest/CoreRestClient.java @@ -176,6 +176,11 @@ public class CoreRestClient implements ICoreClient { return result; } + private boolean uploadFile(File file) throws IOException { + String url = getUrl("upload"); + return WebUtils.postFile(url, file); + } + @Override public CoreService getService(CoreNode node, String serviceName) throws IOException { String url = getUrl(String.format("sessions/%s/nodes/%s/services/%s", sessionId, node.getId(), serviceName)); @@ -266,7 +271,7 @@ public class CoreRestClient implements ICoreClient { @Override public void openSession(File file) throws IOException { String url = getUrl("sessions/xml"); - CreatedSession createdSession = WebUtils.putFile(url, file, CreatedSession.class); + CreatedSession createdSession = WebUtils.postFile(url, file, CreatedSession.class); joinSession(createdSession.getId(), true); } @@ -336,7 +341,13 @@ public class CoreRestClient implements ICoreClient { @Override public boolean setMobilityConfig(CoreNode node, MobilityConfig config) throws IOException { + boolean uploaded = uploadFile(config.getScriptFile()); + if (!uploaded) { + throw new IOException("failed to upload mobility script"); + } + String url = getUrl(String.format("sessions/%s/nodes/%s/mobility", sessionId, node.getId())); + config.setFile(config.getScriptFile().getName()); String data = JsonUtils.toString(config); return WebUtils.postJson(url, data); } diff --git a/corefx/src/main/java/com/core/data/MobilityConfig.java b/corefx/src/main/java/com/core/data/MobilityConfig.java index a38d5d76..67b5d769 100644 --- a/corefx/src/main/java/com/core/data/MobilityConfig.java +++ b/corefx/src/main/java/com/core/data/MobilityConfig.java @@ -1,11 +1,16 @@ package com.core.data; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import java.io.File; + @Data public class MobilityConfig { private String file; + @JsonIgnore + private File scriptFile; @JsonProperty("refresh_ms") private Integer refresh; private String loop; diff --git a/corefx/src/main/java/com/core/ui/MobilityDialog.java b/corefx/src/main/java/com/core/ui/MobilityDialog.java index efeae7d0..ae660e2e 100644 --- a/corefx/src/main/java/com/core/ui/MobilityDialog.java +++ b/corefx/src/main/java/com/core/ui/MobilityDialog.java @@ -59,6 +59,7 @@ public class MobilityDialog extends StageDialog { saveButton.setOnAction(event -> { MobilityConfig mobilityConfig = new MobilityConfig(); mobilityConfig.setFile(fileTextField.getText()); + mobilityConfig.setScriptFile(new File(mobilityConfig.getFile())); mobilityConfig.setAutostart(autoStartTextField.getText()); String loop = loopToggleButton.isSelected() ? "1" : ""; mobilityConfig.setLoop(loop); diff --git a/corefx/src/main/java/com/core/utils/WebUtils.java b/corefx/src/main/java/com/core/utils/WebUtils.java index c332eeaa..6714342f 100644 --- a/corefx/src/main/java/com/core/utils/WebUtils.java +++ b/corefx/src/main/java/com/core/utils/WebUtils.java @@ -51,11 +51,28 @@ public final class WebUtils { } } - public static T putFile(String url, File file, Class clazz) throws IOException { + public static boolean postFile(String url, File file) throws IOException { MediaType mediaType = MediaType.parse("File/*"); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) - .addFormDataPart("session", file.getName(), RequestBody.create(mediaType, file)) + .addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)) + .build(); + + Request request = new Request.Builder() + .url(url) + .post(requestBody) + .build(); + + try (Response response = client.newCall(request).execute()) { + return response.isSuccessful(); + } + } + + public static T postFile(String url, File file, Class clazz) throws IOException { + MediaType mediaType = MediaType.parse("File/*"); + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)) .build(); Request request = new Request.Builder() diff --git a/webapp/app.py b/webapp/app.py index 3305ecc0..4baad787 100644 --- a/webapp/app.py +++ b/webapp/app.py @@ -1,8 +1,11 @@ +import os + from bottle import HTTPError from flask import Flask from flask import jsonify from flask import request +import core_utils import emane_routes import hook_routes import link_routes @@ -65,6 +68,16 @@ def get_ips(): ) +@app.route("/upload", methods=["POST"]) +def upload(): + if not os.path.exists(core_utils.save_dir): + os.mkdir(core_utils.save_dir, 755) + upload_file = request.files["file"] + save_path = os.path.join(core_utils.save_dir, upload_file.filename) + upload_file.save(save_path) + return jsonify() + + @app.errorhandler(HTTPError) def handle_error(e): return jsonify(message=e.body, status=e.status_code), e.status_code diff --git a/webapp/core_utils.py b/webapp/core_utils.py index 4cb091ed..60f9da04 100644 --- a/webapp/core_utils.py +++ b/webapp/core_utils.py @@ -1,8 +1,10 @@ +import os from functools import wraps from threading import Lock from bottle import abort +save_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "uploads") CORE_LOCK = Lock() diff --git a/webapp/mobility_routes.py b/webapp/mobility_routes.py index c21db4c7..cbe62e2d 100644 --- a/webapp/mobility_routes.py +++ b/webapp/mobility_routes.py @@ -1,7 +1,10 @@ +import os + from flask import Blueprint from flask import jsonify from flask import request +import core_utils from core.mobility import Ns2ScriptedMobility api = Blueprint("mobility_api", __name__) @@ -11,45 +14,26 @@ coreemu = None @api.route("/sessions//nodes//mobility", methods=["POST"]) def set_mobility_config(session_id, node_id): - session = coreemu.sessions.get(session_id) - if not session: - return jsonify(error="session does not exist"), 404 - - if node_id.isdigit(): - node_id = int(node_id) - + session = core_utils.get_session(coreemu, session_id) + node_id = core_utils.get_node_id(node_id) data = request.get_json() or {} - + data["file"] = os.path.join(core_utils.save_dir, data["file"]) session.mobility.set_model_config(node_id, Ns2ScriptedMobility.name, data) - return jsonify() @api.route("/sessions//nodes//mobility") def get_mobility_config(session_id, node_id): - session = coreemu.sessions.get(session_id) - if not session: - return jsonify(error="session does not exist"), 404 - - if node_id.isdigit(): - node_id = int(node_id) - + session = core_utils.get_session(coreemu, session_id) + node_id = core_utils.get_node_id(node_id) config = session.mobility.get_model_config(node_id, Ns2ScriptedMobility.name) - return jsonify(config) @api.route("/sessions//nodes//mobility/", methods=["PUT"]) def mobility_action(session_id, node_id, action): - session = coreemu.sessions.get(session_id) - if not session: - return jsonify(error="session does not exist"), 404 - - if node_id.isdigit(): - node_id = int(node_id) - node = session.objects.get(node_id) - if not node: - return jsonify(error="node does not exist"), 404 + session = core_utils.get_session(coreemu, session_id) + node = core_utils.get_node(session, node_id) if action == "start": node.mobility.start() diff --git a/webapp/xml_routes.py b/webapp/xml_routes.py index 58f92187..8b619c52 100644 --- a/webapp/xml_routes.py +++ b/webapp/xml_routes.py @@ -35,7 +35,7 @@ def open_xml(): logger.info("open xml: %s", request.files) _, temp_path = tempfile.mkstemp() - session_file = request.files['session'] + session_file = request.files["file"] session_file.save(temp_path) try: