blob: 4c90a2393046bc9eac81b03e4818d0f1ee3053e1 [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;
Toshio Koide4f308732014-02-18 15:19:48 -080026
Toshio Koide0c9106d2014-02-19 15:26:38 -080027/**
28 * @author Toshio Koide (t-koide@onlab.us)
29 */
30public class PathCalcRuntimeModule implements IFloodlightModule, IPathCalcRuntimeService, INetworkGraphListener {
Toshio Koide4f308732014-02-18 15:19:48 -080031 private PathCalcRuntime runtime;
32 private IDatagridService datagridService;
Toshio Koide27ffd412014-02-18 19:15:27 -080033 private INetworkGraphService networkGraphService;
Toshio Koide4f308732014-02-18 15:19:48 -080034 private IntentMap highLevelIntents;
Toshio Koide27ffd412014-02-18 19:15:27 -080035 private PathIntentMap pathIntents;
36
Toshio Koide0c9106d2014-02-19 15:26:38 -080037 private IEventChannel<String, IntentOperationList> eventChannel;
Toshio Koide4f308732014-02-18 15:19:48 -080038 private static final String EVENT_CHANNEL_NAME = "onos.pathintent";
39
Toshio Koide0c9106d2014-02-19 15:26:38 -080040 private void reroutePaths(LinkEvent linkEvent) {
41 Collection<PathIntent> oldPaths = pathIntents.getIntentsByLink(linkEvent);
42 if (oldPaths == null) return;
43 IntentOperationList reroutingOperation = new IntentOperationList();
44 for (PathIntent pathIntent: oldPaths) {
45 // TODO use Operator.UPDATE instead of REMOVE and ADD in order to optimize
46 reroutingOperation.add(Operator.REMOVE, new Intent(pathIntent.getParentIntent().getId()));
47 reroutingOperation.add(Operator.ADD, pathIntent.getParentIntent());
48 }
49 executeIntentOperations(reroutingOperation);
50 }
Toshio Koide27ffd412014-02-18 19:15:27 -080051
Toshio Koide4f308732014-02-18 15:19:48 -080052 @Override
53 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
54 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>(1);
Toshio Koideeb90d912014-02-18 21:30:22 -080055 l.add(IPathCalcRuntimeService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080056 return l;
57 }
58
59 @Override
60 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
61 Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<>(1);
Toshio Koide27ffd412014-02-18 19:15:27 -080062 m.put(IPathCalcRuntimeService.class, this);
Toshio Koide4f308732014-02-18 15:19:48 -080063 return m;
64 }
65
66 @Override
67 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
68 Collection<Class<? extends IFloodlightService>> l = new ArrayList<>();
69 l.add(IDatagridService.class);
Toshio Koide27ffd412014-02-18 19:15:27 -080070 l.add(INetworkGraphService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080071 return l;
72 }
73
74 @Override
75 public void init(FloodlightModuleContext context) throws FloodlightModuleException {
76 datagridService = context.getServiceImpl(IDatagridService.class);
Toshio Koided9fa2a82014-02-19 17:35:18 -080077 networkGraphService = context.getServiceImpl(INetworkGraphService.class);
Toshio Koide4f308732014-02-18 15:19:48 -080078 }
79
80 @Override
81 public void startUp(FloodlightModuleContext context) {
Toshio Koideeb90d912014-02-18 21:30:22 -080082 highLevelIntents = new IntentMap();
83 runtime = new PathCalcRuntime(networkGraphService.getNetworkGraph());
Toshio Koide0c9106d2014-02-19 15:26:38 -080084 pathIntents = new PathIntentMap();
Toshio Koide4f308732014-02-18 15:19:48 -080085 eventChannel = datagridService.createChannel(
86 EVENT_CHANNEL_NAME,
Toshio Koide0c9106d2014-02-19 15:26:38 -080087 String.class,
Toshio Koide4f308732014-02-18 15:19:48 -080088 IntentOperationList.class);
Toshio Koide0c9106d2014-02-19 15:26:38 -080089 networkGraphService.registerNetworkGraphListener(this);
Toshio Koide4f308732014-02-18 15:19:48 -080090 }
Toshio Koide27ffd412014-02-18 19:15:27 -080091
92 @Override
93 public IntentOperationList executeIntentOperations(IntentOperationList list) {
94 highLevelIntents.executeOperations(list);
95 IntentOperationList pathIntentOperations = runtime.calcPathIntents(list, pathIntents);
Toshio Koide0c9106d2014-02-19 15:26:38 -080096 String key = "..."; // TODO generate key
97 System.out.println(pathIntentOperations);
Toshio Koide27ffd412014-02-18 19:15:27 -080098 pathIntents.executeOperations(pathIntentOperations);
Toshio Koide0c9106d2014-02-19 15:26:38 -080099 eventChannel.addEntry(key, pathIntentOperations);
Toshio Koide27ffd412014-02-18 19:15:27 -0800100 return pathIntentOperations;
101 }
102
103 @Override
104 public IntentMap getHighLevelIntents() {
Toshio Koide4f308732014-02-18 15:19:48 -0800105 return highLevelIntents;
106 }
Toshio Koide27ffd412014-02-18 19:15:27 -0800107
108 @Override
109 public IntentMap getPathIntents() {
110 return pathIntents;
111 }
112
113 @Override
Toshio Koide4f308732014-02-18 15:19:48 -0800114 public void purgeIntents() {
115 highLevelIntents.purge();
Toshio Koide27ffd412014-02-18 19:15:27 -0800116 pathIntents.purge();
Toshio Koide4f308732014-02-18 15:19:48 -0800117 }
Toshio Koide0c9106d2014-02-19 15:26:38 -0800118
119 @Override
120 public void putSwitchEvent(SwitchEvent switchEvent) {
121 // do nothing
122 }
123
124 @Override
125 public void removeSwitchEvent(SwitchEvent switchEvent) {
126 // do nothing
127 }
128
129 @Override
130 public void putPortEvent(PortEvent portEvent) {
131 // do nothing
132 }
133
134 @Override
135 public void removePortEvent(PortEvent portEvent) {
136 // do nothing
137 }
138
139 @Override
140 public void putLinkEvent(LinkEvent linkEvent) {
141 // do nothing
142 }
143
144 @Override
145 public void removeLinkEvent(LinkEvent linkEvent) {
146 reroutePaths(linkEvent);
147 }
148
149 @Override
150 public void putDeviceEvent(DeviceEvent deviceEvent) {
151 // do nothing
152 }
153
154 @Override
155 public void removeDeviceEvent(DeviceEvent deviceEvent) {
156 // do nothing
157 }
Toshio Koide4f308732014-02-18 15:19:48 -0800158}