blob: 64d3def24e82fc88f2962c440a4b6e47203b18a5 [file] [log] [blame]
Toshio Koidec87810e2014-02-11 13:03:21 -08001package net.onrc.onos.intent.runtime;
2
Toshio Koide27ffd412014-02-18 19:15:27 -08003import java.util.HashMap;
Toshio Koidec87810e2014-02-11 13:03:21 -08004
Toshio Koide4f308732014-02-18 15:19:48 -08005import net.floodlightcontroller.core.module.IFloodlightService;
Toshio Koidec87810e2014-02-11 13:03:21 -08006import net.onrc.onos.intent.ConstrainedBFSTree;
7import net.onrc.onos.intent.ConstrainedShortestPathIntent;
Toshio Koidedf2eab92014-02-20 11:24:59 -08008import net.onrc.onos.intent.ErrorIntent;
9import net.onrc.onos.intent.ErrorIntent.ErrorType;
Toshio Koide0c9106d2014-02-19 15:26:38 -080010import net.onrc.onos.intent.Intent;
Toshio Koidea10c0372014-02-20 17:28:10 -080011import net.onrc.onos.intent.Intent.IntentState;
Toshio Koide4f308732014-02-18 15:19:48 -080012import net.onrc.onos.intent.IntentOperation;
Toshio Koided9fa2a82014-02-19 17:35:18 -080013import net.onrc.onos.intent.IntentOperation.Operator;
Toshio Koide4f308732014-02-18 15:19:48 -080014import net.onrc.onos.intent.IntentOperationList;
Toshio Koidec87810e2014-02-11 13:03:21 -080015import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080016import net.onrc.onos.intent.PathIntentMap;
Toshio Koidec87810e2014-02-11 13:03:21 -080017import net.onrc.onos.intent.ShortestPathIntent;
18import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
19import net.onrc.onos.ofcontroller.networkgraph.Path;
20import net.onrc.onos.ofcontroller.networkgraph.Switch;
21
Toshio Koideb39c9d32014-02-20 01:21:47 -080022import org.slf4j.Logger;
23import org.slf4j.LoggerFactory;
24
Toshio Koidec87810e2014-02-11 13:03:21 -080025/**
26 * @author Toshio Koide (t-koide@onlab.us)
27 */
Toshio Koide4f308732014-02-18 15:19:48 -080028public class PathCalcRuntime implements IFloodlightService {
29 private NetworkGraph graph;
Toshio Koideb39c9d32014-02-20 01:21:47 -080030 private final static Logger log = LoggerFactory.getLogger(PathCalcRuntime.class);
Toshio Koidec87810e2014-02-11 13:03:21 -080031 public PathCalcRuntime(NetworkGraph g) {
32 this.graph = g;
33 }
34
Toshio Koide27ffd412014-02-18 19:15:27 -080035 /**
36 * calculate shortest-path and constrained-shortest-path intents into low-level path intents
37 * @param intentOpList IntentOperationList having instances of ShortestPathIntent/ConstrainedShortestPathIntent
38 * @param pathIntents a set of current low-level intents
Toshio Koidedf2eab92014-02-20 11:24:59 -080039 * @return IntentOperationList. PathIntent and/or ErrorIntent instances.
Toshio Koide27ffd412014-02-18 19:15:27 -080040 */
Toshio Koidedf2eab92014-02-20 11:24:59 -080041 public IntentOperationList calcPathIntents(final IntentOperationList intentOpList, final PathIntentMap pathIntents) {
Toshio Koide27ffd412014-02-18 19:15:27 -080042 IntentOperationList pathIntentOpList = new IntentOperationList();
43 HashMap<Switch, ConstrainedBFSTree> spfTrees = new HashMap<>();
Toshio Koidec87810e2014-02-11 13:03:21 -080044
Toshio Koide59bc8ea2014-02-21 17:48:46 -080045 // TODO optimize locking of NetworkGraph
46 graph.acquireReadLock();
47
Toshio Koide27ffd412014-02-18 19:15:27 -080048 for (IntentOperation intentOp: intentOpList) {
49 switch (intentOp.operator) {
50 case ADD:
51 if (!(intentOp.intent instanceof ShortestPathIntent)) {
Toshio Koidedf2eab92014-02-20 11:24:59 -080052 log.error("Unsupported intent type: {}", intentOp.intent.getClass().getName());
53 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
54 ErrorType.UNSUPPORTED_INTENT,
55 "Unsupported intent type.",
56 intentOp.intent));
Toshio Koide27ffd412014-02-18 19:15:27 -080057 continue;
58 }
Toshio Koidec87810e2014-02-11 13:03:21 -080059
Toshio Koide27ffd412014-02-18 19:15:27 -080060 ShortestPathIntent spIntent = (ShortestPathIntent) intentOp.intent;
61 Switch srcSwitch = graph.getSwitch(spIntent.getSrcSwitchDpid());
62 Switch dstSwitch = graph.getSwitch(spIntent.getDstSwitchDpid());
63 if (srcSwitch == null || dstSwitch == null) {
Toshio Koideb39c9d32014-02-20 01:21:47 -080064 log.error("Switch not found: {}, {}",
65 spIntent.getSrcSwitchDpid(),
66 spIntent.getDstSwitchDpid());
Toshio Koidedf2eab92014-02-20 11:24:59 -080067 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
68 ErrorType.SWITCH_NOT_FOUND,
69 "Switch not found.",
Toshio Koidea10c0372014-02-20 17:28:10 -080070 spIntent));
Toshio Koide27ffd412014-02-18 19:15:27 -080071 continue;
72 }
Toshio Koidec87810e2014-02-11 13:03:21 -080073
Toshio Koide27ffd412014-02-18 19:15:27 -080074 double bandwidth = 0.0;
75 ConstrainedBFSTree tree = null;
Toshio Koidea10c0372014-02-20 17:28:10 -080076 if (spIntent instanceof ConstrainedShortestPathIntent) {
Toshio Koide27ffd412014-02-18 19:15:27 -080077 bandwidth = ((ConstrainedShortestPathIntent) intentOp.intent).getBandwidth();
78 tree = new ConstrainedBFSTree(srcSwitch, pathIntents, bandwidth);
79 }
80 else {
81 tree = spfTrees.get(srcSwitch);
82 if (tree == null) {
83 tree = new ConstrainedBFSTree(srcSwitch);
84 spfTrees.put(srcSwitch, tree);
85 }
86 }
87 Path path = tree.getPath(dstSwitch);
88 if (path == null) {
Toshio Koidea10c0372014-02-20 17:28:10 -080089 log.error("Path not found: {}", spIntent.toString());
Toshio Koidedf2eab92014-02-20 11:24:59 -080090 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
91 ErrorType.PATH_NOT_FOUND,
92 "Path not found.",
Toshio Koidea10c0372014-02-20 17:28:10 -080093 spIntent));
Toshio Koide27ffd412014-02-18 19:15:27 -080094 continue;
95 }
Toshio Koidea10c0372014-02-20 17:28:10 -080096
97 // generate new path-intent ID
98 String oldPathIntentId = spIntent.getPathIntentId();
99 String newPathIntentId;
100 if (oldPathIntentId == null)
101 newPathIntentId = PathIntent.createFirstId(spIntent.getId());
102 else {
103 newPathIntentId = PathIntent.createNextId(oldPathIntentId);
104
105 // Request removal of low-level intent if it exists.
106 pathIntentOpList.add(Operator.REMOVE, new Intent(oldPathIntentId));
107 }
108
109 // create new path-intent
110 PathIntent pathIntent = new PathIntent(newPathIntentId, path, bandwidth, spIntent);
111 pathIntent.setState(IntentState.INST_REQ);
112 spIntent.setPathIntent(pathIntent);
Toshio Koidedf2eab92014-02-20 11:24:59 -0800113 pathIntentOpList.add(Operator.ADD, pathIntent);
Toshio Koidea10c0372014-02-20 17:28:10 -0800114
Toshio Koide27ffd412014-02-18 19:15:27 -0800115 break;
116 case REMOVE:
Toshio Koidea10c0372014-02-20 17:28:10 -0800117 pathIntentOpList.add(Operator.REMOVE, new Intent(
118 ((ShortestPathIntent) intentOp.intent).getPathIntentId()));
Toshio Koide27ffd412014-02-18 19:15:27 -0800119 break;
Toshio Koidedf2eab92014-02-20 11:24:59 -0800120 case ERROR:
121 // just ignore
122 break;
Toshio Koidec87810e2014-02-11 13:03:21 -0800123 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800124 }
Toshio Koide59bc8ea2014-02-21 17:48:46 -0800125 // TODO optimize locking of NetworkGraph
126 graph.releaseReadLock();
127
Toshio Koide27ffd412014-02-18 19:15:27 -0800128 return pathIntentOpList;
Toshio Koidec87810e2014-02-11 13:03:21 -0800129 }
130}