Fix checkstyle whitespace issues - WHITESPACE ONLY
Change-Id: Ic205c1afd639c6008d61d9de95cb764eeb6238ca
diff --git a/src/main/java/net/onrc/onos/core/intent/Action.java b/src/main/java/net/onrc/onos/core/intent/Action.java
index 71c7183..6490fe5 100644
--- a/src/main/java/net/onrc/onos/core/intent/Action.java
+++ b/src/main/java/net/onrc/onos/core/intent/Action.java
@@ -3,9 +3,7 @@
import net.onrc.onos.core.util.FlowEntryAction;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
public abstract class Action {
diff --git a/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java b/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
index fece148..c72ef4e 100644
--- a/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
+++ b/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
@@ -15,58 +15,62 @@
* which satisfies the bandwidth condition.
* If bandwidth parameter is not specified, the normal breadth first tree will be calculated.
* The paths are snapshot paths at the point of the class instantiation.
+ *
* @author Toshio Koide (t-koide@onlab.us)
*/
public class ConstrainedBFSTree {
- LinkedList<Switch> switchQueue = new LinkedList<>();
- HashSet<Switch> switchSearched = new HashSet<>();
- HashMap<Long, LinkEvent> upstreamLinks = new HashMap<>();
- HashMap<Switch, Path> paths = new HashMap<>();
- Switch rootSwitch;
- PathIntentMap intents = null;
- double bandwidth = 0.0; // 0.0 means no limit for bandwidth (normal BFS tree)
+ LinkedList<Switch> switchQueue = new LinkedList<>();
+ HashSet<Switch> switchSearched = new HashSet<>();
+ HashMap<Long, LinkEvent> upstreamLinks = new HashMap<>();
+ HashMap<Switch, Path> paths = new HashMap<>();
+ Switch rootSwitch;
+ PathIntentMap intents = null;
+ double bandwidth = 0.0; // 0.0 means no limit for bandwidth (normal BFS tree)
- public ConstrainedBFSTree(Switch rootSwitch) {
- this.rootSwitch = rootSwitch;
- calcTree();
- }
+ public ConstrainedBFSTree(Switch rootSwitch) {
+ this.rootSwitch = rootSwitch;
+ calcTree();
+ }
- public ConstrainedBFSTree(Switch rootSwitch, PathIntentMap intents, double bandwidth) {
- this.rootSwitch = rootSwitch;
- this.intents = intents;
- this.bandwidth = bandwidth;
- calcTree();
- }
+ public ConstrainedBFSTree(Switch rootSwitch, PathIntentMap intents, double bandwidth) {
+ this.rootSwitch = rootSwitch;
+ this.intents = intents;
+ this.bandwidth = bandwidth;
+ calcTree();
+ }
- protected void calcTree() {
- switchQueue.add(rootSwitch);
- switchSearched.add(rootSwitch);
- while (!switchQueue.isEmpty()) {
- Switch sw = switchQueue.poll();
- for (Link link: sw.getOutgoingLinks()) {
- Switch reachedSwitch = link.getDstPort().getSwitch();
- if (switchSearched.contains(reachedSwitch)) continue;
- if (intents != null && intents.getAvailableBandwidth(link) < bandwidth) continue;
- switchQueue.add(reachedSwitch);
- switchSearched.add(reachedSwitch);
- upstreamLinks.put(reachedSwitch.getDpid(), new LinkEvent(link));
- }
- }
- }
+ protected void calcTree() {
+ switchQueue.add(rootSwitch);
+ switchSearched.add(rootSwitch);
+ while (!switchQueue.isEmpty()) {
+ Switch sw = switchQueue.poll();
+ for (Link link : sw.getOutgoingLinks()) {
+ Switch reachedSwitch = link.getDstPort().getSwitch();
+ if (switchSearched.contains(reachedSwitch)) continue;
+ if (intents != null &&
+ intents.getAvailableBandwidth(link) < bandwidth) {
+ continue;
+ }
+ switchQueue.add(reachedSwitch);
+ switchSearched.add(reachedSwitch);
+ upstreamLinks.put(reachedSwitch.getDpid(), new LinkEvent(link));
+ }
+ }
+ }
- public Path getPath(Switch leafSwitch) {
- Path path = paths.get(leafSwitch);
- Long rootSwitchDpid = rootSwitch.getDpid();
- if (path == null && switchSearched.contains(leafSwitch)) {
- path = new Path();
- Long sw = leafSwitch.getDpid();
- while (!sw.equals(rootSwitchDpid)) {
- LinkEvent upstreamLink = upstreamLinks.get(sw);
- path.add(0, upstreamLink);
- sw = upstreamLink.getSrc().getDpid();
- }
- paths.put(leafSwitch, path);
- }
- return path;
- }
+ public Path getPath(Switch leafSwitch) {
+ Path path = paths.get(leafSwitch);
+ Long rootSwitchDpid = rootSwitch.getDpid();
+ if (path == null && switchSearched.contains(leafSwitch)) {
+ path = new Path();
+ Long sw = leafSwitch.getDpid();
+ while (!sw.equals(rootSwitchDpid)) {
+ LinkEvent upstreamLink = upstreamLinks.get(sw);
+ path.add(0, upstreamLink);
+ sw = upstreamLink.getSrc().getDpid();
+ }
+ paths.put(leafSwitch, path);
+ }
+ return path;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/ConstrainedShortestPathIntent.java b/src/main/java/net/onrc/onos/core/intent/ConstrainedShortestPathIntent.java
index ca4f753..7f3de9b 100644
--- a/src/main/java/net/onrc/onos/core/intent/ConstrainedShortestPathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ConstrainedShortestPathIntent.java
@@ -4,23 +4,23 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class ConstrainedShortestPathIntent extends ShortestPathIntent {
- protected double bandwidth;
+ protected double bandwidth;
- /**
- * Default constructor for Kryo deserialization
- */
- protected ConstrainedShortestPathIntent() {
- }
+ /**
+ * Default constructor for Kryo deserialization
+ */
+ protected ConstrainedShortestPathIntent() {
+ }
- public ConstrainedShortestPathIntent(String id,
- long srcSwitch, long srcPort, long srcMac,
- long dstSwitch, long dstPort, long dstMac,
- double bandwidth) {
- super(id, srcSwitch, srcPort, srcMac, dstSwitch, dstPort, dstMac);
- this.bandwidth = bandwidth;
- }
+ public ConstrainedShortestPathIntent(String id,
+ long srcSwitch, long srcPort, long srcMac,
+ long dstSwitch, long dstPort, long dstMac,
+ double bandwidth) {
+ super(id, srcSwitch, srcPort, srcMac, dstSwitch, dstPort, dstMac);
+ this.bandwidth = bandwidth;
+ }
- public double getBandwidth() {
- return bandwidth;
- }
+ public double getBandwidth() {
+ return bandwidth;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/ErrorIntent.java b/src/main/java/net/onrc/onos/core/intent/ErrorIntent.java
index a5046e8..31715a8 100644
--- a/src/main/java/net/onrc/onos/core/intent/ErrorIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ErrorIntent.java
@@ -2,29 +2,30 @@
/**
* This class is instantiated by Run-times to express intent calculation error
+ *
* @author Toshio Koide (t-koide@onlab.us)
*/
public class ErrorIntent extends Intent {
- public enum ErrorType {
- UNSUPPORTED_INTENT,
- SWITCH_NOT_FOUND,
- PATH_NOT_FOUND,
- }
+ public enum ErrorType {
+ UNSUPPORTED_INTENT,
+ SWITCH_NOT_FOUND,
+ PATH_NOT_FOUND,
+ }
- public ErrorType errorType;
- public String message;
- public Intent parentIntent;
+ public ErrorType errorType;
+ public String message;
+ public Intent parentIntent;
- /**
- * Default constructor for Kryo deserialization
- */
- protected ErrorIntent() {
- }
+ /**
+ * Default constructor for Kryo deserialization
+ */
+ protected ErrorIntent() {
+ }
- public ErrorIntent(ErrorType errorType, String message, Intent parentIntent) {
- super(parentIntent.getId());
- this.errorType = errorType;
- this.message = message;
- this.parentIntent = parentIntent;
- }
+ public ErrorIntent(ErrorType errorType, String message, Intent parentIntent) {
+ super(parentIntent.getId());
+ this.errorType = errorType;
+ this.message = message;
+ this.parentIntent = parentIntent;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/FlowEntry.java b/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
index 570f4ef..526fe5f 100644
--- a/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
+++ b/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
@@ -11,79 +11,77 @@
import net.onrc.onos.core.util.FlowEntryUserState;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
public class FlowEntry {
- protected long sw;
- protected Match match;
- protected Set<Action> actions;
- protected Operator operator;
-
- public FlowEntry(long sw, long srcPort, long dstPort,
- MACAddress srcMac, MACAddress dstMac,
- Operator operator) {
- this.sw = sw;
- this.match = new Match(sw, srcPort, srcMac, dstMac);
- this.actions = new HashSet<Action>();
- this.actions.add(new ForwardAction(dstPort));
- this.operator = operator;
- }
-
- public String toString() {
- return match + "->" + actions;
- }
-
- public long getSwitch() {
- return sw;
- }
-
- public Operator getOperator() {
- return operator;
- }
-
- public void setOperator(Operator op) {
- operator = op;
- }
-
- public net.onrc.onos.core.util.FlowEntry getFlowEntry() {
- net.onrc.onos.core.util.FlowEntry entry = new net.onrc.onos.core.util.FlowEntry();
- entry.setDpid(new Dpid(sw));
- entry.setFlowEntryId(new FlowEntryId(hashCode())); // naive, but useful for now
- entry.setFlowEntryMatch(match.getFlowEntryMatch());
- FlowEntryActions flowEntryActions = new FlowEntryActions();
- for(Action action : actions) {
- flowEntryActions.addAction(action.getFlowEntryAction());
- }
- entry.setFlowEntryActions(flowEntryActions);
- switch(operator) {
- case ADD:
- entry.setFlowEntryUserState(FlowEntryUserState.FE_USER_MODIFY);
- break;
- case REMOVE:
- entry.setFlowEntryUserState(FlowEntryUserState.FE_USER_DELETE);
- break;
- default:
- break;
- }
- return entry;
- }
-
-
- public int hashCode() {
- return match.hashCode();
- }
-
- public boolean equals(Object o) {
- if(!(o instanceof FlowEntry)) {
- return false;
- }
- FlowEntry other = (FlowEntry) o;
- // Note: we should not consider the operator for this comparison
- return this.match.equals(other.match)
- && this.actions.containsAll(other.actions)
- && other.actions.containsAll(this.actions);
- }
+ protected long sw;
+ protected Match match;
+ protected Set<Action> actions;
+ protected Operator operator;
+
+ public FlowEntry(long sw, long srcPort, long dstPort,
+ MACAddress srcMac, MACAddress dstMac,
+ Operator operator) {
+ this.sw = sw;
+ this.match = new Match(sw, srcPort, srcMac, dstMac);
+ this.actions = new HashSet<Action>();
+ this.actions.add(new ForwardAction(dstPort));
+ this.operator = operator;
+ }
+
+ public String toString() {
+ return match + "->" + actions;
+ }
+
+ public long getSwitch() {
+ return sw;
+ }
+
+ public Operator getOperator() {
+ return operator;
+ }
+
+ public void setOperator(Operator op) {
+ operator = op;
+ }
+
+ public net.onrc.onos.core.util.FlowEntry getFlowEntry() {
+ net.onrc.onos.core.util.FlowEntry entry = new net.onrc.onos.core.util.FlowEntry();
+ entry.setDpid(new Dpid(sw));
+ entry.setFlowEntryId(new FlowEntryId(hashCode())); // naive, but useful for now
+ entry.setFlowEntryMatch(match.getFlowEntryMatch());
+ FlowEntryActions flowEntryActions = new FlowEntryActions();
+ for (Action action : actions) {
+ flowEntryActions.addAction(action.getFlowEntryAction());
+ }
+ entry.setFlowEntryActions(flowEntryActions);
+ switch (operator) {
+ case ADD:
+ entry.setFlowEntryUserState(FlowEntryUserState.FE_USER_MODIFY);
+ break;
+ case REMOVE:
+ entry.setFlowEntryUserState(FlowEntryUserState.FE_USER_DELETE);
+ break;
+ default:
+ break;
+ }
+ return entry;
+ }
+
+
+ public int hashCode() {
+ return match.hashCode();
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof FlowEntry)) {
+ return false;
+ }
+ FlowEntry other = (FlowEntry) o;
+ // Note: we should not consider the operator for this comparison
+ return this.match.equals(other.match)
+ && this.actions.containsAll(other.actions)
+ && other.actions.containsAll(this.actions);
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/ForwardAction.java b/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
index 482d3f1..4e4088f 100644
--- a/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
+++ b/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
@@ -3,38 +3,36 @@
import net.onrc.onos.core.util.FlowEntryAction;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
class ForwardAction extends Action {
- protected long dstPort;
-
- public ForwardAction(long dstPort) {
- this.dstPort = dstPort;
- }
-
- public String toString() {
- return Long.toString(dstPort);
- }
+ protected long dstPort;
- @Override
- public FlowEntryAction getFlowEntryAction() {
- FlowEntryAction action = new FlowEntryAction();
- action.setActionOutput(new net.onrc.onos.core.util.Port((short) dstPort));
- return action;
- }
+ public ForwardAction(long dstPort) {
+ this.dstPort = dstPort;
+ }
- public int hashCode() {
- return (int) dstPort;
- }
-
- public boolean equals(Object o) {
- if(!(o instanceof ForwardAction)) {
- return false;
- }
- ForwardAction action = (ForwardAction) o;
- return this.dstPort == action.dstPort;
- }
+ public String toString() {
+ return Long.toString(dstPort);
+ }
+
+ @Override
+ public FlowEntryAction getFlowEntryAction() {
+ FlowEntryAction action = new FlowEntryAction();
+ action.setActionOutput(new net.onrc.onos.core.util.Port((short) dstPort));
+ return action;
+ }
+
+ public int hashCode() {
+ return (int) dstPort;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof ForwardAction)) {
+ return false;
+ }
+ ForwardAction action = (ForwardAction) o;
+ return this.dstPort == action.dstPort;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/Intent.java b/src/main/java/net/onrc/onos/core/intent/Intent.java
index 3c4dbea..a8a06b0 100644
--- a/src/main/java/net/onrc/onos/core/intent/Intent.java
+++ b/src/main/java/net/onrc/onos/core/intent/Intent.java
@@ -8,95 +8,95 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class Intent {
- public enum IntentState {
- CREATED,
- INST_REQ,
- INST_NACK,
- INST_ACK,
- DEL_REQ,
- DEL_PENDING,
- DEL_ACK,
- REROUTE_REQ,
- }
+ public enum IntentState {
+ CREATED,
+ INST_REQ,
+ INST_NACK,
+ INST_ACK,
+ DEL_REQ,
+ DEL_PENDING,
+ DEL_ACK,
+ REROUTE_REQ,
+ }
- private String id;
- private IntentState state = IntentState.CREATED;
- private boolean pathFrozen = false;
+ private String id;
+ private IntentState state = IntentState.CREATED;
+ private boolean pathFrozen = false;
- @Optional(value="logs")
- private LinkedList<String> logs = new LinkedList<>();
+ @Optional(value = "logs")
+ private LinkedList<String> logs = new LinkedList<>();
- /**
- * Default constructor for Kryo deserialization
- */
- protected Intent() {
- logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
- }
+ /**
+ * Default constructor for Kryo deserialization
+ */
+ protected Intent() {
+ logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
+ }
- public Intent(String id) {
- logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
- this.id = id;
- }
+ public Intent(String id) {
+ logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
+ this.id = id;
+ }
- public Intent(String id, IntentState state) {
- logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
- setState(state);
- this.id = id;
- }
+ public Intent(String id, IntentState state) {
+ logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
+ setState(state);
+ this.id = id;
+ }
- public String getId() {
- return id;
- }
+ public String getId() {
+ return id;
+ }
- public IntentState getState() {
- return state;
- }
+ public IntentState getState() {
+ return state;
+ }
- public IntentState setState(IntentState newState) {
- logs.add(String.format("setState, oldState:%s, newState:%s, time:%d",
- state, newState, System.nanoTime())); // for measurement
- if (logs.size() > 20) { // TODO this size should be configurable
- logs.removeFirst();
- }
- IntentState oldState = state;
- state = newState;
- return oldState;
- }
+ public IntentState setState(IntentState newState) {
+ logs.add(String.format("setState, oldState:%s, newState:%s, time:%d",
+ state, newState, System.nanoTime())); // for measurement
+ if (logs.size() > 20) { // TODO this size should be configurable
+ logs.removeFirst();
+ }
+ IntentState oldState = state;
+ state = newState;
+ return oldState;
+ }
- public boolean isPathFrozen() {
- return pathFrozen;
- }
+ public boolean isPathFrozen() {
+ return pathFrozen;
+ }
- public void setPathFrozen(boolean isFrozen) {
- pathFrozen = isFrozen;
- }
+ public void setPathFrozen(boolean isFrozen) {
+ pathFrozen = isFrozen;
+ }
- public LinkedList<String> getLogs() {
- return logs;
- }
+ public LinkedList<String> getLogs() {
+ return logs;
+ }
- @Override
- public int hashCode() {
- return (id == null) ? 0 : id.hashCode();
- }
+ @Override
+ public int hashCode() {
+ return (id == null) ? 0 : id.hashCode();
+ }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if ((obj == null) || (getClass() != obj.getClass()))
- return false;
- Intent other = (Intent) obj;
- if (id == null) {
- if (other.id != null)
- return false;
- } else if (!id.equals(other.id))
- return false;
- return true;
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if ((obj == null) || (getClass() != obj.getClass()))
+ return false;
+ Intent other = (Intent) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
- @Override
- public String toString() {
- return id.toString() + ", " + state.toString();
- }
+ @Override
+ public String toString() {
+ return id.toString() + ", " + state.toString();
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/IntentMap.java b/src/main/java/net/onrc/onos/core/intent/IntentMap.java
index ae314a7..e5cae77 100644
--- a/src/main/java/net/onrc/onos/core/intent/IntentMap.java
+++ b/src/main/java/net/onrc/onos/core/intent/IntentMap.java
@@ -14,177 +14,177 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class IntentMap {
- private HashSet<ChangedListener> listeners = new HashSet<>();
- private HashMap<String, Intent> intents = new HashMap<>();
- private LinkedList<ChangedEvent> events = new LinkedList<>();
+ private HashSet<ChangedListener> listeners = new HashSet<>();
+ private HashMap<String, Intent> intents = new HashMap<>();
+ private LinkedList<ChangedEvent> events = new LinkedList<>();
- public enum ChangedEventType {
- /**
- * Added new intent.
- */
- ADDED,
+ public enum ChangedEventType {
+ /**
+ * Added new intent.
+ */
+ ADDED,
- /**
- * Removed existing intent.
- * The specified intent is an instance of Intent class (not a child class)
- * Only id and state are valid.
- */
- REMOVED,
+ /**
+ * Removed existing intent.
+ * The specified intent is an instance of Intent class (not a child class)
+ * Only id and state are valid.
+ */
+ REMOVED,
- /**
- * Changed state of existing intent.
- * The specified intent is an instance of Intent class (not a child class)
- * Only id and state are valid.
- */
- STATE_CHANGED,
- }
+ /**
+ * Changed state of existing intent.
+ * The specified intent is an instance of Intent class (not a child class)
+ * Only id and state are valid.
+ */
+ STATE_CHANGED,
+ }
- public class ChangedEvent {
- public ChangedEvent(ChangedEventType eventType, Intent intent) {
- this.eventType = eventType;
- this.intent = intent;
- }
- public ChangedEventType eventType;
- public Intent intent;
- }
+ public class ChangedEvent {
+ public ChangedEvent(ChangedEventType eventType, Intent intent) {
+ this.eventType = eventType;
+ this.intent = intent;
+ }
- public interface ChangedListener extends EventListener {
- void intentsChange(LinkedList<ChangedEvent> events);
- }
+ public ChangedEventType eventType;
+ public Intent intent;
+ }
- //================================================================================
- // public methods
- //================================================================================
+ public interface ChangedListener extends EventListener {
+ void intentsChange(LinkedList<ChangedEvent> events);
+ }
- public void executeOperations(IntentOperationList operations) {
- for (IntentOperation operation: operations) {
- switch (operation.operator) {
- case ADD:
- handleAddOperation(operation);
- break;
- case REMOVE:
- handleRemoveOperation(operation);
- break;
- case ERROR:
- handleErrorOperation(operation);
- break;
- }
- }
- notifyEvents();
- }
+ //================================================================================
+ // public methods
+ //================================================================================
- public void purge() {
- LinkedList<String> removeIds = new LinkedList<>();
- for (Entry<String, Intent> entry: intents.entrySet()) {
- Intent intent = entry.getValue();
- if (intent.getState() == IntentState.DEL_ACK
- || intent.getState() == IntentState.INST_NACK) {
- removeIds.add(intent.getId());
- }
- }
- for (String intentId: removeIds) {
- removeIntent(intentId);
- }
- notifyEvents();
- }
+ public void executeOperations(IntentOperationList operations) {
+ for (IntentOperation operation : operations) {
+ switch (operation.operator) {
+ case ADD:
+ handleAddOperation(operation);
+ break;
+ case REMOVE:
+ handleRemoveOperation(operation);
+ break;
+ case ERROR:
+ handleErrorOperation(operation);
+ break;
+ }
+ }
+ notifyEvents();
+ }
- public void changeStates(IntentStateList states) {
- for (Entry<String, IntentState> state: states.entrySet()) {
- setState(state.getKey(), state.getValue());
- }
- notifyEvents();
- }
+ public void purge() {
+ LinkedList<String> removeIds = new LinkedList<>();
+ for (Entry<String, Intent> entry : intents.entrySet()) {
+ Intent intent = entry.getValue();
+ if (intent.getState() == IntentState.DEL_ACK
+ || intent.getState() == IntentState.INST_NACK) {
+ removeIds.add(intent.getId());
+ }
+ }
+ for (String intentId : removeIds) {
+ removeIntent(intentId);
+ }
+ notifyEvents();
+ }
- public Intent getIntent(String intentId) {
- return intents.get(intentId);
- }
+ public void changeStates(IntentStateList states) {
+ for (Entry<String, IntentState> state : states.entrySet()) {
+ setState(state.getKey(), state.getValue());
+ }
+ notifyEvents();
+ }
- public Collection<Intent> getAllIntents() {
- return intents.values();
- }
+ public Intent getIntent(String intentId) {
+ return intents.get(intentId);
+ }
- public void addChangeListener(ChangedListener listener) {
- listeners.add(listener);
- }
+ public Collection<Intent> getAllIntents() {
+ return intents.values();
+ }
- public void removeChangedListener(ChangedListener listener) {
- listeners.remove(listener);
- }
+ public void addChangeListener(ChangedListener listener) {
+ listeners.add(listener);
+ }
- //================================================================================
- // methods that affect intents map (protected)
- //================================================================================
+ public void removeChangedListener(ChangedListener listener) {
+ listeners.remove(listener);
+ }
- protected void putIntent(Intent intent) {
- if (intents.containsKey(intent.getId()))
- removeIntent(intent.getId());
- intents.put(intent.getId(), intent);
- events.add(new ChangedEvent(ChangedEventType.ADDED, intent));
- }
+ //================================================================================
+ // methods that affect intents map (protected)
+ //================================================================================
- protected void removeIntent(String intentId) {
- Intent intent = intents.remove(intentId);
- if (intent == null) return;
- events.add(new ChangedEvent(ChangedEventType.REMOVED, intent));
- }
+ protected void putIntent(Intent intent) {
+ if (intents.containsKey(intent.getId()))
+ removeIntent(intent.getId());
+ intents.put(intent.getId(), intent);
+ events.add(new ChangedEvent(ChangedEventType.ADDED, intent));
+ }
- protected void setState(String intentId, IntentState state) {
- Intent intent = intents.get(intentId);
- if (intent == null) return;
- intent.setState(state);
- events.add(new ChangedEvent(ChangedEventType.STATE_CHANGED, intent));
- }
+ protected void removeIntent(String intentId) {
+ Intent intent = intents.remove(intentId);
+ if (intent == null) return;
+ events.add(new ChangedEvent(ChangedEventType.REMOVED, intent));
+ }
- //================================================================================
- // helper methods (protected)
- //================================================================================
+ protected void setState(String intentId, IntentState state) {
+ Intent intent = intents.get(intentId);
+ if (intent == null) return;
+ intent.setState(state);
+ events.add(new ChangedEvent(ChangedEventType.STATE_CHANGED, intent));
+ }
- protected void handleAddOperation(IntentOperation operation) {
- putIntent(operation.intent);
- }
+ //================================================================================
+ // helper methods (protected)
+ //================================================================================
- protected void handleRemoveOperation(IntentOperation operation) {
- Intent intent = getIntent(operation.intent.getId());
- if (intent == null) {
- // TODO error handling
- }
- else {
- setState(intent.getId(), IntentState.DEL_REQ);
- }
- }
+ protected void handleAddOperation(IntentOperation operation) {
+ putIntent(operation.intent);
+ }
- protected void handleErrorOperation(IntentOperation operation) {
- //TODO put error message into the intent
+ protected void handleRemoveOperation(IntentOperation operation) {
+ Intent intent = getIntent(operation.intent.getId());
+ if (intent == null) {
+ // TODO error handling
+ } else {
+ setState(intent.getId(), IntentState.DEL_REQ);
+ }
+ }
- ErrorIntent errorIntent = (ErrorIntent) operation.intent;
- Intent targetIntent = intents.get(errorIntent.getId());
- if (targetIntent == null) {
- // TODO error handling
- return;
- }
+ protected void handleErrorOperation(IntentOperation operation) {
+ //TODO put error message into the intent
- switch (targetIntent.getState()) {
- case CREATED:
- case INST_REQ:
- case INST_ACK:
- case REROUTE_REQ:
- setState(targetIntent.getId(), IntentState.INST_NACK);
- break;
- case DEL_REQ:
- setState(targetIntent.getId(), IntentState.DEL_PENDING);
- break;
- case INST_NACK:
- case DEL_PENDING:
- case DEL_ACK:
- // do nothing
- break;
- }
- }
+ ErrorIntent errorIntent = (ErrorIntent) operation.intent;
+ Intent targetIntent = intents.get(errorIntent.getId());
+ if (targetIntent == null) {
+ // TODO error handling
+ return;
+ }
- protected void notifyEvents() {
- for (ChangedListener listener: listeners) {
- listener.intentsChange(events);
- }
- events.clear();
- }
+ switch (targetIntent.getState()) {
+ case CREATED:
+ case INST_REQ:
+ case INST_ACK:
+ case REROUTE_REQ:
+ setState(targetIntent.getId(), IntentState.INST_NACK);
+ break;
+ case DEL_REQ:
+ setState(targetIntent.getId(), IntentState.DEL_PENDING);
+ break;
+ case INST_NACK:
+ case DEL_PENDING:
+ case DEL_ACK:
+ // do nothing
+ break;
+ }
+ }
+
+ protected void notifyEvents() {
+ for (ChangedListener listener : listeners) {
+ listener.intentsChange(events);
+ }
+ events.clear();
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/IntentOperation.java b/src/main/java/net/onrc/onos/core/intent/IntentOperation.java
index 006c159..0cb42ff 100644
--- a/src/main/java/net/onrc/onos/core/intent/IntentOperation.java
+++ b/src/main/java/net/onrc/onos/core/intent/IntentOperation.java
@@ -4,37 +4,38 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class IntentOperation {
- public enum Operator {
- /**
- * Add new intent specified by intent field.
- */
- ADD,
+ public enum Operator {
+ /**
+ * Add new intent specified by intent field.
+ */
+ ADD,
- /**
- * Remove existing intent specified by intent field.
- * The instance of intent field should be an instance of Intent class (not a child class)
- */
- REMOVE,
+ /**
+ * Remove existing intent specified by intent field.
+ * The instance of intent field should be an instance of Intent class (not a child class)
+ */
+ REMOVE,
- /**
- * Do error handling.
- * The instance of intent field should be an instance of ErrorIntent
- */
- ERROR,
- }
+ /**
+ * Do error handling.
+ * The instance of intent field should be an instance of ErrorIntent
+ */
+ ERROR,
+ }
- public Operator operator;
- public Intent intent;
+ public Operator operator;
+ public Intent intent;
- protected IntentOperation() {}
+ protected IntentOperation() {
+ }
- public IntentOperation(Operator operator, Intent intent) {
- this.operator = operator;
- this.intent = intent;
- }
+ public IntentOperation(Operator operator, Intent intent) {
+ this.operator = operator;
+ this.intent = intent;
+ }
- @Override
- public String toString() {
- return operator.toString() + ", (" + intent.toString() + ")";
- }
+ @Override
+ public String toString() {
+ return operator.toString() + ", (" + intent.toString() + ")";
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/IntentOperationList.java b/src/main/java/net/onrc/onos/core/intent/IntentOperationList.java
index a3981fa..7691c68 100644
--- a/src/main/java/net/onrc/onos/core/intent/IntentOperationList.java
+++ b/src/main/java/net/onrc/onos/core/intent/IntentOperationList.java
@@ -6,9 +6,9 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class IntentOperationList extends LinkedList<IntentOperation> {
- private static final long serialVersionUID = -3894081461861052610L;
+ private static final long serialVersionUID = -3894081461861052610L;
- public boolean add(IntentOperation.Operator op, Intent intent) {
- return add(new IntentOperation(op, intent));
- }
+ public boolean add(IntentOperation.Operator op, Intent intent) {
+ return add(new IntentOperation(op, intent));
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/Match.java b/src/main/java/net/onrc/onos/core/intent/Match.java
index 5f92254..f7a2167 100644
--- a/src/main/java/net/onrc/onos/core/intent/Match.java
+++ b/src/main/java/net/onrc/onos/core/intent/Match.java
@@ -8,59 +8,56 @@
import net.onrc.onos.core.util.FlowEntryMatch;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
public class Match {
- protected long sw;
- protected MACAddress srcMac;
- protected MACAddress dstMac;
- protected long srcPort;
-
- public Match(long sw, long srcPort,
- MACAddress srcMac, MACAddress dstMac) {
- this.sw = sw;
- this.srcPort = srcPort;
- this.srcMac = srcMac;
- this.dstMac = dstMac;
- }
+ protected long sw;
+ protected MACAddress srcMac;
+ protected MACAddress dstMac;
+ protected long srcPort;
- @Override
- public boolean equals(Object obj) {
- if(obj instanceof Match) {
- Match other = (Match) obj;
- return this.sw == other.sw &&
- this.srcMac.equals(other.srcMac) &&
- this.dstMac.equals(other.dstMac) &&
- this.srcPort == other.srcPort;
- }
- else {
- return false;
- }
- }
+ public Match(long sw, long srcPort,
+ MACAddress srcMac, MACAddress dstMac) {
+ this.sw = sw;
+ this.srcPort = srcPort;
+ this.srcMac = srcMac;
+ this.dstMac = dstMac;
+ }
- public FlowEntryMatch getFlowEntryMatch(){
- FlowEntryMatch match = new FlowEntryMatch();
- match.enableSrcMac(srcMac);
- match.enableDstMac(dstMac);
- match.enableInPort(new net.onrc.onos.core.util.Port((short) srcPort));
- return match;
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Match) {
+ Match other = (Match) obj;
+ return this.sw == other.sw &&
+ this.srcMac.equals(other.srcMac) &&
+ this.dstMac.equals(other.dstMac) &&
+ this.srcPort == other.srcPort;
+ } else {
+ return false;
+ }
+ }
- @Override
- public String toString() {
- return "Sw:" + sw + " (" + srcPort + "," + srcMac + "," + dstMac + ")";
- }
-
- @Override
- public int hashCode() {
- long[] nums = new long[4];
- nums[0] = sw;
- nums[1] = srcPort;
- nums[2] = srcMac.toLong();
- nums[3] = dstMac.toLong();
- return Arrays.hashCode(nums);
- }
+ public FlowEntryMatch getFlowEntryMatch() {
+ FlowEntryMatch match = new FlowEntryMatch();
+ match.enableSrcMac(srcMac);
+ match.enableDstMac(dstMac);
+ match.enableInPort(new net.onrc.onos.core.util.Port((short) srcPort));
+ return match;
+ }
+
+ @Override
+ public String toString() {
+ return "Sw:" + sw + " (" + srcPort + "," + srcMac + "," + dstMac + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ long[] nums = new long[4];
+ nums[0] = sw;
+ nums[1] = srcPort;
+ nums[2] = srcMac.toLong();
+ nums[3] = dstMac.toLong();
+ return Arrays.hashCode(nums);
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/PathIntent.java b/src/main/java/net/onrc/onos/core/intent/PathIntent.java
index b06fb81..e541454 100644
--- a/src/main/java/net/onrc/onos/core/intent/PathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/PathIntent.java
@@ -6,55 +6,54 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class PathIntent extends Intent {
- protected Path path;
- protected double bandwidth;
- protected Intent parentIntent;
+ protected Path path;
+ protected double bandwidth;
+ protected Intent parentIntent;
- public static String createFirstId(String parentId) {
- return String.format("%s___0", parentId);
- }
+ public static String createFirstId(String parentId) {
+ return String.format("%s___0", parentId);
+ }
- public static String createNextId(String currentId) {
- String parts[] = currentId.split("___");
- return String.format("%s___%d", parts[0], Long.valueOf(parts[1])+1);
- }
+ public static String createNextId(String currentId) {
+ String parts[] = currentId.split("___");
+ return String.format("%s___%d", parts[0], Long.valueOf(parts[1]) + 1);
+ }
- /**
- * Default constructor for Kryo deserialization
- */
- protected PathIntent() {
- }
+ /**
+ * Default constructor for Kryo deserialization
+ */
+ protected PathIntent() {
+ }
- /**
- *
- * @param graph
- * @param path
- * @param bandwidth bandwidth which should be allocated for the path.
- * If 0, no intent for bandwidth allocation (best effort).
- * @param parentIntent parent intent. If null, this is root intent.
- * @param id
- */
- public PathIntent(String id, Path path, double bandwidth, Intent parentIntent) {
- super(id);
- this.path = path;
- this.bandwidth = bandwidth;
- this.parentIntent = parentIntent;
- }
+ /**
+ * @param graph
+ * @param path
+ * @param bandwidth bandwidth which should be allocated for the path.
+ * If 0, no intent for bandwidth allocation (best effort).
+ * @param parentIntent parent intent. If null, this is root intent.
+ * @param id
+ */
+ public PathIntent(String id, Path path, double bandwidth, Intent parentIntent) {
+ super(id);
+ this.path = path;
+ this.bandwidth = bandwidth;
+ this.parentIntent = parentIntent;
+ }
- public double getBandwidth() {
- return bandwidth;
- }
+ public double getBandwidth() {
+ return bandwidth;
+ }
- public Path getPath() {
- return path;
- }
+ public Path getPath() {
+ return path;
+ }
- public Intent getParentIntent() {
- return parentIntent;
- }
+ public Intent getParentIntent() {
+ return parentIntent;
+ }
- @Override
- public String toString() {
- return String.format("%s, %s, %s", getId(), getState(), getPath());
- }
+ @Override
+ public String toString() {
+ return String.format("%s, %s, %s", getId(), getState(), getPath());
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
index 6f66cb7..ad6b1a5 100644
--- a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
+++ b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
@@ -13,99 +13,100 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class PathIntentMap extends IntentMap {
- private HashMap<Long, HashMap<Long, HashSet<PathIntent>>> intents;
+ private HashMap<Long, HashMap<Long, HashSet<PathIntent>>> intents;
- public PathIntentMap() {
- intents = new HashMap<>();
- }
+ public PathIntentMap() {
+ intents = new HashMap<>();
+ }
- private HashSet<PathIntent> get(SwitchPort swPort) {
- Long dpid = swPort.getDpid();
- Long port = swPort.getNumber();
- HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
- if (portToIntents == null) {
- portToIntents = new HashMap<>();
- intents.put(dpid, portToIntents);
- }
- HashSet<PathIntent> targetIntents = portToIntents.get(port);
- if (targetIntents == null) {
- targetIntents = new HashSet<>();
- portToIntents.put(port, targetIntents);
- }
- return targetIntents;
- }
+ private HashSet<PathIntent> get(SwitchPort swPort) {
+ Long dpid = swPort.getDpid();
+ Long port = swPort.getNumber();
+ HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
+ if (portToIntents == null) {
+ portToIntents = new HashMap<>();
+ intents.put(dpid, portToIntents);
+ }
+ HashSet<PathIntent> targetIntents = portToIntents.get(port);
+ if (targetIntents == null) {
+ targetIntents = new HashSet<>();
+ portToIntents.put(port, targetIntents);
+ }
+ return targetIntents;
+ }
- private void put(SwitchPort swPort, PathIntent intent) {
- get(swPort).add(intent);
- }
+ private void put(SwitchPort swPort, PathIntent intent) {
+ get(swPort).add(intent);
+ }
- @Override
- protected void putIntent(Intent intent) {
- if (!(intent instanceof PathIntent)) return; // TODO throw exception
- super.putIntent(intent);
+ @Override
+ protected void putIntent(Intent intent) {
+ if (!(intent instanceof PathIntent)) return; // TODO throw exception
+ super.putIntent(intent);
- PathIntent pathIntent = (PathIntent) intent;
- for (LinkEvent linkEvent: pathIntent.getPath()) {
- put(linkEvent.getSrc(), (PathIntent) intent);
- put(linkEvent.getDst(), (PathIntent) intent);
- }
- }
+ PathIntent pathIntent = (PathIntent) intent;
+ for (LinkEvent linkEvent : pathIntent.getPath()) {
+ put(linkEvent.getSrc(), (PathIntent) intent);
+ put(linkEvent.getDst(), (PathIntent) intent);
+ }
+ }
- @Override
- protected void removeIntent(String intentId) {
- PathIntent intent = (PathIntent) getIntent(intentId);
- for (LinkEvent linkEvent: intent.getPath()) {
- get(linkEvent.getSrc()).remove(intent);
- get(linkEvent.getDst()).remove(intent);
- }
- super.removeIntent(intentId);
- }
+ @Override
+ protected void removeIntent(String intentId) {
+ PathIntent intent = (PathIntent) getIntent(intentId);
+ for (LinkEvent linkEvent : intent.getPath()) {
+ get(linkEvent.getSrc()).remove(intent);
+ get(linkEvent.getDst()).remove(intent);
+ }
+ super.removeIntent(intentId);
+ }
- public Collection<PathIntent> getIntentsByLink(LinkEvent linkEvent) {
- return getIntentsByPort(
- linkEvent.getSrc().getDpid(),
- linkEvent.getSrc().getNumber());
- }
+ public Collection<PathIntent> getIntentsByLink(LinkEvent linkEvent) {
+ return getIntentsByPort(
+ linkEvent.getSrc().getDpid(),
+ linkEvent.getSrc().getNumber());
+ }
- public Collection<PathIntent> getIntentsByPort(Long dpid, Long port) {
- HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
- if (portToIntents != null) {
- HashSet<PathIntent> targetIntents = portToIntents.get(port);
- if (targetIntents != null) {
- return Collections.unmodifiableCollection(targetIntents);
- }
- }
- return new HashSet<>();
- }
+ public Collection<PathIntent> getIntentsByPort(Long dpid, Long port) {
+ HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
+ if (portToIntents != null) {
+ HashSet<PathIntent> targetIntents = portToIntents.get(port);
+ if (targetIntents != null) {
+ return Collections.unmodifiableCollection(targetIntents);
+ }
+ }
+ return new HashSet<>();
+ }
- public Collection<PathIntent> getIntentsByDpid(Long dpid) {
- HashSet<PathIntent> result = new HashSet<>();
- HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
- if (portToIntents != null) {
- for (HashSet<PathIntent> targetIntents: portToIntents.values()) {
- result.addAll(targetIntents);
- }
- }
- return result;
- }
+ public Collection<PathIntent> getIntentsByDpid(Long dpid) {
+ HashSet<PathIntent> result = new HashSet<>();
+ HashMap<Long, HashSet<PathIntent>> portToIntents = intents.get(dpid);
+ if (portToIntents != null) {
+ for (HashSet<PathIntent> targetIntents : portToIntents.values()) {
+ result.addAll(targetIntents);
+ }
+ }
+ return result;
+ }
- /**
- * calculate available bandwidth of specified link
- * @param link
- * @return
- */
- public Double getAvailableBandwidth(Link link) {
- if (link == null) return null;
- Double bandwidth = link.getCapacity();
- LinkEvent linkEvent = new LinkEvent(link);
- if (!bandwidth.isInfinite()) {
- for (PathIntent intent: getIntentsByLink(linkEvent)) {
- Double intentBandwidth = intent.getBandwidth();
- if (intentBandwidth == null || intentBandwidth.isInfinite() || intentBandwidth.isNaN())
- continue;
- bandwidth -= intentBandwidth;
- }
- }
- return bandwidth;
- }
+ /**
+ * calculate available bandwidth of specified link
+ *
+ * @param link
+ * @return
+ */
+ public Double getAvailableBandwidth(Link link) {
+ if (link == null) return null;
+ Double bandwidth = link.getCapacity();
+ LinkEvent linkEvent = new LinkEvent(link);
+ if (!bandwidth.isInfinite()) {
+ for (PathIntent intent : getIntentsByLink(linkEvent)) {
+ Double intentBandwidth = intent.getBandwidth();
+ if (intentBandwidth == null || intentBandwidth.isInfinite() || intentBandwidth.isNaN())
+ continue;
+ bandwidth -= intentBandwidth;
+ }
+ }
+ return bandwidth;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
index f4bb18c..3adc756 100644
--- a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
@@ -7,69 +7,69 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class ShortestPathIntent extends Intent {
- protected long srcSwitchDpid;
- protected long srcPortNumber;
- protected long srcMacAddress;
- protected long dstSwitchDpid;
- protected long dstPortNumber;
- protected long dstMacAddress;
- protected String pathIntentId = null;
+ protected long srcSwitchDpid;
+ protected long srcPortNumber;
+ protected long srcMacAddress;
+ protected long dstSwitchDpid;
+ protected long dstPortNumber;
+ protected long dstMacAddress;
+ protected String pathIntentId = null;
- /**
- * Default constructor for Kryo deserialization
- */
- protected ShortestPathIntent() {
- }
+ /**
+ * Default constructor for Kryo deserialization
+ */
+ protected ShortestPathIntent() {
+ }
- public ShortestPathIntent(String id,
- long srcSwitch, long srcPort, long srcMac,
- long dstSwitch, long dstPort, long dstMac) {
- super(id);
- srcSwitchDpid = srcSwitch;
- srcPortNumber = srcPort;
- srcMacAddress = srcMac;
- dstSwitchDpid = dstSwitch;
- dstPortNumber = dstPort;
- dstMacAddress = dstMac;
- }
+ public ShortestPathIntent(String id,
+ long srcSwitch, long srcPort, long srcMac,
+ long dstSwitch, long dstPort, long dstMac) {
+ super(id);
+ srcSwitchDpid = srcSwitch;
+ srcPortNumber = srcPort;
+ srcMacAddress = srcMac;
+ dstSwitchDpid = dstSwitch;
+ dstPortNumber = dstPort;
+ dstMacAddress = dstMac;
+ }
- public long getSrcSwitchDpid() {
- return srcSwitchDpid;
- }
+ public long getSrcSwitchDpid() {
+ return srcSwitchDpid;
+ }
- public long getSrcPortNumber() {
- return srcPortNumber;
- }
+ public long getSrcPortNumber() {
+ return srcPortNumber;
+ }
- public long getSrcMac() {
- return srcMacAddress;
- }
+ public long getSrcMac() {
+ return srcMacAddress;
+ }
- public long getDstSwitchDpid() {
- return dstSwitchDpid;
- }
+ public long getDstSwitchDpid() {
+ return dstSwitchDpid;
+ }
- public long getDstPortNumber() {
- return dstPortNumber;
- }
+ public long getDstPortNumber() {
+ return dstPortNumber;
+ }
- public long getDstMac() {
- return dstMacAddress;
- }
+ public long getDstMac() {
+ return dstMacAddress;
+ }
- public void setPathIntent(PathIntent pathIntent) {
- pathIntentId = pathIntent.getId();
- }
+ public void setPathIntent(PathIntent pathIntent) {
+ pathIntentId = pathIntent.getId();
+ }
- public String getPathIntentId() {
- return pathIntentId;
- }
+ public String getPathIntentId() {
+ return pathIntentId;
+ }
- @Override
- public String toString() {
- return String.format("id:%s, state:%s, srcDpid:%s, srcPort:%d, srcMac:%s, dstDpid:%s, dstPort:%d, dstMac:%s",
- getId(), getState(),
- new Dpid(srcSwitchDpid), srcPortNumber, MACAddress.valueOf(srcMacAddress),
- new Dpid(dstSwitchDpid), dstPortNumber, MACAddress.valueOf(dstMacAddress));
- }
+ @Override
+ public String toString() {
+ return String.format("id:%s, state:%s, srcDpid:%s, srcPort:%d, srcMac:%s, dstDpid:%s, dstPort:%d, dstMac:%s",
+ getId(), getState(),
+ new Dpid(srcSwitchDpid), srcPortNumber, MACAddress.valueOf(srcMacAddress),
+ new Dpid(dstSwitchDpid), dstPortNumber, MACAddress.valueOf(dstMacAddress));
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/IPathCalcRuntimeService.java b/src/main/java/net/onrc/onos/core/intent/runtime/IPathCalcRuntimeService.java
index c6aad89..dd7bfd0 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/IPathCalcRuntimeService.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/IPathCalcRuntimeService.java
@@ -8,8 +8,11 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public interface IPathCalcRuntimeService extends IFloodlightService {
- public IntentOperationList executeIntentOperations(IntentOperationList list);
- public IntentMap getHighLevelIntents();
- public IntentMap getPathIntents();
- public void purgeIntents();
+ public IntentOperationList executeIntentOperations(IntentOperationList list);
+
+ public IntentMap getHighLevelIntents();
+
+ public IntentMap getPathIntents();
+
+ public void purgeIntents();
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/IntentStateList.java b/src/main/java/net/onrc/onos/core/intent/runtime/IntentStateList.java
index e6f1180..e354811 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/IntentStateList.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/IntentStateList.java
@@ -8,5 +8,5 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class IntentStateList extends HashMap<String, IntentState> {
- private static final long serialVersionUID = -3674903999581438936L;
+ private static final long serialVersionUID = -3674903999581438936L;
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
index 9314959..c582fe1 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
@@ -27,115 +27,116 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class PathCalcRuntime implements IFloodlightService {
- private NetworkGraph graph;
- private final static Logger log = LoggerFactory.getLogger(PathCalcRuntime.class);
- public PathCalcRuntime(NetworkGraph g) {
- this.graph = g;
- }
+ private NetworkGraph graph;
+ private final static Logger log = LoggerFactory.getLogger(PathCalcRuntime.class);
- /**
- * calculate shortest-path and constrained-shortest-path intents into low-level path intents
- * @param intentOpList IntentOperationList having instances of ShortestPathIntent/ConstrainedShortestPathIntent
- * @param pathIntents a set of current low-level intents
- * @return IntentOperationList. PathIntent and/or ErrorIntent instances.
- */
- public IntentOperationList calcPathIntents(final IntentOperationList intentOpList, final IntentMap appIntents, final PathIntentMap pathIntents) {
- IntentOperationList pathIntentOpList = new IntentOperationList();
- HashMap<Switch, ConstrainedBFSTree> spfTrees = new HashMap<>();
+ public PathCalcRuntime(NetworkGraph g) {
+ this.graph = g;
+ }
- // TODO optimize locking of NetworkGraph
- graph.acquireReadLock();
- log.debug("NetworkGraph: {}", graph.getLinks());
+ /**
+ * calculate shortest-path and constrained-shortest-path intents into low-level path intents
+ *
+ * @param intentOpList IntentOperationList having instances of ShortestPathIntent/ConstrainedShortestPathIntent
+ * @param pathIntents a set of current low-level intents
+ * @return IntentOperationList. PathIntent and/or ErrorIntent instances.
+ */
+ public IntentOperationList calcPathIntents(final IntentOperationList intentOpList, final IntentMap appIntents, final PathIntentMap pathIntents) {
+ IntentOperationList pathIntentOpList = new IntentOperationList();
+ HashMap<Switch, ConstrainedBFSTree> spfTrees = new HashMap<>();
- for (IntentOperation intentOp: intentOpList) {
- switch (intentOp.operator) {
- case ADD:
- if (!(intentOp.intent instanceof ShortestPathIntent)) {
- log.error("Unsupported intent type: {}", intentOp.intent.getClass().getName());
- pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
- ErrorType.UNSUPPORTED_INTENT,
- "Unsupported intent type.",
- intentOp.intent));
- continue;
- }
+ // TODO optimize locking of NetworkGraph
+ graph.acquireReadLock();
+ log.debug("NetworkGraph: {}", graph.getLinks());
- ShortestPathIntent spIntent = (ShortestPathIntent) intentOp.intent;
- Switch srcSwitch = graph.getSwitch(spIntent.getSrcSwitchDpid());
- Switch dstSwitch = graph.getSwitch(spIntent.getDstSwitchDpid());
- if (srcSwitch == null || dstSwitch == null) {
- log.error("Switch not found. src:{}, dst:{}, NetworkGraph:{}",
- spIntent.getSrcSwitchDpid(),
- spIntent.getDstSwitchDpid(),
- graph.getLinks());
- pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
- ErrorType.SWITCH_NOT_FOUND,
- "Switch not found.",
- spIntent));
- continue;
- }
+ for (IntentOperation intentOp : intentOpList) {
+ switch (intentOp.operator) {
+ case ADD:
+ if (!(intentOp.intent instanceof ShortestPathIntent)) {
+ log.error("Unsupported intent type: {}", intentOp.intent.getClass().getName());
+ pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
+ ErrorType.UNSUPPORTED_INTENT,
+ "Unsupported intent type.",
+ intentOp.intent));
+ continue;
+ }
- double bandwidth = 0.0;
- ConstrainedBFSTree tree = null;
- if (spIntent instanceof ConstrainedShortestPathIntent) {
- bandwidth = ((ConstrainedShortestPathIntent) intentOp.intent).getBandwidth();
- tree = new ConstrainedBFSTree(srcSwitch, pathIntents, bandwidth);
- }
- else {
- tree = spfTrees.get(srcSwitch);
- if (tree == null) {
- tree = new ConstrainedBFSTree(srcSwitch);
- spfTrees.put(srcSwitch, tree);
- }
- }
- Path path = tree.getPath(dstSwitch);
- if (path == null) {
- log.error("Path not found. Intent: {}, NetworkGraph:{}", spIntent.toString(), graph.getLinks());
- pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
- ErrorType.PATH_NOT_FOUND,
- "Path not found.",
- spIntent));
- continue;
- }
+ ShortestPathIntent spIntent = (ShortestPathIntent) intentOp.intent;
+ Switch srcSwitch = graph.getSwitch(spIntent.getSrcSwitchDpid());
+ Switch dstSwitch = graph.getSwitch(spIntent.getDstSwitchDpid());
+ if (srcSwitch == null || dstSwitch == null) {
+ log.error("Switch not found. src:{}, dst:{}, NetworkGraph:{}",
+ spIntent.getSrcSwitchDpid(),
+ spIntent.getDstSwitchDpid(),
+ graph.getLinks());
+ pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
+ ErrorType.SWITCH_NOT_FOUND,
+ "Switch not found.",
+ spIntent));
+ continue;
+ }
- // generate new path-intent ID
- String oldPathIntentId = spIntent.getPathIntentId();
- String newPathIntentId;
- if (oldPathIntentId == null)
- newPathIntentId = PathIntent.createFirstId(spIntent.getId());
- else {
- newPathIntentId = PathIntent.createNextId(oldPathIntentId);
+ double bandwidth = 0.0;
+ ConstrainedBFSTree tree = null;
+ if (spIntent instanceof ConstrainedShortestPathIntent) {
+ bandwidth = ((ConstrainedShortestPathIntent) intentOp.intent).getBandwidth();
+ tree = new ConstrainedBFSTree(srcSwitch, pathIntents, bandwidth);
+ } else {
+ tree = spfTrees.get(srcSwitch);
+ if (tree == null) {
+ tree = new ConstrainedBFSTree(srcSwitch);
+ spfTrees.put(srcSwitch, tree);
+ }
+ }
+ Path path = tree.getPath(dstSwitch);
+ if (path == null) {
+ log.error("Path not found. Intent: {}, NetworkGraph:{}", spIntent.toString(), graph.getLinks());
+ pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
+ ErrorType.PATH_NOT_FOUND,
+ "Path not found.",
+ spIntent));
+ continue;
+ }
- // Request removal of low-level intent if it exists.
- pathIntentOpList.add(Operator.REMOVE, new Intent(oldPathIntentId));
- }
+ // generate new path-intent ID
+ String oldPathIntentId = spIntent.getPathIntentId();
+ String newPathIntentId;
+ if (oldPathIntentId == null)
+ newPathIntentId = PathIntent.createFirstId(spIntent.getId());
+ else {
+ newPathIntentId = PathIntent.createNextId(oldPathIntentId);
- // create new path-intent
- PathIntent pathIntent = new PathIntent(newPathIntentId, path, bandwidth, spIntent);
- pathIntent.setState(IntentState.INST_REQ);
- spIntent.setPathIntent(pathIntent);
- pathIntentOpList.add(Operator.ADD, pathIntent);
+ // Request removal of low-level intent if it exists.
+ pathIntentOpList.add(Operator.REMOVE, new Intent(oldPathIntentId));
+ }
- break;
- case REMOVE:
- ShortestPathIntent targetAppIntent = (ShortestPathIntent) appIntents.getIntent(intentOp.intent.getId());
- if (targetAppIntent != null) {
- String pathIntentId = targetAppIntent.getPathIntentId();
- if (pathIntentId != null) {
- Intent targetPathIntent = pathIntents.getIntent(pathIntentId);
- if (targetPathIntent != null) {
- pathIntentOpList.add(Operator.REMOVE, targetPathIntent);
- }
- }
- }
- break;
- case ERROR:
- // just ignore
- break;
- }
- }
- // TODO optimize locking of NetworkGraph
- graph.releaseReadLock();
+ // create new path-intent
+ PathIntent pathIntent = new PathIntent(newPathIntentId, path, bandwidth, spIntent);
+ pathIntent.setState(IntentState.INST_REQ);
+ spIntent.setPathIntent(pathIntent);
+ pathIntentOpList.add(Operator.ADD, pathIntent);
- return pathIntentOpList;
- }
+ break;
+ case REMOVE:
+ ShortestPathIntent targetAppIntent = (ShortestPathIntent) appIntents.getIntent(intentOp.intent.getId());
+ if (targetAppIntent != null) {
+ String pathIntentId = targetAppIntent.getPathIntentId();
+ if (pathIntentId != null) {
+ Intent targetPathIntent = pathIntents.getIntent(pathIntentId);
+ if (targetPathIntent != null) {
+ pathIntentOpList.add(Operator.REMOVE, targetPathIntent);
+ }
+ }
+ }
+ break;
+ case ERROR:
+ // just ignore
+ break;
+ }
+ }
+ // TODO optimize locking of NetworkGraph
+ graph.releaseReadLock();
+
+ return pathIntentOpList;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
index 8c219c2..bacb5a3 100755
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
@@ -41,367 +41,365 @@
* @author Toshio Koide (t-koide@onlab.us)
*/
public class PathCalcRuntimeModule implements IFloodlightModule, IPathCalcRuntimeService, INetworkGraphListener, IEventChannelListener<Long, IntentStateList> {
- class PerfLog {
- private String step;
- private long time;
+ class PerfLog {
+ private String step;
+ private long time;
- public PerfLog(String step) {
- this.step = step;
- this.time = System.nanoTime();
- }
+ public PerfLog(String step) {
+ this.step = step;
+ this.time = System.nanoTime();
+ }
- public void logThis() {
- log.error("Time:{}, Step:{}", time, step);
- }
- }
- class PerfLogger {
- private LinkedList<PerfLog> logData = new LinkedList<>();
+ public void logThis() {
+ log.error("Time:{}, Step:{}", time, step);
+ }
+ }
- public PerfLogger(String logPhase) {
- log("start_" + logPhase);
- }
+ class PerfLogger {
+ private LinkedList<PerfLog> logData = new LinkedList<>();
- public void log(String step) {
- logData.add(new PerfLog(step));
- }
+ public PerfLogger(String logPhase) {
+ log("start_" + logPhase);
+ }
- public void flushLog() {
- log("finish");
- for (PerfLog log: logData) {
- log.logThis();
- }
- logData.clear();
- }
- }
- private PathCalcRuntime runtime;
- private IDatagridService datagridService;
- private INetworkGraphService networkGraphService;
- private IntentMap highLevelIntents;
- private PathIntentMap pathIntents;
- private IControllerRegistryService controllerRegistry;
- private PersistIntent persistIntent;
+ public void log(String step) {
+ logData.add(new PerfLog(step));
+ }
- private IEventChannel<Long, IntentOperationList> opEventChannel;
- private final ReentrantLock lock = new ReentrantLock();
- private HashSet<LinkEvent> unmatchedLinkEvents = new HashSet<>();
- private static final String INTENT_OP_EVENT_CHANNEL_NAME = "onos.pathintent";
- private static final String INTENT_STATE_EVENT_CHANNEL_NAME = "onos.pathintent_state";
- private static final Logger log = LoggerFactory.getLogger(PathCalcRuntimeModule.class);
+ public void flushLog() {
+ log("finish");
+ for (PerfLog log : logData) {
+ log.logThis();
+ }
+ logData.clear();
+ }
+ }
- // ================================================================================
- // private methods
- // ================================================================================
+ private PathCalcRuntime runtime;
+ private IDatagridService datagridService;
+ private INetworkGraphService networkGraphService;
+ private IntentMap highLevelIntents;
+ private PathIntentMap pathIntents;
+ private IControllerRegistryService controllerRegistry;
+ private PersistIntent persistIntent;
- private void reroutePaths(Collection<Intent> oldPaths) {
- if (oldPaths == null || oldPaths.isEmpty())
- return;
+ private IEventChannel<Long, IntentOperationList> opEventChannel;
+ private final ReentrantLock lock = new ReentrantLock();
+ private HashSet<LinkEvent> unmatchedLinkEvents = new HashSet<>();
+ private static final String INTENT_OP_EVENT_CHANNEL_NAME = "onos.pathintent";
+ private static final String INTENT_STATE_EVENT_CHANNEL_NAME = "onos.pathintent_state";
+ private static final Logger log = LoggerFactory.getLogger(PathCalcRuntimeModule.class);
- IntentOperationList reroutingOperation = new IntentOperationList();
- for (Intent intent : oldPaths) {
- PathIntent pathIntent = (PathIntent) intent;
- if (pathIntent.isPathFrozen())
- continue;
- if (pathIntent.getState().equals(IntentState.INST_ACK) && // XXX: path intents in flight
- !reroutingOperation.contains(pathIntent.getParentIntent())) {
- reroutingOperation.add(Operator.ADD, pathIntent.getParentIntent());
- }
- }
- executeIntentOperations(reroutingOperation);
- }
+ // ================================================================================
+ // private methods
+ // ================================================================================
+
+ private void reroutePaths(Collection<Intent> oldPaths) {
+ if (oldPaths == null || oldPaths.isEmpty())
+ return;
+
+ IntentOperationList reroutingOperation = new IntentOperationList();
+ for (Intent intent : oldPaths) {
+ PathIntent pathIntent = (PathIntent) intent;
+ if (pathIntent.isPathFrozen())
+ continue;
+ if (pathIntent.getState().equals(IntentState.INST_ACK) && // XXX: path intents in flight
+ !reroutingOperation.contains(pathIntent.getParentIntent())) {
+ reroutingOperation.add(Operator.ADD, pathIntent.getParentIntent());
+ }
+ }
+ executeIntentOperations(reroutingOperation);
+ }
- // ================================================================================
- // IFloodlightModule implementations
- // ================================================================================
+ // ================================================================================
+ // IFloodlightModule implementations
+ // ================================================================================
- @Override
- public Collection<Class<? extends IFloodlightService>> getModuleServices() {
- Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(1);
- l.add(IPathCalcRuntimeService.class);
- return l;
- }
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+ Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(1);
+ l.add(IPathCalcRuntimeService.class);
+ return l;
+ }
- @Override
- public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
- Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<>();
- m.put(IPathCalcRuntimeService.class, this);
- return m;
- }
+ @Override
+ public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
+ Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<>();
+ m.put(IPathCalcRuntimeService.class, this);
+ return m;
+ }
- @Override
- public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
- Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(2);
- l.add(IDatagridService.class);
- l.add(INetworkGraphService.class);
- return l;
- }
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+ Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(2);
+ l.add(IDatagridService.class);
+ l.add(INetworkGraphService.class);
+ return l;
+ }
- @Override
- public void init(FloodlightModuleContext context) throws FloodlightModuleException {
- datagridService = context.getServiceImpl(IDatagridService.class);
- networkGraphService = context.getServiceImpl(INetworkGraphService.class);
- controllerRegistry = context.getServiceImpl(IControllerRegistryService.class);
- }
+ @Override
+ public void init(FloodlightModuleContext context) throws FloodlightModuleException {
+ datagridService = context.getServiceImpl(IDatagridService.class);
+ networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+ controllerRegistry = context.getServiceImpl(IControllerRegistryService.class);
+ }
- @Override
- public void startUp(FloodlightModuleContext context) {
- highLevelIntents = new IntentMap();
- runtime = new PathCalcRuntime(networkGraphService.getNetworkGraph());
- pathIntents = new PathIntentMap();
- opEventChannel = datagridService.createChannel(INTENT_OP_EVENT_CHANNEL_NAME, Long.class, IntentOperationList.class);
- datagridService.addListener(INTENT_STATE_EVENT_CHANNEL_NAME, this, Long.class, IntentStateList.class);
- networkGraphService.registerNetworkGraphListener(this);
- persistIntent = new PersistIntent(controllerRegistry, networkGraphService);
- }
+ @Override
+ public void startUp(FloodlightModuleContext context) {
+ highLevelIntents = new IntentMap();
+ runtime = new PathCalcRuntime(networkGraphService.getNetworkGraph());
+ pathIntents = new PathIntentMap();
+ opEventChannel = datagridService.createChannel(INTENT_OP_EVENT_CHANNEL_NAME, Long.class, IntentOperationList.class);
+ datagridService.addListener(INTENT_STATE_EVENT_CHANNEL_NAME, this, Long.class, IntentStateList.class);
+ networkGraphService.registerNetworkGraphListener(this);
+ persistIntent = new PersistIntent(controllerRegistry, networkGraphService);
+ }
- // ================================================================================
- // IPathCalcRuntimeService implementations
- // ================================================================================
+ // ================================================================================
+ // IPathCalcRuntimeService implementations
+ // ================================================================================
- @Override
- public IntentOperationList executeIntentOperations(IntentOperationList list) {
- if (list == null || list.size() == 0)
- return null;
- PerfLogger p = new PerfLogger("executeIntentOperations_" + list.get(0).operator);
+ @Override
+ public IntentOperationList executeIntentOperations(IntentOperationList list) {
+ if (list == null || list.size() == 0)
+ return null;
+ PerfLogger p = new PerfLogger("executeIntentOperations_" + list.get(0).operator);
- lock.lock(); // TODO optimize locking using smaller steps
- try {
- // update the map of high-level intents
- p.log("begin_updateInMemoryIntents");
- highLevelIntents.executeOperations(list);
+ lock.lock(); // TODO optimize locking using smaller steps
+ try {
+ // update the map of high-level intents
+ p.log("begin_updateInMemoryIntents");
+ highLevelIntents.executeOperations(list);
- // change states of high-level intents
- IntentStateList states = new IntentStateList();
- for (IntentOperation op : list) {
- switch (op.operator) {
- case ADD:
- switch (op.intent.getState()) {
- case CREATED:
- states.put(op.intent.getId(), IntentState.INST_REQ);
- break;
- case INST_ACK:
- states.put(op.intent.getId(), IntentState.REROUTE_REQ);
- break;
- default:
- break;
- }
- break;
- case REMOVE:
- switch (op.intent.getState()) {
- case CREATED:
- states.put(op.intent.getId(), IntentState.DEL_REQ);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
- highLevelIntents.changeStates(states);
- p.log("end_updateInMemoryIntents");
+ // change states of high-level intents
+ IntentStateList states = new IntentStateList();
+ for (IntentOperation op : list) {
+ switch (op.operator) {
+ case ADD:
+ switch (op.intent.getState()) {
+ case CREATED:
+ states.put(op.intent.getId(), IntentState.INST_REQ);
+ break;
+ case INST_ACK:
+ states.put(op.intent.getId(), IntentState.REROUTE_REQ);
+ break;
+ default:
+ break;
+ }
+ break;
+ case REMOVE:
+ switch (op.intent.getState()) {
+ case CREATED:
+ states.put(op.intent.getId(), IntentState.DEL_REQ);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ highLevelIntents.changeStates(states);
+ p.log("end_updateInMemoryIntents");
- // calculate path-intents (low-level operations)
- p.log("begin_calcPathIntents");
- IntentOperationList pathIntentOperations = runtime.calcPathIntents(list, highLevelIntents, pathIntents);
- p.log("end_calcPathIntents");
+ // calculate path-intents (low-level operations)
+ p.log("begin_calcPathIntents");
+ IntentOperationList pathIntentOperations = runtime.calcPathIntents(list, highLevelIntents, pathIntents);
+ p.log("end_calcPathIntents");
- // persist calculated low-level operations into data store
- p.log("begin_persistPathIntents");
- long key = persistIntent.getKey();
- persistIntent.persistIfLeader(key, pathIntentOperations);
- p.log("end_persistPathIntents");
+ // persist calculated low-level operations into data store
+ p.log("begin_persistPathIntents");
+ long key = persistIntent.getKey();
+ persistIntent.persistIfLeader(key, pathIntentOperations);
+ p.log("end_persistPathIntents");
- // remove error-intents and reflect them to high-level intents
- p.log("begin_removeErrorIntents");
- states.clear();
- Iterator<IntentOperation> i = pathIntentOperations.iterator();
- while (i.hasNext()) {
- IntentOperation op = i.next();
- if (op.operator.equals(Operator.ERROR)) {
- states.put(op.intent.getId(), IntentState.INST_NACK);
- i.remove();
- }
- }
- highLevelIntents.changeStates(states);
- p.log("end_removeErrorIntents");
+ // remove error-intents and reflect them to high-level intents
+ p.log("begin_removeErrorIntents");
+ states.clear();
+ Iterator<IntentOperation> i = pathIntentOperations.iterator();
+ while (i.hasNext()) {
+ IntentOperation op = i.next();
+ if (op.operator.equals(Operator.ERROR)) {
+ states.put(op.intent.getId(), IntentState.INST_NACK);
+ i.remove();
+ }
+ }
+ highLevelIntents.changeStates(states);
+ p.log("end_removeErrorIntents");
- // update the map of path intents and publish the path operations
- p.log("begin_updateInMemoryPathIntents");
- pathIntents.executeOperations(pathIntentOperations);
- p.log("end_updateInMemoryPathIntents");
+ // update the map of path intents and publish the path operations
+ p.log("begin_updateInMemoryPathIntents");
+ pathIntents.executeOperations(pathIntentOperations);
+ p.log("end_updateInMemoryPathIntents");
- // XXX Demo special: add a complete path to remove operation
- p.log("begin_addPathToRemoveOperation");
- for (IntentOperation op: pathIntentOperations) {
- if(op.operator.equals(Operator.REMOVE)) {
- op.intent = pathIntents.getIntent(op.intent.getId());
- }
- if (op.intent instanceof PathIntent) {
- log.debug("operation: {}, intent:{}", op.operator, op.intent);
- }
- }
- p.log("end_addPathToRemoveOperation");
+ // XXX Demo special: add a complete path to remove operation
+ p.log("begin_addPathToRemoveOperation");
+ for (IntentOperation op : pathIntentOperations) {
+ if (op.operator.equals(Operator.REMOVE)) {
+ op.intent = pathIntents.getIntent(op.intent.getId());
+ }
+ if (op.intent instanceof PathIntent) {
+ log.debug("operation: {}, intent:{}", op.operator, op.intent);
+ }
+ }
+ p.log("end_addPathToRemoveOperation");
- // send notification
- p.log("begin_sendNotification");
- // XXX: Send notifications using the same key every time
- // and receive them by entryAdded() and entryUpdated()
- opEventChannel.addEntry(0L, pathIntentOperations);
- p.log("end_sendNotification");
- //opEventChannel.removeEntry(key);
- return pathIntentOperations;
- }
- finally {
- p.flushLog();
- lock.unlock();
- }
- }
+ // send notification
+ p.log("begin_sendNotification");
+ // XXX: Send notifications using the same key every time
+ // and receive them by entryAdded() and entryUpdated()
+ opEventChannel.addEntry(0L, pathIntentOperations);
+ p.log("end_sendNotification");
+ //opEventChannel.removeEntry(key);
+ return pathIntentOperations;
+ } finally {
+ p.flushLog();
+ lock.unlock();
+ }
+ }
- @Override
- public IntentMap getHighLevelIntents() {
- return highLevelIntents;
- }
+ @Override
+ public IntentMap getHighLevelIntents() {
+ return highLevelIntents;
+ }
- @Override
- public IntentMap getPathIntents() {
- return pathIntents;
- }
+ @Override
+ public IntentMap getPathIntents() {
+ return pathIntents;
+ }
- @Override
- public void purgeIntents() {
- highLevelIntents.purge();
- pathIntents.purge();
- }
+ @Override
+ public void purgeIntents() {
+ highLevelIntents.purge();
+ pathIntents.purge();
+ }
- // ================================================================================
- // INetworkGraphListener implementations
- // ================================================================================
+ // ================================================================================
+ // INetworkGraphListener implementations
+ // ================================================================================
- @Override
- public void networkGraphEvents(Collection<SwitchEvent> addedSwitchEvents,
- Collection<SwitchEvent> removedSwitchEvents,
- Collection<PortEvent> addedPortEvents,
- Collection<PortEvent> removedPortEvents,
- Collection<LinkEvent> addedLinkEvents,
- Collection<LinkEvent> removedLinkEvents,
- Collection<DeviceEvent> addedDeviceEvents,
- Collection<DeviceEvent> removedDeviceEvents) {
+ @Override
+ public void networkGraphEvents(Collection<SwitchEvent> addedSwitchEvents,
+ Collection<SwitchEvent> removedSwitchEvents,
+ Collection<PortEvent> addedPortEvents,
+ Collection<PortEvent> removedPortEvents,
+ Collection<LinkEvent> addedLinkEvents,
+ Collection<LinkEvent> removedLinkEvents,
+ Collection<DeviceEvent> addedDeviceEvents,
+ Collection<DeviceEvent> removedDeviceEvents) {
- PerfLogger p = new PerfLogger("networkGraphEvents");
- HashSet<Intent> affectedPaths = new HashSet<>();
+ PerfLogger p = new PerfLogger("networkGraphEvents");
+ HashSet<Intent> affectedPaths = new HashSet<>();
- boolean rerouteAll = false;
- for(LinkEvent le : addedLinkEvents) {
- LinkEvent rev = new LinkEvent(le.getDst().getDpid(), le.getDst().getNumber(), le.getSrc().getDpid(), le.getSrc().getNumber());
- if(unmatchedLinkEvents.contains(rev)) {
- rerouteAll = true;
- unmatchedLinkEvents.remove(rev);
- log.debug("Found matched LinkEvent: {} {}", rev, le);
- }
- else {
- unmatchedLinkEvents.add(le);
- log.debug("Adding unmatched LinkEvent: {}", le);
- }
- }
- for(LinkEvent le : removedLinkEvents) {
- if (unmatchedLinkEvents.contains(le)) {
- unmatchedLinkEvents.remove(le);
- log.debug("Removing LinkEvent: {}", le);
- }
- }
- if(unmatchedLinkEvents.size() > 0) {
- log.debug("Unmatched link events: {} events", unmatchedLinkEvents.size());
- }
+ boolean rerouteAll = false;
+ for (LinkEvent le : addedLinkEvents) {
+ LinkEvent rev = new LinkEvent(le.getDst().getDpid(), le.getDst().getNumber(), le.getSrc().getDpid(), le.getSrc().getNumber());
+ if (unmatchedLinkEvents.contains(rev)) {
+ rerouteAll = true;
+ unmatchedLinkEvents.remove(rev);
+ log.debug("Found matched LinkEvent: {} {}", rev, le);
+ } else {
+ unmatchedLinkEvents.add(le);
+ log.debug("Adding unmatched LinkEvent: {}", le);
+ }
+ }
+ for (LinkEvent le : removedLinkEvents) {
+ if (unmatchedLinkEvents.contains(le)) {
+ unmatchedLinkEvents.remove(le);
+ log.debug("Removing LinkEvent: {}", le);
+ }
+ }
+ if (unmatchedLinkEvents.size() > 0) {
+ log.debug("Unmatched link events: {} events", unmatchedLinkEvents.size());
+ }
- if ( rerouteAll ) {//addedLinkEvents.size() > 0) { // ||
-// addedPortEvents.size() > 0 ||
-// addedSwitchEvents.size() > 0) {
- p.log("begin_getAllIntents");
- affectedPaths.addAll(getPathIntents().getAllIntents());
- p.log("end_getAllIntents");
- }
- else if (removedSwitchEvents.size() > 0 ||
- removedLinkEvents.size() > 0 ||
- removedPortEvents.size() > 0) {
- p.log("begin_getIntentsByLink");
- for (LinkEvent linkEvent: removedLinkEvents)
- affectedPaths.addAll(pathIntents.getIntentsByLink(linkEvent));
- p.log("end_getIntentsByLink");
+ if (rerouteAll) {//addedLinkEvents.size() > 0) { // ||
+// addedPortEvents.size() > 0 ||
+// addedSwitchEvents.size() > 0) {
+ p.log("begin_getAllIntents");
+ affectedPaths.addAll(getPathIntents().getAllIntents());
+ p.log("end_getAllIntents");
+ } else if (removedSwitchEvents.size() > 0 ||
+ removedLinkEvents.size() > 0 ||
+ removedPortEvents.size() > 0) {
+ p.log("begin_getIntentsByLink");
+ for (LinkEvent linkEvent : removedLinkEvents)
+ affectedPaths.addAll(pathIntents.getIntentsByLink(linkEvent));
+ p.log("end_getIntentsByLink");
- p.log("begin_getIntentsByPort");
- for (PortEvent portEvent: removedPortEvents)
- affectedPaths.addAll(pathIntents.getIntentsByPort(portEvent.getDpid(), portEvent.getNumber()));
- p.log("end_getIntentsByPort");
+ p.log("begin_getIntentsByPort");
+ for (PortEvent portEvent : removedPortEvents)
+ affectedPaths.addAll(pathIntents.getIntentsByPort(portEvent.getDpid(), portEvent.getNumber()));
+ p.log("end_getIntentsByPort");
- p.log("begin_getIntentsByDpid");
- for (SwitchEvent switchEvent: removedSwitchEvents)
- affectedPaths.addAll(pathIntents.getIntentsByDpid(switchEvent.getDpid()));
- p.log("end_getIntentsByDpid");
- }
- p.log("begin_reroutePaths");
- reroutePaths(affectedPaths);
- p.log("end_reroutePaths");
- p.flushLog();
- }
+ p.log("begin_getIntentsByDpid");
+ for (SwitchEvent switchEvent : removedSwitchEvents)
+ affectedPaths.addAll(pathIntents.getIntentsByDpid(switchEvent.getDpid()));
+ p.log("end_getIntentsByDpid");
+ }
+ p.log("begin_reroutePaths");
+ reroutePaths(affectedPaths);
+ p.log("end_reroutePaths");
+ p.flushLog();
+ }
- // ================================================================================
- // IEventChannelListener implementations
- // ================================================================================
+ // ================================================================================
+ // IEventChannelListener implementations
+ // ================================================================================
- @Override
- public void entryAdded(IntentStateList value) {
- entryUpdated(value);
- }
+ @Override
+ public void entryAdded(IntentStateList value) {
+ entryUpdated(value);
+ }
- @Override
- public void entryRemoved(IntentStateList value) {
- // do nothing
- }
+ @Override
+ public void entryRemoved(IntentStateList value) {
+ // do nothing
+ }
- @Override
- public void entryUpdated(IntentStateList value) {
- // TODO draw state transition diagram in multiple ONOS instances and update this method
- PerfLogger p = new PerfLogger("entryUpdated");
- lock.lock(); // TODO optimize locking using smaller steps
- try {
- // reflect state changes of path-level intent into application-level intents
- p.log("begin_changeStateByNotification");
- IntentStateList highLevelIntentStates = new IntentStateList();
- IntentStateList pathIntentStates = new IntentStateList();
- for (Entry<String, IntentState> entry: value.entrySet()) {
- PathIntent pathIntent = (PathIntent) pathIntents.getIntent(entry.getKey());
- if (pathIntent == null) continue;
+ @Override
+ public void entryUpdated(IntentStateList value) {
+ // TODO draw state transition diagram in multiple ONOS instances and update this method
+ PerfLogger p = new PerfLogger("entryUpdated");
+ lock.lock(); // TODO optimize locking using smaller steps
+ try {
+ // reflect state changes of path-level intent into application-level intents
+ p.log("begin_changeStateByNotification");
+ IntentStateList highLevelIntentStates = new IntentStateList();
+ IntentStateList pathIntentStates = new IntentStateList();
+ for (Entry<String, IntentState> entry : value.entrySet()) {
+ PathIntent pathIntent = (PathIntent) pathIntents.getIntent(entry.getKey());
+ if (pathIntent == null) continue;
- Intent parentIntent = pathIntent.getParentIntent();
- if (parentIntent == null ||
- !(parentIntent instanceof ShortestPathIntent) ||
- !((ShortestPathIntent) parentIntent).getPathIntentId().equals(pathIntent.getId()))
- continue;
+ Intent parentIntent = pathIntent.getParentIntent();
+ if (parentIntent == null ||
+ !(parentIntent instanceof ShortestPathIntent) ||
+ !((ShortestPathIntent) parentIntent).getPathIntentId().equals(pathIntent.getId()))
+ continue;
- IntentState state = entry.getValue();
- switch (state) {
- //case INST_REQ:
- case INST_ACK:
- case INST_NACK:
- //case DEL_REQ:
- case DEL_ACK:
- case DEL_PENDING:
- highLevelIntentStates.put(parentIntent.getId(), state);
- pathIntentStates.put(entry.getKey(), entry.getValue());
- break;
- default:
- break;
- }
- }
- highLevelIntents.changeStates(highLevelIntentStates);
- pathIntents.changeStates(pathIntentStates);
- p.log("end_changeStateByNotification");
- }
- finally {
- p.flushLog();
- lock.unlock();
- }
- }
+ IntentState state = entry.getValue();
+ switch (state) {
+ //case INST_REQ:
+ case INST_ACK:
+ case INST_NACK:
+ //case DEL_REQ:
+ case DEL_ACK:
+ case DEL_PENDING:
+ highLevelIntentStates.put(parentIntent.getId(), state);
+ pathIntentStates.put(entry.getKey(), entry.getValue());
+ break;
+ default:
+ break;
+ }
+ }
+ highLevelIntents.changeStates(highLevelIntentStates);
+ pathIntents.changeStates(pathIntentStates);
+ p.log("end_changeStateByNotification");
+ } finally {
+ p.flushLog();
+ lock.unlock();
+ }
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PersistIntent.java b/src/main/java/net/onrc/onos/core/intent/runtime/PersistIntent.java
index 53be91c..e8c5dfc 100755
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PersistIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PersistIntent.java
@@ -28,7 +28,6 @@
import com.esotericsoftware.kryo.io.Output;
/**
- *
* @author nickkaranatsios
*/
public class PersistIntent {
@@ -90,7 +89,7 @@
ByteBuffer keyBytes = ByteBuffer.allocate(8).putLong(key);
byte[] buffer = stream.toByteArray();
int total = buffer.length;
- if ((total >= valueStoreLimit )) {
+ if ((total >= valueStoreLimit)) {
int writeCount = total / valueStoreLimit;
int remainder = total % valueStoreLimit;
int upperIndex = 0;
@@ -99,14 +98,14 @@
keyBytes.putLong(key);
keyBytes.flip();
upperIndex = (i * valueStoreLimit + valueStoreLimit) - 1;
- log.debug("writing using indexes {}:{}", (i*valueStoreLimit) ,upperIndex);
+ log.debug("writing using indexes {}:{}", (i * valueStoreLimit), upperIndex);
table.create(keyBytes.array(), Arrays.copyOfRange(buffer, i * valueStoreLimit, upperIndex));
}
if (remainder > 0) {
keyBytes.clear();
keyBytes.putLong(key);
keyBytes.flip();
- log.debug("writing using indexes {}:{}" ,upperIndex ,total);
+ log.debug("writing using indexes {}:{}", upperIndex, total);
table.create(keyBytes.array(), Arrays.copyOfRange(buffer, upperIndex + 1, total - 1));
}
} else {
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
index 09e50f6..7ea3bab 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
@@ -25,130 +25,125 @@
import org.slf4j.LoggerFactory;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
public class PlanCalcRuntime {
-// NetworkGraph graph;
+ // NetworkGraph graph;
private final static Logger log = LoggerFactory.getLogger(PlanCalcRuntime.class);
public PlanCalcRuntime(/*NetworkGraph graph*/) {
-// this.graph = graph;
+// this.graph = graph;
}
public List<Set<FlowEntry>> computePlan(IntentOperationList intentOps) {
- long start = System.nanoTime();
- List<Collection<FlowEntry>> flowEntries = computeFlowEntries(intentOps);
- long step1 = System.nanoTime();
- List<Set<FlowEntry>> plan = buildPhases(flowEntries);
- long step2 = System.nanoTime();
- log.error("MEASUREMENT: Compute flow entries: {} ns, Build phases: {} ns",
- (step1 - start), (step2 - step1));
- return plan;
+ long start = System.nanoTime();
+ List<Collection<FlowEntry>> flowEntries = computeFlowEntries(intentOps);
+ long step1 = System.nanoTime();
+ List<Set<FlowEntry>> plan = buildPhases(flowEntries);
+ long step2 = System.nanoTime();
+ log.error("MEASUREMENT: Compute flow entries: {} ns, Build phases: {} ns",
+ (step1 - start), (step2 - step1));
+ return plan;
}
private List<Collection<FlowEntry>> computeFlowEntries(IntentOperationList intentOps) {
- List<Collection<FlowEntry>> flowEntries = new LinkedList<>();
- for(IntentOperation i : intentOps) {
- if(!(i.intent instanceof PathIntent)) {
- log.warn("Not a path intent: {}", i);
- continue;
- }
- PathIntent intent = (PathIntent) i.intent;
- Intent parent = intent.getParentIntent();
- long srcPort, dstPort;
- long lastDstSw = -1, lastDstPort = -1;
- MACAddress srcMac, dstMac;
- if(parent instanceof ShortestPathIntent) {
- ShortestPathIntent pathIntent = (ShortestPathIntent) parent;
-// Switch srcSwitch = graph.getSwitch(pathIntent.getSrcSwitchDpid());
-// srcPort = srcSwitch.getPort(pathIntent.getSrcPortNumber());
- srcPort = pathIntent.getSrcPortNumber();
- srcMac = MACAddress.valueOf(pathIntent.getSrcMac());
- dstMac = MACAddress.valueOf(pathIntent.getDstMac());
-// Switch dstSwitch = graph.getSwitch(pathIntent.getDstSwitchDpid());
- lastDstSw = pathIntent.getDstSwitchDpid();
-// lastDstPort = dstSwitch.getPort(pathIntent.getDstPortNumber());
- lastDstPort = pathIntent.getDstPortNumber();
- }
- else {
- log.warn("Unsupported Intent: {}", parent);
- continue;
- }
- List<FlowEntry> entries = new ArrayList<>();
- for(LinkEvent linkEvent : intent.getPath()) {
-// Link link = graph.getLink(linkEvent.getSrc().getDpid(),
-// linkEvent.getSrc().getNumber(),
-// linkEvent.getDst().getDpid(),
-// linkEvent.getDst().getNumber());
-// Switch sw = link.getSrcSwitch();
- long sw = linkEvent.getSrc().getDpid();
-// dstPort = link.getSrcPort();
- dstPort = linkEvent.getSrc().getNumber();
- FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
- entries.add(fe);
-// srcPort = link.getDstPort();
- srcPort = linkEvent.getDst().getNumber();
- }
- if(lastDstSw >= 0 && lastDstPort >= 0) {
- //Switch sw = lastDstPort.getSwitch();
- long sw = lastDstSw;
- dstPort = lastDstPort;
- FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
- entries.add(fe);
- }
- // install flow entries in reverse order
- Collections.reverse(entries);
- flowEntries.add(entries);
- }
- return flowEntries;
+ List<Collection<FlowEntry>> flowEntries = new LinkedList<>();
+ for (IntentOperation i : intentOps) {
+ if (!(i.intent instanceof PathIntent)) {
+ log.warn("Not a path intent: {}", i);
+ continue;
+ }
+ PathIntent intent = (PathIntent) i.intent;
+ Intent parent = intent.getParentIntent();
+ long srcPort, dstPort;
+ long lastDstSw = -1, lastDstPort = -1;
+ MACAddress srcMac, dstMac;
+ if (parent instanceof ShortestPathIntent) {
+ ShortestPathIntent pathIntent = (ShortestPathIntent) parent;
+// Switch srcSwitch = graph.getSwitch(pathIntent.getSrcSwitchDpid());
+// srcPort = srcSwitch.getPort(pathIntent.getSrcPortNumber());
+ srcPort = pathIntent.getSrcPortNumber();
+ srcMac = MACAddress.valueOf(pathIntent.getSrcMac());
+ dstMac = MACAddress.valueOf(pathIntent.getDstMac());
+// Switch dstSwitch = graph.getSwitch(pathIntent.getDstSwitchDpid());
+ lastDstSw = pathIntent.getDstSwitchDpid();
+// lastDstPort = dstSwitch.getPort(pathIntent.getDstPortNumber());
+ lastDstPort = pathIntent.getDstPortNumber();
+ } else {
+ log.warn("Unsupported Intent: {}", parent);
+ continue;
+ }
+ List<FlowEntry> entries = new ArrayList<>();
+ for (LinkEvent linkEvent : intent.getPath()) {
+// Link link = graph.getLink(linkEvent.getSrc().getDpid(),
+// linkEvent.getSrc().getNumber(),
+// linkEvent.getDst().getDpid(),
+// linkEvent.getDst().getNumber());
+// Switch sw = link.getSrcSwitch();
+ long sw = linkEvent.getSrc().getDpid();
+// dstPort = link.getSrcPort();
+ dstPort = linkEvent.getSrc().getNumber();
+ FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
+ entries.add(fe);
+// srcPort = link.getDstPort();
+ srcPort = linkEvent.getDst().getNumber();
+ }
+ if (lastDstSw >= 0 && lastDstPort >= 0) {
+ //Switch sw = lastDstPort.getSwitch();
+ long sw = lastDstSw;
+ dstPort = lastDstPort;
+ FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
+ entries.add(fe);
+ }
+ // install flow entries in reverse order
+ Collections.reverse(entries);
+ flowEntries.add(entries);
+ }
+ return flowEntries;
}
private List<Set<FlowEntry>> buildPhases(List<Collection<FlowEntry>> flowEntries) {
- Map<FlowEntry, Integer> map = new HashMap<>();
- List<Set<FlowEntry>> plan = new ArrayList<>();
- for(Collection<FlowEntry> c : flowEntries) {
- for(FlowEntry e : c) {
- Integer i = map.get(e);
- if(i == null) {
- i = Integer.valueOf(0);
- }
- switch(e.getOperator()) {
- case ADD:
- i += 1;
- break;
- case REMOVE:
- i -= 1;
- break;
- default:
- break;
- }
- map.put(e, i);
- // System.out.println(e + " " + e.getOperator());
- }
- }
+ Map<FlowEntry, Integer> map = new HashMap<>();
+ List<Set<FlowEntry>> plan = new ArrayList<>();
+ for (Collection<FlowEntry> c : flowEntries) {
+ for (FlowEntry e : c) {
+ Integer i = map.get(e);
+ if (i == null) {
+ i = Integer.valueOf(0);
+ }
+ switch (e.getOperator()) {
+ case ADD:
+ i += 1;
+ break;
+ case REMOVE:
+ i -= 1;
+ break;
+ default:
+ break;
+ }
+ map.put(e, i);
+ // System.out.println(e + " " + e.getOperator());
+ }
+ }
- // really simple first iteration of plan
- //TODO: optimize the map in phases
- Set<FlowEntry> phase = new HashSet<>();
- for(FlowEntry e : map.keySet()) {
- Integer i = map.get(e);
- if(i == 0) {
- continue;
- }
- else if(i > 0) {
- e.setOperator(Operator.ADD);
- }
- else if(i < 0) {
- e.setOperator(Operator.REMOVE);
- }
- phase.add(e);
- }
- plan.add(phase);
+ // really simple first iteration of plan
+ //TODO: optimize the map in phases
+ Set<FlowEntry> phase = new HashSet<>();
+ for (FlowEntry e : map.keySet()) {
+ Integer i = map.get(e);
+ if (i == 0) {
+ continue;
+ } else if (i > 0) {
+ e.setOperator(Operator.ADD);
+ } else if (i < 0) {
+ e.setOperator(Operator.REMOVE);
+ }
+ phase.add(e);
+ }
+ plan.add(phase);
- return plan;
+ return plan;
}
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
index 102a754..b4904c1 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
@@ -45,154 +45,152 @@
@Override
public void init(FloodlightModuleContext context)
- throws FloodlightModuleException {
- floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
- networkGraph = context.getServiceImpl(INetworkGraphService.class);
- datagridService = context.getServiceImpl(IDatagridService.class);
- flowPusher = context.getServiceImpl(IFlowPusherService.class);
-// NetworkGraph graph = networkGraph.getNetworkGraph();
- planCalc = new PlanCalcRuntime();
- planInstall = new PlanInstallRuntime(floodlightProvider, flowPusher);
- eventListener = new EventListener();
+ throws FloodlightModuleException {
+ floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
+ networkGraph = context.getServiceImpl(INetworkGraphService.class);
+ datagridService = context.getServiceImpl(IDatagridService.class);
+ flowPusher = context.getServiceImpl(IFlowPusherService.class);
+// NetworkGraph graph = networkGraph.getNetworkGraph();
+ planCalc = new PlanCalcRuntime();
+ planInstall = new PlanInstallRuntime(floodlightProvider, flowPusher);
+ eventListener = new EventListener();
}
class EventListener extends Thread
- implements IEventChannelListener<Long, IntentOperationList> {
+ implements IEventChannelListener<Long, IntentOperationList> {
- private BlockingQueue<IntentOperationList> intentQueue = new LinkedBlockingQueue<>();
- private Long key = Long.valueOf(0);
+ private BlockingQueue<IntentOperationList> intentQueue = new LinkedBlockingQueue<>();
+ private Long key = Long.valueOf(0);
- @Override
- public void run() {
- while(true) {
- try {
- IntentOperationList intents = intentQueue.take();
- //TODO: consider draining the remaining intent lists
- // and processing in one big batch
-// List<IntentOperationList> remaining = new LinkedList<>();
-// intentQueue.drainTo(remaining);
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ IntentOperationList intents = intentQueue.take();
+ //TODO: consider draining the remaining intent lists
+ // and processing in one big batch
+// List<IntentOperationList> remaining = new LinkedList<>();
+// intentQueue.drainTo(remaining);
- processIntents(intents);
- } catch (InterruptedException e) {
- log.warn("Error taking from intent queue: {}", e.getMessage());
- }
- }
- }
+ processIntents(intents);
+ } catch (InterruptedException e) {
+ log.warn("Error taking from intent queue: {}", e.getMessage());
+ }
+ }
+ }
- private void processIntents(IntentOperationList intents) {
- log("start_processIntents");
- log.debug("Processing OperationList {}", intents);
- log("begin_computePlan");
- List<Set<FlowEntry>> plan = planCalc.computePlan(intents);
- log("end_computePlan");
- log.debug("Plan: {}", plan);
- log("begin_installPlan");
- boolean success = planInstall.installPlan(plan);
- log("end_installPlan");
+ private void processIntents(IntentOperationList intents) {
+ log("start_processIntents");
+ log.debug("Processing OperationList {}", intents);
+ log("begin_computePlan");
+ List<Set<FlowEntry>> plan = planCalc.computePlan(intents);
+ log("end_computePlan");
+ log.debug("Plan: {}", plan);
+ log("begin_installPlan");
+ boolean success = planInstall.installPlan(plan);
+ log("end_installPlan");
- log("begin_sendInstallNotif");
- sendNotifications(intents, true, success);
- log("end_sendInstallNotif");
- log("finish");
- }
+ log("begin_sendInstallNotif");
+ sendNotifications(intents, true, success);
+ log("end_sendInstallNotif");
+ log("finish");
+ }
- private void sendNotifications(IntentOperationList intents, boolean installed, boolean success) {
- IntentStateList states = new IntentStateList();
- for(IntentOperation i : intents) {
- IntentState newState;
- switch(i.operator) {
- case REMOVE:
- if(installed) {
- newState = success ? IntentState.DEL_ACK : IntentState.DEL_PENDING;
- }
- else {
- newState = IntentState.DEL_REQ;
- }
- break;
- case ADD:
- default:
- if(installed) {
- newState = success ? IntentState.INST_ACK : IntentState.INST_NACK;
- }
- else {
- newState = IntentState.INST_REQ;
- }
- break;
- }
- states.put(i.intent.getId(), newState);
- }
- intentStateChannel.addEntry(key, states);
- // XXX: Send notifications using the same key every time
- // and receive them by entryAdded() and entryUpdated()
- // key += 1;
- }
+ private void sendNotifications(IntentOperationList intents, boolean installed, boolean success) {
+ IntentStateList states = new IntentStateList();
+ for (IntentOperation i : intents) {
+ IntentState newState;
+ switch (i.operator) {
+ case REMOVE:
+ if (installed) {
+ newState = success ? IntentState.DEL_ACK : IntentState.DEL_PENDING;
+ } else {
+ newState = IntentState.DEL_REQ;
+ }
+ break;
+ case ADD:
+ default:
+ if (installed) {
+ newState = success ? IntentState.INST_ACK : IntentState.INST_NACK;
+ } else {
+ newState = IntentState.INST_REQ;
+ }
+ break;
+ }
+ states.put(i.intent.getId(), newState);
+ }
+ intentStateChannel.addEntry(key, states);
+ // XXX: Send notifications using the same key every time
+ // and receive them by entryAdded() and entryUpdated()
+ // key += 1;
+ }
- @Override
- public void entryAdded(IntentOperationList value) {
- entryUpdated(value);
- }
+ @Override
+ public void entryAdded(IntentOperationList value) {
+ entryUpdated(value);
+ }
- @Override
- public void entryRemoved(IntentOperationList value) {
- // This channel is a queue, so this method is not needed
- }
+ @Override
+ public void entryRemoved(IntentOperationList value) {
+ // This channel is a queue, so this method is not needed
+ }
- @Override
- public void entryUpdated(IntentOperationList value) {
- log("start_intentNotifRecv");
- log("begin_sendReceivedNotif");
- sendNotifications(value, false, false);
- log("end_sendReceivedNotif");
- log("finish");
+ @Override
+ public void entryUpdated(IntentOperationList value) {
+ log("start_intentNotifRecv");
+ log("begin_sendReceivedNotif");
+ sendNotifications(value, false, false);
+ log("end_sendReceivedNotif");
+ log("finish");
- log.debug("Added OperationList {}", value);
- try {
- intentQueue.put(value);
- } catch (InterruptedException e) {
- log.warn("Error putting to intent queue: {}", e.getMessage());
- }
- }
+ log.debug("Added OperationList {}", value);
+ try {
+ intentQueue.put(value);
+ } catch (InterruptedException e) {
+ log.warn("Error putting to intent queue: {}", e.getMessage());
+ }
+ }
}
public static void log(String step) {
- log.error("Time:{}, Step:{}", System.nanoTime(), step);
+ log.error("Time:{}, Step:{}", System.nanoTime(), step);
}
@Override
public void startUp(FloodlightModuleContext context) {
- // start subscriber
- datagridService.addListener(PATH_INTENT_CHANNEL_NAME,
- eventListener,
- Long.class,
- IntentOperationList.class);
- eventListener.start();
- // start publisher
- intentStateChannel = datagridService.createChannel(INTENT_STATE_EVENT_CHANNEL_NAME,
- Long.class,
- IntentStateList.class);
+ // start subscriber
+ datagridService.addListener(PATH_INTENT_CHANNEL_NAME,
+ eventListener,
+ Long.class,
+ IntentOperationList.class);
+ eventListener.start();
+ // start publisher
+ intentStateChannel = datagridService.createChannel(INTENT_STATE_EVENT_CHANNEL_NAME,
+ Long.class,
+ IntentStateList.class);
}
@Override
public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
- Collection<Class<? extends IFloodlightService>> l =
- new ArrayList<Class<? extends IFloodlightService>>();
- l.add(IFloodlightProviderService.class);
- l.add(INetworkGraphService.class);
- l.add(IDatagridService.class);
- l.add(IFlowPusherService.class);
- return l;
+ Collection<Class<? extends IFloodlightService>> l =
+ new ArrayList<Class<? extends IFloodlightService>>();
+ l.add(IFloodlightProviderService.class);
+ l.add(INetworkGraphService.class);
+ l.add(IDatagridService.class);
+ l.add(IFlowPusherService.class);
+ return l;
}
@Override
public Collection<Class<? extends IFloodlightService>> getModuleServices() {
- // no services, for now
- return null;
+ // no services, for now
+ return null;
}
@Override
public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
- // no services, for now
- return null;
+ // no services, for now
+ return null;
}
}
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
index 6d5c985..114e718 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
@@ -21,136 +21,137 @@
import org.slf4j.LoggerFactory;
/**
- *
* @author Brian O'Connor <bocon@onlab.us>
- *
*/
public class PlanInstallRuntime {
-// NetworkGraph graph;
+ // NetworkGraph graph;
IFlowPusherService pusher;
IFloodlightProviderService provider;
private final static Logger log = LoggerFactory.getLogger(PlanInstallRuntime.class);
public PlanInstallRuntime(//NetworkGraph graph,
- IFloodlightProviderService provider,
- IFlowPusherService pusher) {
-// this.graph = graph;
- this.provider = provider;
- this.pusher = pusher;
+ IFloodlightProviderService provider,
+ IFlowPusherService pusher) {
+// this.graph = graph;
+ this.provider = provider;
+ this.pusher = pusher;
}
-
+
private static class FlowModCount {
- IOFSwitch sw;
- long modFlows = 0;
- long delFlows = 0;
- long errors = 0;
-
- FlowModCount(IOFSwitch sw) {
- this.sw = sw;
- }
-
- void addFlowEntry(FlowEntry entry) {
- switch(entry.getOperator()){
- case ADD:
- modFlows++;
- break;
- case ERROR:
- errors++;
- break;
- case REMOVE:
- delFlows++;
- break;
- default:
- break;
- }
- }
-
- public String toString() {
- return "sw:" + sw.getStringId() + ": modify " + modFlows + " delete " + delFlows + " error " + errors;
- }
-
- static Map<IOFSwitch, FlowModCount> map = new HashMap<>();
- static void countFlowEntry(IOFSwitch sw, FlowEntry entry) {
- FlowModCount count = map.get(sw);
- if(count == null) {
- count = new FlowModCount(sw);
- map.put(sw, count);
- }
- count.addFlowEntry(entry);
- }
- static void startCount() {
- map.clear();
- }
- static void printCount() {
- String result = "FLOWMOD COUNT:\n";
- for(FlowModCount count : map.values()) {
- result += count.toString() + '\n';
- }
- if(map.values().isEmpty()) {
- result += "No flow mods installed\n";
- }
- log.error(result);
- }
+ IOFSwitch sw;
+ long modFlows = 0;
+ long delFlows = 0;
+ long errors = 0;
+
+ FlowModCount(IOFSwitch sw) {
+ this.sw = sw;
+ }
+
+ void addFlowEntry(FlowEntry entry) {
+ switch (entry.getOperator()) {
+ case ADD:
+ modFlows++;
+ break;
+ case ERROR:
+ errors++;
+ break;
+ case REMOVE:
+ delFlows++;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public String toString() {
+ return "sw:" + sw.getStringId() + ": modify " + modFlows + " delete " + delFlows + " error " + errors;
+ }
+
+ static Map<IOFSwitch, FlowModCount> map = new HashMap<>();
+
+ static void countFlowEntry(IOFSwitch sw, FlowEntry entry) {
+ FlowModCount count = map.get(sw);
+ if (count == null) {
+ count = new FlowModCount(sw);
+ map.put(sw, count);
+ }
+ count.addFlowEntry(entry);
+ }
+
+ static void startCount() {
+ map.clear();
+ }
+
+ static void printCount() {
+ String result = "FLOWMOD COUNT:\n";
+ for (FlowModCount count : map.values()) {
+ result += count.toString() + '\n';
+ }
+ if (map.values().isEmpty()) {
+ result += "No flow mods installed\n";
+ }
+ log.error(result);
+ }
}
public boolean installPlan(List<Set<FlowEntry>> plan) {
- long start = System.nanoTime();
- Map<Long,IOFSwitch> switches = provider.getSwitches();
-
- log.debug("IOFSwitches: {}", switches);
-
- FlowModCount.startCount();
- for(Set<FlowEntry> phase : plan) {
- Set<Pair<IOFSwitch, net.onrc.onos.core.util.FlowEntry>> entries = new HashSet<>();
- Set<IOFSwitch> modifiedSwitches = new HashSet<>();
-
- long step1 = System.nanoTime();
- // convert flow entries and create pairs
- for(FlowEntry entry : phase) {
- IOFSwitch sw = switches.get(entry.getSwitch());
- if(sw == null) {
- // no active switch, skip this flow entry
- log.debug("Skipping flow entry: {}", entry);
- continue;
- }
- entries.add(new Pair<>(sw, entry.getFlowEntry()));
- modifiedSwitches.add(sw);
- FlowModCount.countFlowEntry(sw, entry);
- }
- long step2 = System.nanoTime();
-
- // push flow entries to switches
- log.debug("Pushing flow entries: {}", entries);
- pusher.pushFlowEntries(entries);
- long step3 = System.nanoTime();
-
- // TODO: insert a barrier after each phase on each modifiedSwitch
- // TODO: wait for confirmation messages before proceeding
- List<Pair<IOFSwitch,OFMessageFuture<OFBarrierReply>>> barriers = new ArrayList<>();
- for(IOFSwitch sw : modifiedSwitches) {
- barriers.add(new Pair<>(sw, pusher.barrierAsync(sw)));
- }
- for(Pair<IOFSwitch,OFMessageFuture<OFBarrierReply>> pair : barriers) {
- IOFSwitch sw = pair.first;
- OFMessageFuture<OFBarrierReply> future = pair.second;
- try {
- future.get();
- } catch (InterruptedException | ExecutionException e) {
- log.error("Barrier message not received for sw: {}", sw);
- }
- }
- long step4 = System.nanoTime();
- log.error("MEASUREMENT: convert: {} ns, push: {} ns, barrierWait: {} ns",
- step2 - step1, step3 - step2, step4 - step3);
+ long start = System.nanoTime();
+ Map<Long, IOFSwitch> switches = provider.getSwitches();
- }
- long end = System.nanoTime();
- log.error("MEASUREMENT: Install plan: {} ns", (end-start));
- FlowModCount.printCount();
-
- // TODO: we assume that the plan installation succeeds for now
- return true;
+ log.debug("IOFSwitches: {}", switches);
+
+ FlowModCount.startCount();
+ for (Set<FlowEntry> phase : plan) {
+ Set<Pair<IOFSwitch, net.onrc.onos.core.util.FlowEntry>> entries = new HashSet<>();
+ Set<IOFSwitch> modifiedSwitches = new HashSet<>();
+
+ long step1 = System.nanoTime();
+ // convert flow entries and create pairs
+ for (FlowEntry entry : phase) {
+ IOFSwitch sw = switches.get(entry.getSwitch());
+ if (sw == null) {
+ // no active switch, skip this flow entry
+ log.debug("Skipping flow entry: {}", entry);
+ continue;
+ }
+ entries.add(new Pair<>(sw, entry.getFlowEntry()));
+ modifiedSwitches.add(sw);
+ FlowModCount.countFlowEntry(sw, entry);
+ }
+ long step2 = System.nanoTime();
+
+ // push flow entries to switches
+ log.debug("Pushing flow entries: {}", entries);
+ pusher.pushFlowEntries(entries);
+ long step3 = System.nanoTime();
+
+ // TODO: insert a barrier after each phase on each modifiedSwitch
+ // TODO: wait for confirmation messages before proceeding
+ List<Pair<IOFSwitch, OFMessageFuture<OFBarrierReply>>> barriers = new ArrayList<>();
+ for (IOFSwitch sw : modifiedSwitches) {
+ barriers.add(new Pair<>(sw, pusher.barrierAsync(sw)));
+ }
+ for (Pair<IOFSwitch, OFMessageFuture<OFBarrierReply>> pair : barriers) {
+ IOFSwitch sw = pair.first;
+ OFMessageFuture<OFBarrierReply> future = pair.second;
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ log.error("Barrier message not received for sw: {}", sw);
+ }
+ }
+ long step4 = System.nanoTime();
+ log.error("MEASUREMENT: convert: {} ns, push: {} ns, barrierWait: {} ns",
+ step2 - step1, step3 - step2, step4 - step3);
+
+ }
+ long end = System.nanoTime();
+ log.error("MEASUREMENT: Install plan: {} ns", (end - start));
+ FlowModCount.printCount();
+
+ // TODO: we assume that the plan installation succeeds for now
+ return true;
}
}