blob: 167583f474220b701a4965464b878bb834583d82 [file] [log] [blame]
Jonathan Hart4b5bbb52014-02-06 10:09:31 -08001package net.onrc.onos.ofcontroller.floodlightlistener;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.Map;
6
7import net.floodlightcontroller.core.IFloodlightProviderService;
8import net.floodlightcontroller.core.IOFSwitch;
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.ofcontroller.core.IOFSwitchPortListener;
15import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
16import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
17import net.onrc.onos.ofcontroller.networkgraph.FloodlightToOnosMappers;
18import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
19import net.onrc.onos.ofcontroller.networkgraph.LinkImpl;
20import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
Jonathan Hartfa01c242014-02-11 10:03:03 -080021import net.onrc.onos.ofcontroller.networkgraph.NetworkGraphDatastore;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080022import net.onrc.onos.ofcontroller.networkgraph.Switch;
Toshio Koide2f570c12014-02-06 16:55:32 -080023import net.onrc.onos.ofcontroller.util.Dpid;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080024import net.onrc.onos.registry.controller.IControllerRegistryService;
25
26import org.openflow.protocol.OFPhysicalPort;
Toshio Koide2f570c12014-02-06 16:55:32 -080027import org.slf4j.Logger;
28import org.slf4j.LoggerFactory;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080029
30/*
31 * I've created a copy of the NetworkGraphPublisher so I can integrate
32 * the new API with ONOS while still having the old NetworkGraphPublisher
33 * to reference. I've renamed to RCNetworkGraphPublisher.
34 * TODO Remove old NetworkGraphPublisher once the integration of the new
35 * API is complete.
36 * For now, we just write to the database and don't worry about sending
Toshio Koide2f570c12014-02-06 16:55:32 -080037 * notifications.
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080038 * TODO Send notification after each database write
39 */
40public class RCNetworkGraphPublisher implements /*IOFSwitchListener,*/
41 IOFSwitchPortListener,
42 ILinkDiscoveryListener,
43 IFloodlightModule {
Jonathan Hart47016712014-02-07 12:41:35 -080044 private static final Logger log = LoggerFactory.getLogger(RCNetworkGraphPublisher.class);
Yuta HIGUCHIcb951982014-02-11 13:31:44 -080045
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080046 private IFloodlightProviderService floodlightProvider;
47 private ILinkDiscoveryService linkDiscovery;
48 private IControllerRegistryService registryService;
49 private IDatagridService datagridService;
50 private INetworkGraphService networkGraphService;
Toshio Koide2f570c12014-02-06 16:55:32 -080051
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080052 private NetworkGraph networkGraph;
Jonathan Hartfa01c242014-02-11 10:03:03 -080053 private NetworkGraphDatastore southboundNetworkGraph;
Toshio Koide2f570c12014-02-06 16:55:32 -080054
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080055
56 @Override
57 public void linkDiscoveryUpdate(LDUpdate update) {
Toshio Koide2f570c12014-02-06 16:55:32 -080058
59 // TODO Move this sanity check when retrieving port to common place?
60 Switch srcSw = networkGraph.getSwitch(update.getSrc());
61 if (srcSw == null) {
62 log.error("Switch {} missing when adding Link {}",
63 new Dpid(update.getSrc()), update);
64 return;
65 }
66
67 Switch dstSw = networkGraph.getSwitch(update.getDst());
68 if (dstSw == null) {
69 log.error("Switch {} missing when adding Link {}",
70 new Dpid(update.getDst()), update);
71 return;
72 }
73
74 // XXX Is it correct to add Link object created with networkGraph to southboundNetworkGraph?
75 LinkImpl link = new LinkImpl(networkGraph,
76 srcSw.getPort((long) update.getSrcPort()),
77 dstSw.getPort((long) update.getDstPort()));
78
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080079 switch (update.getOperation()) {
80 case LINK_ADDED:
Yuta HIGUCHIcb951982014-02-11 13:31:44 -080081// southboundNetworkGraph.addLink(link);
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080082 /*
83 TopologyElement topologyElement =
84 new TopologyElement(update.getSrc(),
85 update.getSrcPort(),
86 update.getDst(),
87 update.getDstPort());
88 datagridService.notificationSendTopologyElementAdded(topologyElement);
89 */
90 break;
91 case LINK_UPDATED:
92 // I don't know what a LINK_UPDATED event is.
93 // We never use it.
94 break;
95 case LINK_REMOVED:
Yuta HIGUCHIcb951982014-02-11 13:31:44 -080096// southboundNetworkGraph.removeLink(link);
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080097 /*
98 TopologyElement topologyElement =
99 new TopologyElement(update.getSrc(),
100 update.getSrcPort(),
101 update.getDst(),
102 update.getDstPort());
103 datagridService.notificationSendTopologyElementRemoved(topologyElement);
104 */
105 break;
106 default:
107 break;
108 }
109 }
110
111 @Override
112 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
113 // TODO Auto-generated method stub
Toshio Koide2f570c12014-02-06 16:55:32 -0800114
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800115 }
116
117 @Override
118 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
119 // TODO Auto-generated method stub
Toshio Koide2f570c12014-02-06 16:55:32 -0800120
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800121 }
122
123 @Override
124 public void addedSwitch(IOFSwitch sw) {
125 // TODO Not very robust
126 if (!registryService.hasControl(sw.getId())) {
127 return;
128 }
Toshio Koide2f570c12014-02-06 16:55:32 -0800129
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800130 Switch onosSwitch = FloodlightToOnosMappers.map(networkGraph, sw);
Yuta HIGUCHIcb951982014-02-11 13:31:44 -0800131// southboundNetworkGraph.addSwitch(onosSwitch);
Toshio Koide2f570c12014-02-06 16:55:32 -0800132
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800133 /*
134 // TODO publish ADD_SWITCH event here
135 TopologyElement topologyElement =
136 new TopologyElement(sw.getId());
137 datagridService.notificationSendTopologyElementAdded(topologyElement);
138
139 // Publish: add the ports
140 // TODO: Add only ports that are UP?
141 for (OFPhysicalPort port : sw.getPorts()) {
142 TopologyElement topologyElementPort =
143 new TopologyElement(sw.getId(), port.getPortNumber());
144 datagridService.notificationSendTopologyElementAdded(topologyElementPort);
145
146 // Allow links to be discovered on this port now that it's
147 // in the database
148 linkDiscovery.RemoveFromSuppressLLDPs(sw.getId(), port.getPortNumber());
149 }
150
151 // Add all links that might be connected already
152 List<Link> links = linkStore.getLinks(HexString.toHexString(sw.getId()));
153 // Add all reverse links as well
154 List<Link> reverseLinks = linkStore.getReverseLinks(HexString.toHexString(sw.getId()));
155 links.addAll(reverseLinks);
156
157 // Publish: add the links
158 for (Link link : links) {
159 TopologyElement topologyElementLink =
160 new TopologyElement(link.getSrc(),
161 link.getSrcPort(),
162 link.getDst(),
163 link.getDstPort());
164 datagridService.notificationSendTopologyElementAdded(topologyElementLink);
165 */
166 }
167
168 @Override
169 public void removedSwitch(IOFSwitch sw) {
170 // TODO Auto-generated method stub
Toshio Koide2f570c12014-02-06 16:55:32 -0800171
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800172 }
173
174 @Override
175 public void switchPortChanged(Long switchId) {
176 // TODO Auto-generated method stub
Toshio Koide2f570c12014-02-06 16:55:32 -0800177
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800178 }
179
180 @Override
181 public String getName() {
182 // TODO Auto-generated method stub
183 return null;
184 }
185
186 /* *****************
187 * IFloodlightModule
188 * *****************/
Toshio Koide2f570c12014-02-06 16:55:32 -0800189
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800190 @Override
191 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
192 return null;
193 }
194
195 @Override
Toshio Koide2f570c12014-02-06 16:55:32 -0800196 public Map<Class<? extends IFloodlightService>, IFloodlightService>
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800197 getServiceImpls() {
198 return null;
199 }
200
201 @Override
202 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
203 Collection<Class<? extends IFloodlightService>> l =
204 new ArrayList<Class<? extends IFloodlightService>>();
205 l.add(IFloodlightProviderService.class);
206 l.add(ILinkDiscoveryService.class);
207 l.add(IControllerRegistryService.class);
208 l.add(IDatagridService.class);
209 l.add(INetworkGraphService.class);
210 return l;
211 }
212
213 @Override
214 public void init(FloodlightModuleContext context)
215 throws FloodlightModuleException {
216 floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
217 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
218 registryService = context.getServiceImpl(IControllerRegistryService.class);
219 datagridService = context.getServiceImpl(IDatagridService.class);
Toshio Koide2f570c12014-02-06 16:55:32 -0800220
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800221 networkGraphService = context.getServiceImpl(INetworkGraphService.class);
222 }
223
224 @Override
225 public void startUp(FloodlightModuleContext context) {
226 // TODO enable cleanup thread
227 floodlightProvider.addOFSwitchListener(this);
228 linkDiscovery.addListener(this);
Toshio Koide2f570c12014-02-06 16:55:32 -0800229
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800230 networkGraph = networkGraphService.getNetworkGraph();
231 southboundNetworkGraph = networkGraphService.getSouthboundNetworkGraph();
232 }
233}