Skip to content
Snippets Groups Projects
Commit d2b57d07 authored by Gregor Maier's avatar Gregor Maier
Browse files

CLI expects OFPhysicalPorts being serialized. Add all DescriptionStats to REST

parent c9c0f550
No related branches found
No related tags found
No related merge requests found
......@@ -17,13 +17,19 @@
package net.floodlightcontroller.core.web;
import java.net.SocketAddress;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Collection;
import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.IOFSwitch;
import net.floodlightcontroller.core.ImmutablePort;
import net.floodlightcontroller.util.FilterIterator;
import org.openflow.protocol.OFPhysicalPort;
import org.openflow.util.HexString;
import org.restlet.data.Form;
import org.restlet.data.Status;
......@@ -35,12 +41,107 @@ import org.restlet.resource.ServerResource;
* @author readams
*/
public class ControllerSwitchesResource extends ServerResource {
/**
* A wrapper class around IOFSwitch that defines the REST serialization
* fields. Could have written a Jackson serializer but this is easier.
*/
public static class SwitchJsonSerializerWrapper {
private final IOFSwitch sw;
public SwitchJsonSerializerWrapper(IOFSwitch sw) {
this.sw = sw;
}
public int getActions() {
return sw.getActions();
}
public Map<Object, Object> getAttributes() {
return sw.getAttributes();
}
public Map<String,String> getDescription() {
Map<String,String> rv = new HashMap<String, String>();
rv.put("manufacturer",
sw.getDescriptionStatistics().getManufacturerDescription());
rv.put("hardware",
sw.getDescriptionStatistics().getHardwareDescription());
rv.put("software",
sw.getDescriptionStatistics().getSoftwareDescription());
rv.put("serialNum",
sw.getDescriptionStatistics().getSerialNumber());
rv.put("datapath",
sw.getDescriptionStatistics().getDatapathDescription());
return rv;
}
public int getBuffers() {
return sw.getBuffers();
}
public int getCapabilities() {
return sw.getCapabilities();
}
public long getConnectedSince() {
return sw.getConnectedSince().getTime();
}
public String getDpid() {
return sw.getStringId();
}
public String getHarole() {
return sw.getHARole().toString();
}
public String getInetAddress() {
SocketAddress addr = sw.getInetAddress();
if (addr == null)
return null;
return addr.toString();
}
public Collection<OFPhysicalPort> getPorts() {
return ImmutablePort.ofPhysicalPortListOf(sw.getPorts());
}
}
/**
* Wraps an iterator of IOFSwitch into an iterator of
* SwitchJsonSerializerWrapper
* @author gregor
*/
private static class SwitchJsonSerializerWrapperIterator
implements Iterator<SwitchJsonSerializerWrapper> {
private final Iterator<IOFSwitch> iter;
public SwitchJsonSerializerWrapperIterator(Iterator<IOFSwitch> iter) {
this.iter = iter;
}
@Override
public boolean hasNext() {
return this.iter.hasNext();
}
@Override
public SwitchJsonSerializerWrapper next() {
return new SwitchJsonSerializerWrapper(iter.next());
}
@Override
public void remove() {
this.iter.remove();
}
}
public static final String DPID_ERROR =
"Invalid Switch DPID: must be a 64-bit quantity, expressed in " +
"hex as AA:BB:CC:DD:EE:FF:00:11";
@Get("json")
public Iterator<IOFSwitch> retrieve() {
public Iterator<SwitchJsonSerializerWrapper> retrieve() {
IFloodlightProviderService floodlightProvider =
(IFloodlightProviderService)getContext().getAttributes().
get(IFloodlightProviderService.class.getCanonicalName());
......@@ -60,19 +161,25 @@ public class ControllerSwitchesResource extends ServerResource {
if (switchDPID != null) {
IOFSwitch sw =
floodlightProvider.getSwitch(switchDPID);
if (sw != null)
return Collections.singleton(sw).iterator();
return Collections.<IOFSwitch>emptySet().iterator();
if (sw != null) {
SwitchJsonSerializerWrapper wrappedSw =
new SwitchJsonSerializerWrapper(sw);
return Collections.singleton(wrappedSw).iterator();
}
return Collections.<SwitchJsonSerializerWrapper>emptySet().iterator();
}
final String dpidStartsWith =
form.getFirstValue("dpid__startswith", true);
Iterator<IOFSwitch> switer =
Iterator<IOFSwitch> iofSwitchIter =
floodlightProvider.getAllSwitchMap().values().iterator();
Iterator<SwitchJsonSerializerWrapper> switer =
new SwitchJsonSerializerWrapperIterator(iofSwitchIter);
if (dpidStartsWith != null) {
return new FilterIterator<IOFSwitch>(switer) {
return new FilterIterator<SwitchJsonSerializerWrapper>(switer) {
@Override
protected boolean matches(IOFSwitch value) {
return value.getStringId().startsWith(dpidStartsWith);
protected boolean matches(SwitchJsonSerializerWrapper value) {
return value.getDpid().startsWith(dpidStartsWith);
}
};
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment