/**
* Copyright 2011, 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.core.web;
import net.floodlightcontroller.core.internal.IOFSwitchService;
import net.floodlightcontroller.core.web.StatsReply;
import org.projectfloodlight.openflow.protocol.OFStatsType;
import org.projectfloodlight.openflow.types.DatapathId;
import org.restlet.resource.Get;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Return switch statistics information for specific switches
* @author readams
*/
public class SwitchStatisticsResource extends SwitchResourceBase {
protected static Logger log =
LoggerFactory.getLogger(SwitchStatisticsResource.class);
@Get("json")
public StatsReply retrieve(){
StatsReply result = new StatsReply();
Object values = null; // set for error detection in serializer
String switchIdStr = (String) getRequestAttributes().get(CoreWebRoutable.STR_SWITCH_ID);
DatapathId switchId;
String statType = (String) getRequestAttributes().get(CoreWebRoutable.STR_STAT_TYPE);
IOFSwitchService switchService = (IOFSwitchService) getContext().getAttributes().
get(IOFSwitchService.class.getCanonicalName());
// prevent input errors and give error to user if bad switch DPID
try {
switchId = DatapathId.of(switchIdStr);
} catch (NumberFormatException | NullPointerException e) { // new Java 7 shorthand...reduces duplicated code in each catch
switchId = DatapathId.NONE; // set for error detection in serializer
}
// stop if the DPID is invalid or is not presently connected
if (!switchId.equals(DatapathId.NONE) && switchService.getSwitch(switchId) != null) {
// at this point, the switch DPID is valid AND exists; what about the OFStatsType?
switch (statType) {
case OFStatsTypeStrings.PORT:
values = getSwitchStatistics(switchId, OFStatsType.PORT);
result.setStatType(OFStatsType.PORT);
break;
case OFStatsTypeStrings.PORT_DESC:
values = getSwitchStatistics(switchId, OFStatsType.PORT_DESC);
result.setStatType(OFStatsType.PORT_DESC);
break;
case OFStatsTypeStrings.QUEUE:
values = getSwitchStatistics(switchId, OFStatsType.QUEUE);
result.setStatType(OFStatsType.QUEUE);
break;
case OFStatsTypeStrings.QUEUE_DESC:
values = getSwitchStatistics(switchId, OFStatsType.QUEUE_DESC);
result.setStatType(OFStatsType.QUEUE_DESC);
break;
case OFStatsTypeStrings.FLOW:
values = getSwitchStatistics(switchId, OFStatsType.FLOW);
result.setStatType(OFStatsType.FLOW);
break;
case OFStatsTypeStrings.FLOW_LIGHTWEIGHT:
values = getSwitchStatistics(switchId, OFStatsType.FLOW_LIGHTWEIGHT);
result.setStatType(OFStatsType.FLOW_LIGHTWEIGHT);
break;
case OFStatsTypeStrings.FLOW_MONITOR:
values = getSwitchStatistics(switchId, OFStatsType.FLOW_MONITOR);
result.setStatType(OFStatsType.FLOW_MONITOR);
break;
case OFStatsTypeStrings.AGGREGATE:
values = getSwitchStatistics(switchId, OFStatsType.AGGREGATE);
result.setStatType(OFStatsType.AGGREGATE);
break;
case OFStatsTypeStrings.DESC:
values = getSwitchStatistics(switchId, OFStatsType.DESC);
result.setStatType(OFStatsType.DESC);
break;
case OFStatsTypeStrings.GROUP:
values = getSwitchStatistics(switchId, OFStatsType.GROUP);
result.setStatType(OFStatsType.GROUP);
break;
case OFStatsTypeStrings.GROUP_DESC:
values = getSwitchStatistics(switchId, OFStatsType.GROUP_DESC);
result.setStatType(OFStatsType.GROUP_DESC);
break;
case OFStatsTypeStrings.GROUP_FEATURES:
values = getSwitchStatistics(switchId, OFStatsType.GROUP_FEATURES);
result.setStatType(OFStatsType.GROUP_FEATURES);
break;
case OFStatsTypeStrings.METER:
values = getSwitchStatistics(switchId, OFStatsType.METER);
result.setStatType(OFStatsType.METER);
break;
case OFStatsTypeStrings.METER_CONFIG:
values = getSwitchStatistics(switchId, OFStatsType.METER_CONFIG);
result.setStatType(OFStatsType.METER_CONFIG);
break;
case OFStatsTypeStrings.METER_FEATURES:
values = getSwitchStatistics(switchId, OFStatsType.METER_FEATURES);
result.setStatType(OFStatsType.METER_FEATURES);
break;
case OFStatsTypeStrings.TABLE:
values = getSwitchStatistics(switchId, OFStatsType.TABLE);
result.setStatType(OFStatsType.TABLE);
break;
case OFStatsTypeStrings.TABLE_DESC:
values = getSwitchStatistics(switchId, OFStatsType.TABLE_DESC);
result.setStatType(OFStatsType.TABLE_DESC);
break;
case OFStatsTypeStrings.TABLE_FEATURES:
values = getSwitchStatistics(switchId, OFStatsType.TABLE_FEATURES);
result.setStatType(OFStatsType.TABLE_FEATURES);
break;
case OFStatsTypeStrings.EXPERIMENTER:
values = getSwitchFeaturesReply(switchId);
result.setStatType(OFStatsType.EXPERIMENTER);
break;
case OFStatsTypeStrings.BUNDLE_FEATURES:
values = getSwitchStatistics(switchId, OFStatsType.BUNDLE_FEATURES);
result.setStatType(OFStatsType.BUNDLE_FEATURES);
break;
case OFStatsTypeStrings.CONTROLLER_STATUS:
values = getSwitchStatistics(switchId, OFStatsType.CONTROLLER_STATUS);
result.setStatType(OFStatsType.CONTROLLER_STATUS);
break;
case OFStatsTypeStrings.FEATURES:
values = getSwitchFeaturesReply(switchId);
result.setStatType(null); // we will assume anything in "values" with a null stattype is "features"
default:
log.error("Invalid or unimplemented stat request type {}", statType);
break;
}
} else {
log.error("Invalid or disconnected switch {}", switchIdStr);
// if there was an error, the serializer will report it
}
result.setDatapathId(switchId);
result.setValues(values); // values can only be a List<OFStatsReply> or an OFFeaturesReply
// if values is set to null (the default), the serializer will kick back a response to the user via the REST API
return result;
}
}