blob: 1be6e44b4cc7e239e7134a466bb73c2962cfef95 [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;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080011import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
12import org.openflow.protocol.OFPhysicalPort.OFPortState;
Pankaj Berde3200ea02013-01-04 15:48:36 -080013
14import com.thinkaurelius.titan.core.TitanException;
15import com.thinkaurelius.titan.core.TitanFactory;
16import com.thinkaurelius.titan.core.TitanGraph;
17import com.tinkerpop.blueprints.Direction;
18import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
19import com.tinkerpop.blueprints.Edge;
20import com.tinkerpop.blueprints.Vertex;
21import net.floodlightcontroller.core.ISwitchStorage;
22
23public class SwitchStorageImpl implements ISwitchStorage {
24 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080025 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080026
27 @Override
28 public void update(String dpid, SwitchState state, DM_OPERATION op) {
29 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080030 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080031 switch(op) {
32
33 case UPDATE:
34 case INSERT:
35 case CREATE:
36 addSwitch(dpid);
37 if (state != SwitchState.ACTIVE) {
38 setStatus(dpid, state);
39 }
40 break;
41 case DELETE:
42 deleteSwitch(dpid);
43 break;
44 default:
45 }
46 }
47
48 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080049 Vertex sw;
50 try {
51 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080052 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080053 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -080054 log.info("SwitchStorage:setSTatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080055 }
56 } catch (TitanException e) {
57 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -080058 log.info("SwitchStorage:setSTatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080059 }
60
61
62 }
63
64 @Override
65 public void addPort(String dpid, OFPhysicalPort port) {
66 // TODO Auto-generated method stub
67 Vertex sw;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080068
69 boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
70 ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
71 if (portDown) {
72 deletePort(dpid, port.getPortNumber());
73 return;
74 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080075 try {
76 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080077 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080078 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080079 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080080 //TODO: Do nothing for now
81 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080082 } else {
83 Vertex p = graph.addVertex(null);
84 p.setProperty("type","port");
85 p.setProperty("number",port.getPortNumber());
86 p.setProperty("state",port.getState());
87 p.setProperty("desc",port.getName());
88 Edge e = graph.addEdge(null, sw, p, "on");
89 e.setProperty("state","ACTIVE");
90 e.setProperty("number", port.getPortNumber());
91
92 graph.stopTransaction(Conclusion.SUCCESS);
93 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080094 }
95 } catch (TitanException e) {
96 // TODO: handle exceptions
Pankaj Berde0a31dab2013-01-15 16:06:36 -080097 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080098 }
99
100 }
101
102 @Override
103 public Collection<OFPhysicalPort> getPorts(long dpid) {
104 // TODO Auto-generated method stub
105 return null;
106 }
107
108 @Override
109 public OFPhysicalPort getPort(String dpid, short portnum) {
110 // TODO Auto-generated method stub
111 return null;
112 }
113
114 @Override
115 public OFPhysicalPort getPort(String dpid, String portName) {
116 // TODO Auto-generated method stub
117 return null;
118 }
119
120 @Override
121 public void addSwitch(String dpid) {
122
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800123 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800124
Pankaj Berde3200ea02013-01-04 15:48:36 -0800125 try {
126 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
127 /*
128 * Do nothing or throw exception?
129 */
Pankaj Berde1ccc7fe2013-01-22 17:31:06 -0800130 Vertex sw = graph.getVertices("dpid",dpid).iterator().next();
131
132 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
133 sw.setProperty("state",SwitchState.ACTIVE.toString());
134 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800135 } else {
136 Vertex sw = graph.addVertex(null);
137
138 sw.setProperty("type","switch");
139 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800140 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800141 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800142 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800143 }
144 } catch (TitanException e) {
145 /*
146 * retry till we succeed?
147 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800148 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800149 }
150
151
152 }
153
154 @Override
155 public void deleteSwitch(String dpid) {
156 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800157 Vertex sw;
158 try {
159
160 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
161 graph.removeVertex(sw);
162 graph.stopTransaction(Conclusion.SUCCESS);
163 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
164 }
165 } catch (TitanException e) {
166 // TODO: handle exceptions
167 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
168 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800169
170 }
171
172 @Override
173 public void deletePort(String dpid, short port) {
174 // TODO Auto-generated method stub
175 Vertex sw;
176 try {
177 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
178 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800179 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
180 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
181 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
182 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800183 graph.removeVertex(p);
184 graph.stopTransaction(Conclusion.SUCCESS);
185 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800186 }
187 } catch (TitanException e) {
188 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800189 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800190 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800191 }
192
193 @Override
194 public void deletePort(String dpid, String portName) {
195 // TODO Auto-generated method stub
196
197 }
198
199 @Override
200 public List<String> getActiveSwitches() {
201 // TODO Auto-generated method stub
202 return null;
203 }
204
205 @Override
206 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800207
208 graph = TitanFactory.open(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800209
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800210 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800211 Set<String> s = graph.getIndexedKeys(Vertex.class);
212 if (!s.contains("dpid")) {
213 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800214 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800215 }
216 if (!s.contains("type")) {
217 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800218 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800219 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800220 }
221
222}