blob: 658aaaf67fbc37c43af2a4b16f7b7050a3cd4397 [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;
419 private String matchSrcMac,matchDstMac,matchSrcIpaddr,matchDstIpaddr;
420 private Short srcPort,dstPort,matchEthernetFrameType;
421
422 private List<IFlowEntry> entries;
423 private List<ISwitchObject> switches;
424
425 private String stateToUpdate,typeToUpdate,flowIdToUpdate,installerIdToUpdate,srcSwToUpdate,dstSwToUpdate;
426 private String dataPathSummaryToUpdate,userStateToUpdate;
427 private String matchSrcMacToUpdate,matchDstMacToUpdate,matchSrcIpaddrToUpdate,matchDstIpaddrToUpdate;
428 private Short srcPortToUpdate,dstPortToUpdate,matchEthernetFrameTypeToUpdate;
429
430 private List<IFlowEntry> flowsToAdd;
431 private List<IFlowEntry> flowsToRemove;
432
433 public TestFlowPath() {
434 type = "flow";
435
436 entries = new ArrayList<IFlowEntry>();
437 flowsToAdd = new ArrayList<IFlowEntry>();
438 flowsToRemove = new ArrayList<IFlowEntry>();
439
440 switches = new ArrayList<ISwitchObject>();
441
442 clear();
443 }
444
445 public void commit() {
446 for(IFlowEntry flow : flowsToAdd) {
447 entries.add(flow);
448 }
449 for(IFlowEntry flow : flowsToRemove) {
450 entries.remove(flow);
451 }
452 if(stateToUpdate != null) { state = stateToUpdate; }
453 if(typeToUpdate != null) { type = typeToUpdate; }
454 if(flowIdToUpdate != null) { flowId = flowIdToUpdate; }
455 if(installerIdToUpdate != null) { installerId = installerIdToUpdate; }
456 if(srcSwToUpdate != null) { srcSw = srcSwToUpdate; }
457 if(dstSwToUpdate != null) { dstSw = dstSwToUpdate; }
458 if(dataPathSummaryToUpdate != null) { dataPathSummary = dataPathSummaryToUpdate; }
459 if(userStateToUpdate != null) { userState = userStateToUpdate; }
460 if(matchSrcMacToUpdate != null) { matchSrcMac = matchSrcMacToUpdate; }
461 if(matchDstMacToUpdate != null) { matchDstMac = matchDstMacToUpdate; }
462 if(matchSrcIpaddrToUpdate != null) { matchSrcIpaddr = matchSrcIpaddrToUpdate; }
463 if(matchDstIpaddrToUpdate != null) { matchDstIpaddr = matchDstIpaddrToUpdate; }
464 if(srcPortToUpdate != null) { srcPort = srcPortToUpdate; }
465 if(dstPortToUpdate != null) { dstPort = dstPortToUpdate; }
466 if(matchEthernetFrameTypeToUpdate != null) { matchEthernetFrameType = matchEthernetFrameTypeToUpdate; }
467 }
468
469 public void rollback() {
470 clear();
471 }
472
473 public void clear() {
474 flowsToAdd.clear();
475 flowsToRemove.clear();
476
477 stateToUpdate = typeToUpdate = flowIdToUpdate = installerIdToUpdate = null;
478 srcSwToUpdate = dstSwToUpdate = dataPathSummaryToUpdate = userStateToUpdate = null;
479 matchSrcMacToUpdate = matchDstMacToUpdate = matchSrcIpaddrToUpdate = matchDstIpaddrToUpdate = null;
480 srcPortToUpdate = dstPortToUpdate = matchEthernetFrameTypeToUpdate = null;
481 }
482
483 // Setter methods for test
484 public void setStateForTest(String state) { this.state = state; }
485 public void setTypeForTest(String type) { this.type = type; }
486 public void setFlowIdForTest(String flowId) { this.flowId = flowId; }
487 public void setInstallerIdForTest(String installerId) { this.installerId = installerId; }
488 public void setSrcSwForTest(String srcSw) { this.srcSw = srcSw; }
489 public void setDstSwForTest(String dstSw) { this.dstSw = dstSw; }
490 public void setDataPathSummaryForTest(String dataPathSummary) { this.dataPathSummary = dataPathSummary; }
491 public void setUserStateForTest(String userState) { this.userState = userState; }
492 public void setMatchSrcMacForTest(String matchSrcMac) { this.matchSrcMac = matchSrcMac; }
493 public void setMatchDstMacForTest(String matchDstMac) { this.matchDstMac = matchDstMac; }
494 public void setMatchSrcIpaddrForTest(String matchSrcIpaddr) { this.matchSrcIpaddr = matchSrcIpaddr; }
495 public void setMatchDstIpaddrForTest(String matchDstIpaddr) { this.matchDstIpaddr = matchDstIpaddr; }
496 public void setSrcPortForTest(Short srcPort) { this.srcPort = srcPort; }
497 public void setDstPortForTest(Short dstPort) { this.dstPort = dstPort; }
498 public void setMatchEthernetFrameTypeForTest(Short matchEthernetFrameType) { this.matchEthernetFrameType = matchEthernetFrameType; }
499 public void addFlowEntryForTest(IFlowEntry entry) { entries.add(entry); }
500 public void addSwitchForTest(ISwitchObject sw) { switches.add(sw); }
501
502 @Override
503 public String getState() { return state; }
504
505 @Override
506 public void setState(String state) { stateToUpdate = state; }
507
508 @Override
509 public String getType() { return type; }
510
511 @Override
512 public void setType(String type) { typeToUpdate = type; }
513
514 @Override
515 public Vertex asVertex() {
516 // TODO Auto-generated method stub
517 return null;
518 }
519
520 @Override
521 public String getFlowId() { return flowId; }
522
523 @Override
524 public void setFlowId(String flowId) { flowIdToUpdate = flowId; }
525
526 @Override
527 public String getInstallerId() { return installerId; }
528
529 @Override
530 public void setInstallerId(String installerId) { installerIdToUpdate = installerId; }
531
532 @Override
533 public String getSrcSwitch() { return srcSw; }
534
535 @Override
536 public void setSrcSwitch(String srcSwitch) { srcSwToUpdate = srcSwitch; }
537
538 @Override
539 public Short getSrcPort() { return srcPort; }
540
541 @Override
542 public void setSrcPort(Short srcPort) { srcPortToUpdate = srcPort; }
543
544 @Override
545 public String getDstSwitch() { return dstSw; }
546
547 @Override
548 public void setDstSwitch(String dstSwitch) { dstSwToUpdate = dstSwitch; }
549
550 @Override
551 public Short getDstPort() { return dstPort; }
552
553 @Override
554 public void setDstPort(Short dstPort) { dstPortToUpdate = dstPort; }
555
556 @Override
557 public String getDataPathSummary() { return dataPathSummary; }
558
559 @Override
560 public void setDataPathSummary(String dataPathSummary) { dataPathSummaryToUpdate = dataPathSummary; }
561
562 @Override
563 public Iterable<IFlowEntry> getFlowEntries() { return entries; }
564
565 @Override
566 public void addFlowEntry(IFlowEntry flowEntry) {
567 if(! entries.contains(flowEntry)) {
568 flowsToAdd.add(flowEntry);
569 }
570 }
571
572 @Override
573 public void removeFlowEntry(IFlowEntry flowEntry) {
574 if(entries.contains(flowEntry)) {
575 flowsToAdd.add(flowEntry);
576 }
577 }
578
579 @Override
580 public Short getMatchEthernetFrameType() { return matchEthernetFrameType; }
581
582 @Override
583 public void setMatchEthernetFrameType(Short matchEthernetFrameType) {
584 matchEthernetFrameTypeToUpdate = matchEthernetFrameType; }
585
586 @Override
587 public String getMatchSrcMac() { return matchSrcMac; }
588
589 @Override
590 public void setMatchSrcMac(String matchSrcMac) { matchSrcMacToUpdate = matchSrcMac; }
591
592 @Override
593 public String getMatchDstMac() { return matchDstMac; }
594
595 @Override
596 public void setMatchDstMac(String matchDstMac) { matchDstMacToUpdate = matchDstMac; }
597
598 @Override
599 public String getMatchSrcIPv4Net() { return matchSrcIpaddr; }
600
601 @Override
602 public void setMatchSrcIPv4Net(String matchSrcIPv4Net) {
603 matchSrcIpaddrToUpdate = matchSrcIPv4Net; }
604
605 @Override
606 public String getMatchDstIPv4Net() { return matchDstIpaddr; }
607
608 @Override
609 public void setMatchDstIPv4Net(String matchDstIPv4Net) {
610 matchDstIpaddrToUpdate = matchDstIPv4Net; }
611
612 @Override
613 public Iterable<ISwitchObject> getSwitches() { return switches; }
614
615 @Override
616 public String getUserState() { return userState; }
617
618 @Override
619 public void setUserState(String userState) { userStateToUpdate = userState; }
620 }
621
622 public static class TestFlowEntry implements IFlowEntry {
623 private String state,type,entryId,dpid,userState,switchState,errorStateType,errorStateCode;
624 private String matchSrcMac,matchDstMac,matchSrcIpaddr,matchDstIpaddr;
625 private Short matchInPort,matchEtherFrameType,actionOutput;
626
627 private IFlowPath flowPath;
628 private ISwitchObject sw;
629 private IPortObject inport,outport;
630
631 private String stateToUpdate,typeToUpdate,entryIdToUpdate,dpidToUpdate,
632 userStateToUpdate,switchStateToUpdate,errorStateTypeToUpdate,errorStateCodeToUpdate;
633 private String matchSrcMacToUpdate,matchDstMacToUpdate,matchSrcIpaddrToUpdate,matchDstIpaddrToUpdate;
634
635 private Short matchInPortToUpdate,matchEtherFrameTypeToUpdate,actionOutputToUpdate;
636
637 private IFlowPath flowPathToUpdate;
638 private ISwitchObject swToUpdate;
639 private IPortObject inportToUpdate,outportToUpdate;
640
641 public TestFlowEntry() {
642 type = "flow_entry";
643
644 clearUncommitedData();
645 }
646
647 public void commit() {
648 if(stateToUpdate != null) { state = stateToUpdate; }
649 if(typeToUpdate != null) { type = typeToUpdate; }
650 if(entryIdToUpdate != null) { entryId = entryIdToUpdate; }
651 if(dpidToUpdate != null) { dpid = dpidToUpdate; }
652 if(userStateToUpdate != null) { userState = userStateToUpdate; }
653 if(switchStateToUpdate != null) { switchState = switchStateToUpdate; }
654 if(errorStateTypeToUpdate != null) { errorStateType = errorStateTypeToUpdate; }
655 if(errorStateCodeToUpdate != null) { errorStateCode = errorStateCodeToUpdate; }
656 if(matchSrcMacToUpdate != null) { matchSrcMac = matchSrcMacToUpdate; }
657 if(matchDstMacToUpdate != null) { matchDstMac = matchDstMacToUpdate; }
658 if(matchSrcIpaddrToUpdate != null) { matchSrcIpaddr = matchSrcIpaddrToUpdate; }
659 if(matchDstIpaddrToUpdate != null) { matchDstIpaddr = matchDstIpaddrToUpdate; }
660 if(matchInPortToUpdate != null) { matchInPort = matchInPortToUpdate; }
661 if(matchEtherFrameTypeToUpdate != null) { matchEtherFrameType = matchEtherFrameTypeToUpdate; }
662 if(actionOutputToUpdate != null) { actionOutput = actionOutputToUpdate; }
663
664 if(flowPathToUpdate != null) { flowPath = flowPathToUpdate; }
665 if(swToUpdate != null) { sw = swToUpdate; }
666 if(inportToUpdate != null) { inport = inportToUpdate; }
667 if(outportToUpdate != null) { outport = outportToUpdate; }
668
669 clearUncommitedData();
670 }
671
672 public void rollback() {
673 clearUncommitedData();
674 }
675
676 public void clearUncommitedData() {
677 stateToUpdate = typeToUpdate = entryIdToUpdate = dpidToUpdate = null;
678 userStateToUpdate = switchStateToUpdate = errorStateTypeToUpdate = errorStateCodeToUpdate = null;
679 matchSrcMacToUpdate = matchDstMacToUpdate = matchSrcIpaddrToUpdate = matchDstIpaddrToUpdate = null;
680 matchInPortToUpdate = matchEtherFrameTypeToUpdate = actionOutputToUpdate = null;
681 flowPathToUpdate = null;
682 swToUpdate = null;
683 inportToUpdate = outportToUpdate = null;
684 }
685
686 // Setter methods for test
687 public void setStateForTest(String state) { this.state = state; }
688 public void setTypeForTest(String type) { this.type = type; }
689 public void setEntryIdForTest(String entryId) { this.entryId = entryId; }
690 public void setDpidForTest(String dpid) { this.dpid = dpid; }
691 public void setUserStateForTest(String userState) { this.userState = userState; }
692 public void setSwitchStateForTest(String switchState) { this.switchState = switchState; }
693 public void setErrorStateTypeForTest(String errorStateType) { this.errorStateType = errorStateType; }
694 public void setErrorStateCodeForTest(String errorStateCode) { this.errorStateCode = errorStateCode; }
695 public void setMatchSrcMacForTest(String matchSrcMac) { this.matchSrcMac = matchSrcMac; }
696 public void setMatchDstMacForTest(String matchDstMac) { this.matchDstMac = matchDstMac; }
697 public void setMatchSrcIpaddrForTest(String matchSrcIpaddr) { this.matchSrcIpaddr = matchSrcIpaddr; }
698 public void setMatchDstIpaddrForTest(String matchDstIpaddr) { this.matchDstIpaddr = matchDstIpaddr; }
699 public void setMatchInPortForTest(Short matchInPort) { this.matchInPort = matchInPort; }
700 public void setMatchEtherFrameTypeForTest(Short matchEtherFrameType) { this.matchEtherFrameType = matchEtherFrameType; }
701 public void setActionOutputForTest(Short actionOutput) { this.actionOutput = actionOutput; }
702 public void setFlowPathForTest(IFlowPath flowPath) { this.flowPath = flowPath; }
703 public void setSwitchForTest(ISwitchObject sw) { this.sw = sw; }
704 public void setInportForTest(IPortObject inport) { this.inport = inport; }
705 public void setOutportForTest(IPortObject outport) { this.outport = outport; }
706
707 @Override
708 public String getState() { return state; }
709
710 @Override
711 public void setState(String state) { stateToUpdate = state; }
712
713 @Override
714 public String getType() { return type; }
715
716 @Override
717 public void setType(String type) { typeToUpdate = type; }
718
719 @Override
720 public Vertex asVertex() {
721 // TODO Auto-generated method stub
722 return null;
723 }
724
725 @Override
726 public String getFlowEntryId() { return entryId; }
727
728 @Override
729 public void setFlowEntryId(String flowEntryId) { entryIdToUpdate = flowEntryId; }
730
731 @Override
732 public String getSwitchDpid() { return dpid; }
733
734 @Override
735 public void setSwitchDpid(String switchDpid) { dpidToUpdate = switchDpid; }
736
737 @Override
738 public String getUserState() { return userState; }
739
740 @Override
741 public void setUserState(String userState) { userStateToUpdate = userState; }
742
743 @Override
744 public String getSwitchState() { return switchState; }
745
746 @Override
747 public void setSwitchState(String switchState) { switchStateToUpdate = switchState; }
748
749 @Override
750 public String getErrorStateType() { return errorStateType; }
751
752 @Override
753 public void setErrorStateType(String errorStateType) { errorStateTypeToUpdate = errorStateType; }
754
755 @Override
756 public String getErrorStateCode() { return errorStateCode; }
757
758 @Override
759 public void setErrorStateCode(String errorStateCode) { errorStateCodeToUpdate = errorStateCode; }
760
761 @Override
762 public Short getMatchInPort() { return matchInPort; }
763
764 @Override
765 public void setMatchInPort(Short matchInPort) { matchInPortToUpdate = matchInPort; }
766
767 @Override
768 public Short getMatchEthernetFrameType() {return matchEtherFrameType; }
769
770 @Override
771 public void setMatchEthernetFrameType(Short matchEthernetFrameType) { matchEtherFrameTypeToUpdate = matchEthernetFrameType; }
772
773 @Override
774 public String getMatchSrcMac() { return matchSrcMac; }
775
776 @Override
777 public void setMatchSrcMac(String matchSrcMac) { matchSrcMacToUpdate = matchSrcMac; }
778
779 @Override
780 public String getMatchDstMac() { return matchDstMac; }
781
782 @Override
783 public void setMatchDstMac(String matchDstMac) { matchDstMacToUpdate = matchDstMac; }
784
785 @Override
786 public String getMatchSrcIPv4Net() { return matchSrcIpaddr; }
787
788 @Override
789 public void setMatchSrcIPv4Net(String matchSrcIPv4Net) { matchSrcIpaddrToUpdate = matchSrcIPv4Net; }
790
791 @Override
792 public String getMatchDstIPv4Net() { return matchDstIpaddr; }
793
794 @Override
795 public void setMatchDstIPv4Net(String matchDstIPv4Net) { matchDstIpaddrToUpdate = matchDstIPv4Net; }
796
797 @Override
798 public Short getActionOutput() { return actionOutput; }
799
800 @Override
801 public void setActionOutput(Short actionOutput) { actionOutputToUpdate = actionOutput; }
802
803 @Override
804 public IFlowPath getFlow() { return flowPath; }
805
806 @Override
807 public void setFlow(IFlowPath flow) { flowPathToUpdate = flow; }
808
809 @Override
810 public ISwitchObject getSwitch() { return sw; }
811
812 @Override
813 public void setSwitch(ISwitchObject sw) { swToUpdate = sw; }
814
815 @Override
816 public IPortObject getInPort() { return inport; }
817
818 @Override
819 public void setInPort(IPortObject port) { inportToUpdate = port; }
820
821 @Override
822 public IPortObject getOutPort() { return outport; }
823
824 @Override
825 public void setOutPort(IPortObject port) { outportToUpdate = port; }
826 }
827
828
829 public TestableGraphDBOperation() {
830 super(EasyMock.createNiceMock(GraphDBConnection.class));
831
832 switches = new ArrayList<TestSwitchObject>();
833 ports = new ArrayList<TestPortObject>();
834 devices = new ArrayList<TestDeviceObject>();
835 paths = new ArrayList<TestFlowPath>();
836 entries = new ArrayList<TestFlowEntry>();
837
838 switchesToAdd = new ArrayList<TestSwitchObject>();
839 portsToAdd = new ArrayList<TestPortObject>();
840 devicesToAdd = new ArrayList<TestDeviceObject>();
841 pathsToAdd = new ArrayList<TestFlowPath>();
842 entriesToAdd = new ArrayList<TestFlowEntry>();
843
844 switchesToRemove = new ArrayList<TestSwitchObject>();
845 portsToRemove = new ArrayList<TestPortObject>();
846 devicesToRemove = new ArrayList<TestDeviceObject>();
847 pathsToRemove = new ArrayList<TestFlowPath>();
848 entriesToRemove = new ArrayList<TestFlowEntry>();
849
850 clearUncommitedData();
851 }
852
853 private void clearUncommitedData() {
854 for(TestFlowEntry flow : entries) {
855 flow.clearUncommitedData();
856 }
857 for(TestFlowEntry flow : entriesToAdd) {
858 flow.clearUncommitedData();
859 }
860
861 for(TestDeviceObject dev : devices) {
862 dev.clearUncommitedData();
863 }
864 for(TestDeviceObject dev : devicesToAdd) {
865 dev.clearUncommitedData();
866 }
867
868 for(TestSwitchObject sw : switches) {
869 sw.clearUncommitedData();
870 }
871 for(TestSwitchObject sw : switchesToAdd) {
872 sw.clearUncommitedData();
873 }
874
875 for(TestPortObject port : ports) {
876 port.clearUncommitedData();
877 }
878 for(TestPortObject port : portsToAdd) {
879 port.clearUncommitedData();
880 }
881
882 entriesToAdd.clear();
883 entriesToRemove.clear();
884 devicesToAdd.clear();
885 devicesToRemove.clear();
886 switchesToAdd.clear();
887 switchesToRemove.clear();
888 portsToAdd.clear();
889 portsToRemove.clear();
890 }
891
892
893 // this.*ForTest() methods below are supposed to be used for creation of test topology.
894 /**
895 * Create new empty TestSwitchObject.
896 * @return New TestSwitchObject
897 */
898 public TestSwitchObject createNewSwitchForTest() {
899 TestSwitchObject sw = new TestSwitchObject();
900 switches.add(sw);
901 return sw;
902 }
903
904 /**
905 * Create new TestSwitchObject with specific DPID.
906 * @param dpid DPID to be set
907 * @return New TestSwitchObject
908 */
909 public TestSwitchObject createNewSwitchForTest(String dpid) {
910 for(TestSwitchObject sw_loop : switches) {
911 if(sw_loop.getDPID().equals(dpid)) {
912 // Already created
913 log.error("switch already exists : " + dpid);
914 return sw_loop;
915 }
916 }
917
918 TestSwitchObject sw = new TestSwitchObject();
919
920 sw.setDpidForTest(dpid);
921 switches.add(sw);
922
923 return sw;
924 }
925
926 /**
927 * Create new empty TestPortObject.
928 * @return New TestPortObject
929 */
930 public TestPortObject createNewPortForTest() {
931 TestPortObject port = new TestPortObject();
932 ports.add(port);
933 return port;
934 }
935
936 /**
937 * Create new TestPortObject with specific DPID and port number.
938 * @param dpid DPID to be set
939 * @param number Port number to be set
940 * @return New TestPortObject
941 */
942 public TestPortObject createNewPortForTest(String dpid, Short number) {
943 TestSwitchObject sw = null;
944
945 for(TestSwitchObject sw_loop : switches) {
946 if(sw_loop.getDPID().equals(dpid)) {
947 sw = sw_loop;
948 }
949 }
950
951 if(sw != null) {
952 TestPortObject port = new TestPortObject();
953 port.setNumberForTest(number);
954 port.setSwitchForTest(sw);
955 sw.addPortForTest(port);
956
957 ports.add(port);
958
959 return port;
960 } else {
961 return null;
962 }
963 }
964
965 /**
966 * Link a TestPortObject to other TestPortObject.
967 * @param src TestPortObjecgt of source port.
968 * @param dst TestPortObjecgt of destination port.
969 */
970 public void setLinkBetweenPortsForTest(TestPortObject src, TestPortObject dst) {
971 src.addLinkedPortForTest(dst);
972 }
973
974 /**
975 * Create new empty TestDeviceObject.
976 * @return New TestDeviceObject
977 */
978 public TestDeviceObject createNewDeviceForTest() {
979 TestDeviceObject dev = new TestDeviceObject();
980
981 return dev;
982 }
983
984 /**
985 * Create new empty TestFlowPathObject.
986 * @return New TestFlowPathObject
987 */
988 public TestFlowPath createNewFlowPathForTest() {
989 TestFlowPath path = new TestFlowPath();
990 paths.add(path);
991 return path;
992 }
993
994 /**
995 * Create new empty TestFlowEntryObject.
996 * @return New TestFlowEntryObject
997 */
998 public TestFlowEntry createNewFlowEntryForTest() {
999 TestFlowEntry entry = new TestFlowEntry();
1000 entries.add(entry);
1001 return entry;
1002 }
1003
1004
1005 public boolean hasLinkBetween(String srcSw_str, Short srcNumber, String dstSw_str, Short dstNumber) {
1006 IPortObject srcPort = null, dstPort = null;
1007 long srcSw = HexString.toLong(srcSw_str);
1008 long dstSw = HexString.toLong(dstSw_str);
1009
1010 for(TestSwitchObject sw : switches) {
1011 long swLong = HexString.toLong(sw.getDPID());
1012 if(swLong == srcSw) {
1013 for(IPortObject port : sw.getPorts()) {
1014 if(port.getNumber().equals(srcNumber)) {
1015 srcPort = port;
1016 }
1017 }
1018 } else if(swLong == dstSw) {
1019 for(IPortObject port : sw.getPorts()) {
1020 if(port.getNumber().equals(dstNumber)) {
1021 dstPort = port;
1022 }
1023 }
1024 }
1025 }
1026
1027 if(srcPort != null && dstPort != null) {
1028 for(IPortObject port : srcPort.getLinkedPorts()) {
1029 if(port.equals(dstPort)) {
1030 return true;
1031 }
1032 }
1033 }
1034
1035 return false;
1036 }
1037
1038 // Overriding methods below are to mock GraphDBOperation class.
1039 @Override
1040 public ISwitchObject newSwitch(String dpid) {
1041 TestSwitchObject sw = new TestSwitchObject();
1042 sw.setDPID(dpid);
1043 switchesToAdd.add(sw);
1044
1045 return sw;
1046 }
1047
1048 @Override
1049 public ISwitchObject searchSwitch(String dpid_str) {
1050 Long dpid = HexString.toLong(dpid_str);
1051
1052 for(ISwitchObject sw : switches) {
1053 if(HexString.toLong(sw.getDPID()) == dpid) {
1054 return sw;
1055 }
1056 }
1057 return null;
1058 }
1059
1060 @Override
1061 public ISwitchObject searchActiveSwitch(String dpid_str) {
1062 Long dpid = HexString.toLong(dpid_str);
1063
1064 for(ISwitchObject sw : switches) {
1065 if(HexString.toLong(sw.getDPID()) == dpid && sw.getState().equals("ACTIVE")) {
1066 return sw;
1067 }
1068 }
1069 return null;
1070 }
1071
1072 @Override
1073 public Iterable<ISwitchObject> getActiveSwitches() {
1074 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1075
1076 for(ISwitchObject sw : switches) {
1077 if(sw.getState() != null && sw.getState().equals("ACTIVE")) {
1078 list.add(sw);
1079 }
1080 }
1081 return list.isEmpty() ? null : list;
1082 }
1083
1084 @Override
1085 public Iterable<ISwitchObject> getAllSwitches() {
1086 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1087
1088 for(ISwitchObject sw : switches) {
1089 list.add(sw);
1090 }
1091
1092 return list.isEmpty() ? null : list;
1093 }
1094
1095 @Override
1096 public Iterable<ISwitchObject> getInactiveSwitches() {
1097 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
1098
1099 for(ISwitchObject sw : switches) {
1100 if(! sw.getState().equals("ACTIVE")) {
1101 list.add(sw);
1102 }
1103 }
1104 return list.isEmpty() ? null : list;
1105 }
1106
1107 @Override
1108 public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
1109 List<IFlowEntry> list = new ArrayList<IFlowEntry>();
1110
1111 for(TestFlowEntry entry : entries) {
1112 if(entry.getSwitchState().equals("FE_SWITCH_NOT_UPDATED")) {
1113 list.add(entry);
1114 }
1115 }
1116 return list;
1117 }
1118
1119 @Override
1120 public void removeSwitch(ISwitchObject sw) {
1121 if(switches.contains(sw)) {
1122 switchesToRemove.add((TestSwitchObject)sw);
1123 }
1124 }
1125
1126 @Override
1127 public IPortObject newPort(Short portNumber) {
1128 TestPortObject port = new TestPortObject();
1129 port.setNumber(portNumber);
1130
1131 return port;
1132 }
1133
1134 public IPortObject newPort(Long dpid, Short portNumber) {
1135 TestPortObject port = null;
1136 TestSwitchObject sw = (TestSwitchObject)searchSwitch(HexString.toHexString(dpid));
1137
1138 if(sw != null) {
1139 port = (TestPortObject)newPort(portNumber);
1140 portsToAdd.add(port);
1141 sw.addPort(port);
1142 }
1143
1144 return port;
1145 }
1146
1147 @Override
Pankaj Berdebbd38612013-06-22 05:59:12 -07001148 public IPortObject searchPort(String dpid_str, Short number) {
Naoki Shiotac88d9562013-06-18 15:21:56 -07001149 long dpid = HexString.toLong(dpid_str);
1150
1151 for(TestSwitchObject sw : switches) {
1152 if(HexString.toLong(sw.getDPID()) == dpid) {
1153 for(IPortObject port : sw.getPorts()) {
1154 if(port.getNumber().equals(number)) {
1155 return port;
1156 }
1157 }
1158 }
1159 }
1160 return null;
1161 }
1162
1163 @Override
1164 public void removePort(IPortObject port) {
1165 for(TestSwitchObject sw : switches) {
1166 for(IPortObject pt : sw.getPorts()) {
1167 if(pt.equals(port)) {
1168 sw.removePort(port);
1169 }
1170 }
1171 }
1172 portsToRemove.add((TestPortObject)port);
1173 }
1174
1175 @Override
1176 public IDeviceObject newDevice() {
1177 TestDeviceObject dev = new TestDeviceObject();
1178 devicesToAdd.add(dev);
1179
1180 return dev;
1181 }
1182
1183 @Override
1184 public IDeviceObject searchDevice(String macAddr) {
1185 for(IDeviceObject dev : devices) {
1186 if(dev.getMACAddress().equals(macAddr)) {
1187 return dev;
1188 }
1189 }
1190 return null;
1191 }
1192
1193 @Override
1194 public Iterable<IDeviceObject> getDevices() {
1195 List<IDeviceObject> list = new ArrayList<IDeviceObject>();
1196
1197 for(TestDeviceObject dev : devices) {
1198 list.add(dev);
1199 }
1200
1201 return list;
1202 }
1203
1204 @Override
1205 public void removeDevice(IDeviceObject dev) {
1206 if(devices.contains((TestDeviceObject)dev)) {
1207 devicesToRemove.add((TestDeviceObject)dev);
1208 }
1209 }
1210
1211 @Override
1212 public IFlowPath newFlowPath() {
1213 TestFlowPath path = new TestFlowPath();
1214 pathsToAdd.add(path);
1215
1216 return path;
1217 }
1218
1219 @Override
1220 public IFlowPath searchFlowPath(FlowId flowId) {
1221 for(IFlowPath path : paths) {
1222 if(path.getFlowId().equals(flowId)) {
1223 return path;
1224 }
1225 }
1226 return null;
1227 }
1228
1229 @Override
1230 public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry) {
1231 for(IFlowPath path : paths) {
1232 for(IFlowEntry entry : path.getFlowEntries()) {
1233 if(entry.equals(flowEntry)) {
1234 return path;
1235 }
1236 }
1237
1238 }
1239 return null;
1240 }
1241
1242 @Override
1243 public Iterable<IFlowPath> getAllFlowPaths() {
1244 List<IFlowPath> list = new ArrayList<IFlowPath>();
1245
1246 for(IFlowPath path : paths) {
1247 list.add(path);
1248 }
1249
1250 return list;
1251 }
1252
1253 @Override
1254 public void removeFlowPath(IFlowPath flowPath) {
1255 if(paths.contains((TestFlowPath)flowPath)) {
1256 pathsToRemove.add((TestFlowPath)flowPath);
1257 }
1258 }
1259
1260 @Override
1261 public IFlowEntry newFlowEntry() {
1262 TestFlowEntry entry = new TestFlowEntry();
1263 entriesToAdd.add(entry);
1264 return entry;
1265 }
1266
1267 @Override
1268 public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
1269 for(TestFlowEntry entry : entries) {
1270 // TODO check if this matching works
1271 if(entry.getFlowEntryId().equals(flowEntryId)) {
1272 return entry;
1273 }
1274 }
1275 return null;
1276 }
1277
1278 @Override
1279 public Iterable<IFlowEntry> getAllFlowEntries() {
1280 List<IFlowEntry> list = new ArrayList<IFlowEntry>();
1281
1282 for(TestFlowEntry entry : entries) {
1283 list.add(entry);
1284 }
1285
1286 return list;
1287 }
1288
1289 @Override
1290 public void removeFlowEntry(IFlowEntry flowEntry) {
1291 if(entries.contains((TestFlowEntry)flowEntry)) {
1292 entriesToRemove.add((TestFlowEntry)flowEntry);
1293 }
1294 }
1295
1296 @Override
1297 public IDBConnection getDBConnection() {
1298 return super.getDBConnection();
1299 }
1300
1301 @Override
1302 public void commit() {
1303 for(TestSwitchObject sw : switchesToAdd) {
1304 switches.add(sw);
1305 }
1306 for(TestSwitchObject sw : switchesToRemove) {
1307 sw.commit();
1308 switches.remove(sw);
1309 }
1310 for(TestSwitchObject sw : switches) {
1311 sw.commit();
1312 }
1313
1314 for(TestPortObject port : portsToAdd) {
1315 ports.add(port);
1316 }
1317 for(TestPortObject port : portsToRemove) {
1318 port.commit();
1319 ports.remove(port);
1320 }
1321 for(TestPortObject port : ports) {
1322 port.commit();
1323 }
1324
1325 for(TestDeviceObject dev : devicesToAdd) {
1326 devices.add(dev);
1327 }
1328 for(TestDeviceObject dev : devicesToRemove) {
1329 dev.commit();
1330 devices.remove(dev);
1331 }
1332 for(TestDeviceObject dev : devices) {
1333 dev.commit();
1334 }
1335
1336 clearUncommitedData();
1337 }
1338
1339 @Override
1340 public void rollback() {
1341 clearUncommitedData();
1342 }
1343
1344 @Override
1345 public void close() {
1346 // TODO Auto-generated method stub
1347
1348 }
1349}