blob: f4ed4c8442c42ef9d201877e55209db1715a60f1 [file] [log] [blame]
Naoki Shiota93ec1712013-06-13 15:49:36 -07001package net.floodlightcontroller.linkdiscovery.internal;
2
3import java.util.ArrayList;
Naoki Shiota93ec1712013-06-13 15:49:36 -07004import java.util.List;
Naoki Shiota93ec1712013-06-13 15:49:36 -07005
6import org.codehaus.jackson.annotate.JsonIgnore;
7import org.codehaus.jackson.annotate.JsonProperty;
8import org.easymock.EasyMock;
9import org.openflow.util.HexString;
Naoki Shiota17cfd792013-06-17 15:14:56 -070010import org.slf4j.Logger;
11import org.slf4j.LoggerFactory;
Naoki Shiota93ec1712013-06-13 15:49:36 -070012
13import com.tinkerpop.blueprints.Direction;
14import com.tinkerpop.blueprints.Vertex;
15import com.tinkerpop.frames.Adjacency;
16import com.tinkerpop.frames.Incidence;
17import com.tinkerpop.frames.Property;
18import com.tinkerpop.frames.annotations.gremlin.GremlinGroovy;
19import com.tinkerpop.frames.annotations.gremlin.GremlinParam;
20
21import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
22import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
23import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
24import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
25import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
Naoki Shiota93ec1712013-06-13 15:49:36 -070026import net.onrc.onos.ofcontroller.util.FlowEntryId;
27import net.onrc.onos.ofcontroller.util.FlowId;
28import net.onrc.onos.util.GraphDBConnection;
29import net.onrc.onos.util.GraphDBOperation;
30import net.onrc.onos.util.IDBConnection;
31
32public class TestGraphDBOperation extends GraphDBOperation {
Naoki Shiota17cfd792013-06-17 15:14:56 -070033 protected static Logger log = LoggerFactory.getLogger(TestGraphDBOperation.class);
34
Naoki Shiota93ec1712013-06-13 15:49:36 -070035 protected List<TestSwitchObject> switches;
36 protected List<TestPortObject> ports;
Naoki Shiota17cfd792013-06-17 15:14:56 -070037 protected List<TestDeviceObject> devices;
Naoki Shiota93ec1712013-06-13 15:49:36 -070038// protected List<TestFlowEntry> flows;
39
40 protected List<TestSwitchObject> switchesToAdd;
41 protected List<TestPortObject> portsToAdd;
Naoki Shiota17cfd792013-06-17 15:14:56 -070042 protected List<TestDeviceObject> devicesToAdd;
Naoki Shiota93ec1712013-06-13 15:49:36 -070043// protected List<TestFlowEntry> flowsToAdd;
44
45 protected List<TestSwitchObject> switchesToRemove;
46 protected List<TestPortObject> portsToRemove;
Naoki Shiota17cfd792013-06-17 15:14:56 -070047 protected List<TestDeviceObject> devicesToRemove;
Naoki Shiota93ec1712013-06-13 15:49:36 -070048// protected List<TestFlowEntry> flowsToRemove;
49
50
51 // Testable implementations of INetMapTopologyObject interfaces
Naoki Shiota17cfd792013-06-17 15:14:56 -070052 public static class TestDeviceObject implements IDeviceObject {
53 private String state,type,mac,ipaddr;
54 private List<IPortObject> ports;
55 private List<ISwitchObject> switches;
56
57 private String stateToUpdate,typeToUpdate,macToUpdate,ipaddrToUpdate;
58 private List<IPortObject> portsToAdd;
59 private List<IPortObject> portsToRemove;
60
61 public TestDeviceObject() {
62 ports = new ArrayList<IPortObject>();
63 portsToAdd = new ArrayList<IPortObject>();
64 portsToRemove = new ArrayList<IPortObject>();
65 switches = new ArrayList<ISwitchObject>();
66
67 clearUncommitedData();
68 }
69
70 public void commit() {
71 for(IPortObject port : portsToAdd) {
72 ports.add(port);
73 }
74 for(IPortObject port : portsToRemove) {
75 ports.remove(port);
76 }
77
78 if(stateToUpdate != null) { state = stateToUpdate; }
79 if(typeToUpdate != null) { type = typeToUpdate; }
80 if(macToUpdate != null) { mac = macToUpdate; }
81 if(ipaddrToUpdate != null) { ipaddr = ipaddrToUpdate; }
82
83 clearUncommitedData();
84 }
85
86 public void rollback() {
87 clearUncommitedData();
88 }
89
90 public void clearUncommitedData() {
91 ports.clear();
92 portsToAdd.clear();
93 portsToRemove.clear();
94
95 stateToUpdate = typeToUpdate = macToUpdate = ipaddrToUpdate = null;
96 }
97
98 public void addSwitchForTest(ISwitchObject sw) {
99 switches.add(sw);
100 }
101
102 public void addPortForTest(IPortObject port) {
103 ports.add(port);
104 }
105
106 @Override
107 @JsonProperty("state")
108 @Property("state")
109 public String getState() { return state; }
110
111 @Override
112 @Property("state")
113 public void setState(String state) { stateToUpdate = state; }
114
115 @Override
116 @JsonIgnore
117 @Property("type")
118 public String getType() { return type; }
119
120 @Override
121 @Property("type")
122 public void setType(String type) { typeToUpdate = type; }
123
124 @Override
125 public Vertex asVertex() {
126 // TODO Auto-generated method stub
127 return null;
128 }
129
130 @Override
131 @JsonProperty("mac")
132 @Property("dl_addr")
133 public String getMACAddress() { return mac; }
134
135 @Override
136 @Property("dl_addr")
137 public void setMACAddress(String macaddr) { macToUpdate = macaddr; }
138
139 @Override
140 @JsonProperty("ipv4")
141 @Property("nw_addr")
142 public String getIPAddress() { return ipaddr; }
143
144 @Override
145 @Property("dl_addr")
146 public void setIPAddress(String ipaddr) { ipaddrToUpdate = ipaddr; }
147
148 @Override
149 @JsonIgnore
150 @Incidence(label = "host", direction = Direction.IN)
151 public Iterable<IPortObject> getAttachedPorts() { return ports; }
152
153 @Override
154 @JsonIgnore
155 @Incidence(label = "host", direction = Direction.IN)
156 public void setHostPort(IPortObject port) { portsToAdd.add(port); }
157
158 @Override
159 @JsonIgnore
160 @Incidence(label = "host", direction = Direction.IN)
161 public void removeHostPort(IPortObject port) { portsToRemove.add(port); }
162
163 @Override
164 @JsonIgnore
165 @GremlinGroovy("_().in('host').in('on')")
166 public Iterable<ISwitchObject> getSwitch() { return switches; }
167 }
Naoki Shiota93ec1712013-06-13 15:49:36 -0700168
169 public static class TestSwitchObject implements ISwitchObject {
170 private String state,type,dpid;
171 private List<IPortObject> ports;
172 private List<IDeviceObject> devices;
173 private List<IFlowEntry> flows;
174
175 private String stateToUpdate, typeToUpdate, dpidToUpdate;
176 private List<IPortObject> portsToAdd;
177 private List<IPortObject> portsToRemove;
178
179 public TestSwitchObject() {
180 type = "switch";
181 state = "ACTIVE";
182
183 ports = new ArrayList<IPortObject>();
184 portsToAdd = new ArrayList<IPortObject>();
185 portsToRemove = new ArrayList<IPortObject>();
186 devices = new ArrayList<IDeviceObject>();
187 flows = new ArrayList<IFlowEntry>();
188
189 clearUncommitedData();
190 }
191
192 public void commit() {
193 for(IPortObject port : portsToAdd) {
194 ports.add(port);
195 }
196 for(IPortObject port : portsToRemove) {
197 ports.remove(port);
198 }
199 if(stateToUpdate != null) { state = stateToUpdate; }
200 if(typeToUpdate != null) { type = typeToUpdate; }
201 if(dpidToUpdate != null) { dpid = dpidToUpdate; }
202
203 clearUncommitedData();
204 }
205
206 public void rollback() {
207 clearUncommitedData();
208 }
209
210 public void clearUncommitedData() {
211 portsToAdd.clear();
212 portsToRemove.clear();
213 stateToUpdate = typeToUpdate = dpidToUpdate = null;
214 }
215
216 public void setDpidForTest(String dpid) { this.dpid = dpid; }
217 public void setStateForTest(String state) { this.state = state; }
218 public void setTypeForTest(String type) { this.type = type; }
219 public void addPortForTest(TestPortObject port) { ports.add(port); }
220
221 @Override
222 @JsonProperty("state")
223 @Property("state")
224 public String getState() { return state; }
225
226 @Override
227 @Property("state")
228 public void setState(String state) { this.stateToUpdate = state; }
229
230 @Override
231 @JsonIgnore
232 @Property("type")
233 public String getType() { return type ; }
234
235 @Override
236 @Property("type")
237 public void setType(String type) { this.typeToUpdate = type; }
238
239 // Not support for test
240 @Override
241 public Vertex asVertex() { return null; }
242
243 @Override
244 @JsonProperty("dpid")
245 @Property("dpid")
246 public String getDPID() { return dpid; }
247
248 @Override
249 @Property("dpid")
250 public void setDPID(String dpid) { this.dpidToUpdate = dpid; }
251
252 @Override
253 @JsonProperty("ports")
254 @Adjacency(label = "on")
255 public Iterable<IPortObject> getPorts() { return ports; }
256
257 @Override
258 @JsonIgnore
259 @GremlinGroovy("_().out('on').has('number',port_num)")
260 public IPortObject getPort(@GremlinParam("port_num") short port_num) {
261 for(IPortObject port : ports) {
262 if(port.getNumber() == port_num) {
263 return port;
264 }
265 }
266 return null;
267 }
268
269 @Override
270 @Adjacency(label = "on")
271 public void addPort(IPortObject port) { portsToAdd.add(port); }
272
273 @Override
274 @Adjacency(label = "on")
275 public void removePort(IPortObject port) { portsToRemove.add(port); }
276
277 @Override
278 @JsonIgnore
279 @GremlinGroovy("_().out('on').out('host')")
280 public Iterable<IDeviceObject> getDevices() { return devices; }
281
282 @Override
283 @JsonIgnore
284 @Incidence(label = "switch", direction = Direction.IN)
285 public Iterable<IFlowEntry> getFlowEntries() { return flows; }
286 }
287
288 public static class TestPortObject implements IPortObject {
289 private String state,type,desc;
290 private Short number;
291 private Integer port_state;
292 private ISwitchObject sw;
293 private List<IPortObject> linkedPorts;
294 private List<IDeviceObject> devices;
295 private List<IFlowEntry> flows;
296
297 private String stateToUpdate,typeToUpdate,descToUpdate;
298 private Short numberToUpdate;
299 private Integer port_stateToUpdate;
300 private List<IPortObject> linkedPortsToAdd;
301 private List<IPortObject> linkedPortsToRemove;
Naoki Shiota17cfd792013-06-17 15:14:56 -0700302 private List<IDeviceObject> devicesToAdd;
303 private List<IDeviceObject> devicesToRemove;
Naoki Shiota93ec1712013-06-13 15:49:36 -0700304
305
306 public TestPortObject() {
307 type = "port";
308 state = "ACTIVE";
309
310 linkedPorts = new ArrayList<IPortObject>();
311 linkedPortsToAdd = new ArrayList<IPortObject>();
312 linkedPortsToRemove = new ArrayList<IPortObject>();
313 devices = new ArrayList<IDeviceObject>();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700314 devicesToAdd = new ArrayList<IDeviceObject>();
315 devicesToRemove = new ArrayList<IDeviceObject>();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700316 flows = new ArrayList<IFlowEntry>();
317
318 clearUncommitedData();
319 }
320
321 public void commit() {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700322 for(IPortObject port : linkedPortsToAdd) { linkedPorts.add(port); }
323 for(IPortObject port : linkedPortsToRemove) { linkedPorts.remove(port); }
324 for(IDeviceObject dev : devicesToAdd) { devices.add(dev); }
325 for(IDeviceObject dev : devicesToRemove) { devices.remove(dev); }
326
Naoki Shiota93ec1712013-06-13 15:49:36 -0700327 if(stateToUpdate != null) { state = stateToUpdate; }
328 if(typeToUpdate != null) { type = typeToUpdate; }
329 if(descToUpdate != null) { desc = descToUpdate; }
330 if(numberToUpdate != null) { number = numberToUpdate; }
331 if(port_stateToUpdate != null) { port_state = port_stateToUpdate; }
332
333 clearUncommitedData();
334 }
335
336 public void rollback() {
337 clearUncommitedData();
338 }
339
340 public void clearUncommitedData() {
341 linkedPortsToAdd.clear();
342 linkedPortsToRemove.clear();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700343 devicesToAdd.clear();
344 devicesToRemove.clear();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700345 stateToUpdate = typeToUpdate = descToUpdate = null;
346 port_stateToUpdate = null;
347 numberToUpdate = null;
348 }
349
350 public void setStateForTest(String state) { this.state = state; }
351 public void setTypeForTest(String type) { this.type = type; }
352 public void setDescForTest(String desc) { this.desc = desc; }
353 public void setNumberForTest(Short number) { this.number = number; }
354 public void setPortStateForTest(Integer state) { this.port_state = state; }
355 public void setSwitchForTest(ISwitchObject sw) { this.sw = sw; }
356 public void addLinkedPortForTest(TestPortObject port) { this.linkedPorts.add(port); }
357
358 @Override
359 @JsonProperty("state")
360 @Property("state")
361 public String getState() { return state; }
362
363 @Override
364 @Property("state")
365 public void setState(String state) { this.stateToUpdate = state; }
366
367 @Override
368 @JsonIgnore
369 @Property("type")
370 public String getType() { return type; }
371
372 @Override
373 @Property("type")
374 public void setType(String type) { this.typeToUpdate = type; }
375
376 // not support for test
377 @Override
378 public Vertex asVertex() {
379 return null;
380 }
381
382 @Override
383 @JsonProperty("number")
384 @Property("number")
385 public Short getNumber() { return number; }
386
387 @Override
388 @Property("number")
389 public void setNumber(Short n) { this.numberToUpdate = n; }
390
391 @Override
392 @JsonProperty("desc")
393 @Property("desc")
394 public String getDesc() { return desc; }
395
396 @Override
397 @Property("desc")
398 public void setDesc(String s) { this.descToUpdate = s; }
399
400 @Override
401 @JsonIgnore
402 @Property("port_state")
403 public Integer getPortState() { return port_state; }
404
405 @Override
406 @Property("port_state")
407 public void setPortState(Integer s) { this.port_stateToUpdate = s; }
408
409 @Override
410 @JsonIgnore
411 @Incidence(label = "on", direction = Direction.IN)
412 public ISwitchObject getSwitch() { return sw; }
413
414 @Override
415 @JsonProperty("devices")
416 @Adjacency(label = "host")
417 public Iterable<IDeviceObject> getDevices() { return devices; }
418
419 @Override
420 @Adjacency(label = "host")
Naoki Shiota17cfd792013-06-17 15:14:56 -0700421 public void setDevice(IDeviceObject device) { devicesToAdd.add(device); }
Naoki Shiota93ec1712013-06-13 15:49:36 -0700422
423 @Override
424 @Adjacency(label = "host")
Naoki Shiota17cfd792013-06-17 15:14:56 -0700425 public void removeDevice(IDeviceObject device) { devicesToRemove.add(device); }
Naoki Shiota93ec1712013-06-13 15:49:36 -0700426
427 @Override
428 @JsonIgnore
429 @Incidence(label = "inport", direction = Direction.IN)
430 public Iterable<IFlowEntry> getInFlowEntries() {
431 // TODO Auto-generated method stub
432 return null;
433 }
434
435 @Override
436 @JsonIgnore
437 @Incidence(label = "outport", direction = Direction.IN)
438 public Iterable<IFlowEntry> getOutFlowEntries() {
439 // TODO Auto-generated method stub
440 return null;
441 }
442
443 @Override
444 @JsonIgnore
445 @Adjacency(label = "link")
Naoki Shiota17cfd792013-06-17 15:14:56 -0700446 public Iterable<IPortObject> getLinkedPorts() {
447 return linkedPorts; }
Naoki Shiota93ec1712013-06-13 15:49:36 -0700448
449 @Override
450 @Adjacency(label = "link")
451 public void removeLink(IPortObject dest_port) { linkedPortsToRemove.add(dest_port); }
452
453 @Override
454 @Adjacency(label = "link")
455 public void setLinkPort(IPortObject dest_port) { linkedPortsToAdd.add(dest_port); }
456 }
457
458
459 public TestGraphDBOperation() {
460 super(EasyMock.createNiceMock(GraphDBConnection.class));
461
462 switches = new ArrayList<TestSwitchObject>();
463 ports = new ArrayList<TestPortObject>();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700464 devices = new ArrayList<TestDeviceObject>();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700465// flows = new ArrayList<TestFlowEntry>();
466
467 switchesToAdd = new ArrayList<TestSwitchObject>();
468 portsToAdd = new ArrayList<TestPortObject>();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700469 devicesToAdd = new ArrayList<TestDeviceObject>();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700470// flowsToAdd = new ArrayList<TestFlowEntry>();
471
472 switchesToRemove = new ArrayList<TestSwitchObject>();
473 portsToRemove = new ArrayList<TestPortObject>();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700474 devicesToRemove = new ArrayList<TestDeviceObject>();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700475// flowsToRemove = new ArrayList<TestFlowEntry>();
476
Naoki Shiota17cfd792013-06-17 15:14:56 -0700477 clearUncommitedData();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700478 }
479
Naoki Shiota17cfd792013-06-17 15:14:56 -0700480 private void clearUncommitedData() {
481 for(TestDeviceObject dev : devices) {
482 dev.clearUncommitedData();
483 }
484 for(TestDeviceObject dev : devicesToAdd) {
485 dev.clearUncommitedData();
486 }
487
Naoki Shiota93ec1712013-06-13 15:49:36 -0700488 for(TestSwitchObject sw : switches) {
489 sw.clearUncommitedData();
490 }
491 for(TestSwitchObject sw : switchesToAdd) {
492 sw.clearUncommitedData();
493 }
494
495 for(TestPortObject port : ports) {
496 port.clearUncommitedData();
497 }
498 for(TestPortObject port : portsToAdd) {
499 port.clearUncommitedData();
500 }
501
Naoki Shiota17cfd792013-06-17 15:14:56 -0700502 devicesToAdd.clear();
503 devicesToRemove.clear();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700504 switchesToAdd.clear();
505 switchesToRemove.clear();
506 portsToAdd.clear();
507 portsToRemove.clear();
508 }
509
510
511 // this.*ForTest() methods below are supposed to be used for creation of test topology.
512 /**
513 *
514 * @param dpid
515 * @return
516 */
517 public TestSwitchObject createNewSwitchForTest(String dpid) {
518 for(TestSwitchObject sw_loop : switches) {
519 if(sw_loop.getDPID().equals(dpid)) {
520 // Already created
Naoki Shiota17cfd792013-06-17 15:14:56 -0700521 log.error("switch already exists : " + dpid);
Naoki Shiota93ec1712013-06-13 15:49:36 -0700522 return sw_loop;
523 }
524 }
525
526 TestSwitchObject sw = new TestSwitchObject();
527
528 sw.setDpidForTest(dpid);
529 switches.add(sw);
530
531 return sw;
532 }
533
534 public TestPortObject createNewPortForTest(String dpid, Short number) {
535 TestSwitchObject sw = null;
536
537 for(TestSwitchObject sw_loop : switches) {
538 if(sw_loop.getDPID().equals(dpid)) {
539 sw = sw_loop;
540 }
541 }
542
543 if(sw != null) {
544 TestPortObject port = new TestPortObject();
545 port.setNumberForTest(number);
546 port.setSwitchForTest(sw);
Naoki Shiota17cfd792013-06-17 15:14:56 -0700547 sw.addPortForTest(port);
548
549 ports.add(port);
Naoki Shiota93ec1712013-06-13 15:49:36 -0700550
551 return port;
552 } else {
553 return null;
554 }
555 }
556
557 public void setLinkBetweenPortsForTest(TestPortObject src, TestPortObject dst) {
558 src.addLinkedPortForTest(dst);
559 //dst.addLinkedPortForTest(src);
560 }
Naoki Shiota17cfd792013-06-17 15:14:56 -0700561
562 public boolean hasLinkBetween(String srcSw_str, Short srcNumber, String dstSw_str, Short dstNumber) {
563 IPortObject srcPort = null, dstPort = null;
564 long srcSw = HexString.toLong(srcSw_str);
565 long dstSw = HexString.toLong(dstSw_str);
566
567 for(TestSwitchObject sw : switches) {
568 long swLong = HexString.toLong(sw.getDPID());
569 if(swLong == srcSw) {
570 for(IPortObject port : sw.getPorts()) {
571 if(port.getNumber().equals(srcNumber)) {
572 srcPort = port;
573 }
574 }
575 } else if(swLong == dstSw) {
576 for(IPortObject port : sw.getPorts()) {
577 if(port.getNumber().equals(dstNumber)) {
578 dstPort = port;
579 }
580 }
581 }
582 }
583
584 if(srcPort != null && dstPort != null) {
585 for(IPortObject port : srcPort.getLinkedPorts()) {
586 if(port.equals(dstPort)) {
587 return true;
588 }
589 }
590 }
591
592 return false;
593 }
Naoki Shiota93ec1712013-06-13 15:49:36 -0700594
595 // Overriding methods below are to mock GraphDBOperation class.
596 @Override
597 public ISwitchObject newSwitch(String dpid) {
598 TestSwitchObject sw = new TestSwitchObject();
Naoki Shiota17cfd792013-06-17 15:14:56 -0700599 sw.setDPID(dpid);
Naoki Shiota93ec1712013-06-13 15:49:36 -0700600 switchesToAdd.add(sw);
601
602 return sw;
603 }
604
605 @Override
Naoki Shiota17cfd792013-06-17 15:14:56 -0700606 public ISwitchObject searchSwitch(String dpid_str) {
607 Long dpid = HexString.toLong(dpid_str);
608
Naoki Shiota93ec1712013-06-13 15:49:36 -0700609 for(ISwitchObject sw : switches) {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700610 if(HexString.toLong(sw.getDPID()) == dpid) {
Naoki Shiota93ec1712013-06-13 15:49:36 -0700611 return sw;
612 }
613 }
614 return null;
615 }
616
617 @Override
Naoki Shiota17cfd792013-06-17 15:14:56 -0700618 public ISwitchObject searchActiveSwitch(String dpid_str) {
619 Long dpid = HexString.toLong(dpid_str);
620
Naoki Shiota93ec1712013-06-13 15:49:36 -0700621 for(ISwitchObject sw : switches) {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700622 if(HexString.toLong(sw.getDPID()) == dpid && sw.getState().equals("ACTIVE")) {
Naoki Shiota93ec1712013-06-13 15:49:36 -0700623 return sw;
624 }
625 }
626 return null;
627 }
628
629 @Override
630 public Iterable<ISwitchObject> getActiveSwitches() {
631 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
632
633 for(ISwitchObject sw : switches) {
634 if(sw.getState().equals("ACTIVE")) {
635 list.add(sw);
636 }
637 }
638 return list.isEmpty() ? null : list;
639 }
640
641 @Override
642 public Iterable<ISwitchObject> getAllSwitches() {
643 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
644
645 for(ISwitchObject sw : switches) {
646 list.add(sw);
647 }
648
649 return list.isEmpty() ? null : list;
650 }
651
652 @Override
653 public Iterable<ISwitchObject> getInactiveSwitches() {
654 List<ISwitchObject> list = new ArrayList<ISwitchObject>();
655
656 for(ISwitchObject sw : switches) {
657 if(! sw.getState().equals("ACTIVE")) {
658 list.add(sw);
659 }
660 }
661 return list.isEmpty() ? null : list;
662 }
663
664 @Override
665 public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
666 // TODO Auto-generated method stub
667 return null;
668 }
669
670 @Override
671 public void removeSwitch(ISwitchObject sw) {
672 if(switches.contains(sw)) {
673 switchesToRemove.add((TestSwitchObject)sw);
674 }
675 }
676
677 @Override
678 public IPortObject newPort(Short portNumber) {
679 TestPortObject port = new TestPortObject();
680 port.setNumber(portNumber);
681
682 return port;
683 }
684
685 public IPortObject newPort(Long dpid, Short portNumber) {
686 TestPortObject port = null;
687 TestSwitchObject sw = (TestSwitchObject)searchSwitch(HexString.toHexString(dpid));
688
689 if(sw != null) {
690 port = (TestPortObject)newPort(portNumber);
691 portsToAdd.add(port);
692 sw.addPort(port);
693 }
694
695 return port;
696 }
697
698 @Override
699 public IPortObject searchPort(String dpid_str, short number) {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700700 long dpid = HexString.toLong(dpid_str);
701
Naoki Shiota93ec1712013-06-13 15:49:36 -0700702 for(TestSwitchObject sw : switches) {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700703 if(HexString.toLong(sw.getDPID()) == dpid) {
Naoki Shiota93ec1712013-06-13 15:49:36 -0700704 for(IPortObject port : sw.getPorts()) {
705 if(port.getNumber().equals(number)) {
706 return port;
707 }
708 }
709 }
710 }
711 return null;
712 }
713
714 @Override
715 public void removePort(IPortObject port) {
716 for(TestSwitchObject sw : switches) {
717 for(IPortObject pt : sw.getPorts()) {
718 if(pt.equals(port)) {
719 sw.removePort(port);
720 }
721 }
722 }
723 portsToRemove.add((TestPortObject)port);
724 }
725
726 @Override
727 public IDeviceObject newDevice() {
728 // TODO Auto-generated method stub
729 return null;
730 }
731
732 @Override
733 public IDeviceObject searchDevice(String macAddr) {
734 // TODO Auto-generated method stub
735 return null;
736 }
737
738 @Override
739 public Iterable<IDeviceObject> getDevices() {
740 // TODO Auto-generated method stub
741 return null;
742 }
743
744 @Override
745 public void removeDevice(IDeviceObject dev) {
746 // TODO Auto-generated method stub
747
748 }
749
750 @Override
751 public IFlowPath newFlowPath() {
752 // TODO Auto-generated method stub
753 return null;
754 }
755
756 @Override
757 public IFlowPath searchFlowPath(FlowId flowId) {
758 // TODO Auto-generated method stub
759 return null;
760 }
761
762 @Override
763 public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry) {
764 // TODO Auto-generated method stub
765 return null;
766 }
767
768 @Override
769 public Iterable<IFlowPath> getAllFlowPaths() {
770 // TODO Auto-generated method stub
771 return null;
772 }
773
774 @Override
775 public void removeFlowPath(IFlowPath flowPath) {
776 // TODO Auto-generated method stub
777
778 }
779
780 @Override
781 public IFlowEntry newFlowEntry() {
782 // TODO Auto-generated method stub
783 return null;
784 }
785
786 @Override
787 public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
788 // TODO Auto-generated method stub
789 return null;
790 }
791
792 @Override
793 public Iterable<IFlowEntry> getAllFlowEntries() {
794 // TODO Auto-generated method stub
795 return null;
796 }
797
798 @Override
799 public void removeFlowEntry(IFlowEntry flowEntry) {
800 // TODO Auto-generated method stub
801
802 }
803
804 @Override
805 public IDBConnection getDBConnection() {
806 return super.getDBConnection();
807 }
808
809 @Override
810 public void commit() {
811 for(TestSwitchObject sw : switchesToAdd) {
812 switches.add(sw);
813 }
814 for(TestSwitchObject sw : switchesToRemove) {
815 sw.commit();
816 switches.remove(sw);
817 }
818 for(TestSwitchObject sw : switches) {
819 sw.commit();
820 }
821
822 for(TestPortObject port : portsToAdd) {
823 ports.add(port);
824 }
825 for(TestPortObject port : portsToRemove) {
826 port.commit();
827 ports.remove(port);
828 }
829 for(TestPortObject port : ports) {
830 port.commit();
831 }
832
Naoki Shiota17cfd792013-06-17 15:14:56 -0700833 for(TestDeviceObject dev : devicesToAdd) {
834 devices.add(dev);
835 }
836 for(TestDeviceObject dev : devicesToRemove) {
837 dev.commit();
838 devices.remove(dev);
839 }
840 for(TestDeviceObject dev : devices) {
841 dev.commit();
842 }
843
844 clearUncommitedData();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700845 }
846
847 @Override
848 public void rollback() {
Naoki Shiota17cfd792013-06-17 15:14:56 -0700849 clearUncommitedData();
Naoki Shiota93ec1712013-06-13 15:49:36 -0700850 }
851
852 @Override
853 public void close() {
854 // TODO Auto-generated method stub
855
856 }
857}