blob: 201e97d36d5116051bdf6a5c24caa8c2a7017b27 [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 Koide4f308732014-02-18 15:19:48 -080011import net.onrc.onos.intent.IntentOperation;
Toshio Koided9fa2a82014-02-19 17:35:18 -080012import net.onrc.onos.intent.IntentOperation.Operator;
Toshio Koide4f308732014-02-18 15:19:48 -080013import net.onrc.onos.intent.IntentOperationList;
Toshio Koidec87810e2014-02-11 13:03:21 -080014import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080015import net.onrc.onos.intent.PathIntentMap;
Toshio Koidec87810e2014-02-11 13:03:21 -080016import net.onrc.onos.intent.ShortestPathIntent;
17import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
18import net.onrc.onos.ofcontroller.networkgraph.Path;
19import net.onrc.onos.ofcontroller.networkgraph.Switch;
20
Toshio Koideb39c9d32014-02-20 01:21:47 -080021import org.slf4j.Logger;
22import org.slf4j.LoggerFactory;
23
Toshio Koidec87810e2014-02-11 13:03:21 -080024/**
25 * @author Toshio Koide (t-koide@onlab.us)
26 */
Toshio Koide4f308732014-02-18 15:19:48 -080027public class PathCalcRuntime implements IFloodlightService {
28 private NetworkGraph graph;
Toshio Koideb39c9d32014-02-20 01:21:47 -080029 private final static Logger log = LoggerFactory.getLogger(PathCalcRuntime.class);
Toshio Koidec87810e2014-02-11 13:03:21 -080030 public PathCalcRuntime(NetworkGraph g) {
31 this.graph = g;
32 }
33
Toshio Koide27ffd412014-02-18 19:15:27 -080034 /**
35 * calculate shortest-path and constrained-shortest-path intents into low-level path intents
36 * @param intentOpList IntentOperationList having instances of ShortestPathIntent/ConstrainedShortestPathIntent
37 * @param pathIntents a set of current low-level intents
Toshio Koidedf2eab92014-02-20 11:24:59 -080038 * @return IntentOperationList. PathIntent and/or ErrorIntent instances.
Toshio Koide27ffd412014-02-18 19:15:27 -080039 */
Toshio Koidedf2eab92014-02-20 11:24:59 -080040 public IntentOperationList calcPathIntents(final IntentOperationList intentOpList, final PathIntentMap pathIntents) {
Toshio Koide27ffd412014-02-18 19:15:27 -080041 IntentOperationList pathIntentOpList = new IntentOperationList();
42 HashMap<Switch, ConstrainedBFSTree> spfTrees = new HashMap<>();
Toshio Koidec87810e2014-02-11 13:03:21 -080043
Toshio Koide27ffd412014-02-18 19:15:27 -080044 for (IntentOperation intentOp: intentOpList) {
45 switch (intentOp.operator) {
46 case ADD:
47 if (!(intentOp.intent instanceof ShortestPathIntent)) {
Toshio Koidedf2eab92014-02-20 11:24:59 -080048 log.error("Unsupported intent type: {}", intentOp.intent.getClass().getName());
49 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
50 ErrorType.UNSUPPORTED_INTENT,
51 "Unsupported intent type.",
52 intentOp.intent));
Toshio Koide27ffd412014-02-18 19:15:27 -080053 continue;
54 }
Toshio Koidec87810e2014-02-11 13:03:21 -080055
Toshio Koide27ffd412014-02-18 19:15:27 -080056 ShortestPathIntent spIntent = (ShortestPathIntent) intentOp.intent;
57 Switch srcSwitch = graph.getSwitch(spIntent.getSrcSwitchDpid());
58 Switch dstSwitch = graph.getSwitch(spIntent.getDstSwitchDpid());
59 if (srcSwitch == null || dstSwitch == null) {
Toshio Koideb39c9d32014-02-20 01:21:47 -080060 log.error("Switch not found: {}, {}",
61 spIntent.getSrcSwitchDpid(),
62 spIntent.getDstSwitchDpid());
Toshio Koidedf2eab92014-02-20 11:24:59 -080063 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
64 ErrorType.SWITCH_NOT_FOUND,
65 "Switch not found.",
66 intentOp.intent));
Toshio Koide27ffd412014-02-18 19:15:27 -080067 continue;
68 }
Toshio Koidec87810e2014-02-11 13:03:21 -080069
Toshio Koide27ffd412014-02-18 19:15:27 -080070 double bandwidth = 0.0;
71 ConstrainedBFSTree tree = null;
72 if (intentOp.intent instanceof ConstrainedShortestPathIntent) {
73 bandwidth = ((ConstrainedShortestPathIntent) intentOp.intent).getBandwidth();
74 tree = new ConstrainedBFSTree(srcSwitch, pathIntents, bandwidth);
75 }
76 else {
77 tree = spfTrees.get(srcSwitch);
78 if (tree == null) {
79 tree = new ConstrainedBFSTree(srcSwitch);
80 spfTrees.put(srcSwitch, tree);
81 }
82 }
83 Path path = tree.getPath(dstSwitch);
84 if (path == null) {
Toshio Koideb39c9d32014-02-20 01:21:47 -080085 log.error("Path not found: {}", intentOp.intent.toString());
Toshio Koidedf2eab92014-02-20 11:24:59 -080086 pathIntentOpList.add(Operator.ERROR, new ErrorIntent(
87 ErrorType.PATH_NOT_FOUND,
88 "Path not found.",
89 intentOp.intent));
Toshio Koide27ffd412014-02-18 19:15:27 -080090 continue;
91 }
92 PathIntent pathIntent = new PathIntent("pi" + intentOp.intent.getId(), path, bandwidth, intentOp.intent);
Toshio Koidedf2eab92014-02-20 11:24:59 -080093 pathIntentOpList.add(Operator.ADD, pathIntent);
Toshio Koide27ffd412014-02-18 19:15:27 -080094 break;
95 case REMOVE:
Toshio Koide0c9106d2014-02-19 15:26:38 -080096 pathIntentOpList.add(Operator.REMOVE, new Intent("pi" + intentOp.intent.getId()));
Toshio Koide27ffd412014-02-18 19:15:27 -080097 break;
Toshio Koidedf2eab92014-02-20 11:24:59 -080098 case ERROR:
99 // just ignore
100 break;
Toshio Koidec87810e2014-02-11 13:03:21 -0800101 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800102 }
Toshio Koide27ffd412014-02-18 19:15:27 -0800103 return pathIntentOpList;
Toshio Koidec87810e2014-02-11 13:03:21 -0800104 }
105}