blob: fb5227f5d2013429857a07a3cb20777017934e2f [file] [log] [blame]
Naoki Shiotac88d9562013-06-18 15:21:56 -07001package net.onrc.onos.ofcontroller.core.internal;
2
3import java.util.ArrayList;
4import java.util.List;
5
Pankaj Berdebbd38612013-06-22 05:59:12 -07006import org.codehaus.jackson.annotate.JsonIgnore;
Naoki Shiotac88d9562013-06-18 15:21:56 -07007import org.easymock.EasyMock;
8import org.openflow.util.HexString;
9import org.slf4j.Logger;
10import org.slf4j.LoggerFactory;
11
12import com.tinkerpop.blueprints.Vertex;
Pankaj Berdebbd38612013-06-22 05:59:12 -070013import com.tinkerpop.frames.Property;
Naoki Shiotac88d9562013-06-18 15:21:56 -070014import com.tinkerpop.frames.annotations.gremlin.GremlinParam;
15
Pankaj Berde38646d62013-06-21 11:34:04 -070016import net.onrc.onos.graph.GraphDBConnection;
17import net.onrc.onos.graph.GraphDBOperation;
18import net.onrc.onos.graph.IDBConnection;
Naoki Shiotac88d9562013-06-18 15:21:56 -070019import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
20import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
21import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
22import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
23import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
24import net.onrc.onos.ofcontroller.util.FlowEntryId;
25import net.onrc.onos.ofcontroller.util.FlowId;
Naoki Shiotac88d9562013-06-18 15:21:56 -070026
27/**
28 * Mock class of GraphDBOperation which provides additional setter to construct a graph for test.
29 * This object simply caches parameters set up by override interfaces and reflect them when commit().
30 * *ForTest() methods are exempt from cache, parameters through those methods are reflected soon.
31 * @author Naoki Shiota
32 *
33 */
34public class TestableGraphDBOperation extends GraphDBOperation {
35 protected static Logger log = LoggerFactory.getLogger(TestableGraphDBOperation.class);
36
37 protected List<TestSwitchObject> switches;
38 protected List<TestPortObject> ports;
39 protected List<TestDeviceObject> devices;
40 protected List<TestFlowPath> paths;
41 protected List<TestFlowEntry> entries;
42
43 protected List<TestSwitchObject> switchesToAdd;
44 protected List<TestPortObject> portsToAdd;
45 protected List<TestDeviceObject> devicesToAdd;
46 protected List<TestFlowPath> pathsToAdd;
47 protected List<TestFlowEntry> entriesToAdd;
48
49 protected List<TestSwitchObject> switchesToRemove;
50 protected List<TestPortObject> portsToRemove;
51 protected List<TestDeviceObject> devicesToRemove;
52 protected List<TestFlowPath> pathsToRemove;
53 protected List<TestFlowEntry> entriesToRemove;
54
55 // Testable implementations of INetMapTopologyObject interfaces
56
57 public static class TestSwitchObject implements ISwitchObject {
58 private String state,type,dpid;
59 private List<IPortObject> ports;
60 private List<IDeviceObject> devices;
61 private List<IFlowEntry> entries;
62
63 private String stateToUpdate, typeToUpdate, dpidToUpdate;
64 private List<IPortObject> portsToAdd;
65 private List<IPortObject> portsToRemove;
66
67 public TestSwitchObject() {
68 type = "switch";
69
70 ports = new ArrayList<IPortObject>();
71 portsToAdd = new ArrayList<IPortObject>();
72 portsToRemove = new ArrayList<IPortObject>();
73 devices = new ArrayList<IDeviceObject>();
74 entries = new ArrayList<IFlowEntry>();
75
76 clearUncommitedData();
77 }
78
79 public void commit() {
80 for(IPortObject port : portsToAdd) {
81 ports.add(port);
82 }
83 for(IPortObject port : portsToRemove) {
84 ports.remove(port);
85 }
86 if(stateToUpdate != null) { state = stateToUpdate; }
87 if(typeToUpdate != null) { type = typeToUpdate; }
88 if(dpidToUpdate != null) { dpid = dpidToUpdate; }
89
90 clearUncommitedData();
91 }
92
93 public void rollback() {
94 clearUncommitedData();
95 }
96
97 public void clearUncommitedData() {
98 portsToAdd.clear();
99 portsToRemove.clear();
100 stateToUpdate = typeToUpdate = dpidToUpdate = null;
101 }
102
103 public void setStateForTest(String state) { this.state = state; }
104 public void setTypeForTest(String type) { this.type = type; }
105 public void setDpidForTest(String dpid) { this.dpid = dpid; }
106 public void addPortForTest(TestPortObject port) { ports.add(port); }
107 public void addDeviceForTest(TestDeviceObject dev) { devices.add(dev); }
108 public void addEntryForTest(TestFlowEntry entry) { entries.add(entry); }
109
110 @Override
111 public String getState() { return state; }
112
113 @Override
114 public void setState(String state) { this.stateToUpdate = state; }
115
116 @Override
117 public String getType() { return type ; }
118
119 @Override
120 public void setType(String type) { this.typeToUpdate = type; }
121
122 // Not support for test
123 @Override
124 public Vertex asVertex() { return null; }
125
126 @Override
127 public String getDPID() { return dpid; }
128
129 @Override
130 public void setDPID(String dpid) { this.dpidToUpdate = dpid; }
131
132 @Override
133 public Iterable<IPortObject> getPorts() { return ports; }
134
135 @Override
136 public IPortObject getPort(@GremlinParam("port_num") short port_num) {
137 for(IPortObject port : ports) {
138 if(port.getNumber() == port_num) {
139 return port;
140 }
141 }
142 return null;
143 }
144
145 @Override
146 public void addPort(IPortObject port) { portsToAdd.add(port); }
147
148 @Override
149 public void removePort(IPortObject port) { portsToRemove.add(port); }
150
151 @Override
152 public Iterable<IDeviceObject> getDevices() { return devices; }
153
154 @Override
155 public Iterable<IFlowEntry> getFlowEntries() { return entries; }
156 }
157
158 public static class TestPortObject implements IPortObject {
159 private String state,type,desc;
160 private Short number;
161 private Integer port_state;
162 private ISwitchObject sw;
163
164 private List<IPortObject> linkedPorts;
165 private List<IDeviceObject> devices;
166 private List<IFlowEntry> inflows,outflows;
167
168 private String stateToUpdate,typeToUpdate,descToUpdate;
169 private Short numberToUpdate;
170 private Integer port_stateToUpdate;
171
172 private List<IPortObject> linkedPortsToAdd;
173 private List<IPortObject> linkedPortsToRemove;
174 private List<IDeviceObject> devicesToAdd;
175 private List<IDeviceObject> devicesToRemove;
176
177
178 public TestPortObject() {
179 type = "port";
180
181 linkedPorts = new ArrayList<IPortObject>();
182 linkedPortsToAdd = new ArrayList<IPortObject>();
183 linkedPortsToRemove = new ArrayList<IPortObject>();
184 devices = new ArrayList<IDeviceObject>();
185 devicesToAdd = new ArrayList<IDeviceObject>();
186 devicesToRemove = new ArrayList<IDeviceObject>();
187 inflows = new ArrayList<IFlowEntry>();
188 outflows = new ArrayList<IFlowEntry>();
189
190 clearUncommitedData();
191 }
192
193 public void commit() {
194 for(IPortObject port : linkedPortsToAdd) { linkedPorts.add(port); }
195 for(IPortObject port : linkedPortsToRemove) { linkedPorts.remove(port); }
196 for(IDeviceObject dev : devicesToAdd) { devices.add(dev); }
197 for(IDeviceObject dev : devicesToRemove) { devices.remove(dev); }
198
199 if(stateToUpdate != null) { state = stateToUpdate; }
200 if(typeToUpdate != null) { type = typeToUpdate; }
201 if(descToUpdate != null) { desc = descToUpdate; }
202 if(numberToUpdate != null) { number = numberToUpdate; }
203 if(port_stateToUpdate != null) { port_state = port_stateToUpdate; }
204
205 clearUncommitedData();
206 }
207
208 public void rollback() {
209 clearUncommitedData();
210 }
211
212 public void clearUncommitedData() {
213 linkedPortsToAdd.clear();
214 linkedPortsToRemove.clear();
215 devicesToAdd.clear();
216 devicesToRemove.clear();
217 stateToUpdate = typeToUpdate = descToUpdate = null;
218 port_stateToUpdate = null;
219 numberToUpdate = null;
220 }
221
222 // Setter methods for test
223 public void setStateForTest(String state) { this.state = state; }
224 public void setTypeForTest(String type) { this.type = type; }
225 public void setDescForTest(String desc) { this.desc = desc; }
226 public void setNumberForTest(Short number) { this.number = number; }
227 public void setPortStateForTest(Integer state) { this.port_state = state; }
228 public void setSwitchForTest(ISwitchObject sw) { this.sw = sw; }
229 public void addLinkedPortForTest(TestPortObject port) { this.linkedPorts.add(port); }
230 public void addInflowForTest(TestFlowEntry entry) { inflows.add(entry); }
231 public void addOutflowForTest(TestFlowEntry entry) { outflows.add(entry); }
232
233 // Override methods for mock IPortObject
234 @Override
235 public String getState() { return state; }
236
237 @Override
238 public void setState(String state) { this.stateToUpdate = state; }
239
240 @Override
241 public String getType() { return type; }
242
243 @Override
244 public void setType(String type) { this.typeToUpdate = type; }
245
246 // not support for test
247 @Override
248 public Vertex asVertex() {
249 return null;
250 }
251
252 @Override
253 public Short getNumber() { return number; }
254
255 @Override
256 public void setNumber(Short n) { this.numberToUpdate = n; }
257
258 @Override
259 public String getDesc() { return desc; }
260
261 @Override
262 public void setDesc(String s) { this.descToUpdate = s; }
263
264 @Override
265 public Integer getPortState() { return port_state; }
266
267 @Override
268 public void setPortState(Integer s) { this.port_stateToUpdate = s; }
269
270 @Override
271 public ISwitchObject getSwitch() { return sw; }
272
273 @Override
274 public Iterable<IDeviceObject> getDevices() { return devices; }
275
276 @Override
277 public void setDevice(IDeviceObject device) { devicesToAdd.add(device); }
278
279 @Override
280 public void removeDevice(IDeviceObject device) { devicesToRemove.add(device); }
281
282 @Override
283 public Iterable<IFlowEntry> getInFlowEntries() { return inflows; }
284
285 @Override
286 public Iterable<IFlowEntry> getOutFlowEntries() { return outflows; }
287
288 @Override
289 public Iterable<IPortObject> getLinkedPorts() { return linkedPorts; }
290
291 @Override
292 public void removeLink(IPortObject dest_port) { linkedPortsToRemove.add(dest_port); }
293
294 @Override
295 public void setLinkPort(IPortObject dest_port) { linkedPortsToAdd.add(dest_port); }
Pankaj Berdebbd38612013-06-22 05:59:12 -0700296
297 @Override
298 @JsonIgnore
299 @Property("port_id")
300 public void setPortId(String id) {
301 // TODO Auto-generated method stub
302
303 }
304
305 @Override
306 @JsonIgnore
307 @Property("port_id")
308 public String getPortId() {
309 // TODO Auto-generated method stub
310 return null;
311 }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700312 }
313
314 public static class TestDeviceObject implements IDeviceObject {
315 private String state,type,mac,ipaddr;
316 private List<IPortObject> ports;
317 private List<ISwitchObject> switches;
318
319 private String stateToUpdate,typeToUpdate,macToUpdate,ipaddrToUpdate;
320 private List<IPortObject> portsToAdd;
321 private List<IPortObject> portsToRemove;
322
323 public TestDeviceObject() {
324 type = "device";
325
326 ports = new ArrayList<IPortObject>();
327 portsToAdd = new ArrayList<IPortObject>();
328 portsToRemove = new ArrayList<IPortObject>();
329 switches = new ArrayList<ISwitchObject>();
330
331 clearUncommitedData();
332 }
333
334 public void commit() {
335 for(IPortObject port : portsToAdd) {
336 ports.add(port);
337 }
338 for(IPortObject port : portsToRemove) {
339 ports.remove(port);
340 }
341
342 if(stateToUpdate != null) { state = stateToUpdate; }
343 if(typeToUpdate != null) { type = typeToUpdate; }
344 if(macToUpdate != null) { mac = macToUpdate; }
345 if(ipaddrToUpdate != null) { ipaddr = ipaddrToUpdate; }
346
347 clearUncommitedData();
348 }
349
350 public void rollback() {
351 clearUncommitedData();
352 }
353
354 public void clearUncommitedData() {
355 ports.clear();
356 portsToAdd.clear();
357 portsToRemove.clear();
358
359 stateToUpdate = typeToUpdate = macToUpdate = ipaddrToUpdate = null;
360 }
361
362 // Setter methods for test
363 public void setStateForTest(String state) { this.state = state; }
364 public void setTypeForTest(String type) { this.type = type; }
365 public void setMacForTest(String mac) { this.mac = mac; }
366 public void setIpaddrForTest(String ipaddr) { this.ipaddr = ipaddr; }
367 public void addSwitchForTest(ISwitchObject sw) { switches.add(sw); }
368 public void addPortForTest(IPortObject port) { ports.add(port); }
369
370
371 // Override methods
372 @Override
373 public String getState() { return state; }
374
375 @Override
376 public void setState(String state) { stateToUpdate = state; }
377
378 @Override
379 public String getType() { return type; }
380
381 @Override
382 public void setType(String type) { typeToUpdate = type; }
383
384 @Override
385 public Vertex asVertex() {
386 // TODO Auto-generated method stub
387 return null;
388 }
389
390 @Override
391 public String getMACAddress() { return mac; }
392
393 @Override
394 public void setMACAddress(String macaddr) { macToUpdate = macaddr; }
395
396 @Override
397 public String getIPAddress() { return ipaddr; }
398
399 @Override
400 public void setIPAddress(String ipaddr) { ipaddrToUpdate = ipaddr; }
401
402 @Override
403 public Iterable<IPortObject> getAttachedPorts() {
404 return ports; }
405
406 @Override
407 public void setHostPort(IPortObject port) { portsToAdd.add(port); }
408
409 @Override
410 public void removeHostPort(IPortObject port) { portsToRemove.add(port); }
411
412 @Override
413 public Iterable<ISwitchObject> getSwitch() { return switches; }
414 }
415
416 public static class TestFlowPath implements IFlowPath {
417 private String state,type,flowId,installerId,srcSw,dstSw;
418 private String dataPathSummary,userState;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700419 private Short srcPort,dstPort;
420 private String matchSrcMac,matchDstMac;
421 private Short matchEthernetFrameType;
422 private Short matchVlanId;
423 private Byte matchVlanPriority;
424 private String matchSrcIpaddr,matchDstIpaddr;
425 private Byte matchIpProto, matchIpToS;
426 private Short matchSrcTcpUdpPort, matchDstTcpUdpPort;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700427
428 private List<IFlowEntry> entries;
429 private List<ISwitchObject> switches;
430
431 private String stateToUpdate,typeToUpdate,flowIdToUpdate,installerIdToUpdate,srcSwToUpdate,dstSwToUpdate;
432 private String dataPathSummaryToUpdate,userStateToUpdate;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700433 private Short srcPortToUpdate,dstPortToUpdate;
434 private String matchSrcMacToUpdate,matchDstMacToUpdate;
435 private Short matchEthernetFrameTypeToUpdate;
436 private Short matchVlanIdToUpdate;
437 private Byte matchVlanPriorityToUpdate;
438 private String matchSrcIpaddrToUpdate,matchDstIpaddrToUpdate;
439 private Byte matchIpProtoToUpdate, matchIpToSToUpdate;
440 private Short matchSrcTcpUdpPortToUpdate, matchDstTcpUdpPortToUpdate;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700441
442 private List<IFlowEntry> flowsToAdd;
443 private List<IFlowEntry> flowsToRemove;
444
445 public TestFlowPath() {
446 type = "flow";
447
448 entries = new ArrayList<IFlowEntry>();
449 flowsToAdd = new ArrayList<IFlowEntry>();
450 flowsToRemove = new ArrayList<IFlowEntry>();
451
452 switches = new ArrayList<ISwitchObject>();
453
454 clear();
455 }
456
457 public void commit() {
458 for(IFlowEntry flow : flowsToAdd) {
459 entries.add(flow);
460 }
461 for(IFlowEntry flow : flowsToRemove) {
462 entries.remove(flow);
463 }
464 if(stateToUpdate != null) { state = stateToUpdate; }
465 if(typeToUpdate != null) { type = typeToUpdate; }
466 if(flowIdToUpdate != null) { flowId = flowIdToUpdate; }
467 if(installerIdToUpdate != null) { installerId = installerIdToUpdate; }
468 if(srcSwToUpdate != null) { srcSw = srcSwToUpdate; }
469 if(dstSwToUpdate != null) { dstSw = dstSwToUpdate; }
470 if(dataPathSummaryToUpdate != null) { dataPathSummary = dataPathSummaryToUpdate; }
471 if(userStateToUpdate != null) { userState = userStateToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700472 if(srcPortToUpdate != null) { srcPort = srcPortToUpdate; }
473 if(dstPortToUpdate != null) { dstPort = dstPortToUpdate; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700474 if(matchSrcMacToUpdate != null) { matchSrcMac = matchSrcMacToUpdate; }
475 if(matchDstMacToUpdate != null) { matchDstMac = matchDstMacToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700476 if(matchEthernetFrameTypeToUpdate != null) { matchEthernetFrameType = matchEthernetFrameTypeToUpdate; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700477 if(matchVlanIdToUpdate != null) { matchVlanId = matchVlanIdToUpdate; }
478 if(matchVlanPriorityToUpdate != null) { matchVlanPriority = matchVlanPriorityToUpdate; }
479 if(matchSrcIpaddrToUpdate != null) { matchSrcIpaddr = matchSrcIpaddrToUpdate; }
480 if(matchDstIpaddrToUpdate != null) { matchDstIpaddr = matchDstIpaddrToUpdate; }
481 if(matchIpProtoToUpdate != null) { matchIpProto = matchIpProtoToUpdate; }
482 if(matchIpToSToUpdate != null) { matchIpToS = matchIpToSToUpdate; }
483 if(matchSrcTcpUdpPortToUpdate != null) { matchSrcTcpUdpPort = matchSrcTcpUdpPortToUpdate; }
484 if(matchDstTcpUdpPortToUpdate != null) { matchDstTcpUdpPort = matchDstTcpUdpPortToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700485 }
486
487 public void rollback() {
488 clear();
489 }
490
491 public void clear() {
492 flowsToAdd.clear();
493 flowsToRemove.clear();
494
495 stateToUpdate = typeToUpdate = flowIdToUpdate = installerIdToUpdate = null;
496 srcSwToUpdate = dstSwToUpdate = dataPathSummaryToUpdate = userStateToUpdate = null;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700497 srcPortToUpdate = dstPortToUpdate = null;
498 matchSrcMacToUpdate = matchDstMacToUpdate = null;
499 matchEthernetFrameTypeToUpdate = null;
500 matchVlanIdToUpdate = null;
501 matchVlanPriorityToUpdate = null;
502 matchSrcIpaddrToUpdate = matchDstIpaddrToUpdate = null;
503 matchIpProtoToUpdate = matchIpToSToUpdate = null;
504 matchSrcTcpUdpPortToUpdate = matchDstTcpUdpPortToUpdate = null;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700505 }
506
507 // Setter methods for test
508 public void setStateForTest(String state) { this.state = state; }
509 public void setTypeForTest(String type) { this.type = type; }
510 public void setFlowIdForTest(String flowId) { this.flowId = flowId; }
511 public void setInstallerIdForTest(String installerId) { this.installerId = installerId; }
512 public void setSrcSwForTest(String srcSw) { this.srcSw = srcSw; }
513 public void setDstSwForTest(String dstSw) { this.dstSw = dstSw; }
514 public void setDataPathSummaryForTest(String dataPathSummary) { this.dataPathSummary = dataPathSummary; }
515 public void setUserStateForTest(String userState) { this.userState = userState; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700516 public void setSrcPortForTest(Short srcPort) { this.srcPort = srcPort; }
517 public void setDstPortForTest(Short dstPort) { this.dstPort = dstPort; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700518 public void setMatchSrcMacForTest(String matchSrcMac) { this.matchSrcMac = matchSrcMac; }
519 public void setMatchDstMacForTest(String matchDstMac) { this.matchDstMac = matchDstMac; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700520 public void setMatchEthernetFrameTypeForTest(Short matchEthernetFrameType) { this.matchEthernetFrameType = matchEthernetFrameType; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700521 public void setMatchVlanIdForTest(Short matchVlanId) { this.matchVlanId = matchVlanId; }
522 public void setMatchVlanPriorityForTest(Byte matchVlanPriority) { this.matchVlanPriority = matchVlanPriority; }
523 public void setMatchSrcIpaddrForTest(String matchSrcIpaddr) { this.matchSrcIpaddr = matchSrcIpaddr; }
524 public void setMatchDstIpaddrForTest(String matchDstIpaddr) { this.matchDstIpaddr = matchDstIpaddr; }
525 public void setMatchIpProtoForTest(Byte matchIpProto) { this.matchIpProto = matchIpProto; }
526 public void setMatchIpToSForTest(Byte matchIpToS) { this.matchIpToS = matchIpToS; }
527 public void setMatchSrcTcpUdpPortForTest(Short matchSrcTcpUdpPort) { this.matchSrcTcpUdpPort = matchSrcTcpUdpPort; }
528 public void setMatchDstTcpUdpPortForTest(Short matchDstTcpUdpPort) { this.matchDstTcpUdpPort = matchDstTcpUdpPort; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700529 public void addFlowEntryForTest(IFlowEntry entry) { entries.add(entry); }
530 public void addSwitchForTest(ISwitchObject sw) { switches.add(sw); }
531
532 @Override
533 public String getState() { return state; }
534
535 @Override
536 public void setState(String state) { stateToUpdate = state; }
537
538 @Override
539 public String getType() { return type; }
540
541 @Override
542 public void setType(String type) { typeToUpdate = type; }
543
544 @Override
545 public Vertex asVertex() {
546 // TODO Auto-generated method stub
547 return null;
548 }
549
550 @Override
551 public String getFlowId() { return flowId; }
552
553 @Override
554 public void setFlowId(String flowId) { flowIdToUpdate = flowId; }
555
556 @Override
557 public String getInstallerId() { return installerId; }
558
559 @Override
560 public void setInstallerId(String installerId) { installerIdToUpdate = installerId; }
561
562 @Override
563 public String getSrcSwitch() { return srcSw; }
564
565 @Override
566 public void setSrcSwitch(String srcSwitch) { srcSwToUpdate = srcSwitch; }
567
568 @Override
569 public Short getSrcPort() { return srcPort; }
570
571 @Override
572 public void setSrcPort(Short srcPort) { srcPortToUpdate = srcPort; }
573
574 @Override
575 public String getDstSwitch() { return dstSw; }
576
577 @Override
578 public void setDstSwitch(String dstSwitch) { dstSwToUpdate = dstSwitch; }
579
580 @Override
581 public Short getDstPort() { return dstPort; }
582
583 @Override
584 public void setDstPort(Short dstPort) { dstPortToUpdate = dstPort; }
585
586 @Override
587 public String getDataPathSummary() { return dataPathSummary; }
588
589 @Override
590 public void setDataPathSummary(String dataPathSummary) { dataPathSummaryToUpdate = dataPathSummary; }
591
592 @Override
593 public Iterable<IFlowEntry> getFlowEntries() { return entries; }
594
595 @Override
596 public void addFlowEntry(IFlowEntry flowEntry) {
597 if(! entries.contains(flowEntry)) {
598 flowsToAdd.add(flowEntry);
599 }
600 }
601
602 @Override
603 public void removeFlowEntry(IFlowEntry flowEntry) {
604 if(entries.contains(flowEntry)) {
605 flowsToAdd.add(flowEntry);
606 }
607 }
608
609 @Override
Naoki Shiotac88d9562013-06-18 15:21:56 -0700610 public String getMatchSrcMac() { return matchSrcMac; }
611
612 @Override
613 public void setMatchSrcMac(String matchSrcMac) { matchSrcMacToUpdate = matchSrcMac; }
614
615 @Override
616 public String getMatchDstMac() { return matchDstMac; }
617
618 @Override
619 public void setMatchDstMac(String matchDstMac) { matchDstMacToUpdate = matchDstMac; }
620
621 @Override
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700622 public Short getMatchEthernetFrameType() { return matchEthernetFrameType; }
623
624 @Override
625 public void setMatchEthernetFrameType(Short matchEthernetFrameType) {
626 matchEthernetFrameTypeToUpdate = matchEthernetFrameType; }
627
628 @Override
629 public Short getMatchVlanId() { return matchVlanId; }
630
631 @Override
632 public void setMatchVlanId(Short matchVlanId) {
633 matchVlanIdToUpdate = matchVlanId; }
634
635 @Override
636 public Byte getMatchVlanPriority() { return matchVlanPriority; }
637
638 @Override
639 public void setMatchVlanPriority(Byte matchVlanPriority) {
640 matchVlanPriorityToUpdate = matchVlanPriority; }
641
642 @Override
Naoki Shiotac88d9562013-06-18 15:21:56 -0700643 public String getMatchSrcIPv4Net() { return matchSrcIpaddr; }
644
645 @Override
646 public void setMatchSrcIPv4Net(String matchSrcIPv4Net) {
647 matchSrcIpaddrToUpdate = matchSrcIPv4Net; }
648
649 @Override
650 public String getMatchDstIPv4Net() { return matchDstIpaddr; }
651
652 @Override
653 public void setMatchDstIPv4Net(String matchDstIPv4Net) {
654 matchDstIpaddrToUpdate = matchDstIPv4Net; }
655
656 @Override
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700657 public Byte getMatchIpProto() { return matchIpProto; }
658
659 @Override
660 public void setMatchIpProto(Byte matchIpProto) {
661 matchIpProtoToUpdate = matchIpProto; }
662
663 @Override
664 public Byte getMatchIpToS() { return matchIpToS; }
665
666 @Override
667 public void setMatchIpToS(Byte matchIpToS) {
668 matchIpToSToUpdate = matchIpToS; }
669
670 @Override
671 public Short getMatchSrcTcpUdpPort() { return matchSrcTcpUdpPort; }
672
673 @Override
674 public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort) {
675 matchSrcTcpUdpPortToUpdate = matchSrcTcpUdpPort; }
676
677 @Override
678 public Short getMatchDstTcpUdpPort() { return matchDstTcpUdpPort; }
679
680 @Override
681 public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort) {
682 matchDstTcpUdpPortToUpdate = matchDstTcpUdpPort; }
683
684 @Override
Naoki Shiotac88d9562013-06-18 15:21:56 -0700685 public Iterable<ISwitchObject> getSwitches() { return switches; }
686
687 @Override
688 public String getUserState() { return userState; }
689
690 @Override
691 public void setUserState(String userState) { userStateToUpdate = userState; }
692 }
693
694 public static class TestFlowEntry implements IFlowEntry {
695 private String state,type,entryId,dpid,userState,switchState,errorStateType,errorStateCode;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700696 private Short matchInPort;
697 private String matchSrcMac,matchDstMac;
698 private Short matchEtherFrameType;
699 private Short matchVlanId;
700 private Byte matchVlanPriority;
701 private String matchSrcIpaddr,matchDstIpaddr;
702 private Byte matchIpProto, matchIpToS;
703 private Short matchSrcTcpUdpPort, matchDstTcpUdpPort;
704 private Short actionOutput;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700705
706 private IFlowPath flowPath;
707 private ISwitchObject sw;
708 private IPortObject inport,outport;
709
710 private String stateToUpdate,typeToUpdate,entryIdToUpdate,dpidToUpdate,
711 userStateToUpdate,switchStateToUpdate,errorStateTypeToUpdate,errorStateCodeToUpdate;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700712 private Short matchInPortToUpdate;
713 private String matchSrcMacToUpdate,matchDstMacToUpdate;
714 private Short matchEtherFrameTypeToUpdate;
715 private Short matchVlanIdToUpdate;
716 private Byte matchVlanPriorityToUpdate;
717 private String matchSrcIpaddrToUpdate,matchDstIpaddrToUpdate;
718 private Byte matchIpProtoToUpdate, matchIpToSToUpdate;
719 private Short matchSrcTcpUdpPortToUpdate, matchDstTcpUdpPortToUpdate;
720 private Short actionOutputToUpdate;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700721
722 private IFlowPath flowPathToUpdate;
723 private ISwitchObject swToUpdate;
724 private IPortObject inportToUpdate,outportToUpdate;
725
726 public TestFlowEntry() {
727 type = "flow_entry";
728
729 clearUncommitedData();
730 }
731
732 public void commit() {
733 if(stateToUpdate != null) { state = stateToUpdate; }
734 if(typeToUpdate != null) { type = typeToUpdate; }
735 if(entryIdToUpdate != null) { entryId = entryIdToUpdate; }
736 if(dpidToUpdate != null) { dpid = dpidToUpdate; }
737 if(userStateToUpdate != null) { userState = userStateToUpdate; }
738 if(switchStateToUpdate != null) { switchState = switchStateToUpdate; }
739 if(errorStateTypeToUpdate != null) { errorStateType = errorStateTypeToUpdate; }
740 if(errorStateCodeToUpdate != null) { errorStateCode = errorStateCodeToUpdate; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700741 if(matchInPortToUpdate != null) { matchInPort = matchInPortToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700742 if(matchSrcMacToUpdate != null) { matchSrcMac = matchSrcMacToUpdate; }
743 if(matchDstMacToUpdate != null) { matchDstMac = matchDstMacToUpdate; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700744 if(matchEtherFrameTypeToUpdate != null) { matchEtherFrameType = matchEtherFrameTypeToUpdate; }
745 if(matchVlanIdToUpdate != null) { matchVlanId = matchVlanIdToUpdate; }
746 if(matchVlanPriorityToUpdate != null) { matchVlanPriority = matchVlanPriorityToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700747 if(matchSrcIpaddrToUpdate != null) { matchSrcIpaddr = matchSrcIpaddrToUpdate; }
748 if(matchDstIpaddrToUpdate != null) { matchDstIpaddr = matchDstIpaddrToUpdate; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700749 if(matchIpProtoToUpdate != null) { matchIpProto = matchIpProtoToUpdate; }
750 if(matchIpToSToUpdate != null) { matchIpToS = matchIpToSToUpdate; }
751 if(matchSrcTcpUdpPortToUpdate != null) { matchSrcTcpUdpPort = matchSrcTcpUdpPortToUpdate; }
752 if(matchDstTcpUdpPortToUpdate != null) { matchDstTcpUdpPort = matchDstTcpUdpPortToUpdate; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700753 if(actionOutputToUpdate != null) { actionOutput = actionOutputToUpdate; }
754
755 if(flowPathToUpdate != null) { flowPath = flowPathToUpdate; }
756 if(swToUpdate != null) { sw = swToUpdate; }
757 if(inportToUpdate != null) { inport = inportToUpdate; }
758 if(outportToUpdate != null) { outport = outportToUpdate; }
759
760 clearUncommitedData();
761 }
762
763 public void rollback() {
764 clearUncommitedData();
765 }
766
767 public void clearUncommitedData() {
768 stateToUpdate = typeToUpdate = entryIdToUpdate = dpidToUpdate = null;
769 userStateToUpdate = switchStateToUpdate = errorStateTypeToUpdate = errorStateCodeToUpdate = null;
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700770 matchInPortToUpdate = null;
771 matchSrcMacToUpdate = matchDstMacToUpdate = null;
772 matchEtherFrameTypeToUpdate = null;
773 matchVlanIdToUpdate = null;
774 matchVlanPriorityToUpdate = null;
775 matchSrcIpaddrToUpdate = matchDstIpaddrToUpdate = null;
776 matchIpProtoToUpdate = matchIpToSToUpdate = null;
777 matchSrcTcpUdpPortToUpdate = matchDstTcpUdpPortToUpdate = null;
778 actionOutputToUpdate = null;
Naoki Shiotac88d9562013-06-18 15:21:56 -0700779 flowPathToUpdate = null;
780 swToUpdate = null;
781 inportToUpdate = outportToUpdate = null;
782 }
783
784 // Setter methods for test
785 public void setStateForTest(String state) { this.state = state; }
786 public void setTypeForTest(String type) { this.type = type; }
787 public void setEntryIdForTest(String entryId) { this.entryId = entryId; }
788 public void setDpidForTest(String dpid) { this.dpid = dpid; }
789 public void setUserStateForTest(String userState) { this.userState = userState; }
790 public void setSwitchStateForTest(String switchState) { this.switchState = switchState; }
791 public void setErrorStateTypeForTest(String errorStateType) { this.errorStateType = errorStateType; }
792 public void setErrorStateCodeForTest(String errorStateCode) { this.errorStateCode = errorStateCode; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700793 public void setMatchInPortForTest(Short matchInPort) { this.matchInPort = matchInPort; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700794 public void setMatchSrcMacForTest(String matchSrcMac) { this.matchSrcMac = matchSrcMac; }
795 public void setMatchDstMacForTest(String matchDstMac) { this.matchDstMac = matchDstMac; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700796 public void setMatchEtherFrameTypeForTest(Short matchEtherFrameType) { this.matchEtherFrameType = matchEtherFrameType; }
797 public void setMatchVlanIdForTest(Short matchVlanId) { this.matchVlanId = matchVlanId; }
798 public void setMatchVlanPriorityForTest(Byte matchVlanPriority) { this.matchVlanPriority = matchVlanPriority; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700799 public void setMatchSrcIpaddrForTest(String matchSrcIpaddr) { this.matchSrcIpaddr = matchSrcIpaddr; }
800 public void setMatchDstIpaddrForTest(String matchDstIpaddr) { this.matchDstIpaddr = matchDstIpaddr; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700801 public void setMatchIpProtoForTest(Byte matchIpProto) { this.matchIpProto = matchIpProto; }
802 public void setMatchIpToSForTest(Byte matchIpToS) { this.matchIpToS = matchIpToS; }
803 public void setMatchSrcTcpUdpPortForTest(Short matchSrcTcpUdpPort) { this.matchSrcTcpUdpPort = matchSrcTcpUdpPort; }
804 public void setMatchDstTcpUdpPortForTest(Short matchDstTcpUdpPort) { this.matchDstTcpUdpPort = matchDstTcpUdpPort; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700805 public void setActionOutputForTest(Short actionOutput) { this.actionOutput = actionOutput; }
806 public void setFlowPathForTest(IFlowPath flowPath) { this.flowPath = flowPath; }
807 public void setSwitchForTest(ISwitchObject sw) { this.sw = sw; }
808 public void setInportForTest(IPortObject inport) { this.inport = inport; }
809 public void setOutportForTest(IPortObject outport) { this.outport = outport; }
810
811 @Override
812 public String getState() { return state; }
813
814 @Override
815 public void setState(String state) { stateToUpdate = state; }
816
817 @Override
818 public String getType() { return type; }
819
820 @Override
821 public void setType(String type) { typeToUpdate = type; }
822
823 @Override
824 public Vertex asVertex() {
825 // TODO Auto-generated method stub
826 return null;
827 }
828
829 @Override
830 public String getFlowEntryId() { return entryId; }
831
832 @Override
833 public void setFlowEntryId(String flowEntryId) { entryIdToUpdate = flowEntryId; }
834
835 @Override
836 public String getSwitchDpid() { return dpid; }
837
838 @Override
839 public void setSwitchDpid(String switchDpid) { dpidToUpdate = switchDpid; }
840
841 @Override
842 public String getUserState() { return userState; }
843
844 @Override
845 public void setUserState(String userState) { userStateToUpdate = userState; }
846
847 @Override
848 public String getSwitchState() { return switchState; }
849
850 @Override
851 public void setSwitchState(String switchState) { switchStateToUpdate = switchState; }
852
853 @Override
854 public String getErrorStateType() { return errorStateType; }
855
856 @Override
857 public void setErrorStateType(String errorStateType) { errorStateTypeToUpdate = errorStateType; }
858
859 @Override
860 public String getErrorStateCode() { return errorStateCode; }
861
862 @Override
863 public void setErrorStateCode(String errorStateCode) { errorStateCodeToUpdate = errorStateCode; }
864
865 @Override
866 public Short getMatchInPort() { return matchInPort; }
867
868 @Override
869 public void setMatchInPort(Short matchInPort) { matchInPortToUpdate = matchInPort; }
870
871 @Override
Naoki Shiotac88d9562013-06-18 15:21:56 -0700872 public String getMatchSrcMac() { return matchSrcMac; }
873
874 @Override
875 public void setMatchSrcMac(String matchSrcMac) { matchSrcMacToUpdate = matchSrcMac; }
876
877 @Override
878 public String getMatchDstMac() { return matchDstMac; }
879
880 @Override
881 public void setMatchDstMac(String matchDstMac) { matchDstMacToUpdate = matchDstMac; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700882
883 @Override
884 public Short getMatchEthernetFrameType() {return matchEtherFrameType; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700885
886 @Override
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700887 public void setMatchEthernetFrameType(Short matchEthernetFrameType) { matchEtherFrameTypeToUpdate = matchEthernetFrameType; }
888
889 @Override
890 public Short getMatchVlanId() {return matchVlanId; }
891
892 @Override
893 public void setMatchVlanId(Short matchVlanId) { matchVlanId = matchVlanId; }
894
895 @Override
896 public Byte getMatchVlanPriority() {return matchVlanPriority; }
897
898 @Override
899 public void setMatchVlanPriority(Byte matchVlanPriority) { matchVlanPriority = matchVlanPriority; }
900
901 @Override
Naoki Shiotac88d9562013-06-18 15:21:56 -0700902 public String getMatchSrcIPv4Net() { return matchSrcIpaddr; }
903
904 @Override
905 public void setMatchSrcIPv4Net(String matchSrcIPv4Net) { matchSrcIpaddrToUpdate = matchSrcIPv4Net; }
906
907 @Override
908 public String getMatchDstIPv4Net() { return matchDstIpaddr; }
909
910 @Override
911 public void setMatchDstIPv4Net(String matchDstIPv4Net) { matchDstIpaddrToUpdate = matchDstIPv4Net; }
Pavlin Radoslavovad3a1e62013-07-09 13:30:16 -0700912
913 @Override
914 public Byte getMatchIpProto() {return matchIpProto; }
915
916 @Override
917 public void setMatchIpProto(Byte matchIpProto) { matchIpProto = matchIpProto; }
918
919 @Override
920 public Byte getMatchIpToS() {return matchIpToS; }
921
922 @Override
923 public void setMatchIpToS(Byte matchIpToS) { matchIpToS = matchIpToS; }
924
925 @Override
926 public Short getMatchSrcTcpUdpPort() {return matchSrcTcpUdpPort; }
927
928 @Override
929 public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort) { matchSrcTcpUdpPortToUpdate = matchSrcTcpUdpPort; }
930
931 @Override
932 public Short getMatchDstTcpUdpPort() {return matchDstTcpUdpPort; }
933
934 @Override
935 public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort) { matchDstTcpUdpPortToUpdate = matchDstTcpUdpPort; }
Naoki Shiotac88d9562013-06-18 15:21:56 -0700936
937 @Override
938 public Short getActionOutput() { return actionOutput; }
939
940 @Override
941 public void setActionOutput(Short actionOutput) { actionOutputToUpdate = actionOutput; }
942
943 @Override
944 public IFlowPath getFlow() { return flowPath; }
945
946 @Override
947 public void setFlow(IFlowPath flow) { flowPathToUpdate = flow; }
948
949 @Override
950 public ISwitchObject getSwitch() { return sw; }
951
952 @Override
953 public void setSwitch(ISwitchObject sw) { swToUpdate = sw; }
954
955 @Override
956 public IPortObject getInPort() { return inport; }
957
958 @Override
959 public void setInPort(IPortObject port) { inportToUpdate = port; }
960
961 @Override
962 public IPortObject getOutPort() { return outport; }
963
964 @Override
965 public void setOutPort(IPortObject port) { outportToUpdate = port; }
966 }
967
968
969 public TestableGraphDBOperation() {
970 super(EasyMock.createNiceMock(GraphDBConnection.class));
971
972 switches = new ArrayList<TestSwitchObject>();
973 ports = new ArrayList<TestPortObject>();
974 devices = new ArrayList<TestDeviceObject>();
975 paths = new ArrayList<TestFlowPath>();
976 entries = new ArrayList<TestFlowEntry>();
977
978 switchesToAdd = new ArrayList<TestSwitchObject>();
979 portsToAdd = new ArrayList<TestPortObject>();
980 devicesToAdd = new ArrayList<TestDeviceObject>();
981 pathsToAdd = new ArrayList<TestFlowPath>();
982 entriesToAdd = new ArrayList<TestFlowEntry>();
983
984 switchesToRemove = new ArrayList<TestSwitchObject>();
985 portsToRemove = new ArrayList<TestPortObject>();
986 devicesToRemove = new ArrayList<TestDeviceObject>();
987 pathsToRemove = new ArrayList<TestFlowPath>();
988 entriesToRemove = new ArrayList<TestFlowEntry>();
989
990 clearUncommitedData();
991 }
992
993 private void clearUncommitedData() {
994 for(TestFlowEntry flow : entries) {
995 flow.clearUncommitedData();
996 }
997 for(TestFlowEntry flow : entriesToAdd) {
998 flow.clearUncommitedData();
999 }
1000
1001 for(TestDeviceObject dev : devices) {
1002 dev.clearUncommitedData();
1003 }
1004 for(TestDeviceObject dev : devicesToAdd) {
1005 dev.clearUncommitedData();
1006 }
1007
1008 for(TestSwitchObject sw : switches) {
1009 sw.clearUncommitedData();
1010 }
1011 for(TestSwitchObject sw : switchesToAdd) {
1012 sw.clearUncommitedData();
1013 }
1014
1015 for(TestPortObject port : ports) {
1016 port.clearUncommitedData();
1017 }
1018 for(TestPortObject port : portsToAdd) {
1019 port.clearUncommitedData();
1020 }
1021
1022 entriesToAdd.clear();
1023 entriesToRemove.clear();
1024 devicesToAdd.clear();
1025 devicesToRemove.clear();
1026 switchesToAdd.clear();
1027 switchesToRemove.clear();
1028 portsToAdd.clear();
1029 portsToRemove.clear();
1030 }
1031
1032
1033 // this.*ForTest() methods below are supposed to be used for creation of test topology.
1034 /**
1035 * Create new empty TestSwitchObject.
1036 * @return New TestSwitchObject
1037 */
1038 public TestSwitchObject createNewSwitchForTest() {
1039 TestSwitchObject sw = new TestSwitchObject();
1040 switches.add(sw);
1041 return sw;
1042 }
1043
1044 /**
1045 * Create new TestSwitchObject with specific DPID.
1046 * @param dpid DPID to be set
1047 * @return New TestSwitchObject
1048 */
1049 public TestSwitchObject createNewSwitchForTest(String dpid) {
1050 for(TestSwitchObject sw_loop : switches) {
1051 if(sw_loop.getDPID().equals(dpid)) {
1052 // Already created
1053 log.error("switch already exists : " + dpid);
1054 return sw_loop;
1055 }
1056 }
1057
1058 TestSwitchObject sw = new TestSwitchObject();
1059
1060 sw.setDpidForTest(dpid);
1061 switches.add(sw);
1062
1063 return sw;
1064 }
1065
1066 /**
1067 * Create new empty TestPortObject.
1068 * @return New TestPortObject
1069 */
1070 public TestPortObject createNewPortForTest() {
1071 TestPortObject port = new TestPortObject();
1072 ports.add(port);
1073 return port;
1074 }
1075
1076 /**
1077 * Create new TestPortObject with specific DPID and port number.
1078 * @param dpid DPID to be set
1079 * @param number Port number to be set
1080 * @return New TestPortObject
1081 */
1082 public TestPortObject createNewPortForTest(String dpid, Short number) {
1083 TestSwitchObject sw = null;
1084
1085 for(TestSwitchObject sw_loop : switches) {
1086 if(sw_loop.getDPID().equals(dpid)) {
1087 sw = sw_loop;
1088 }
1089 }
1090
1091 if(sw != null) {
1092 TestPortObject port = new TestPortObject();
1093 port.setNumberForTest(number);
1094 port.setSwitchForTest(sw);
1095 sw.addPortForTest(port);
1096
1097 ports.add(port);
1098
1099 return port;
1100 } else {
1101 return null;
1102 }
1103 }
1104
1105 /**
1106 * Link a TestPortObject to other TestPortObject.
1107 * @param src TestPortObjecgt of source port.
1108 * @param dst TestPortObjecgt of destination port.
1109 */
1110 public void setLinkBetweenPortsForTest(TestPortObject src, TestPortObject dst) {
1111 src.addLinkedPortForTest(dst);
1112 }
1113
1114 /**
1115 * Create new empty TestDeviceObject.
1116 * @return New TestDeviceObject
1117 */
1118 public TestDeviceObject createNewDeviceForTest() {
1119 TestDeviceObject dev = new TestDeviceObject();
1120
1121 return dev;
1122 }
1123
1124 /**
1125 * Create new empty TestFlowPathObject.
1126 * @return New TestFlowPathObject
1127 */
1128 public TestFlowPath createNewFlowPathForTest() {
1129 TestFlowPath path = new TestFlowPath();
1130 paths.add(path);
1131 return path;
1132 }
1133
1134 /**
1135 * Create new empty TestFlowEntryObject.
1136 * @return New TestFlowEntryObject
1137 */
1138 public TestFlowEntry createNewFlowEntryForTest() {
1139 TestFlowEntry entry = new TestFlowEntry();
1140 entries.add(entry);
1141 return entry;
1142 }
1143
1144
1145 public boolean hasLinkBetween(String srcSw_str, Short srcNumber, String dstSw_str, Short dstNumber) {
1146 IPortObject srcPort = null, dstPort = null;
1147 long srcSw = HexString.toLong(srcSw_str);
1148 long dstSw = HexString.toLong(dstSw_str);
1149
1150 for(TestSwitchObject sw : switches) {
1151 long swLong = HexString.toLong(sw.getDPID());
1152 if(swLong == srcSw) {
1153 for(IPortObject port : sw.getPorts()) {
1154 if(port.getNumber().equals(srcNumber)) {
1155 srcPort = port;
1156 }
1157 }
1158 } else if(swLong == dstSw) {
1159 for(IPortObject port : sw.getPorts()) {
1160 if(port.getNumber().equals(dstNumber)) {
1161 dstPort = port;
1162 }
1163 }
1164 }
1165 }
1166
1167 if(srcPort != null && dstPort != null) {
1168 for(IPortObject port : srcPort.getLinkedPorts()) {
1169 if(port.equals(dstPort)) {
1170 return true;
1171 }
1172 }
1173 }
1174
1175 return false;
1176 }
1177
1178 // Overriding methods below are to mock GraphDBOperation class.
1179 @Override
1180 public ISwitchObject newSwitch(String dpid) {
1181 TestSwitchObject sw = new TestSwitchObject();
1182 sw.setDPID(dpid);
1183 switchesToAdd.add(sw);
1184
1185 return sw;
1186 }
1187
1188 @Override
1189 public ISwitchObject searchSwitch(String dpid_str) {
1190 Long dpid = HexString.toLong(dpid_str);
1191
1192 for(ISwitchObject sw : switches) {
1193 if(HexString.toLong(sw.getDPID()) == dpid) {
1194 return sw;
1195 }
1196 }
1197 return null;
1198 }
1199
1200 @Override
1201 public ISwitchObject searchActiveSwitch(String dpid_str) {
1202 Long dpid = HexString.toLong(dpid_str);
1203
1204 for(ISwitchObject sw : switches) {
1205 if(HexString.toLong(sw.getDPID()) == dpid && sw.getState().equals("ACTIVE")) {
1206 return sw;
1207 }
1208 }
1209 return null;
1210 }
1211
1212 @Override
1213 public Iterable<ISwitchObject> getActiveSwitches() {
1214 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1215
1216 for(ISwitchObject sw : switches) {
1217 if(sw.getState() != null && sw.getState().equals("ACTIVE")) {
1218 list.add(sw);
1219 }
1220 }
1221 return list.isEmpty() ? null : list;
1222 }
1223
1224 @Override
1225 public Iterable<ISwitchObject> getAllSwitches() {
1226 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1227
1228 for(ISwitchObject sw : switches) {
1229 list.add(sw);
1230 }
1231
1232 return list.isEmpty() ? null : list;
1233 }
1234
1235 @Override
1236 public Iterable<ISwitchObject> getInactiveSwitches() {
1237 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1238
1239 for(ISwitchObject sw : switches) {
1240 if(! sw.getState().equals("ACTIVE")) {
1241 list.add(sw);
1242 }
1243 }
1244 return list.isEmpty() ? null : list;
1245 }
1246
1247 @Override
1248 public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
1249 List<IFlowEntry> list = new ArrayList<IFlowEntry>();
1250
1251 for(TestFlowEntry entry : entries) {
1252 if(entry.getSwitchState().equals("FE_SWITCH_NOT_UPDATED")) {
1253 list.add(entry);
1254 }
1255 }
1256 return list;
1257 }
1258
1259 @Override
1260 public void removeSwitch(ISwitchObject sw) {
1261 if(switches.contains(sw)) {
1262 switchesToRemove.add((TestSwitchObject)sw);
1263 }
1264 }
1265
1266 @Override
1267 public IPortObject newPort(Short portNumber) {
1268 TestPortObject port = new TestPortObject();
1269 port.setNumber(portNumber);
1270
1271 return port;
1272 }
1273
1274 public IPortObject newPort(Long dpid, Short portNumber) {
1275 TestPortObject port = null;
1276 TestSwitchObject sw = (TestSwitchObject)searchSwitch(HexString.toHexString(dpid));
1277
1278 if(sw != null) {
1279 port = (TestPortObject)newPort(portNumber);
1280 portsToAdd.add(port);
1281 sw.addPort(port);
1282 }
1283
1284 return port;
1285 }
1286
1287 @Override
Pankaj Berdebbd38612013-06-22 05:59:12 -07001288 public IPortObject searchPort(String dpid_str, Short number) {
Naoki Shiotac88d9562013-06-18 15:21:56 -07001289 long dpid = HexString.toLong(dpid_str);
1290
1291 for(TestSwitchObject sw : switches) {
1292 if(HexString.toLong(sw.getDPID()) == dpid) {
1293 for(IPortObject port : sw.getPorts()) {
1294 if(port.getNumber().equals(number)) {
1295 return port;
1296 }
1297 }
1298 }
1299 }
1300 return null;
1301 }
1302
1303 @Override
1304 public void removePort(IPortObject port) {
1305 for(TestSwitchObject sw : switches) {
1306 for(IPortObject pt : sw.getPorts()) {
1307 if(pt.equals(port)) {
1308 sw.removePort(port);
1309 }
1310 }
1311 }
1312 portsToRemove.add((TestPortObject)port);
1313 }
1314
1315 @Override
1316 public IDeviceObject newDevice() {
1317 TestDeviceObject dev = new TestDeviceObject();
1318 devicesToAdd.add(dev);
1319
1320 return dev;
1321 }
1322
1323 @Override
1324 public IDeviceObject searchDevice(String macAddr) {
1325 for(IDeviceObject dev : devices) {
1326 if(dev.getMACAddress().equals(macAddr)) {
1327 return dev;
1328 }
1329 }
1330 return null;
1331 }
1332
1333 @Override
1334 public Iterable<IDeviceObject> getDevices() {
1335 List<IDeviceObject> list = new ArrayList<IDeviceObject>();
1336
1337 for(TestDeviceObject dev : devices) {
1338 list.add(dev);
1339 }
1340
1341 return list;
1342 }
1343
1344 @Override
1345 public void removeDevice(IDeviceObject dev) {
1346 if(devices.contains((TestDeviceObject)dev)) {
1347 devicesToRemove.add((TestDeviceObject)dev);
1348 }
1349 }
1350
1351 @Override
1352 public IFlowPath newFlowPath() {
1353 TestFlowPath path = new TestFlowPath();
1354 pathsToAdd.add(path);
1355
1356 return path;
1357 }
1358
1359 @Override
1360 public IFlowPath searchFlowPath(FlowId flowId) {
1361 for(IFlowPath path : paths) {
1362 if(path.getFlowId().equals(flowId)) {
1363 return path;
1364 }
1365 }
1366 return null;
1367 }
1368
1369 @Override
1370 public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry) {
1371 for(IFlowPath path : paths) {
1372 for(IFlowEntry entry : path.getFlowEntries()) {
1373 if(entry.equals(flowEntry)) {
1374 return path;
1375 }
1376 }
1377
1378 }
1379 return null;
1380 }
1381
1382 @Override
1383 public Iterable<IFlowPath> getAllFlowPaths() {
1384 List<IFlowPath> list = new ArrayList<IFlowPath>();
1385
1386 for(IFlowPath path : paths) {
1387 list.add(path);
1388 }
1389
1390 return list;
1391 }
1392
1393 @Override
1394 public void removeFlowPath(IFlowPath flowPath) {
1395 if(paths.contains((TestFlowPath)flowPath)) {
1396 pathsToRemove.add((TestFlowPath)flowPath);
1397 }
1398 }
1399
1400 @Override
1401 public IFlowEntry newFlowEntry() {
1402 TestFlowEntry entry = new TestFlowEntry();
1403 entriesToAdd.add(entry);
1404 return entry;
1405 }
1406
1407 @Override
1408 public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
1409 for(TestFlowEntry entry : entries) {
1410 // TODO check if this matching works
1411 if(entry.getFlowEntryId().equals(flowEntryId)) {
1412 return entry;
1413 }
1414 }
1415 return null;
1416 }
1417
1418 @Override
1419 public Iterable<IFlowEntry> getAllFlowEntries() {
1420 List<IFlowEntry> list = new ArrayList<IFlowEntry>();
1421
1422 for(TestFlowEntry entry : entries) {
1423 list.add(entry);
1424 }
1425
1426 return list;
1427 }
1428
1429 @Override
1430 public void removeFlowEntry(IFlowEntry flowEntry) {
1431 if(entries.contains((TestFlowEntry)flowEntry)) {
1432 entriesToRemove.add((TestFlowEntry)flowEntry);
1433 }
1434 }
1435
1436 @Override
1437 public IDBConnection getDBConnection() {
1438 return super.getDBConnection();
1439 }
1440
1441 @Override
1442 public void commit() {
1443 for(TestSwitchObject sw : switchesToAdd) {
1444 switches.add(sw);
1445 }
1446 for(TestSwitchObject sw : switchesToRemove) {
1447 sw.commit();
1448 switches.remove(sw);
1449 }
1450 for(TestSwitchObject sw : switches) {
1451 sw.commit();
1452 }
1453
1454 for(TestPortObject port : portsToAdd) {
1455 ports.add(port);
1456 }
1457 for(TestPortObject port : portsToRemove) {
1458 port.commit();
1459 ports.remove(port);
1460 }
1461 for(TestPortObject port : ports) {
1462 port.commit();
1463 }
1464
1465 for(TestDeviceObject dev : devicesToAdd) {
1466 devices.add(dev);
1467 }
1468 for(TestDeviceObject dev : devicesToRemove) {
1469 dev.commit();
1470 devices.remove(dev);
1471 }
1472 for(TestDeviceObject dev : devices) {
1473 dev.commit();
1474 }
1475
1476 clearUncommitedData();
1477 }
1478
1479 @Override
1480 public void rollback() {
1481 clearUncommitedData();
1482 }
1483
1484 @Override
1485 public void close() {
1486 // TODO Auto-generated method stub
1487
1488 }
1489}