| /** |
| * Copyright 2012, Big Switch Networks, Inc. |
| * Originally created by David Erickson, Stanford University |
| * |
| * 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 net.floodlightcontroller.devicemanager.web; |
| |
| import java.util.Iterator; |
| |
| import net.floodlightcontroller.devicemanager.IDevice; |
| import net.floodlightcontroller.devicemanager.IDeviceService; |
| import net.floodlightcontroller.devicemanager.SwitchPort; |
| import net.floodlightcontroller.devicemanager.internal.Device; |
| import net.floodlightcontroller.packet.IPv4; |
| import net.floodlightcontroller.util.FilterIterator; |
| |
| import org.openflow.util.HexString; |
| import org.restlet.data.Form; |
| import org.restlet.data.Status; |
| import org.restlet.resource.ServerResource; |
| |
| /** |
| * Resource for querying and displaying devices that exist in the system |
| */ |
| public abstract class AbstractDeviceResource extends ServerResource { |
| public static final String MAC_ERROR = |
| "Invalid MAC address: must be a 48-bit quantity, " + |
| "expressed in hex as AA:BB:CC:DD:EE:FF"; |
| public static final String VLAN_ERROR = |
| "Invalid VLAN: must be an integer in the range 0-4095"; |
| public static final String IPV4_ERROR = |
| "Invalid IPv4 address: must be in dotted decimal format, " + |
| "234.0.59.1"; |
| 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"; |
| public static final String PORT_ERROR = |
| "Invalid Port: must be a positive integer"; |
| |
| public Iterator<? extends IDevice> getDevices() { |
| IDeviceService deviceManager = |
| (IDeviceService)getContext().getAttributes(). |
| get(IDeviceService.class.getCanonicalName()); |
| |
| Long macAddress = null; |
| Short vlan = null; |
| Integer ipv4Address = null; |
| Long switchDPID = null; |
| Integer switchPort = null; |
| |
| Form form = getQuery(); |
| String macAddrStr = form.getFirstValue("mac", true); |
| String vlanStr = form.getFirstValue("vlan", true); |
| String ipv4Str = form.getFirstValue("ipv4", true); |
| String dpid = form.getFirstValue("dpid", true); |
| String port = form.getFirstValue("port", true); |
| |
| if (macAddrStr != null) { |
| try { |
| macAddress = HexString.toLong(macAddrStr); |
| } catch (Exception e) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, MAC_ERROR); |
| return null; |
| } |
| } |
| if (vlanStr != null) { |
| try { |
| vlan = Short.parseShort(vlanStr); |
| if (vlan > 4095 || vlan < 0) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, VLAN_ERROR); |
| return null; |
| } |
| } catch (Exception e) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, VLAN_ERROR); |
| return null; |
| } |
| } |
| if (ipv4Str != null) { |
| try { |
| ipv4Address = IPv4.toIPv4Address(ipv4Str); |
| } catch (Exception e) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, IPV4_ERROR); |
| return null; |
| } |
| } |
| if (dpid != null) { |
| try { |
| switchDPID = HexString.toLong(dpid); |
| } catch (Exception e) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, DPID_ERROR); |
| return null; |
| } |
| } |
| if (port != null) { |
| try { |
| switchPort = Integer.parseInt(port); |
| if (switchPort < 0) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, PORT_ERROR); |
| return null; |
| } |
| } catch (Exception e) { |
| setStatus(Status.CLIENT_ERROR_BAD_REQUEST, PORT_ERROR); |
| return null; |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| Iterator<Device> diter = (Iterator<Device>) |
| deviceManager.queryDevices(macAddress, |
| vlan, |
| ipv4Address, |
| switchDPID, |
| switchPort); |
| |
| final String macStartsWith = |
| form.getFirstValue("mac__startswith", true); |
| final String vlanStartsWith = |
| form.getFirstValue("vlan__startswith", true); |
| final String ipv4StartsWith = |
| form.getFirstValue("ipv4__startswith", true); |
| final String dpidStartsWith = |
| form.getFirstValue("dpid__startswith", true); |
| final String portStartsWith = |
| form.getFirstValue("port__startswith", true); |
| |
| return new FilterIterator<Device>(diter) { |
| @Override |
| protected boolean matches(Device value) { |
| if (macStartsWith != null) { |
| if (!value.getMACAddressString().startsWith(macStartsWith)) |
| return false; |
| } |
| if (vlanStartsWith != null) { |
| boolean match = false; |
| for (Short v : value.getVlanId()) { |
| if (v != null && |
| v.toString().startsWith(vlanStartsWith)) { |
| match = true; |
| break; |
| } |
| } |
| if (!match) return false; |
| } |
| if (ipv4StartsWith != null) { |
| boolean match = false; |
| for (Integer v : value.getIPv4Addresses()) { |
| String str = IPv4.fromIPv4Address(v); |
| if (v != null && |
| str.startsWith(ipv4StartsWith)) { |
| match = true; |
| break; |
| } |
| } |
| if (!match) return false; |
| } |
| if (dpidStartsWith != null) { |
| boolean match = false; |
| for (SwitchPort v : value.getAttachmentPoints(true)) { |
| String str = |
| HexString.toHexString(v.getSwitchDPID(), 8); |
| if (v != null && |
| str.startsWith(dpidStartsWith)) { |
| match = true; |
| break; |
| } |
| } |
| if (!match) return false; |
| } |
| if (portStartsWith != null) { |
| boolean match = false; |
| for (SwitchPort v : value.getAttachmentPoints(true)) { |
| String str = Integer.toString(v.getPort()); |
| if (v != null && |
| str.startsWith(portStartsWith)) { |
| match = true; |
| break; |
| } |
| } |
| if (!match) return false; |
| } |
| return true; |
| } |
| }; |
| } |
| } |