blob: c0666b740b18a651ae5d9be070190cfd5de4a51f [file] [log] [blame]
yoshi0451f282013-11-22 15:48:55 -08001/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package net.onrc.onos.graph;
6
yoshi0451f282013-11-22 15:48:55 -08007import com.tinkerpop.blueprints.Vertex;
8import com.tinkerpop.frames.FramedGraph;
9import com.tinkerpop.frames.structures.FramedVertexIterable;
10import com.tinkerpop.gremlin.java.GremlinPipeline;
11import java.util.ArrayList;
12import java.util.Iterator;
13import java.util.List;
14import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects;
yoshitomob292c622013-11-23 14:35:58 -080015import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IBaseObject;
yoshi0451f282013-11-22 15:48:55 -080016import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
17import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
18import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
yoshitomob292c622013-11-23 14:35:58 -080019import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IIpv4Address;
yoshi0451f282013-11-22 15:48:55 -080020import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
21import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
22import net.onrc.onos.ofcontroller.core.ISwitchStorage;
yoshib3c83c12013-12-03 00:58:13 -080023import net.onrc.onos.ofcontroller.util.FlowEntryId;
yoshi0451f282013-11-22 15:48:55 -080024import net.onrc.onos.ofcontroller.util.FlowId;
25
26/**
27 *
28 * @author nickkaranatsios
29 */
30public abstract class DBOperation implements IDBOperation {
31
yoshic455c012013-11-27 10:35:50 -080032 protected DBConnection conn;
yoshi0451f282013-11-22 15:48:55 -080033
yoshi2dd767c2013-11-27 23:39:06 -080034 /**
35 * Search and get an active switch object with DPID.
36 * @param dpid DPID of the switch
37 */
yoshic455c012013-11-27 10:35:50 -080038 @Override
39 public ISwitchObject searchActiveSwitch(String dpid) {
40 ISwitchObject sw = searchSwitch(dpid);
41 if ((sw != null)
42 && sw.getState().equals(ISwitchStorage.SwitchState.ACTIVE.toString())) {
43 return sw;
44 }
45 return null;
46 }
yoshi2dd767c2013-11-27 23:39:06 -080047
48 /**
49 * Create a new switch and return the created switch object.
50 * @param dpid DPID of the switch
51 */
yoshic455c012013-11-27 10:35:50 -080052 @Override
53 public ISwitchObject newSwitch(final String dpid) {
yoshi89eacab2013-12-09 17:29:08 -080054 //System.out.println("newSwitch");
yoshic455c012013-11-27 10:35:50 -080055 ISwitchObject obj = (ISwitchObject) conn.getFramedGraph().addVertex(null, ISwitchObject.class);
56 if (obj != null) {
57 obj.setType("switch");
58 obj.setDPID(dpid);
59 }
60 return obj;
61 }
yoshi2dd767c2013-11-27 23:39:06 -080062
63 /**
64 * Get all switch objects.
65 */
yoshic455c012013-11-27 10:35:50 -080066 @Override
67 public Iterable<ISwitchObject> getAllSwitches() {
yoshi89eacab2013-12-09 17:29:08 -080068 //System.out.println("getAllSwitches");
yoshic455c012013-11-27 10:35:50 -080069 Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
70 return switches;
71 }
yoshi0451f282013-11-22 15:48:55 -080072
yoshi2dd767c2013-11-27 23:39:06 -080073 /**
74 * Get all inactive switch objects.
75 */
yoshic455c012013-11-27 10:35:50 -080076 @Override
77 public Iterable<ISwitchObject> getInactiveSwitches() {
yoshi89eacab2013-12-09 17:29:08 -080078 //System.out.println("getInactiveSwitches");
yoshic455c012013-11-27 10:35:50 -080079 Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
80 List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
yoshi0451f282013-11-22 15:48:55 -080081
yoshic455c012013-11-27 10:35:50 -080082 for (ISwitchObject sw : switches) {
83 if (sw.getState().equals(ISwitchStorage.SwitchState.INACTIVE.toString())) {
84 inactiveSwitches.add(sw);
85 }
86 }
87 return inactiveSwitches;
88 }
yoshi2dd767c2013-11-27 23:39:06 -080089
90 /**
91 * Get all flow entries objects where their switches are not updated.
92 */
yoshic455c012013-11-27 10:35:50 -080093 @Override
94 public Iterable<INetMapTopologyObjects.IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
95 //TODO: Should use an enum for flow_switch_state
96 return conn.getFramedGraph().getVertices("switch_state", "FE_SWITCH_NOT_UPDATED", INetMapTopologyObjects.IFlowEntry.class);
yoshi0451f282013-11-22 15:48:55 -080097
yoshic455c012013-11-27 10:35:50 -080098 }
yoshi0451f282013-11-22 15:48:55 -080099
yoshi2dd767c2013-11-27 23:39:06 -0800100 /**
101 * Remove specified switch.
102 * @param sw switch object to remove
103 */
yoshic455c012013-11-27 10:35:50 -0800104 @Override
105 public void removeSwitch(ISwitchObject sw) {
yoshi89eacab2013-12-09 17:29:08 -0800106 //System.out.println("removeSwitch");
yoshic455c012013-11-27 10:35:50 -0800107 conn.getFramedGraph().removeVertex(sw.asVertex());
108 }
yoshi0451f282013-11-22 15:48:55 -0800109
yoshic455c012013-11-27 10:35:50 -0800110 @Override
111 public IPortObject newPort(String dpid, Short portNum) {
yoshi89eacab2013-12-09 17:29:08 -0800112 //System.out.println("newPort");
yoshic455c012013-11-27 10:35:50 -0800113 IPortObject obj = (IPortObject) conn.getFramedGraph().addVertex(null, IPortObject.class);
114 if (obj != null) {
115 obj.setType("port");
116 String id = dpid + portNum.toString();
117 obj.setPortId(id);
118 obj.setNumber(portNum);
119 }
120 return obj;
121 }
yoshi0451f282013-11-22 15:48:55 -0800122
yoshic455c012013-11-27 10:35:50 -0800123 /**
124 * Create a port having specified port number.
125 *
126 * @param portNumber port number
127 */
128 @Deprecated
129 public IPortObject newPort(Short portNumber) {
130 IPortObject obj = (IPortObject) conn.getFramedGraph().addVertex(null, IPortObject.class);
131 if (obj != null) {
132 obj.setType("port");
133 obj.setNumber(portNumber);
134 }
135 return obj;
136 }
yoshi0451f282013-11-22 15:48:55 -0800137
yoshi2dd767c2013-11-27 23:39:06 -0800138 /**
139 * Search and get a port object of specified switch and port number.
140 * @param dpid DPID of a switch
141 * @param number port number of the switch's port
142 */
yoshic455c012013-11-27 10:35:50 -0800143 @Override
144 public IPortObject searchPort(String dpid, Short number) {
yoshi89eacab2013-12-09 17:29:08 -0800145 //System.out.println("searchPort");
yoshic455c012013-11-27 10:35:50 -0800146 String id = dpid + number.toString();
147 return (conn.getFramedGraph() != null && conn.getFramedGraph().getVertices("port_id", id).iterator().hasNext())
148 ? (IPortObject) conn.getFramedGraph().getVertices("port_id", id, IPortObject.class).iterator().next() : null;
yoshi0451f282013-11-22 15:48:55 -0800149
yoshic455c012013-11-27 10:35:50 -0800150 }
yoshi0451f282013-11-22 15:48:55 -0800151
yoshi2dd767c2013-11-27 23:39:06 -0800152 /**
153 * Remove the specified switch port.
154 * @param port switch port object to remove
155 */
yoshic455c012013-11-27 10:35:50 -0800156 @Override
157 public void removePort(IPortObject port) {
yoshi89eacab2013-12-09 17:29:08 -0800158 //System.out.println("removeProt");
yoshic455c012013-11-27 10:35:50 -0800159 if (conn.getFramedGraph() != null) {
160 conn.getFramedGraph().removeVertex(port.asVertex());
161 }
162 }
163
yoshi2dd767c2013-11-27 23:39:06 -0800164 /**
165 * Create and return a device object.
166 */
yoshic455c012013-11-27 10:35:50 -0800167 @Override
168 public IDeviceObject newDevice() {
yoshi89eacab2013-12-09 17:29:08 -0800169 //System.out.println("newDevice");
yoshic455c012013-11-27 10:35:50 -0800170 IDeviceObject obj = (IDeviceObject) conn.getFramedGraph().addVertex(null, IDeviceObject.class);
171 if (obj != null) {
172 obj.setType("device");
173 }
174 return obj;
175 }
176
yoshi2dd767c2013-11-27 23:39:06 -0800177 /**
178 * Get all devices.
179 */
yoshic455c012013-11-27 10:35:50 -0800180 @Override
181 public Iterable<IDeviceObject> getDevices() {
yoshi89eacab2013-12-09 17:29:08 -0800182 //System.out.println("getDeiveces");
yoshic455c012013-11-27 10:35:50 -0800183 return conn.getFramedGraph() != null ? conn.getFramedGraph().getVertices("type", "device", IDeviceObject.class) : null;
184 }
yoshi0451f282013-11-22 15:48:55 -0800185
yoshi2dd767c2013-11-27 23:39:06 -0800186 /**
187 * Remove the specified device.
188 * @param dev a device object to remove
189 */
yoshic455c012013-11-27 10:35:50 -0800190 @Override
191 public void removeDevice(IDeviceObject dev) {
yoshi89eacab2013-12-09 17:29:08 -0800192 //System.out.println("removeDevice");
yoshic455c012013-11-27 10:35:50 -0800193 if (conn.getFramedGraph() != null) {
194 conn.getFramedGraph().removeVertex(dev.asVertex());
195 }
196 }
197
198 /**
199 * Create and return a flow path object.
200 */
yoshic455c012013-11-27 10:35:50 -0800201 @Override
202 public IFlowPath newFlowPath() {
yoshi89eacab2013-12-09 17:29:08 -0800203 //System.out.println("newFlowPath");
yoshic455c012013-11-27 10:35:50 -0800204 IFlowPath flowPath = (IFlowPath)conn.getFramedGraph().addVertex(null, IFlowPath.class);
yoshi89eacab2013-12-09 17:29:08 -0800205 //System.out.println("flowPath : " + flowPath);
yoshic455c012013-11-27 10:35:50 -0800206 if (flowPath != null) {
207 flowPath.setType("flow");
208 }
209 return flowPath;
210 }
yoshi0451f282013-11-22 15:48:55 -0800211
yoshi2dd767c2013-11-27 23:39:06 -0800212 /**
213 * Get a flow path object with a flow entry.
214 * @param flowEntry flow entry object
215 */
yoshic455c012013-11-27 10:35:50 -0800216 @Override
217 public IFlowPath getFlowPathByFlowEntry(INetMapTopologyObjects.IFlowEntry flowEntry) {
218 GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
219 pipe.start(flowEntry.asVertex());
220 pipe.out("flow");
221 FramedVertexIterable<IFlowPath> r = new FramedVertexIterable(conn.getFramedGraph(), (Iterable) pipe, IFlowPath.class);
222 return r.iterator().hasNext() ? r.iterator().next() : null;
223 }
yoshi0451f282013-11-22 15:48:55 -0800224
yoshi0451f282013-11-22 15:48:55 -0800225
yoshic455c012013-11-27 10:35:50 -0800226 /**
227 * Search and get a switch object with DPID.
228 *
229 * @param dpid DPID of the switch
230 */
231 @Override
232 public ISwitchObject searchSwitch(final String dpid) {
yoshi89eacab2013-12-09 17:29:08 -0800233 //System.out.println("searchSwitch");
yoshic455c012013-11-27 10:35:50 -0800234 return (conn.getFramedGraph() != null && conn.getFramedGraph().getVertices("dpid", dpid).iterator().hasNext())
235 ? (ISwitchObject) (conn.getFramedGraph().getVertices("dpid", dpid, ISwitchObject.class).iterator().next()) : null;
236 }
yoshi0451f282013-11-22 15:48:55 -0800237
yoshi2dd767c2013-11-27 23:39:06 -0800238 /**
239 * Get all active switch objects.
240 */
yoshic455c012013-11-27 10:35:50 -0800241 @Override
242 public Iterable<ISwitchObject> getActiveSwitches() {
243 Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
244 List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
yoshi0451f282013-11-22 15:48:55 -0800245
yoshic455c012013-11-27 10:35:50 -0800246 for (ISwitchObject sw : switches) {
247 if (sw.getState().equals(ISwitchStorage.SwitchState.ACTIVE.toString())) {
248 activeSwitches.add(sw);
249 }
250 }
251 return activeSwitches;
252 }
yoshi0451f282013-11-22 15:48:55 -0800253
yoshi2dd767c2013-11-27 23:39:06 -0800254 /**
255 * Search and get a device object having specified MAC address.
256 * @param macAddr MAC address to search and get
257 */
yoshic455c012013-11-27 10:35:50 -0800258 @Override
259 public IDeviceObject searchDevice(String macAddr) {
260 return (conn.getFramedGraph() != null && conn.getFramedGraph().getVertices("dl_addr", macAddr).iterator().hasNext())
261 ? (IDeviceObject) conn.getFramedGraph().getVertices("dl_addr", macAddr, IDeviceObject.class).iterator().next() : null;
262
263 }
264
yoshi2dd767c2013-11-27 23:39:06 -0800265 /**
266 * Search and get a flow path object with specified flow ID.
267 * @param flowId flow ID to search
268 */
yoshib3c83c12013-12-03 00:58:13 -0800269 @Override
270 public IFlowPath searchFlowPath(final FlowId flowId) {
yoshi89eacab2013-12-09 17:29:08 -0800271 //System.out.println("searchFlowPath");
yoshib3c83c12013-12-03 00:58:13 -0800272 return conn.getFramedGraph().getVertices("flow_id", flowId.toString()).iterator().hasNext()
273 ? (IFlowPath) conn.getFramedGraph().getVertices("flow_id", flowId.toString(),
yoshic455c012013-11-27 10:35:50 -0800274 IFlowPath.class).iterator().next() : null;
275 }
276
yoshi2dd767c2013-11-27 23:39:06 -0800277 /**
278 * Get all flow path objects.
279 */
yoshib3c83c12013-12-03 00:58:13 -0800280 @Override
281 public Iterable<IFlowPath> getAllFlowPaths() {
yoshi89eacab2013-12-09 17:29:08 -0800282 //System.out.println("getAllFlowPaths");
yoshib3c83c12013-12-03 00:58:13 -0800283 Iterable<IFlowPath> flowPaths = conn.getFramedGraph().getVertices("type", "flow", IFlowPath.class);
yoshic455c012013-11-27 10:35:50 -0800284
285 List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
286
287 for (IFlowPath fp : flowPaths) {
288 if (fp.getFlowId() != null) {
289 nonNullFlows.add(fp);
290 }
291 }
292 return nonNullFlows;
293 }
yoshi2dd767c2013-11-27 23:39:06 -0800294
295 /**
yoshib3c83c12013-12-03 00:58:13 -0800296 * Remove the specified flow path.
297 * @param flowPath flow path object to remove
298 */
299 @Override
300 public void removeFlowPath(IFlowPath flowPath) {
yoshi89eacab2013-12-09 17:29:08 -0800301 //System.out.println("removeFlowPath");
yoshib3c83c12013-12-03 00:58:13 -0800302 conn.getFramedGraph().removeVertex(flowPath.asVertex());
303 }
304
305 /**
306 * Search and get a flow entry object with flow entry ID.
307 * @param flowEntryId flow entry ID to search
308 */
309 @Override
310 public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
yoshi89eacab2013-12-09 17:29:08 -0800311 //System.out.println("searchFlowEntry");
yoshib3c83c12013-12-03 00:58:13 -0800312 return conn.getFramedGraph().getVertices("flow_entry_id", flowEntryId.toString()).iterator().hasNext()
313 ? (IFlowEntry)conn.getFramedGraph().getVertices("flow_entry_id", flowEntryId.toString(),
314 IFlowEntry.class).iterator().next() : null;
315 }
316
317 /**
318 * Get all flow entry objects.
319 */
320 @Override
321 public Iterable<IFlowEntry> getAllFlowEntries() {
322 return conn.getFramedGraph().getVertices("type", "flow_entry", IFlowEntry.class);
323 }
324
325 /**
326 * Remove the specified flow entry.
327 * @param flowEntry flow entry object to remove
328 */
329 @Override
330 public void removeFlowEntry(IFlowEntry flowEntry) {
yoshi89eacab2013-12-09 17:29:08 -0800331 //System.out.println("removeFlowEntry");
yoshib3c83c12013-12-03 00:58:13 -0800332 conn.getFramedGraph().removeVertex(flowEntry.asVertex());
333 }
334
335 /**
yoshi2dd767c2013-11-27 23:39:06 -0800336 * Create and return a flow entry object.
337 */
yoshic455c012013-11-27 10:35:50 -0800338 @Override
339 public IFlowEntry newFlowEntry() {
yoshi89eacab2013-12-09 17:29:08 -0800340 //System.out.println("newFlowEntry");
yoshic455c012013-11-27 10:35:50 -0800341 IFlowEntry flowEntry = (IFlowEntry) conn.getFramedGraph().addVertex(null, IFlowEntry.class);
342 if (flowEntry != null) {
343 flowEntry.setType("flow_entry");
344 }
345 return flowEntry;
346 }
347
348
yoshitomob292c622013-11-23 14:35:58 -0800349 public IIpv4Address newIpv4Address() {
350 return newVertex("ipv4Address", IIpv4Address.class);
351 }
yoshi2dd767c2013-11-27 23:39:06 -0800352
yoshitomob292c622013-11-23 14:35:58 -0800353 private <T extends IBaseObject> T newVertex(String type, Class<T> vertexType) {
yoshi9247b812013-11-27 11:26:14 -0800354 T newVertex = (T) conn.getFramedGraph().addVertex(null, vertexType);
yoshitomob292c622013-11-23 14:35:58 -0800355 if (newVertex != null) {
356 newVertex.setType(type);
357 }
358 return newVertex;
359 }
yoshic455c012013-11-27 10:35:50 -0800360
yoshitomob292c622013-11-23 14:35:58 -0800361 public IIpv4Address searchIpv4Address(int intIpv4Address) {
362 return searchForVertex("ipv4_address", intIpv4Address, IIpv4Address.class);
363 }
364
365
366 public IIpv4Address ensureIpv4Address(int intIpv4Address) {
367 IIpv4Address ipv4Vertex = searchIpv4Address(intIpv4Address);
368 if (ipv4Vertex == null) {
369 ipv4Vertex = newIpv4Address();
370 ipv4Vertex.setIpv4Address(intIpv4Address);
371 }
372 return ipv4Vertex;
373 }
374
375
376 private <T> T searchForVertex(String propertyName, Object propertyValue, Class<T> vertexType) {
377 if (conn.getFramedGraph() != null) {
378 Iterator<T> it = conn.getFramedGraph().getVertices(propertyName, propertyValue, vertexType).iterator();
379 if (it.hasNext()) {
380 return it.next();
381 }
382 }
383 return null;
384 }
385
386 public void removeIpv4Address(IIpv4Address ipv4Address) {
yoshi89eacab2013-12-09 17:29:08 -0800387 //System.out.println("removeIpv4Address");
yoshitomob292c622013-11-23 14:35:58 -0800388 conn.getFramedGraph().removeVertex(ipv4Address.asVertex());
389 }
yoshi0451f282013-11-22 15:48:55 -0800390
yoshib3c83c12013-12-03 00:58:13 -0800391 /**
392 * Get the instance of GraphDBConnection assigned to this class.
393 */
yoshi7594aef2013-11-27 09:27:07 -0800394 @Override
395 public IDBConnection getDBConnection() {
396 return conn;
397 }
yoshib3c83c12013-12-03 00:58:13 -0800398
399 @Override
400 public void commit() {
401 conn.commit();
402 }
403
404 @Override
405 public void rollback() {
406 conn.rollback();
407 }
408
409 @Override
410 public void close() {
411 conn.close();
412 }
yoshi0451f282013-11-22 15:48:55 -0800413}