blob: 3a9c607d896664fd820fb39807103ac235235911 [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;
6import java.util.Map;
7
8import net.floodlightcontroller.core.module.FloodlightModuleContext;
9import net.floodlightcontroller.core.module.FloodlightModuleException;
10import net.floodlightcontroller.core.module.IFloodlightModule;
11import net.floodlightcontroller.core.module.IFloodlightService;
12import net.onrc.onos.datagrid.IDatagridService;
13import net.onrc.onos.datagrid.IEventChannel;
Toshio Koide0c9106d2014-02-19 15:26:38 -080014import net.onrc.onos.intent.Intent;
Toshio Koide4f308732014-02-18 15:19:48 -080015import net.onrc.onos.intent.IntentMap;
Toshio Koide0c9106d2014-02-19 15:26:38 -080016import net.onrc.onos.intent.IntentOperation.Operator;
Toshio Koide4f308732014-02-18 15:19:48 -080017import net.onrc.onos.intent.IntentOperationList;
Toshio Koide0c9106d2014-02-19 15:26:38 -080018import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080019import net.onrc.onos.intent.PathIntentMap;
Toshio Koide0c9106d2014-02-19 15:26:38 -080020import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
21import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphListener;
Toshio Koide27ffd412014-02-18 19:15:27 -080022import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
Toshio Koide0c9106d2014-02-19 15:26:38 -080023import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
24import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
25import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080026import net.onrc.onos.intent.persist.PersistIntent;
27import net.onrc.onos.registry.controller.IControllerRegistryService;
Toshio Koide4f308732014-02-18 15:19:48 -080028
Toshio Koide0c9106d2014-02-19 15:26:38 -080029/**
30 * @author Toshio Koide (t-koide@onlab.us)
31 */
32public class PathCalcRuntimeModule implements IFloodlightModule, IPathCalcRuntimeService, INetworkGraphListener {
Toshio Koide4f308732014-02-18 15:19:48 -080033 private PathCalcRuntime runtime;
34 private IDatagridService datagridService;
Toshio Koide27ffd412014-02-18 19:15:27 -080035 private INetworkGraphService networkGraphService;
Toshio Koide4f308732014-02-18 15:19:48 -080036 private IntentMap highLevelIntents;
Toshio Koide27ffd412014-02-18 19:15:27 -080037 private PathIntentMap pathIntents;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080038 private IControllerRegistryService controllerRegistry;
39 private PersistIntent persistIntent;
Toshio Koide27ffd412014-02-18 19:15:27 -080040
Nick Karanatsios8abe7172014-02-19 20:31:48 -080041 private IEventChannel<Long, IntentOperationList> eventChannel;
Toshio Koide4f308732014-02-18 15:19:48 -080042 private static final String EVENT_CHANNEL_NAME = "onos.pathintent";
43
Toshio Koide0c9106d2014-02-19 15:26:38 -080044 private void reroutePaths(LinkEvent linkEvent) {
45 Collection<PathIntent> oldPaths = pathIntents.getIntentsByLink(linkEvent);
46 if (oldPaths == null) return;
47 IntentOperationList reroutingOperation = new IntentOperationList();
48 for (PathIntent pathIntent: oldPaths) {
49 // TODO use Operator.UPDATE instead of REMOVE and ADD in order to optimize
50 reroutingOperation.add(Operator.REMOVE, new Intent(pathIntent.getParentIntent().getId()));
51 reroutingOperation.add(Operator.ADD, pathIntent.getParentIntent());
52 }
53 executeIntentOperations(reroutingOperation);
54 }
Toshio Koide27ffd412014-02-18 19:15:27 -080055
Toshio Koide4f308732014-02-18 15:19:48 -080056 @Override
57 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
58 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(1);
Toshio Koideeb90d912014-02-18 21:30:22 -080059 l.add(IPathCalcRuntimeService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080060 return l;
61 }
62
63 @Override
64 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
65 Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<>(1);
Toshio Koide27ffd412014-02-18 19:15:27 -080066 m.put(IPathCalcRuntimeService.class, this);
Toshio Koide4f308732014-02-18 15:19:48 -080067 return m;
68 }
69
70 @Override
71 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
72 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>();
73 l.add(IDatagridService.class);
Toshio Koide27ffd412014-02-18 19:15:27 -080074 l.add(INetworkGraphService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080075 return l;
76 }
77
78 @Override
79 public void init(FloodlightModuleContext context) throws FloodlightModuleException {
80 datagridService = context.getServiceImpl(IDatagridService.class);
Toshio Koided9fa2a82014-02-19 17:35:18 -080081 networkGraphService = context.getServiceImpl(INetworkGraphService.class);
Nick Karanatsios8abe7172014-02-19 20:31:48 -080082 controllerRegistry = context.getServiceImpl(IControllerRegistryService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080083 }
84
85 @Override
86 public void startUp(FloodlightModuleContext context) {
Toshio Koideeb90d912014-02-18 21:30:22 -080087 highLevelIntents = new IntentMap();
88 runtime = new PathCalcRuntime(networkGraphService.getNetworkGraph());
Toshio Koide0c9106d2014-02-19 15:26:38 -080089 pathIntents = new PathIntentMap();
Toshio Koide4f308732014-02-18 15:19:48 -080090 eventChannel = datagridService.createChannel(
91 EVENT_CHANNEL_NAME,
Nick Karanatsios8abe7172014-02-19 20:31:48 -080092 Long.class,
Toshio Koide4f308732014-02-18 15:19:48 -080093 IntentOperationList.class);
Toshio Koide0c9106d2014-02-19 15:26:38 -080094 networkGraphService.registerNetworkGraphListener(this);
Nick Karanatsios8abe7172014-02-19 20:31:48 -080095 persistIntent = new PersistIntent(controllerRegistry, networkGraphService);
96
Toshio Koide4f308732014-02-18 15:19:48 -080097 }
Toshio Koide27ffd412014-02-18 19:15:27 -080098
99 @Override
100 public IntentOperationList executeIntentOperations(IntentOperationList list) {
101 highLevelIntents.executeOperations(list);
102 IntentOperationList pathIntentOperations = runtime.calcPathIntents(list, pathIntents);
Nick Karanatsios8abe7172014-02-19 20:31:48 -0800103 long key = persistIntent.getKey();
Toshio Koide0c9106d2014-02-19 15:26:38 -0800104 System.out.println(pathIntentOperations);
Toshio Koide27ffd412014-02-18 19:15:27 -0800105 pathIntents.executeOperations(pathIntentOperations);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800106 eventChannel.addEntry(key, pathIntentOperations);
Nick Karanatsios8abe7172014-02-19 20:31:48 -0800107 persistIntent.persistIfLeader(key, pathIntentOperations);
Toshio Koide27ffd412014-02-18 19:15:27 -0800108 return pathIntentOperations;
109 }
110
111 @Override
112 public IntentMap getHighLevelIntents() {
Toshio Koide4f308732014-02-18 15:19:48 -0800113 return highLevelIntents;
114 }
Toshio Koide27ffd412014-02-18 19:15:27 -0800115
116 @Override
117 public IntentMap getPathIntents() {
118 return pathIntents;
119 }
120
121 @Override
Toshio Koide4f308732014-02-18 15:19:48 -0800122 public void purgeIntents() {
123 highLevelIntents.purge();
Toshio Koide27ffd412014-02-18 19:15:27 -0800124 pathIntents.purge();
Toshio Koide4f308732014-02-18 15:19:48 -0800125 }
Toshio Koide0c9106d2014-02-19 15:26:38 -0800126
127 @Override
128 public void putSwitchEvent(SwitchEvent switchEvent) {
129 // do nothing
130 }
131
132 @Override
133 public void removeSwitchEvent(SwitchEvent switchEvent) {
134 // do nothing
135 }
136
137 @Override
138 public void putPortEvent(PortEvent portEvent) {
139 // do nothing
140 }
141
142 @Override
143 public void removePortEvent(PortEvent portEvent) {
144 // do nothing
145 }
146
147 @Override
148 public void putLinkEvent(LinkEvent linkEvent) {
149 // do nothing
150 }
151
152 @Override
153 public void removeLinkEvent(LinkEvent linkEvent) {
154 reroutePaths(linkEvent);
155 }
156
157 @Override
158 public void putDeviceEvent(DeviceEvent deviceEvent) {
159 // do nothing
160 }
161
162 @Override
163 public void removeDeviceEvent(DeviceEvent deviceEvent) {
164 // do nothing
165 }
Toshio Koide4f308732014-02-18 15:19:48 -0800166}