blob: df927f6a69d864ad4b0fc5749d4e20b4989f0660 [file] [log] [blame]
Toshio Koide4f308732014-02-18 15:19:48 -08001package net.onrc.onos.intent.runtime;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.HashMap;
Toshio Koidedf2eab92014-02-20 11:24:59 -08006import java.util.Iterator;
Toshio Koide4f308732014-02-18 15:19:48 -08007import java.util.Map;
8
9import net.floodlightcontroller.core.module.FloodlightModuleContext;
10import net.floodlightcontroller.core.module.FloodlightModuleException;
11import net.floodlightcontroller.core.module.IFloodlightModule;
12import net.floodlightcontroller.core.module.IFloodlightService;
13import net.onrc.onos.datagrid.IDatagridService;
14import net.onrc.onos.datagrid.IEventChannel;
Toshio Koide0c9106d2014-02-19 15:26:38 -080015import net.onrc.onos.intent.Intent;
Toshio Koidedf2eab92014-02-20 11:24:59 -080016import net.onrc.onos.intent.Intent.IntentState;
Toshio Koide4f308732014-02-18 15:19:48 -080017import net.onrc.onos.intent.IntentMap;
Toshio Koidedf2eab92014-02-20 11:24:59 -080018import net.onrc.onos.intent.IntentOperation;
Toshio Koide0c9106d2014-02-19 15:26:38 -080019import net.onrc.onos.intent.IntentOperation.Operator;
Toshio Koide4f308732014-02-18 15:19:48 -080020import net.onrc.onos.intent.IntentOperationList;
Toshio Koide0c9106d2014-02-19 15:26:38 -080021import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080022import net.onrc.onos.intent.PathIntentMap;
Toshio Koidedf2eab92014-02-20 11:24:59 -080023import net.onrc.onos.intent.persist.PersistIntent;
Toshio Koide0c9106d2014-02-19 15:26:38 -080024import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
25import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphListener;
Toshio Koide27ffd412014-02-18 19:15:27 -080026import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
Toshio Koide0c9106d2014-02-19 15:26:38 -080027import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
28import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
29import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080030import net.onrc.onos.registry.controller.IControllerRegistryService;
Toshio Koide4f308732014-02-18 15:19:48 -080031
Toshio Koide0c9106d2014-02-19 15:26:38 -080032/**
33 * @author Toshio Koide (t-koide@onlab.us)
34 */
35public class PathCalcRuntimeModule implements IFloodlightModule, IPathCalcRuntimeService, INetworkGraphListener {
Toshio Koide4f308732014-02-18 15:19:48 -080036 private PathCalcRuntime runtime;
37 private IDatagridService datagridService;
Toshio Koide27ffd412014-02-18 19:15:27 -080038 private INetworkGraphService networkGraphService;
Toshio Koide4f308732014-02-18 15:19:48 -080039 private IntentMap highLevelIntents;
Toshio Koide27ffd412014-02-18 19:15:27 -080040 private PathIntentMap pathIntents;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080041 private IControllerRegistryService controllerRegistry;
42 private PersistIntent persistIntent;
Toshio Koide27ffd412014-02-18 19:15:27 -080043
Nick Karanatsios8abe7172014-02-19 20:31:48 -080044 private IEventChannel<Long, IntentOperationList> eventChannel;
Toshio Koide4f308732014-02-18 15:19:48 -080045 private static final String EVENT_CHANNEL_NAME = "onos.pathintent";
46
Toshio Koide0c9106d2014-02-19 15:26:38 -080047 private void reroutePaths(LinkEvent linkEvent) {
48 Collection<PathIntent> oldPaths = pathIntents.getIntentsByLink(linkEvent);
49 if (oldPaths == null) return;
50 IntentOperationList reroutingOperation = new IntentOperationList();
51 for (PathIntent pathIntent: oldPaths) {
52 // TODO use Operator.UPDATE instead of REMOVE and ADD in order to optimize
53 reroutingOperation.add(Operator.REMOVE, new Intent(pathIntent.getParentIntent().getId()));
54 reroutingOperation.add(Operator.ADD, pathIntent.getParentIntent());
55 }
56 executeIntentOperations(reroutingOperation);
57 }
Toshio Koide27ffd412014-02-18 19:15:27 -080058
Toshio Koide4f308732014-02-18 15:19:48 -080059 @Override
60 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
61 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(1);
Toshio Koideeb90d912014-02-18 21:30:22 -080062 l.add(IPathCalcRuntimeService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080063 return l;
64 }
65
66 @Override
67 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
68 Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<>(1);
Toshio Koide27ffd412014-02-18 19:15:27 -080069 m.put(IPathCalcRuntimeService.class, this);
Toshio Koide4f308732014-02-18 15:19:48 -080070 return m;
71 }
72
73 @Override
74 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
75 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>();
76 l.add(IDatagridService.class);
Toshio Koide27ffd412014-02-18 19:15:27 -080077 l.add(INetworkGraphService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080078 return l;
79 }
80
81 @Override
82 public void init(FloodlightModuleContext context) throws FloodlightModuleException {
83 datagridService = context.getServiceImpl(IDatagridService.class);
Toshio Koided9fa2a82014-02-19 17:35:18 -080084 networkGraphService = context.getServiceImpl(INetworkGraphService.class);
Nick Karanatsios8abe7172014-02-19 20:31:48 -080085 controllerRegistry = context.getServiceImpl(IControllerRegistryService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080086 }
87
88 @Override
89 public void startUp(FloodlightModuleContext context) {
Toshio Koideeb90d912014-02-18 21:30:22 -080090 highLevelIntents = new IntentMap();
91 runtime = new PathCalcRuntime(networkGraphService.getNetworkGraph());
Toshio Koide0c9106d2014-02-19 15:26:38 -080092 pathIntents = new PathIntentMap();
Toshio Koide4f308732014-02-18 15:19:48 -080093 eventChannel = datagridService.createChannel(
94 EVENT_CHANNEL_NAME,
Nick Karanatsios8abe7172014-02-19 20:31:48 -080095 Long.class,
Toshio Koide4f308732014-02-18 15:19:48 -080096 IntentOperationList.class);
Toshio Koide0c9106d2014-02-19 15:26:38 -080097 networkGraphService.registerNetworkGraphListener(this);
Nick Karanatsios8abe7172014-02-19 20:31:48 -080098 persistIntent = new PersistIntent(controllerRegistry, networkGraphService);
Toshio Koidedf2eab92014-02-20 11:24:59 -080099
Toshio Koide4f308732014-02-18 15:19:48 -0800100 }
Toshio Koide27ffd412014-02-18 19:15:27 -0800101
102 @Override
103 public IntentOperationList executeIntentOperations(IntentOperationList list) {
Toshio Koidedf2eab92014-02-20 11:24:59 -0800104 // update the map of high-level intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800105 highLevelIntents.executeOperations(list);
Toshio Koidedf2eab92014-02-20 11:24:59 -0800106
107 // prepare high-level intents' state changes
108 HashMap<String, IntentState> states = new HashMap<>();
109 for (IntentOperation op: list) {
110 String id = op.intent.getId();
111 states.put(id, IntentState.INST_REQ);
112 }
113
114 // calculate path-intents (low-level operations)
Toshio Koide27ffd412014-02-18 19:15:27 -0800115 IntentOperationList pathIntentOperations = runtime.calcPathIntents(list, pathIntents);
Toshio Koidedf2eab92014-02-20 11:24:59 -0800116
117 // persist calculated low-level operations
Nick Karanatsios8abe7172014-02-19 20:31:48 -0800118 long key = persistIntent.getKey();
Toshio Koidedf2eab92014-02-20 11:24:59 -0800119 persistIntent.persistIfLeader(key, pathIntentOperations);
120
121 // remove error-intents and reflect them to high-level intents
122 Iterator<IntentOperation> i = pathIntentOperations.iterator();
123 while (i.hasNext()) {
124 IntentOperation op = i.next();
125 if (op.operator.equals(Operator.ERROR)) {
126 states.put(op.intent.getId(), IntentState.INST_NACK);
127 i.remove();
128 }
129 }
130 highLevelIntents.changeStates(states);
131
132 // update the map of low-level intents and publish the low-level operations
Toshio Koide27ffd412014-02-18 19:15:27 -0800133 pathIntents.executeOperations(pathIntentOperations);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800134 eventChannel.addEntry(key, pathIntentOperations);
Toshio Koide27ffd412014-02-18 19:15:27 -0800135 return pathIntentOperations;
136 }
137
138 @Override
139 public IntentMap getHighLevelIntents() {
Toshio Koide4f308732014-02-18 15:19:48 -0800140 return highLevelIntents;
141 }
Toshio Koide27ffd412014-02-18 19:15:27 -0800142
143 @Override
144 public IntentMap getPathIntents() {
145 return pathIntents;
146 }
147
148 @Override
Toshio Koide4f308732014-02-18 15:19:48 -0800149 public void purgeIntents() {
150 highLevelIntents.purge();
Toshio Koide27ffd412014-02-18 19:15:27 -0800151 pathIntents.purge();
Toshio Koide4f308732014-02-18 15:19:48 -0800152 }
Toshio Koide0c9106d2014-02-19 15:26:38 -0800153
154 @Override
155 public void putSwitchEvent(SwitchEvent switchEvent) {
156 // do nothing
157 }
158
159 @Override
160 public void removeSwitchEvent(SwitchEvent switchEvent) {
161 // do nothing
162 }
163
164 @Override
165 public void putPortEvent(PortEvent portEvent) {
166 // do nothing
167 }
168
169 @Override
170 public void removePortEvent(PortEvent portEvent) {
171 // do nothing
172 }
173
174 @Override
175 public void putLinkEvent(LinkEvent linkEvent) {
176 // do nothing
177 }
178
179 @Override
180 public void removeLinkEvent(LinkEvent linkEvent) {
181 reroutePaths(linkEvent);
182 }
183
184 @Override
185 public void putDeviceEvent(DeviceEvent deviceEvent) {
186 // do nothing
187 }
188
189 @Override
190 public void removeDeviceEvent(DeviceEvent deviceEvent) {
191 // do nothing
192 }
Toshio Koide4f308732014-02-18 15:19:48 -0800193}