blob: dbb985e72851b0fba0d844ee6e9005f5a21fb3de [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 Berde3200ea02013-01-04 15:48:36 -080023import net.floodlightcontroller.core.ISwitchStorage;
24
25public class SwitchStorageImpl implements ISwitchStorage {
26 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080027 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080028
29 @Override
30 public void update(String dpid, SwitchState state, DM_OPERATION op) {
31 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080032 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080033 switch(op) {
34
35 case UPDATE:
36 case INSERT:
37 case CREATE:
38 addSwitch(dpid);
39 if (state != SwitchState.ACTIVE) {
40 setStatus(dpid, state);
41 }
42 break;
43 case DELETE:
44 deleteSwitch(dpid);
45 break;
46 default:
47 }
48 }
49
50 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080051 Vertex sw;
52 try {
53 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080054 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080055 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -080056 log.info("SwitchStorage:setSTatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080057 }
58 } catch (TitanException e) {
59 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -080060 log.info("SwitchStorage:setSTatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080061 }
62
63
64 }
65
66 @Override
67 public void addPort(String dpid, OFPhysicalPort port) {
68 // TODO Auto-generated method stub
69 Vertex sw;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080070
71 boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
72 ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
73 if (portDown) {
74 deletePort(dpid, port.getPortNumber());
75 return;
76 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080077 try {
78 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080079 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080080 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080081 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080082 //TODO: Do nothing for now
83 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080084 } else {
85 Vertex p = graph.addVertex(null);
86 p.setProperty("type","port");
87 p.setProperty("number",port.getPortNumber());
88 p.setProperty("state",port.getState());
89 p.setProperty("desc",port.getName());
90 Edge e = graph.addEdge(null, sw, p, "on");
91 e.setProperty("state","ACTIVE");
92 e.setProperty("number", port.getPortNumber());
93
94 graph.stopTransaction(Conclusion.SUCCESS);
95 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080096 }
97 } catch (TitanException e) {
98 // TODO: handle exceptions
Pankaj Berde0a31dab2013-01-15 16:06:36 -080099 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800100 }
101
102 }
103
104 @Override
105 public Collection<OFPhysicalPort> getPorts(long dpid) {
106 // TODO Auto-generated method stub
107 return null;
108 }
109
110 @Override
111 public OFPhysicalPort getPort(String dpid, short portnum) {
112 // TODO Auto-generated method stub
113 return null;
114 }
115
116 @Override
117 public OFPhysicalPort getPort(String dpid, String portName) {
118 // TODO Auto-generated method stub
119 return null;
120 }
121
122 @Override
123 public void addSwitch(String dpid) {
124
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800125 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800126
Pankaj Berde3200ea02013-01-04 15:48:36 -0800127 try {
128 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
129 /*
130 * Do nothing or throw exception?
131 */
Pankaj Berde1ccc7fe2013-01-22 17:31:06 -0800132 Vertex sw = graph.getVertices("dpid",dpid).iterator().next();
133
134 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
135 sw.setProperty("state",SwitchState.ACTIVE.toString());
136 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800137 } else {
138 Vertex sw = graph.addVertex(null);
139
140 sw.setProperty("type","switch");
141 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800142 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800143 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800144 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800145 }
146 } catch (TitanException e) {
147 /*
148 * retry till we succeed?
149 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800150 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800151 }
152
153
154 }
155
156 @Override
157 public void deleteSwitch(String dpid) {
158 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800159 Vertex sw;
160 try {
161
162 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
163 graph.removeVertex(sw);
164 graph.stopTransaction(Conclusion.SUCCESS);
165 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
166 }
167 } catch (TitanException e) {
168 // TODO: handle exceptions
169 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
170 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800171
172 }
173
174 @Override
175 public void deletePort(String dpid, short port) {
176 // TODO Auto-generated method stub
177 Vertex sw;
178 try {
179 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
180 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800181 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
182 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
183 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
184 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800185 graph.removeVertex(p);
186 graph.stopTransaction(Conclusion.SUCCESS);
187 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800188 }
189 } catch (TitanException e) {
190 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800191 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800192 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800193 }
194
195 @Override
196 public void deletePort(String dpid, String portName) {
197 // TODO Auto-generated method stub
198
199 }
200
201 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800202 public Iterable<ISwitchObject> getActiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800203 // TODO Add unit test
Pankaj Berdeff421802013-01-29 20:28:52 -0800204 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
205 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
206 List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
207
208 for (ISwitchObject sw: switches) {
209 if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
210 activeSwitches.add(sw);
211 }
212 }
213
214 return activeSwitches;
Pankaj Berde3200ea02013-01-04 15:48:36 -0800215 }
216
217 @Override
218 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800219
220 graph = TitanFactory.open(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800221
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800222 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800223 Set<String> s = graph.getIndexedKeys(Vertex.class);
224 if (!s.contains("dpid")) {
225 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800226 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800227 }
228 if (!s.contains("type")) {
229 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800230 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800231 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800232 }
233
Pankaj Berded1259e82013-01-23 14:10:00 -0800234 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800235 public Iterable<ISwitchObject> getAllSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800236 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800237 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
238 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
239
240 for (ISwitchObject sw: switches) {
241 log.debug("switch: {}", sw.getDPID());
242 }
243
Pankaj Berded1259e82013-01-23 14:10:00 -0800244 return switches;
245 }
246
247 @Override
Pankaj Berdeff421802013-01-29 20:28:52 -0800248 public Iterable<ISwitchObject> getInactiveSwitches() {
Pankaj Berded1259e82013-01-23 14:10:00 -0800249 // TODO Auto-generated method stub
Pankaj Berdeff421802013-01-29 20:28:52 -0800250 FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
251 Iterable<ISwitchObject> switches = fg.getVertices("type","switch",ISwitchObject.class);
252
253 List<ISwitchObject> inActiveSwitches = new ArrayList<ISwitchObject>();
254
255 for (ISwitchObject sw: switches) {
256 if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
257 inActiveSwitches.add(sw);
258 }
259 }
260 return inActiveSwitches;
Pankaj Berded1259e82013-01-23 14:10:00 -0800261 }
262
263
Pankaj Berde3200ea02013-01-04 15:48:36 -0800264}