blob: 7e049b622e96746a94f54ea53a88924fb7bc6793 [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;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070019import com.tinkerpop.blueprints.TransactionalGraph;
Pankaj Berde3200ea02013-01-04 15:48:36 -080020import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
21import com.tinkerpop.blueprints.Edge;
22import com.tinkerpop.blueprints.Vertex;
Pankaj Berdeff421802013-01-29 20:28:52 -080023import com.tinkerpop.frames.FramedGraph;
Pankaj Berde1e2f7312013-02-15 08:25:31 -080024import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
Pankaj Berde3200ea02013-01-04 15:48:36 -080025import net.floodlightcontroller.core.ISwitchStorage;
26
27public class SwitchStorageImpl implements ISwitchStorage {
28 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080029 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080030
31 @Override
32 public void update(String dpid, SwitchState state, DM_OPERATION op) {
33 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080034 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080035 switch(op) {
36
37 case UPDATE:
38 case INSERT:
39 case CREATE:
40 addSwitch(dpid);
41 if (state != SwitchState.ACTIVE) {
42 setStatus(dpid, state);
43 }
44 break;
45 case DELETE:
46 deleteSwitch(dpid);
47 break;
48 default:
49 }
50 }
51
52 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080053 Vertex sw;
54 try {
55 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080056 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080057 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde5024ec12013-01-31 17:07:29 -080058 log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080059 }
60 } catch (TitanException e) {
61 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -080062 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde5024ec12013-01-31 17:07:29 -080063 log.info("SwitchStorage:setStatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080064 }
65
66
67 }
68
69 @Override
70 public void addPort(String dpid, OFPhysicalPort port) {
71 // TODO Auto-generated method stub
72 Vertex sw;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080073
74 boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
75 ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
76 if (portDown) {
77 deletePort(dpid, port.getPortNumber());
78 return;
79 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080080 try {
81 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080082 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080083 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080084 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080085 //TODO: Do nothing for now
86 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080087 } else {
88 Vertex p = graph.addVertex(null);
89 p.setProperty("type","port");
90 p.setProperty("number",port.getPortNumber());
Pankaj Berde1cde50b2013-02-19 20:16:06 -080091 p.setProperty("state", "ACTIVE");
92 p.setProperty("port_state",port.getState());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080093 p.setProperty("desc",port.getName());
94 Edge e = graph.addEdge(null, sw, p, "on");
95 e.setProperty("state","ACTIVE");
96 e.setProperty("number", port.getPortNumber());
97
98 graph.stopTransaction(Conclusion.SUCCESS);
99 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800100 }
101 } catch (TitanException e) {
102 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800103 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800104 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800105 }
106
107 }
108
109 @Override
110 public Collection<OFPhysicalPort> getPorts(long dpid) {
111 // TODO Auto-generated method stub
112 return null;
113 }
114
115 @Override
116 public OFPhysicalPort getPort(String dpid, short portnum) {
117 // TODO Auto-generated method stub
118 return null;
119 }
120
121 @Override
122 public OFPhysicalPort getPort(String dpid, String portName) {
123 // TODO Auto-generated method stub
124 return null;
125 }
126
127 @Override
128 public void addSwitch(String dpid) {
129
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800130 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800131
Pankaj Berde3200ea02013-01-04 15:48:36 -0800132 try {
133 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
134 /*
135 * Do nothing or throw exception?
136 */
Pankaj Berde1ccc7fe2013-01-22 17:31:06 -0800137 Vertex sw = graph.getVertices("dpid",dpid).iterator().next();
138
139 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
140 sw.setProperty("state",SwitchState.ACTIVE.toString());
141 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800142 } else {
143 Vertex sw = graph.addVertex(null);
144
145 sw.setProperty("type","switch");
146 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800147 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800148 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800149 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800150 }
151 } catch (TitanException e) {
152 /*
153 * retry till we succeed?
154 */
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800155 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800156 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800157 }
158
159
160 }
161
162 @Override
163 public void deleteSwitch(String dpid) {
164 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800165 Vertex sw;
166 try {
167
168 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
169 graph.removeVertex(sw);
170 graph.stopTransaction(Conclusion.SUCCESS);
171 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
172 }
173 } catch (TitanException e) {
174 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800175 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800176 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
177 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800178
179 }
180
181 @Override
182 public void deletePort(String dpid, short port) {
183 // TODO Auto-generated method stub
184 Vertex sw;
185 try {
186 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
187 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800188 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
189 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
190 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
191 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800192 graph.removeVertex(p);
193 graph.stopTransaction(Conclusion.SUCCESS);
194 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800195 }
196 } catch (TitanException e) {
197 // TODO: handle exceptions
Pankaj Berde62e1d5b2013-02-27 18:49:53 -0800198 graph.stopTransaction(Conclusion.FAILURE);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800199 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800200 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800201 }
202
203 @Override
204 public void deletePort(String dpid, String portName) {
205 // TODO Auto-generated method stub
206
207 }
208
209 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800210 public Iterable<ISwitchObject> getActiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800211 // TODO Add unit test
Pankaj Berdeff421802013-01-29 20:28:52 -0800212 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
213 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
214 List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
Pankaj Berde5024ec12013-01-31 17:07:29 -0800215
Pankaj Berdeff421802013-01-29 20:28:52 -0800216 for (ISwitchObject sw: switches) {
217 if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
218 activeSwitches.add(sw);
219 }
220 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800221
222 return activeSwitches;
Pankaj Berde3200ea02013-01-04 15:48:36 -0800223 }
224
225 @Override
226 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800227
228 graph = TitanFactory.open(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800229
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800230 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800231 Set<String> s = graph.getIndexedKeys(Vertex.class);
232 if (!s.contains("dpid")) {
233 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800234 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800235 }
236 if (!s.contains("type")) {
237 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800238 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800239 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800240 }
241
Pankaj Berded1259e82013-01-23 14:10:00 -0800242 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800243 public Iterable<ISwitchObject> getAllSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800244 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800245 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
246 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
247
Pankaj Berdeff421802013-01-29 20:28:52 -0800248
Pankaj Berded1259e82013-01-23 14:10:00 -0800249 return switches;
250 }
251
252 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800253 public Iterable<ISwitchObject> getInactiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800254 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800255 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
256 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
257
Pankaj Berde5024ec12013-01-31 17:07:29 -0800258 List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
Pankaj Berdeff421802013-01-29 20:28:52 -0800259
260 for (ISwitchObject sw: switches) {
261 if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800262 inactiveSwitches.add(sw);
Pankaj Berdeff421802013-01-29 20:28:52 -0800263 }
264 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800265 return inactiveSwitches;
Pankaj Berded1259e82013-01-23 14:10:00 -0800266 }
267
Pankaj Berded18c7622013-02-04 10:28:35 -0800268 public void finalize() {
269 close();
270 }
271
272 @Override
273 public void close() {
274 // TODO Auto-generated method stub
275 graph.shutdown();
276
277 }
278
Pankaj Berded1259e82013-01-23 14:10:00 -0800279
Pankaj Berde3200ea02013-01-04 15:48:36 -0800280}