blob: f6bd10349198ab22f2e837d3359803ba3bcb0d04 [file] [log] [blame]
Pankaj Berde3200ea02013-01-04 15:48:36 -08001package net.floodlightcontroller.core.internal;
2
3import java.util.Collection;
4import java.util.List;
5
Pankaj Berdeafb20532013-01-08 15:05:24 -08006import org.slf4j.Logger;
7import org.slf4j.LoggerFactory;
8
9import org.apache.commons.configuration.BaseConfiguration;
10import org.apache.commons.configuration.Configuration;
Pankaj Berde3200ea02013-01-04 15:48:36 -080011import org.openflow.protocol.OFPhysicalPort;
12
13import com.thinkaurelius.titan.core.TitanException;
14import com.thinkaurelius.titan.core.TitanFactory;
15import com.thinkaurelius.titan.core.TitanGraph;
16import com.tinkerpop.blueprints.Direction;
17import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
18import com.tinkerpop.blueprints.Edge;
19import com.tinkerpop.blueprints.Vertex;
20import net.floodlightcontroller.core.ISwitchStorage;
21
22public class SwitchStorageImpl implements ISwitchStorage {
23 public TitanGraph graph;
Pankaj Berdeafb20532013-01-08 15:05:24 -080024 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080025
26 @Override
27 public void update(String dpid, SwitchState state, DM_OPERATION op) {
28 // TODO Auto-generated method stub
29 switch(op) {
30
31 case UPDATE:
32 case INSERT:
33 case CREATE:
34 addSwitch(dpid);
35 if (state != SwitchState.ACTIVE) {
36 setStatus(dpid, state);
37 }
38 break;
39 case DELETE:
40 deleteSwitch(dpid);
41 break;
42 default:
43 }
44 }
45
46 private void setStatus(String dpid, SwitchState state) {
47 // TODO Auto-generated method stub
48 Vertex sw;
49 try {
50 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
51 sw.setProperty("state",state);
52 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berdeafb20532013-01-08 15:05:24 -080053 log.trace("SwitchStorage:setSTatus dpid:{} state: {} done", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080054 }
55 } catch (TitanException e) {
56 // TODO: handle exceptions
Pankaj Berdeafb20532013-01-08 15:05:24 -080057 log.trace("SwitchStorage:setSTatus dpid:{} state: {} failed", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080058 }
59
60
61 }
62
63 @Override
64 public void addPort(String dpid, OFPhysicalPort port) {
65 // TODO Auto-generated method stub
66 Vertex sw;
67 try {
68 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
Pankaj Berdeafb20532013-01-08 15:05:24 -080069 log.trace("SwitchStorage:addPort dpid:{} port:{}", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -080070 // TODO: Check if port exists
71 Vertex p = graph.addVertex(null);
Pankaj Berde8557a462013-01-07 08:59:31 -080072 p.setProperty("type","port");
Pankaj Berde3200ea02013-01-04 15:48:36 -080073 p.setProperty("number",port.getPortNumber());
74 p.setProperty("state",port.getState());
75 p.setProperty("desc",port.getName());
76 Edge e = graph.addEdge(null, sw, p, "on");
77 e.setProperty("state","ACTIVE");
78 e.setProperty("number", port.getPortNumber());
79
80 graph.stopTransaction(Conclusion.SUCCESS);
81 }
82 } catch (TitanException e) {
83 // TODO: handle exceptions
Pankaj Berdeafb20532013-01-08 15:05:24 -080084 log.trace("SwitchStorage:addPort dpid:{} port:{}", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -080085 }
86
87 }
88
89 @Override
90 public Collection<OFPhysicalPort> getPorts(long dpid) {
91 // TODO Auto-generated method stub
92 return null;
93 }
94
95 @Override
96 public OFPhysicalPort getPort(String dpid, short portnum) {
97 // TODO Auto-generated method stub
98 return null;
99 }
100
101 @Override
102 public OFPhysicalPort getPort(String dpid, String portName) {
103 // TODO Auto-generated method stub
104 return null;
105 }
106
107 @Override
108 public void addSwitch(String dpid) {
109
Pankaj Berdeafb20532013-01-08 15:05:24 -0800110 log.trace("SwitchStorage:addSwitch(): dpid {} ", dpid);
111
Pankaj Berde3200ea02013-01-04 15:48:36 -0800112 try {
113 if (graph.getVertices("dpid",dpid).iterator().hasNext()) {
114 /*
115 * Do nothing or throw exception?
116 */
Pankaj Berdeafb20532013-01-08 15:05:24 -0800117 log.trace("SwitchStorage:addSwitch dpid:{} already exists", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800118 } else {
119 Vertex sw = graph.addVertex(null);
120
121 sw.setProperty("type","switch");
122 sw.setProperty("dpid", dpid);
123 sw.setProperty("state",SwitchState.ACTIVE);
124 graph.stopTransaction(Conclusion.SUCCESS);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800125 log.trace("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800126 }
127 } catch (TitanException e) {
128 /*
129 * retry till we succeed?
130 */
Pankaj Berdeafb20532013-01-08 15:05:24 -0800131 log.trace("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800132 }
133
134
135 }
136
137 @Override
138 public void deleteSwitch(String dpid) {
139 // TODO Setting inactive but we need to eventually remove data
140 setStatus(dpid, SwitchState.INACTIVE);
141
142 }
143
144 @Override
145 public void deletePort(String dpid, short port) {
146 // TODO Auto-generated method stub
147 Vertex sw;
148 try {
149 if ((sw = graph.getVertices("dpid",dpid).iterator().next()) != null) {
150 // TODO: Check if port exists
Pankaj Berdeafb20532013-01-08 15:05:24 -0800151 log.trace("SwitchStorage:deletePort dpid:{} port:{}", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800152 Vertex p = sw.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
Pankaj Berde8557a462013-01-07 08:59:31 -0800153 if (p != null) {
Pankaj Berdeafb20532013-01-08 15:05:24 -0800154 log.trace("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde8557a462013-01-07 08:59:31 -0800155 graph.removeVertex(p);
156 graph.stopTransaction(Conclusion.SUCCESS);
157 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800158 }
159 } catch (TitanException e) {
160 // TODO: handle exceptions
Pankaj Berdeafb20532013-01-08 15:05:24 -0800161 log.trace("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800162 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800163 }
164
165 @Override
166 public void deletePort(String dpid, String portName) {
167 // TODO Auto-generated method stub
168
169 }
170
171 @Override
172 public List<String> getActiveSwitches() {
173 // TODO Auto-generated method stub
174 return null;
175 }
176
177 @Override
178 public void init(String conf) {
Pankaj Berde8557a462013-01-07 08:59:31 -0800179 //TODO extract the DB location from conf
Pankaj Berdeafb20532013-01-08 15:05:24 -0800180 Configuration db = new BaseConfiguration();
181 db.setProperty("storage,backend","local");
182 db.setProperty("storage.directory","/tmp/netmap");
Pankaj Berde8557a462013-01-07 08:59:31 -0800183 graph = TitanFactory.open(db);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800184 graph.createKeyIndex("dpid", Vertex.class);
Pankaj Berde8557a462013-01-07 08:59:31 -0800185 graph.createKeyIndex("type", Vertex.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800186 }
187
188}