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