blob: 06364008613566cd5a32556d2f207c0bcb7bc9ee [file] [log] [blame]
Pankaj Berde3200ea02013-01-04 15:48:36 -08001package net.floodlightcontroller.core.internal;
2
3import java.util.Collection;
4import java.util.List;
Pankaj Berde28cc61c2013-01-08 18:19:33 -08005import java.util.Set;
Pankaj Berde3200ea02013-01-04 15:48:36 -08006
Pankaj Berdeafb20532013-01-08 15:05:24 -08007import org.slf4j.Logger;
8import org.slf4j.LoggerFactory;
9
Pankaj Berde3200ea02013-01-04 15:48:36 -080010import org.openflow.protocol.OFPhysicalPort;
11
12import com.thinkaurelius.titan.core.TitanException;
13import com.thinkaurelius.titan.core.TitanFactory;
14import com.thinkaurelius.titan.core.TitanGraph;
15import com.tinkerpop.blueprints.Direction;
16import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
17import com.tinkerpop.blueprints.Edge;
18import com.tinkerpop.blueprints.Vertex;
19import net.floodlightcontroller.core.ISwitchStorage;
20
21public class SwitchStorageImpl implements ISwitchStorage {
22 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080023 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080024
25 @Override
26 public void update(String dpid, SwitchState state, DM_OPERATION op) {
27 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080028 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080029 switch(op) {
30
31 case UPDATE:
32 case INSERT:
33 case CREATE:
34 addSwitch(dpid);
35 if (state != SwitchState.ACTIVE) {
36 setStatus(dpid, state);
37 }
38 break;
39 case DELETE:
40 deleteSwitch(dpid);
41 break;
42 default:
43 }
44 }
45
46 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080047 Vertex sw;
48 try {
49 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080050 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080051 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -080052 log.info("SwitchStorage:setSTatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080053 }
54 } catch (TitanException e) {
55 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -080056 log.info("SwitchStorage:setSTatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080057 }
58
59
60 }
61
62 @Override
63 public void addPort(String dpid, OFPhysicalPort port) {
64 // TODO Auto-generated method stub
65 Vertex sw;
66 try {
67 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080068 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080069 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080070 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080071 //TODO: Do nothing for now
72 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080073 } else {
74 Vertex p = graph.addVertex(null);
75 p.setProperty("type","port");
76 p.setProperty("number",port.getPortNumber());
77 p.setProperty("state",port.getState());
78 p.setProperty("desc",port.getName());
79 Edge e = graph.addEdge(null, sw, p, "on");
80 e.setProperty("state","ACTIVE");
81 e.setProperty("number", port.getPortNumber());
82
83 graph.stopTransaction(Conclusion.SUCCESS);
84 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080085 }
86 } catch (TitanException e) {
87 // TODO: handle exceptions
Pankaj Berde0a31dab2013-01-15 16:06:36 -080088 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080089 }
90
91 }
92
93 @Override
94 public Collection<OFPhysicalPort> getPorts(long dpid) {
95 // TODO Auto-generated method stub
96 return null;
97 }
98
99 @Override
100 public OFPhysicalPort getPort(String dpid, short portnum) {
101 // TODO Auto-generated method stub
102 return null;
103 }
104
105 @Override
106 public OFPhysicalPort getPort(String dpid, String portName) {
107 // TODO Auto-generated method stub
108 return null;
109 }
110
111 @Override
112 public void addSwitch(String dpid) {
113
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800114 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800115
Pankaj Berde3200ea02013-01-04 15:48:36 -0800116 try {
117 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
118 /*
119 * Do nothing or throw exception?
120 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800121 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800122 } else {
123 Vertex sw = graph.addVertex(null);
124
125 sw.setProperty("type","switch");
126 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800127 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800128 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800129 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800130 }
131 } catch (TitanException e) {
132 /*
133 * retry till we succeed?
134 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800135 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800136 }
137
138
139 }
140
141 @Override
142 public void deleteSwitch(String dpid) {
143 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800144 Vertex sw;
145 try {
146
147 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
148 graph.removeVertex(sw);
149 graph.stopTransaction(Conclusion.SUCCESS);
150 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
151 }
152 } catch (TitanException e) {
153 // TODO: handle exceptions
154 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
155 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800156
157 }
158
159 @Override
160 public void deletePort(String dpid, short port) {
161 // TODO Auto-generated method stub
162 Vertex sw;
163 try {
164 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
165 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800166 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
167 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
168 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
169 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800170 graph.removeVertex(p);
171 graph.stopTransaction(Conclusion.SUCCESS);
172 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800173 }
174 } catch (TitanException e) {
175 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800176 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800177 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800178 }
179
180 @Override
181 public void deletePort(String dpid, String portName) {
182 // TODO Auto-generated method stub
183
184 }
185
186 @Override
187 public List<String> getActiveSwitches() {
188 // TODO Auto-generated method stub
189 return null;
190 }
191
192 @Override
193 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800194
195 graph = TitanFactory.open(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800196
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800197 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800198 Set<String> s = graph.getIndexedKeys(Vertex.class);
199 if (!s.contains("dpid")) {
200 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800201 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800202 }
203 if (!s.contains("type")) {
204 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800205 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800206 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800207 }
208
209}