blob: 01b37c0a42ef93d1ec6b885f6763c70ed90e8f77 [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 Berde28cc61c2013-01-08 18:19:33 -080071 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -080072 // TODO: Check if port exists
73 Vertex p = graph.addVertex(null);
Pankaj Berde8557a462013-01-07 08:59:31 -080074 p.setProperty("type","port");
Pankaj Berde3200ea02013-01-04 15:48:36 -080075 p.setProperty("number",port.getPortNumber());
76 p.setProperty("state",port.getState());
77 p.setProperty("desc",port.getName());
78 Edge e = graph.addEdge(null, sw, p, "on");
79 e.setProperty("state","ACTIVE");
80 e.setProperty("number", port.getPortNumber());
81
82 graph.stopTransaction(Conclusion.SUCCESS);
83 }
84 } catch (TitanException e) {
85 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -080086 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -080087 }
88
89 }
90
91 @Override
92 public Collection<OFPhysicalPort> getPorts(long dpid) {
93 // TODO Auto-generated method stub
94 return null;
95 }
96
97 @Override
98 public OFPhysicalPort getPort(String dpid, short portnum) {
99 // TODO Auto-generated method stub
100 return null;
101 }
102
103 @Override
104 public OFPhysicalPort getPort(String dpid, String portName) {
105 // TODO Auto-generated method stub
106 return null;
107 }
108
109 @Override
110 public void addSwitch(String dpid) {
111
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800112 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800113
Pankaj Berde3200ea02013-01-04 15:48:36 -0800114 try {
115 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
116 /*
117 * Do nothing or throw exception?
118 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800119 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800120 } else {
121 Vertex sw = graph.addVertex(null);
122
123 sw.setProperty("type","switch");
124 sw.setProperty("dpid", dpid);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800125 sw.setProperty("state",SwitchState.ACTIVE.toString());
Pankaj Berde3200ea02013-01-04 15:48:36 -0800126 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800127 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800128 }
129 } catch (TitanException e) {
130 /*
131 * retry till we succeed?
132 */
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800133 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800134 }
135
136
137 }
138
139 @Override
140 public void deleteSwitch(String dpid) {
141 // TODO Setting inactive but we need to eventually remove data
142 setStatus(dpid, SwitchState.INACTIVE);
143
144 }
145
146 @Override
147 public void deletePort(String dpid, short port) {
148 // TODO Auto-generated method stub
149 Vertex sw;
150 try {
151 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
152 // TODO: Check if port exists
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800153 log.info("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
154 if (sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
155 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
156 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800157 graph.removeVertex(p);
158 graph.stopTransaction(Conclusion.SUCCESS);
159 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800160 }
161 } catch (TitanException e) {
162 // TODO: handle exceptions
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800163 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800164 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800165 }
166
167 @Override
168 public void deletePort(String dpid, String portName) {
169 // TODO Auto-generated method stub
170
171 }
172
173 @Override
174 public List<String> getActiveSwitches() {
175 // TODO Auto-generated method stub
176 return null;
177 }
178
179 @Override
180 public void init(String conf) {
Pankaj Berde8557a462013-01-07 08:59:31 -0800181 //TODO extract the DB location from conf
Pankaj Berdeafb20532013-01-08 15:05:24 -0800182 Configuration db = new BaseConfiguration();
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800183
184 // Local storage gets locked for single process
Pankaj Berdeafb20532013-01-08 15:05:24 -0800185 db.setProperty("storage,backend","local");
186 db.setProperty("storage.directory","/tmp/netmap");
Pankaj Berde8557a462013-01-07 08:59:31 -0800187 graph = TitanFactory.open(db);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800188
189 // FIXME:
190 Set<String> s = graph.getIndexedKeys(Vertex.class);
191 if (!s.contains("dpid")) {
192 graph.createKeyIndex("dpid", Vertex.class);
193 }
194 if (!s.contains("type")) {
195 graph.createKeyIndex("type", Vertex.class);
196 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800197 }
198
199}