| package net.floodlightcontroller.virtualnetwork; |
| |
| import java.io.IOException; |
| import java.util.Collection; |
| |
| import net.floodlightcontroller.packet.IPv4; |
| |
| import org.codehaus.jackson.JsonParseException; |
| import org.codehaus.jackson.JsonParser; |
| import org.codehaus.jackson.JsonToken; |
| import org.codehaus.jackson.map.MappingJsonFactory; |
| import org.restlet.data.Status; |
| import org.restlet.resource.Delete; |
| import org.restlet.resource.Get; |
| import org.restlet.resource.Post; |
| import org.restlet.resource.Put; |
| import org.restlet.resource.ServerResource; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| public class NetworkResource extends ServerResource { |
| protected static Logger log = LoggerFactory.getLogger(NetworkResource.class); |
| |
| public class NetworkDefinition { |
| public String name = null; |
| public String guid = null; |
| public String gateway = null; |
| } |
| |
| protected void jsonToNetworkDefinition(String json, NetworkDefinition network) throws IOException { |
| MappingJsonFactory f = new MappingJsonFactory(); |
| JsonParser jp; |
| |
| try { |
| jp = f.createJsonParser(json); |
| } catch (JsonParseException e) { |
| throw new IOException(e); |
| } |
| |
| jp.nextToken(); |
| if (jp.getCurrentToken() != JsonToken.START_OBJECT) { |
| throw new IOException("Expected START_OBJECT"); |
| } |
| |
| while (jp.nextToken() != JsonToken.END_OBJECT) { |
| if (jp.getCurrentToken() != JsonToken.FIELD_NAME) { |
| throw new IOException("Expected FIELD_NAME"); |
| } |
| |
| String n = jp.getCurrentName(); |
| jp.nextToken(); |
| if (jp.getText().equals("")) |
| continue; |
| else if (n.equals("network")) { |
| while (jp.nextToken() != JsonToken.END_OBJECT) { |
| String field = jp.getCurrentName(); |
| if (field.equals("name")) { |
| network.name = jp.getText(); |
| } else if (field.equals("gateway")) { |
| String gw = jp.getText(); |
| if ((gw != null) && (!gw.equals("null"))) |
| network.gateway = gw; |
| } else if (field.equals("id")) { |
| network.guid = jp.getText(); |
| } else { |
| log.warn("Unrecognized field {} in " + |
| "parsing network definition", |
| jp.getText()); |
| } |
| } |
| } |
| } |
| |
| jp.close(); |
| } |
| |
| @Get("json") |
| public Collection <VirtualNetwork> retrieve() { |
| IVirtualNetworkService vns = |
| (IVirtualNetworkService)getContext().getAttributes(). |
| get(IVirtualNetworkService.class.getCanonicalName()); |
| |
| return vns.listNetworks(); |
| } |
| |
| @Put |
| @Post |
| public String createNetwork(String postData) { |
| NetworkDefinition network = new NetworkDefinition(); |
| try { |
| jsonToNetworkDefinition(postData, network); |
| } catch (IOException e) { |
| log.error("Could not parse JSON {}", e.getMessage()); |
| } |
| |
| // We try to get the ID from the URI only if it's not |
| // in the POST data |
| if (network.guid == null) { |
| String guid = (String) getRequestAttributes().get("network"); |
| if ((guid != null) && (!guid.equals("null"))) |
| network.guid = guid; |
| } |
| |
| IVirtualNetworkService vns = |
| (IVirtualNetworkService)getContext().getAttributes(). |
| get(IVirtualNetworkService.class.getCanonicalName()); |
| |
| Integer gw = null; |
| if (network.gateway != null) { |
| try { |
| gw = IPv4.toIPv4Address(network.gateway); |
| } catch (IllegalArgumentException e) { |
| log.warn("Could not parse gateway {} as IP for network {}, setting as null", |
| network.gateway, network.name); |
| network.gateway = null; |
| } |
| } |
| vns.createNetwork(network.guid, network.name, gw); |
| setStatus(Status.SUCCESS_OK); |
| return "{\"status\":\"ok\"}"; |
| } |
| |
| @Delete |
| public String deleteNetwork() { |
| IVirtualNetworkService vns = |
| (IVirtualNetworkService)getContext().getAttributes(). |
| get(IVirtualNetworkService.class.getCanonicalName()); |
| String guid = (String) getRequestAttributes().get("network"); |
| vns.deleteNetwork(guid); |
| setStatus(Status.SUCCESS_OK); |
| return "{\"status\":\"ok\"}"; |
| } |
| } |