blob: 6be26cbbbde5809454339a8d3456c1b9c6b975c7 [file] [log] [blame]
Pankaj Berde3200ea02013-01-04 15:48:36 -08001package net.floodlightcontroller.core.internal;
2
Pankaj Berded1259e82013-01-23 14:10:00 -08003import java.util.ArrayList;
Pankaj Berde3200ea02013-01-04 15:48:36 -08004import java.util.Collection;
5import java.util.List;
Pankaj Berde28cc61c2013-01-08 18:19:33 -08006import java.util.Set;
Pankaj Berde3200ea02013-01-04 15:48:36 -08007
Pankaj Berdeafb20532013-01-08 15:05:24 -08008import org.slf4j.Logger;
9import org.slf4j.LoggerFactory;
10
Pankaj Berde3200ea02013-01-04 15:48:36 -080011import org.openflow.protocol.OFPhysicalPort;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080012import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
13import org.openflow.protocol.OFPhysicalPort.OFPortState;
Pankaj Berde3200ea02013-01-04 15:48:36 -080014
15import com.thinkaurelius.titan.core.TitanException;
16import com.thinkaurelius.titan.core.TitanFactory;
17import com.thinkaurelius.titan.core.TitanGraph;
18import com.tinkerpop.blueprints.Direction;
19import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
20import com.tinkerpop.blueprints.Edge;
21import com.tinkerpop.blueprints.Vertex;
Pankaj Berdeff421802013-01-29 20:28:52 -080022import com.tinkerpop.frames.FramedGraph;
Pankaj Berde1e2f7312013-02-15 08:25:31 -080023import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
Pankaj Berde3200ea02013-01-04 15:48:36 -080024import net.floodlightcontroller.core.ISwitchStorage;
25
26public class SwitchStorageImpl implements ISwitchStorage {
27 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080028 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080029
30 @Override
31 public void update(String dpid, SwitchState state, DM_OPERATION op) {
32 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080033 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080034 switch(op) {
35
36 case UPDATE:
37 case INSERT:
38 case CREATE:
39 addSwitch(dpid);
40 if (state != SwitchState.ACTIVE) {
41 setStatus(dpid, state);
42 }
43 break;
44 case DELETE:
45 deleteSwitch(dpid);
46 break;
47 default:
48 }
49 }
50
51 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080052 Vertex sw;
53 try {
54 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080055 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080056 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde5024ec12013-01-31 17:07:29 -080057 log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080058 }
59 } catch (TitanException e) {
60 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -080061 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde5024ec12013-01-31 17:07:29 -080062 log.info("SwitchStorage:setStatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080063 }
64
65
66 }
67
68 @Override
69 public void addPort(String dpid, OFPhysicalPort port) {
70 // TODO Auto-generated method stub
71 Vertex sw;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080072
73 boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
74 ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
75 if (portDown) {
76 deletePort(dpid, port.getPortNumber());
77 return;
78 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080079 try {
80 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080081 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080082 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080083 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080084 //TODO: Do nothing for now
85 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080086 } else {
87 Vertex p = graph.addVertex(null);
88 p.setProperty("type","port");
89 p.setProperty("number",port.getPortNumber());
Pankaj Berde1cde50b2013-02-19 20:16:06 -080090 p.setProperty("state", "ACTIVE");
91 p.setProperty("port_state",port.getState());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080092 p.setProperty("desc",port.getName());
93 Edge e = graph.addEdge(null, sw, p, "on");
94 e.setProperty("state","ACTIVE");
95 e.setProperty("number", port.getPortNumber());
96
97 graph.stopTransaction(Conclusion.SUCCESS);
98 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080099 }
100 } catch (TitanException e) {
101 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800102 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800103 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800104 }
105
106 }
107
108 @Override
109 public Collection<OFPhysicalPort> getPorts(long dpid) {
110 // TODO Auto-generated method stub
111 return null;
112 }
113
114 @Override
115 public OFPhysicalPort getPort(String dpid, short portnum) {
116 // TODO Auto-generated method stub
117 return null;
118 }
119
120 @Override
121 public OFPhysicalPort getPort(String dpid, String portName) {
122 // TODO Auto-generated method stub
123 return null;
124 }
125
126 @Override
127 public void addSwitch(String dpid) {
128
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800129 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800130
Pankaj Berde3200ea02013-01-04 15:48:36 -0800131 try {
132 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
133 /*
134 * Do nothing or throw exception?
135 */
Pankaj Berde1ccc7fe2013-01-22 17:31:06 -0800136 Vertex sw = graph.getVertices("dpid",dpid).iterator().next();
137
138 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
139 sw.setProperty("state",SwitchState.ACTIVE.toString());
140 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800141 } else {
142 Vertex sw = graph.addVertex(null);
143
144 sw.setProperty("type","switch");
145 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800146 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800147 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800148 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800149 }
150 } catch (TitanException e) {
151 /*
152 * retry till we succeed?
153 */
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800154 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800155 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800156 }
157
158
159 }
160
161 @Override
162 public void deleteSwitch(String dpid) {
163 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800164 Vertex sw;
165 try {
166
167 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
168 graph.removeVertex(sw);
169 graph.stopTransaction(Conclusion.SUCCESS);
170 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
171 }
172 } catch (TitanException e) {
173 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800174 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800175 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
176 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800177
178 }
179
180 @Override
181 public void deletePort(String dpid, short port) {
182 // TODO Auto-generated method stub
183 Vertex sw;
184 try {
185 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
186 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800187 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
188 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
189 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
190 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800191 graph.removeVertex(p);
192 graph.stopTransaction(Conclusion.SUCCESS);
193 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800194 }
195 } catch (TitanException e) {
196 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800197 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800198 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800199 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800200 }
201
202 @Override
203 public void deletePort(String dpid, String portName) {
204 // TODO Auto-generated method stub
205
206 }
207
208 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800209 public Iterable<ISwitchObject> getActiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800210 // TODO Add unit test
Pankaj Berdeff421802013-01-29 20:28:52 -0800211 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
212 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
213 List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
Pankaj Berde5024ec12013-01-31 17:07:29 -0800214
Pankaj Berdeff421802013-01-29 20:28:52 -0800215 for (ISwitchObject sw: switches) {
216 if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
217 activeSwitches.add(sw);
218 }
219 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800220
221 return activeSwitches;
Pankaj Berde3200ea02013-01-04 15:48:36 -0800222 }
223
224 @Override
225 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800226
227 graph = TitanFactory.open(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800228
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800229 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800230 Set<String> s = graph.getIndexedKeys(Vertex.class);
231 if (!s.contains("dpid")) {
232 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800233 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800234 }
235 if (!s.contains("type")) {
236 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800237 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800238 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800239 }
240
Pankaj Berded1259e82013-01-23 14:10:00 -0800241 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800242 public Iterable<ISwitchObject> getAllSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800243 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800244 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
245 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
246
247 for (ISwitchObject sw: switches) {
248 log.debug("switch: {}", sw.getDPID());
249 }
250
Pankaj Berded1259e82013-01-23 14:10:00 -0800251 return switches;
252 }
253
254 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800255 public Iterable<ISwitchObject> getInactiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800256 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800257 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
258 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
259
Pankaj Berde5024ec12013-01-31 17:07:29 -0800260 List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
Pankaj Berdeff421802013-01-29 20:28:52 -0800261
262 for (ISwitchObject sw: switches) {
263 if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800264 inactiveSwitches.add(sw);
Pankaj Berdeff421802013-01-29 20:28:52 -0800265 }
266 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800267 return inactiveSwitches;
Pankaj Berded1259e82013-01-23 14:10:00 -0800268 }
269
Pankaj Berded18c7622013-02-04 10:28:35 -0800270 public void finalize() {
271 close();
272 }
273
274 @Override
275 public void close() {
276 // TODO Auto-generated method stub
277 graph.shutdown();
278
279 }
280
Pankaj Berded1259e82013-01-23 14:10:00 -0800281
Pankaj Berde3200ea02013-01-04 15:48:36 -0800282}