blob: 0b91dd2b3488b66914ef8cf1e5a06c358384f62d [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.
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -080036 * @param dpid DPID of the switch
yoshi2dd767c2013-11-27 23:39:06 -080037 */
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 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -080047
yoshi2dd767c2013-11-27 23:39:06 -080048 /**
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 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -080062
yoshi2dd767c2013-11-27 23:39:06 -080063 /**
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 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -080089
yoshi2dd767c2013-11-27 23:39:06 -080090 /**
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 */
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800128 @Override
yoshic455c012013-11-27 10:35:50 -0800129 @Deprecated
130 public IPortObject newPort(Short portNumber) {
131 IPortObject obj = (IPortObject) conn.getFramedGraph().addVertex(null, IPortObject.class);
132 if (obj != null) {
133 obj.setType("port");
134 obj.setNumber(portNumber);
135 }
136 return obj;
137 }
yoshi0451f282013-11-22 15:48:55 -0800138
yoshi2dd767c2013-11-27 23:39:06 -0800139 /**
140 * Search and get a port object of specified switch and port number.
141 * @param dpid DPID of a switch
142 * @param number port number of the switch's port
143 */
yoshic455c012013-11-27 10:35:50 -0800144 @Override
145 public IPortObject searchPort(String dpid, Short number) {
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800146 FramedGraph fg = conn.getFramedGraph();
147 if ( fg == null ) return null;
yoshic455c012013-11-27 10:35:50 -0800148 String id = dpid + number.toString();
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800149 Iterator<IPortObject> it = fg.getVertices("port_id", id, IPortObject.class).iterator();
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800150 return (it.hasNext()) ? it.next() : null;
yoshi0451f282013-11-22 15:48:55 -0800151
yoshic455c012013-11-27 10:35:50 -0800152 }
yoshi0451f282013-11-22 15:48:55 -0800153
yoshi2dd767c2013-11-27 23:39:06 -0800154 /**
155 * Remove the specified switch port.
156 * @param port switch port object to remove
157 */
yoshic455c012013-11-27 10:35:50 -0800158 @Override
159 public void removePort(IPortObject port) {
yoshi89eacab2013-12-09 17:29:08 -0800160 //System.out.println("removeProt");
yoshic455c012013-11-27 10:35:50 -0800161 if (conn.getFramedGraph() != null) {
162 conn.getFramedGraph().removeVertex(port.asVertex());
163 }
164 }
165
yoshi2dd767c2013-11-27 23:39:06 -0800166 /**
167 * Create and return a device object.
168 */
yoshic455c012013-11-27 10:35:50 -0800169 @Override
170 public IDeviceObject newDevice() {
yoshi89eacab2013-12-09 17:29:08 -0800171 //System.out.println("newDevice");
yoshic455c012013-11-27 10:35:50 -0800172 IDeviceObject obj = (IDeviceObject) conn.getFramedGraph().addVertex(null, IDeviceObject.class);
173 if (obj != null) {
174 obj.setType("device");
175 }
176 return obj;
177 }
178
yoshi2dd767c2013-11-27 23:39:06 -0800179 /**
180 * Get all devices.
181 */
yoshic455c012013-11-27 10:35:50 -0800182 @Override
183 public Iterable<IDeviceObject> getDevices() {
yoshi89eacab2013-12-09 17:29:08 -0800184 //System.out.println("getDeiveces");
yoshic455c012013-11-27 10:35:50 -0800185 return conn.getFramedGraph() != null ? conn.getFramedGraph().getVertices("type", "device", IDeviceObject.class) : null;
186 }
yoshi0451f282013-11-22 15:48:55 -0800187
yoshi2dd767c2013-11-27 23:39:06 -0800188 /**
189 * Remove the specified device.
190 * @param dev a device object to remove
191 */
yoshic455c012013-11-27 10:35:50 -0800192 @Override
193 public void removeDevice(IDeviceObject dev) {
yoshi89eacab2013-12-09 17:29:08 -0800194 //System.out.println("removeDevice");
yoshic455c012013-11-27 10:35:50 -0800195 if (conn.getFramedGraph() != null) {
196 conn.getFramedGraph().removeVertex(dev.asVertex());
197 }
198 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800199
yoshic455c012013-11-27 10:35:50 -0800200 /**
201 * Create and return a flow path object.
202 */
yoshic455c012013-11-27 10:35:50 -0800203 @Override
204 public IFlowPath newFlowPath() {
yoshi89eacab2013-12-09 17:29:08 -0800205 //System.out.println("newFlowPath");
yoshic455c012013-11-27 10:35:50 -0800206 IFlowPath flowPath = (IFlowPath)conn.getFramedGraph().addVertex(null, IFlowPath.class);
yoshi89eacab2013-12-09 17:29:08 -0800207 //System.out.println("flowPath : " + flowPath);
yoshic455c012013-11-27 10:35:50 -0800208 if (flowPath != null) {
209 flowPath.setType("flow");
210 }
211 return flowPath;
212 }
yoshi0451f282013-11-22 15:48:55 -0800213
yoshi2dd767c2013-11-27 23:39:06 -0800214 /**
215 * Get a flow path object with a flow entry.
216 * @param flowEntry flow entry object
217 */
yoshic455c012013-11-27 10:35:50 -0800218 @Override
219 public IFlowPath getFlowPathByFlowEntry(INetMapTopologyObjects.IFlowEntry flowEntry) {
220 GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
221 pipe.start(flowEntry.asVertex());
222 pipe.out("flow");
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800223 FramedVertexIterable<IFlowPath> r = new FramedVertexIterable(conn.getFramedGraph(), pipe, IFlowPath.class);
yoshic455c012013-11-27 10:35:50 -0800224 return r.iterator().hasNext() ? r.iterator().next() : null;
225 }
yoshi0451f282013-11-22 15:48:55 -0800226
yoshi0451f282013-11-22 15:48:55 -0800227
yoshic455c012013-11-27 10:35:50 -0800228 /**
229 * Search and get a switch object with DPID.
230 *
231 * @param dpid DPID of the switch
232 */
233 @Override
234 public ISwitchObject searchSwitch(final String dpid) {
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800235 FramedGraph fg = conn.getFramedGraph();
236 if ( fg == null ) return null;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800237 Iterator<ISwitchObject> it = fg.getVertices("dpid", dpid, ISwitchObject.class).iterator();
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800238 return (it.hasNext()) ? it.next() : null;
yoshic455c012013-11-27 10:35:50 -0800239 }
yoshi0451f282013-11-22 15:48:55 -0800240
yoshi2dd767c2013-11-27 23:39:06 -0800241 /**
242 * Get all active switch objects.
243 */
yoshic455c012013-11-27 10:35:50 -0800244 @Override
245 public Iterable<ISwitchObject> getActiveSwitches() {
246 Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
247 List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
yoshi0451f282013-11-22 15:48:55 -0800248
yoshic455c012013-11-27 10:35:50 -0800249 for (ISwitchObject sw : switches) {
250 if (sw.getState().equals(ISwitchStorage.SwitchState.ACTIVE.toString())) {
251 activeSwitches.add(sw);
252 }
253 }
254 return activeSwitches;
255 }
yoshi0451f282013-11-22 15:48:55 -0800256
yoshi2dd767c2013-11-27 23:39:06 -0800257 /**
258 * Search and get a device object having specified MAC address.
259 * @param macAddr MAC address to search and get
260 */
yoshic455c012013-11-27 10:35:50 -0800261 @Override
262 public IDeviceObject searchDevice(String macAddr) {
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800263 FramedGraph fg = conn.getFramedGraph();
264 if ( fg == null ) return null;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800265 Iterator<IDeviceObject> it = fg.getVertices("dl_addr", macAddr, IDeviceObject.class).iterator();
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800266 return (it.hasNext()) ? it.next() : null;
yoshic455c012013-11-27 10:35:50 -0800267 }
268
yoshi2dd767c2013-11-27 23:39:06 -0800269 /**
270 * Search and get a flow path object with specified flow ID.
271 * @param flowId flow ID to search
272 */
yoshib3c83c12013-12-03 00:58:13 -0800273 @Override
274 public IFlowPath searchFlowPath(final FlowId flowId) {
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800275 FramedGraph fg = conn.getFramedGraph();
276 if ( fg == null ) return null;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800277 Iterator<IFlowPath> it = fg.getVertices("flow_id", flowId.toString(), IFlowPath.class).iterator();
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800278 return (it.hasNext()) ? it.next() : null;
yoshic455c012013-11-27 10:35:50 -0800279 }
280
yoshi2dd767c2013-11-27 23:39:06 -0800281 /**
282 * Get all flow path objects.
283 */
yoshib3c83c12013-12-03 00:58:13 -0800284 @Override
285 public Iterable<IFlowPath> getAllFlowPaths() {
yoshi89eacab2013-12-09 17:29:08 -0800286 //System.out.println("getAllFlowPaths");
yoshib3c83c12013-12-03 00:58:13 -0800287 Iterable<IFlowPath> flowPaths = conn.getFramedGraph().getVertices("type", "flow", IFlowPath.class);
yoshic455c012013-11-27 10:35:50 -0800288
289 List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
290
291 for (IFlowPath fp : flowPaths) {
292 if (fp.getFlowId() != null) {
293 nonNullFlows.add(fp);
294 }
295 }
296 return nonNullFlows;
297 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800298
yoshi2dd767c2013-11-27 23:39:06 -0800299 /**
yoshib3c83c12013-12-03 00:58:13 -0800300 * Remove the specified flow path.
301 * @param flowPath flow path object to remove
302 */
303 @Override
304 public void removeFlowPath(IFlowPath flowPath) {
yoshi89eacab2013-12-09 17:29:08 -0800305 //System.out.println("removeFlowPath");
yoshib3c83c12013-12-03 00:58:13 -0800306 conn.getFramedGraph().removeVertex(flowPath.asVertex());
307 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800308
yoshib3c83c12013-12-03 00:58:13 -0800309 /**
310 * Search and get a flow entry object with flow entry ID.
311 * @param flowEntryId flow entry ID to search
312 */
313 @Override
314 public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800315 FramedGraph fg = conn.getFramedGraph();
316 if ( fg == null ) return null;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800317 Iterator<IFlowEntry> it = fg.getVertices("flow_entry_id", flowEntryId.toString(), IFlowEntry.class).iterator();
Yuta HIGUCHIfa9bcb12013-12-14 00:14:58 -0800318 return (it.hasNext()) ? it.next() : null;
yoshib3c83c12013-12-03 00:58:13 -0800319 }
320
321 /**
322 * Get all flow entry objects.
323 */
324 @Override
325 public Iterable<IFlowEntry> getAllFlowEntries() {
326 return conn.getFramedGraph().getVertices("type", "flow_entry", IFlowEntry.class);
327 }
328
329 /**
330 * Remove the specified flow entry.
331 * @param flowEntry flow entry object to remove
332 */
333 @Override
334 public void removeFlowEntry(IFlowEntry flowEntry) {
yoshi89eacab2013-12-09 17:29:08 -0800335 //System.out.println("removeFlowEntry");
yoshib3c83c12013-12-03 00:58:13 -0800336 conn.getFramedGraph().removeVertex(flowEntry.asVertex());
337 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800338
yoshib3c83c12013-12-03 00:58:13 -0800339 /**
yoshi2dd767c2013-11-27 23:39:06 -0800340 * Create and return a flow entry object.
341 */
yoshic455c012013-11-27 10:35:50 -0800342 @Override
343 public IFlowEntry newFlowEntry() {
yoshi89eacab2013-12-09 17:29:08 -0800344 //System.out.println("newFlowEntry");
yoshic455c012013-11-27 10:35:50 -0800345 IFlowEntry flowEntry = (IFlowEntry) conn.getFramedGraph().addVertex(null, IFlowEntry.class);
346 if (flowEntry != null) {
347 flowEntry.setType("flow_entry");
348 }
349 return flowEntry;
350 }
351
352
yoshitomob292c622013-11-23 14:35:58 -0800353 public IIpv4Address newIpv4Address() {
354 return newVertex("ipv4Address", IIpv4Address.class);
355 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800356
yoshitomob292c622013-11-23 14:35:58 -0800357 private <T extends IBaseObject> T newVertex(String type, Class<T> vertexType) {
yoshi9247b812013-11-27 11:26:14 -0800358 T newVertex = (T) conn.getFramedGraph().addVertex(null, vertexType);
yoshitomob292c622013-11-23 14:35:58 -0800359 if (newVertex != null) {
360 newVertex.setType(type);
361 }
362 return newVertex;
363 }
yoshic455c012013-11-27 10:35:50 -0800364
yoshitomob292c622013-11-23 14:35:58 -0800365 public IIpv4Address searchIpv4Address(int intIpv4Address) {
366 return searchForVertex("ipv4_address", intIpv4Address, IIpv4Address.class);
367 }
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800368
369
yoshitomob292c622013-11-23 14:35:58 -0800370 public IIpv4Address ensureIpv4Address(int intIpv4Address) {
371 IIpv4Address ipv4Vertex = searchIpv4Address(intIpv4Address);
372 if (ipv4Vertex == null) {
373 ipv4Vertex = newIpv4Address();
374 ipv4Vertex.setIpv4Address(intIpv4Address);
375 }
376 return ipv4Vertex;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800377 }
yoshitomob292c622013-11-23 14:35:58 -0800378
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800379
yoshitomob292c622013-11-23 14:35:58 -0800380 private <T> T searchForVertex(String propertyName, Object propertyValue, Class<T> vertexType) {
381 if (conn.getFramedGraph() != null) {
382 Iterator<T> it = conn.getFramedGraph().getVertices(propertyName, propertyValue, vertexType).iterator();
383 if (it.hasNext()) {
384 return it.next();
385 }
386 }
387 return null;
388 }
389
390 public void removeIpv4Address(IIpv4Address ipv4Address) {
yoshi89eacab2013-12-09 17:29:08 -0800391 //System.out.println("removeIpv4Address");
yoshitomob292c622013-11-23 14:35:58 -0800392 conn.getFramedGraph().removeVertex(ipv4Address.asVertex());
393 }
yoshi0451f282013-11-22 15:48:55 -0800394
yoshib3c83c12013-12-03 00:58:13 -0800395 /**
396 * Get the instance of GraphDBConnection assigned to this class.
397 */
yoshi7594aef2013-11-27 09:27:07 -0800398 @Override
399 public IDBConnection getDBConnection() {
400 return conn;
Yuta HIGUCHI9e580b62014-01-02 12:02:22 -0800401 }
402
yoshib3c83c12013-12-03 00:58:13 -0800403 @Override
404 public void commit() {
405 conn.commit();
406 }
407
408 @Override
409 public void rollback() {
410 conn.rollback();
411 }
412
413 @Override
414 public void close() {
415 conn.close();
416 }
yoshi0451f282013-11-22 15:48:55 -0800417}