Thomas Vachuska

GUI -- Added facility to upload and track various sprite JSON definitions. WIP

Change-Id: I5629e07d84b91d2d885737a9011acc4e13538cf2
#!/bin/bash
# -----------------------------------------------------------------------------
# Tool to upload GUI sprites definitions using GUI REST API.
# -----------------------------------------------------------------------------
node=${1}
sprites=${2}
export URL=http://$node:8181/onos/ui/rs/topology/sprites
export HDR="-HContent-Type:application/json"
curl --fail -sS -X POST $HDR $URL --data @$sprites
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.ui.impl;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.Set;
/**
* Provisional service to keep track of the topology view sprite definitions.
*/
public interface SpriteService {
/**
* Returns set of registered sprite definition names.
*
* @return set of sprite definition names
*/
Set<String> getNames();
/**
* Registers sprite data under the specified name.
*
* @param name sprite definition name
* @param spriteData sprite data
*/
void put(String name, JsonNode spriteData);
/**
* Returns the sprite definition registered under the given name.
*
* @param name sprite definition name
* @return sprite data
*/
JsonNode get(String name);
}
......@@ -15,16 +15,21 @@
*/
package org.onosproject.ui.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onlab.rest.BaseResource;
import org.slf4j.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import static org.slf4j.LoggerFactory.getLogger;
......@@ -39,8 +44,7 @@ public class TopologyResource extends BaseResource {
private final ObjectMapper mapper = new ObjectMapper();
@Path("/geoloc")
@Path("geoloc")
@GET
@Produces("application/json")
public Response getGeoLocations() {
......@@ -77,4 +81,14 @@ public class TopologyResource extends BaseResource {
}
}
@Path("sprites")
@POST
@Consumes("application/json")
public Response setSprites(InputStream stream) throws IOException {
JsonNode root = mapper.readTree(stream);
String name = root.path("defn_id").asText("sprites");
get(SpriteService.class).put(name, root);
return Response.ok().build();
}
}
......
......@@ -145,7 +145,9 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase {
"cancelTraffic",
"requestSummary",
"cancelSummary",
"equalizeMasters"
"equalizeMasters",
"spriteListRequest",
"spriteDataRequest"
));
}
......@@ -211,6 +213,11 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase {
} else if (type.equals("equalizeMasters")) {
equalizeMasters(event);
} else if (type.equals("spriteListRequest")) {
sendSpriteList(event);
} else if (type.equals("spriteDataRequest")) {
sendSpriteData(event);
} else if (type.equals("topoStart")) {
sendAllInitialData();
} else if (type.equals("topoStop")) {
......@@ -563,6 +570,22 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase {
directory.get(MastershipAdminService.class).balanceRoles();
}
// Sends a list of sprite names.
private void sendSpriteList(ObjectNode event) {
ObjectNode root = mapper.createObjectNode();
ArrayNode names = mapper.createArrayNode();
get(SpriteService.class).getNames().forEach(names::add);
root.set("names", names);
sendMessage(envelope("spriteListResponse", number(event, "sid"), root));
}
// Sends requested sprite data.
private void sendSpriteData(ObjectNode event) {
ObjectNode root = mapper.createObjectNode();
root.set("defn", get(SpriteService.class).get(event.path("payload").path("name").asText()));
sendMessage(envelope("spriteDataResponse", number(event, "sid"), root));
}
// Adds all internal listeners.
private void addListeners() {
......
......@@ -15,7 +15,9 @@
*/
package org.onosproject.ui.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.felix.scr.annotations.Activate;
......@@ -31,6 +33,7 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.google.common.collect.ImmutableList.of;
import static java.util.stream.Collectors.toSet;
......@@ -40,7 +43,7 @@ import static java.util.stream.Collectors.toSet;
*/
@Component(immediate = true)
@Service
public class UiExtensionManager implements UiExtensionService {
public class UiExtensionManager implements UiExtensionService, SpriteService {
private final Logger log = LoggerFactory.getLogger(getClass());
......@@ -115,4 +118,25 @@ public class UiExtensionManager implements UiExtensionService {
public synchronized UiExtension getViewExtension(String viewId) {
return views.get(viewId);
}
// Provisional tracking of sprite definitions
private Map<String, JsonNode> sprites = Maps.newHashMap();
@Override
public Set<String> getNames() {
return ImmutableSet.copyOf(sprites.keySet());
}
@Override
public void put(String name, JsonNode spriteData) {
log.info("Registered sprite definition {}", name);
sprites.put(name, spriteData);
}
@Override
public JsonNode get(String name) {
return sprites.get(name);
}
}
......
......@@ -86,6 +86,8 @@
openListener = wss.addOpenListener(wsOpen);
wss.bindHandlers(handlerMap);
wss.sendEvent('topoStart');
wss.sendEvent('spriteListRequest');
wss.sendEvent('spriteDataRequest', {name: 'sample'});
$log.debug('topo comms started');
}
......
{
"defn_id": "sample",
"file_desc": "Cloud Sprite Data",
"_comment": [
......