blob: 3bb6c876d608234524652b90df9b73c6d9168d31 [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
10import org.apache.commons.configuration.BaseConfiguration;
11import org.apache.commons.configuration.Configuration;
Pankaj Berde3200ea02013-01-04 15:48:36 -080012import org.openflow.protocol.OFPhysicalPort;
13
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) {
49 // TODO Auto-generated method stub
50 Vertex sw;
51 try {
52 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -080053 sw.setProperty("state",state.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -080054 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -080055 log.info("SwitchStorage:setSTatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080056 }
57 } catch (TitanException e) {
58 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -080059 log.info("SwitchStorage:setSTatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080060 }
61
62
63 }
64
65 @Override
66 public void addPort(String dpid, OFPhysicalPort port) {
67 // TODO Auto-generated method stub
68 Vertex sw;
69 try {
70 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080071 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080072 // TODO: Check if port exists
Pankaj Berde0fc4e432013-01-12 09:47:22 -080073 if (sw.query().direction(Direction.OUT).labels("on").has("number",port.getPortNumber()).vertices().iterator().hasNext()) {
74 //TODO: Do nothing for now
75 } else {
76 Vertex p = graph.addVertex(null);
77 p.setProperty("type","port");
78 p.setProperty("number",port.getPortNumber());
79 p.setProperty("state",port.getState());
80 p.setProperty("desc",port.getName());
81 Edge e = graph.addEdge(null, sw, p, "on");
82 e.setProperty("state","ACTIVE");
83 e.setProperty("number", port.getPortNumber());
84
85 graph.stopTransaction(Conclusion.SUCCESS);
86 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080087 }
88 } catch (TitanException e) {
89 // TODO: handle exceptions
Pankaj Berde0fc4e432013-01-12 09:47:22 -080090 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080091 }
92
93 }
94
95 @Override
96 public Collection<OFPhysicalPort> getPorts(long dpid) {
97 // TODO Auto-generated method stub
98 return null;
99 }
100
101 @Override
102 public OFPhysicalPort getPort(String dpid, short portnum) {
103 // TODO Auto-generated method stub
104 return null;
105 }
106
107 @Override
108 public OFPhysicalPort getPort(String dpid, String portName) {
109 // TODO Auto-generated method stub
110 return null;
111 }
112
113 @Override
114 public void addSwitch(String dpid) {
115
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800116 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800117
Pankaj Berde3200ea02013-01-04 15:48:36 -0800118 try {
119 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
120 /*
121 * Do nothing or throw exception?
122 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800123 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800124 } else {
125 Vertex sw = graph.addVertex(null);
126
127 sw.setProperty("type","switch");
128 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800129 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800130 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800131 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800132 }
133 } catch (TitanException e) {
134 /*
135 * retry till we succeed?
136 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800137 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800138 }
139
140
141 }
142
143 @Override
144 public void deleteSwitch(String dpid) {
145 // TODO Setting inactive but we need to eventually remove data
146 setStatus(dpid, SwitchState.INACTIVE);
147
148 }
149
150 @Override
151 public void deletePort(String dpid, short port) {
152 // TODO Auto-generated method stub
153 Vertex sw;
154 try {
155 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
156 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800157 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
158 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
159 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
160 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800161 graph.removeVertex(p);
162 graph.stopTransaction(Conclusion.SUCCESS);
163 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800164 }
165 } catch (TitanException e) {
166 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800167 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800168 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800169 }
170
171 @Override
172 public void deletePort(String dpid, String portName) {
173 // TODO Auto-generated method stub
174
175 }
176
177 @Override
178 public List<String> getActiveSwitches() {
179 // TODO Auto-generated method stub
180 return null;
181 }
182
183 @Override
184 public void init(String conf) {
Pankaj Berde8557a462013-01-07 08:59:31 -0800185 //TODO extract the DB location from conf
Pankaj Berdeafb20532013-01-08 15:05:24 -0800186 Configuration db = new BaseConfiguration();
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800187
188 // Local storage gets locked for single process
Pankaj Berdecb703a52013-01-09 18:06:33 -0800189 db.setProperty("storage.backend","cassandra");
190 db.setProperty("storage.hostname","127.0.0.1");
Pankaj Berde8557a462013-01-07 08:59:31 -0800191 graph = TitanFactory.open(db);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800192
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800193 // FIXME: Creation on Indexes should be done only once
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800194 Set<String> s = graph.getIndexedKeys(Vertex.class);
195 if (!s.contains("dpid")) {
196 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800197 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800198 }
199 if (!s.contains("type")) {
200 graph.createKeyIndex("type", Vertex.class);
Pankaj Berdecb703a52013-01-09 18:06:33 -0800201 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800202 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800203 }
204
205}