Did porting of PROXYARP and Forwarding to the new-datamodel branch.
Change-Id: Ibbc46e20e31627daf68149b7cb31b055d3441eaf
diff --git a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
index 294e1a5..1eb7750 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
@@ -6,6 +6,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -20,20 +21,27 @@
import net.floodlightcontroller.util.MACAddress;
import net.onrc.onos.datagrid.IDatagridService;
import net.onrc.onos.datagrid.IEventChannel;
+import net.onrc.onos.datagrid.IEventChannelListener;
+import net.onrc.onos.intent.Intent;
+import net.onrc.onos.intent.IntentMap;
+import net.onrc.onos.intent.IntentOperation;
+import net.onrc.onos.intent.IntentOperationList;
+import net.onrc.onos.intent.PathIntent;
+import net.onrc.onos.intent.ShortestPathIntent;
+import net.onrc.onos.intent.Intent.IntentState;
+import net.onrc.onos.intent.runtime.IPathCalcRuntimeService;
+import net.onrc.onos.intent.runtime.IntentStateList;
import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.ofcontroller.networkgraph.Device;
+import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
+import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
+import net.onrc.onos.ofcontroller.networkgraph.Switch;
import net.onrc.onos.ofcontroller.proxyarp.BroadcastPacketOutNotification;
import net.onrc.onos.ofcontroller.proxyarp.IProxyArpService;
-import net.onrc.onos.ofcontroller.proxyarp.PacketOutNotification;
-import net.onrc.onos.ofcontroller.util.CallerId;
-import net.onrc.onos.ofcontroller.util.DataPath;
import net.onrc.onos.ofcontroller.util.Dpid;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
-import net.onrc.onos.ofcontroller.util.FlowId;
import net.onrc.onos.ofcontroller.util.FlowPath;
-import net.onrc.onos.ofcontroller.util.FlowPathType;
-import net.onrc.onos.ofcontroller.util.FlowPathUserState;
import net.onrc.onos.ofcontroller.util.Port;
import net.onrc.onos.ofcontroller.util.SwitchPort;
import net.onrc.onos.packet.Ethernet;
@@ -54,35 +62,34 @@
import com.google.common.collect.ListMultimap;
public class Forwarding implements IOFMessageListener, IFloodlightModule,
- IForwardingService {
+ IForwardingService, IEventChannelListener<Long, IntentStateList> {
private final static Logger log = LoggerFactory.getLogger(Forwarding.class);
- private final int IDLE_TIMEOUT = 5; // seconds
- private final int HARD_TIMEOUT = 0; // seconds
private final int SLEEP_TIME_FOR_DB_DEVICE_INSTALLED = 100; // milliseconds
private final static int NUMBER_OF_THREAD_FOR_EXECUTOR = 1;
private final static ScheduledExecutorService executor = Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
- private final CallerId callerId = new CallerId("Forwarding");
+ private final String callerId = "Forwarding";
private IFloodlightProviderService floodlightProvider;
private IFlowPusherService flowPusher;
private IDatagridService datagrid;
- //
- // TODO: Using PacketOutNotification as both the key and the
- // value is a hack that should be removed when this module is
- // refactored.
- //
- private IEventChannel<PacketOutNotification, PacketOutNotification> eventChannel;
- private static final String PACKET_OUT_CHANNEL_NAME = "onos.packet_out";
+
+ private IEventChannel<Long, BroadcastPacketOutNotification> eventChannel;
+ private static final String SINGLE_PACKET_OUT_CHANNEL_NAME = "onos.forwarding.packet_out";
private IControllerRegistryService controllerRegistryService;
+ private INetworkGraphService networkGraphService;
+ private NetworkGraph networkGraph;
+ private IPathCalcRuntimeService pathRuntime;
+ private IntentMap intentMap;
+
// TODO it seems there is a Guava collection that will time out entries.
// We should see if this will work here.
private Map<Path, PushedFlow> pendingFlows;
- private ListMultimap<Long, PacketToPush> waitingPackets;
+ private ListMultimap<String, PacketToPush> waitingPackets;
private final Object lock = new Object();
@@ -97,12 +104,12 @@
}
private class PushedFlow {
- public final long flowId;
+ public final String intentId;
public boolean installed = false;
public short firstOutPort;
- public PushedFlow(long flowId) {
- this.flowId = flowId;
+ public PushedFlow(String flowId) {
+ this.intentId = flowId;
}
}
@@ -162,8 +169,11 @@
new ArrayList<Class<? extends IFloodlightService>>();
dependencies.add(IFloodlightProviderService.class);
dependencies.add(IFlowPusherService.class);
+ dependencies.add(IControllerRegistryService.class);
dependencies.add(IOnosDeviceService.class);
- dependencies.add(IControllerRegistryService.class);
+ dependencies.add(IDatagridService.class);
+ dependencies.add(INetworkGraphService.class);
+ dependencies.add(IPathCalcRuntimeService.class);
// We don't use the IProxyArpService directly, but reactive forwarding
// requires it to be loaded and answering ARP requests
dependencies.add(IProxyArpService.class);
@@ -177,6 +187,8 @@
flowPusher = context.getServiceImpl(IFlowPusherService.class);
datagrid = context.getServiceImpl(IDatagridService.class);
controllerRegistryService = context.getServiceImpl(IControllerRegistryService.class);
+ networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+ pathRuntime = context.getServiceImpl(IPathCalcRuntimeService.class);
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
@@ -186,14 +198,13 @@
@Override
public void startUp(FloodlightModuleContext context) {
- //
- // TODO: Using PacketOutNotification as both the key and the
- // value is a hack that should be removed when this module is
- // refactored.
- //
- eventChannel = datagrid.createChannel(PACKET_OUT_CHANNEL_NAME,
- PacketOutNotification.class,
- PacketOutNotification.class);
+
+ eventChannel = datagrid.createChannel(SINGLE_PACKET_OUT_CHANNEL_NAME,
+ Long.class,
+ BroadcastPacketOutNotification.class);
+ networkGraph = networkGraphService.getNetworkGraph();
+ intentMap = pathRuntime.getPathIntents();
+ datagrid.addListener("onos.pathintent_state", this, Long.class, IntentStateList.class);
}
@Override
@@ -248,17 +259,13 @@
log.trace("Sending broadcast packet to other ONOS instances");
}
- PacketOutNotification key =
+ //We don't use address information, so 0 is put into the third argument.
+ BroadcastPacketOutNotification key =
new BroadcastPacketOutNotification(
eth.serialize(),
- null, sw.getId(),
+ 0, sw.getId(),
pi.getInPort());
- //
- // TODO: Using PacketOutNotification as both the key and the
- // value is a hack that should be removed when this module is
- // refactored.
- //
- eventChannel.addTransientEntry(key, key);
+ eventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
}
private void handlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth){
@@ -268,25 +275,18 @@
HexString.toHexString(eth.getDestinationMACAddress());
//FIXME getDeviceByMac() is a blocking call, so it may be better way to handle it to avoid the condition.
- // TODO: Fix the code below after deviceStorage was removed
- /*
- try{
- IDeviceObject deviceObject = deviceStorage.getDeviceByMac(
- destinationMac);
- if (deviceObject == null) {
- log.debug("No device entry found for {}",
- destinationMac);
+ Device deviceObject = networkGraph.getDeviceByMac(MACAddress.valueOf(destinationMac));
- //Device is not in the DB, so wait it until the device is added.
- executor.schedule(new WaitDeviceArp(sw, pi, eth), SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
- return;
- }
+ if (deviceObject == null) {
+ log.debug("No device entry found for {}",
+ destinationMac);
- continueHandlePacketIn(sw, pi, eth, deviceObject);
- } finally {
- deviceStorage.rollback();
+ //Device is not in the DB, so wait it until the device is added.
+ executor.schedule(new WaitDeviceArp(sw, pi, eth), SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
+ return;
}
- */
+
+ continueHandlePacketIn(sw, pi, eth, deviceObject);
}
private class WaitDeviceArp implements Runnable {
@@ -303,44 +303,35 @@
@Override
public void run() {
- // TODO: Fix the code below after deviceStorage was removed
- /*
- try {
- IDeviceObject deviceObject = deviceStorage.getDeviceByMac(HexString.toHexString(eth.getDestinationMACAddress()));
- if(deviceObject == null){
- log.debug("wait {}ms and device was not found. Send broadcast packet and the thread finish.", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
- handleBroadcast(sw, pi, eth);
- return;
- }
- log.debug("wait {}ms and device {} was found, continue",SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMACAddress());
- continueHandlePacketIn(sw, pi, eth, deviceObject);
- } finally {
- deviceStorage.rollback();
- }
- */
+ Device deviceObject = networkGraph.getDeviceByMac(MACAddress.valueOf(eth.getDestinationMACAddress()));
+ if(deviceObject == null){
+ log.debug("wait {}ms and device was not found. Send broadcast packet and the thread finish.", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
+ handleBroadcast(sw, pi, eth);
+ return;
+ }
+ log.debug("wait {}ms and device {} was found, continue",SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMacAddress());
+ continueHandlePacketIn(sw, pi, eth, deviceObject);
}
}
- // TODO: Fix the code below because IDeviceObject was removed
- /*
- private void continueHandlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth, IDeviceObject deviceObject) {
- log.debug("Start continuehandlePacketIn");
+ private void continueHandlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth, Device deviceObject) {
- Iterator<IPortObject> ports = deviceObject.getAttachedPorts().iterator();
+ log.debug("Start continuehandlePacketIn");
+
+ //Iterator<IPortObject> ports = deviceObject.getAttachedPorts().iterator();
+ Iterator<net.onrc.onos.ofcontroller.networkgraph.Port> ports = deviceObject.getAttachmentPoints().iterator();
if (!ports.hasNext()) {
log.debug("No attachment point found for device {} - broadcasting packet",
- deviceObject.getMACAddress());
+ deviceObject.getMacAddress());
handleBroadcast(sw, pi, eth);
return;
}
-
//This code assumes the device has only one port. It should be problem.
- IPortObject portObject = ports.next();
-
- short destinationPort = portObject.getNumber();
- ISwitchObject switchObject = portObject.getSwitch();
- long destinationDpid = HexString.toLong(switchObject.getDPID());
+ net.onrc.onos.ofcontroller.networkgraph.Port portObject = ports.next();
+ short destinationPort = portObject.getNumber().shortValue();
+ Switch switchObject = portObject.getSwitch();
+ long destinationDpid = switchObject.getDpid();
// TODO SwitchPort, Dpid and Port should probably be immutable
SwitchPort srcSwitchPort = new SwitchPort(
@@ -351,21 +342,18 @@
MACAddress srcMacAddress = MACAddress.valueOf(eth.getSourceMACAddress());
MACAddress dstMacAddress = MACAddress.valueOf(eth.getDestinationMACAddress());
- FlowPath flowPath;
-
synchronized (lock) {
//TODO check concurrency
Path pathspec = new Path(srcMacAddress, dstMacAddress);
-
PushedFlow existingFlow = pendingFlows.get(pathspec);
//A path is installed side by side to reduce a path timeout and a wrong state.
if (existingFlow != null) {
// We've already start to install a flow for this pair of MAC addresses
if(log.isDebugEnabled()) {
- log.debug("Found existing the same pathspec {}, Flow ID is {}",
+ log.debug("Found existing the same pathspec {}, intent ID is {}",
pathspec,
- HexString.toHexString(existingFlow.flowId));
+ existingFlow.intentId);
}
OFPacketOut po = constructPacketOut(pi, sw);
@@ -378,42 +366,44 @@
// Flow has been sent to the switches so it is safe to
// send a packet out now
- //
- // TODO: The getFlow() call below needs
- // to be updated to the new Path Intent
- // framework.
- //
- // FlowPath flow = datagrid.getFlow(new FlowId(existingFlow.flowId));
- FlowPath flow = null;
- FlowEntry flowEntryForThisSwitch = null;
+ Intent intent = intentMap.getIntent(existingFlow.intentId);
+ PathIntent pathIntent = null;
+ if(intent instanceof PathIntent) {
+ pathIntent = (PathIntent)intent;
+ } else {
+ log.debug("Intent {} is not PathIntent. Return.", intent.getId());
+ return;
+ }
- if (flow != null) {
- for (FlowEntry flowEntry : flow.flowEntries()) {
- if (flowEntry.dpid().equals(new Dpid(sw.getId()))) {
- flowEntryForThisSwitch = flowEntry;
- break;
- }
+ Boolean isflowEntryForThisSwitch = false;
+ net.onrc.onos.ofcontroller.networkgraph.Path path = pathIntent.getPath();
+
+ for(Iterator<LinkEvent> i = path.iterator(); i.hasNext();) {
+ LinkEvent le = (LinkEvent)i.next();
+ if(le.getSrc().dpid == sw.getId()) {
+ log.debug("src {} dst {}", le.getSrc(), le.getDst());
+ isflowEntryForThisSwitch = true;
+ break;
}
}
- if (flowEntryForThisSwitch == null) {
+ if (isflowEntryForThisSwitch == false) {
// If we don't find a flow entry for that switch, then we're
// in the middle of a rerouting (or something's gone wrong).
// This packet will be dropped as a victim of the rerouting.
- log.debug("Dropping packet on flow {} between {}-{}, flow path {}",
- new Object[] {new FlowId(existingFlow.flowId),
- srcMacAddress, dstMacAddress, flow});
- }
- else {
- log.debug("Sending packet out from sw {}, outport{}", sw, flowEntryForThisSwitch.outPort().value());
- sendPacketOut(sw, po, flowEntryForThisSwitch.outPort().value());
+ log.debug("Dropping packet on flow {} between {}-{}",
+ existingFlow.intentId,
+ srcMacAddress, dstMacAddress);
+ } else {
+ log.debug("Sending packet out from sw {}, outport{}", sw, existingFlow.firstOutPort);
+ sendPacketOut(sw, po, existingFlow.firstOutPort);
}
}
else {
// Flow path has not yet been installed to switches so save the
// packet out for later
- log.debug("Put a packet into the waitng list. flowId {}", Long.toHexString(existingFlow.flowId));
- waitingPackets.put(existingFlow.flowId, new PacketToPush(po, sw.getId()));
+ log.debug("Put a packet into the waitng list. flowId {}", existingFlow.intentId);
+ waitingPackets.put(existingFlow.intentId, new PacketToPush(po, sw.getId()));
}
return;
}
@@ -421,42 +411,25 @@
log.debug("Adding new flow between {} at {} and {} at {}",
new Object[]{srcMacAddress, srcSwitchPort, dstMacAddress, dstSwitchPort});
- DataPath datapath = new DataPath();
- datapath.setSrcPort(srcSwitchPort);
- datapath.setDstPort(dstSwitchPort);
-
- flowPath = new FlowPath();
- flowPath.setInstallerId(new CallerId(callerId));
-
- flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
- flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
- flowPath.setFlowEntryMatch(new FlowEntryMatch());
- flowPath.setIdleTimeout(IDLE_TIMEOUT);
- flowPath.setHardTimeout(HARD_TIMEOUT);
- flowPath.flowEntryMatch().enableSrcMac(srcMacAddress);
- flowPath.flowEntryMatch().enableDstMac(dstMacAddress);
- flowPath.flowEntryMatch().enableEthernetFrameType(Ethernet.TYPE_IPv4);
- flowPath.setDataPath(datapath);
-
- FlowId flowId = new FlowId(controllerRegistryService.getNextUniqueId());
-
- flowPath.setFlowId(flowId);
+ String intentId = callerId + ":" + controllerRegistryService.getNextUniqueId();
+ IntentOperationList operations = new IntentOperationList();
+ ShortestPathIntent intent = new ShortestPathIntent(intentId,
+ sw.getId(), pi.getInPort(), srcMacAddress.toLong(),
+ destinationDpid, destinationPort, dstMacAddress.toLong());
+ IntentOperation.Operator operator = IntentOperation.Operator.ADD;
+ operations.add(operator, intent);
+ pathRuntime.executeIntentOperations(operations);
OFPacketOut po = constructPacketOut(pi, sw);
// Add to waiting lists
- pendingFlows.put(pathspec, new PushedFlow(flowId.value()));
- log.debug("Put a Path {} in the pending flow, Flow ID {}", pathspec, flowId);
- waitingPackets.put(flowId.value(), new PacketToPush(po, sw.getId()));
+ pendingFlows.put(pathspec, new PushedFlow(intentId));
+ log.debug("Put a Path {} in the pending flow, intent ID {}", pathspec, intentId);
+ waitingPackets.put(intentId, new PacketToPush(po, sw.getId()));
log.debug("Put a Packet in the wating list. related pathspec {}", pathspec);
+
}
-
- log.debug("Adding forward {} to {}. Flow ID {}", new Object[] {
- srcMacAddress, dstMacAddress, flowPath.flowId()});
- // TODO: Add the flow by using the new Path Intent framework
- // flowService.addFlow(flowPath);
}
- */
private OFPacketOut constructPacketOut(OFPacketIn pi, IOFSwitch sw) {
OFPacketOut po = new OFPacketOut();
@@ -479,94 +452,84 @@
@Override
public void flowsInstalled(Collection<FlowPath> installedFlowPaths) {
- for (FlowPath flowPath : installedFlowPaths) {
- flowInstalled(flowPath);
- }
}
@Override
public void flowRemoved(FlowPath removedFlowPath) {
- if(log.isDebugEnabled()){
- log.debug("Flow {} was removed", removedFlowPath.flowId());
+ }
+
+ public void flowRemoved(PathIntent removedIntent) {
+ if(log.isTraceEnabled()){
+ log.trace("Path {} was removed", removedIntent.getParentIntent().getId());
}
-
- if (!removedFlowPath.installerId().equals(callerId)) {
- // Not our flow path, ignore
- return;
- }
-
- MACAddress srcMacAddress = removedFlowPath.flowEntryMatch().srcMac();
- MACAddress dstMacAddress = removedFlowPath.flowEntryMatch().dstMac();
-
+ ShortestPathIntent spfIntent = (ShortestPathIntent) removedIntent.getParentIntent();
+ MACAddress srcMacAddress = MACAddress.valueOf(spfIntent.getSrcMac());
+ MACAddress dstMacAddress = MACAddress.valueOf(spfIntent.getDstMac());
Path removedPath = new Path(srcMacAddress, dstMacAddress);
synchronized (lock) {
// There *shouldn't* be any packets queued if the flow has
// just been removed.
- List<PacketToPush> packets = waitingPackets.removeAll(removedFlowPath.flowId().value());
+ List<PacketToPush> packets = waitingPackets.removeAll(spfIntent.getId());
if (!packets.isEmpty()) {
- log.warn("Removed flow {} has packets queued.", removedFlowPath.flowId());
+ log.warn("Removed flow {} has packets queued.", spfIntent.getId());
}
pendingFlows.remove(removedPath);
- log.debug("Removed from the pendingFlow: Path {}, Flow ID {}", removedPath, removedFlowPath.flowId());
+ log.debug("Removed from the pendingFlow: Path {}, Flow ID {}", removedPath, spfIntent.getId());
}
}
-
- private void flowInstalled(FlowPath installedFlowPath) {
- log.debug("Flow {} was installed", installedFlowPath.flowId());
-
- if (!installedFlowPath.installerId().equals(callerId)) {
- // Not our flow path, ignore
- return;
- }
-
- if(installedFlowPath.flowEntries().isEmpty()){
- //If there is no flowEntry, ignore
- log.warn("There is no flowEntry in the installedFlowPath id {}.return.", installedFlowPath.flowId());
- return;
+
+ private void flowInstalled(PathIntent installedPath) {
+ if(log.isTraceEnabled()){
+ log.trace("Path {} was installed", installedPath.getParentIntent().getId());
}
- MACAddress srcMacAddress = installedFlowPath.flowEntryMatch().srcMac();
- MACAddress dstMacAddress = installedFlowPath.flowEntryMatch().dstMac();
- Path installedPath = new Path(srcMacAddress, dstMacAddress);
+ ShortestPathIntent spfIntent = (ShortestPathIntent) installedPath.getParentIntent();
+ MACAddress srcMacAddress = MACAddress.valueOf(spfIntent.getSrcMac());
+ MACAddress dstMacAddress = MACAddress.valueOf(spfIntent.getDstMac());
+ Path path = new Path(srcMacAddress, dstMacAddress);
+ log.debug("Path spec {}", path);
// TODO waiting packets should time out. We could request a path that
// can't be installed right now because of a network partition. The path
// may eventually be installed, but we may have received thousands of
// packets in the meantime and probably don't want to send very old packets.
- List<PacketToPush> packets;
- Short outPort = installedFlowPath.flowEntries().get(0).outPort().value();
-
- PushedFlow existingFlow;
+ List<PacketToPush> packets = null;
+ net.onrc.onos.ofcontroller.networkgraph.Path graphPath = installedPath.getPath();
+
+ log.debug("path{}", graphPath);
+ Short outPort = graphPath.get(0).getSrc().getNumber().shortValue();
+
+ PushedFlow existingFlow = null;
synchronized (lock) {
- existingFlow = pendingFlows.get(installedPath);
+ existingFlow = pendingFlows.get(path);
if (existingFlow != null) {
existingFlow.installed = true;
existingFlow.firstOutPort = outPort;
} else {
- log.debug("ExistingFlow {} is null", installedPath);
+ log.debug("ExistingFlow {} is null", path);
return;
}
//Check both existing flow are installed status.
if(existingFlow.installed){
- packets = waitingPackets.removeAll(existingFlow.flowId);
+ packets = waitingPackets.removeAll(existingFlow.intentId);
if(log.isDebugEnabled()){
log.debug("removed my packets {} to push from waitingPackets. outPort {} size {}",
- Long.toHexString(existingFlow.flowId), existingFlow.firstOutPort, packets.size());
+ existingFlow.intentId, existingFlow.firstOutPort, packets.size());
}
}else{
log.debug("Forward or reverse flows hasn't been pushed yet. return");
return;
}
}
-
+
for (PacketToPush packet : packets) {
- log.debug("Start packetToPush to sw {}, outPort {}", packet.dpid, existingFlow.firstOutPort);
+ log.debug("Start packetToPush to sw {}, outPort {}, path {}", packet.dpid, existingFlow.firstOutPort, path);
IOFSwitch sw = floodlightProvider.getSwitches().get(packet.dpid);
sendPacketOut(sw, packet.packet, existingFlow.firstOutPort);
}
@@ -581,4 +544,47 @@
flowPusher.add(sw, po);
}
+ @Override
+ public void entryAdded(IntentStateList value) {
+ entryUpdated(value);
+
+ }
+
+ @Override
+ public void entryRemoved(IntentStateList value) {
+ //no-op
+ }
+
+ @Override
+ public void entryUpdated(IntentStateList value) {
+ for (Entry<String, IntentState> entry: value.entrySet()) {
+ log.debug("path intent key {}, value {}", entry.getKey(), entry.getValue());
+ PathIntent pathIntent = (PathIntent) intentMap.getIntent(entry.getKey());
+ if (pathIntent == null)
+ continue;
+
+ if (!(pathIntent.getParentIntent() instanceof ShortestPathIntent))
+ continue;
+
+ IntentState state = entry.getValue();
+ switch (state) {
+ case INST_REQ:
+ break;
+ case INST_ACK:
+ flowInstalled(pathIntent);
+ break;
+ case INST_NACK:
+ break;
+ case DEL_REQ:
+ break;
+ case DEL_ACK:
+ flowRemoved(pathIntent);
+ break;
+ case DEL_PENDING:
+ break;
+ default:
+ break;
+ }
+ }
+ }
}