blob: b8197b75691bc7cebbe29909d6088691c1d1064a [file] [log] [blame]
Pankaj Berde3200ea02013-01-04 15:48:36 -08001package net.floodlightcontroller.core.internal;
2
3import java.util.Collection;
Pankaj Berde3200ea02013-01-04 15:48:36 -08004
Pankaj Berde15193092013-03-21 17:30:14 -07005import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
6import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
7import net.floodlightcontroller.core.ISwitchStorage;
8import net.onrc.onos.util.GraphDBConnection;
Pankaj Berde2239f0d2013-04-04 09:42:43 -07009import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
Pankaj Berde15193092013-03-21 17:30:14 -070010import net.onrc.onos.util.GraphDBConnection.Transaction;
Pankaj Berdeafb20532013-01-08 15:05:24 -080011
Pankaj Berde3200ea02013-01-04 15:48:36 -080012import org.openflow.protocol.OFPhysicalPort;
Pankaj Berde6a4075d2013-01-22 16:42:54 -080013import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
14import org.openflow.protocol.OFPhysicalPort.OFPortState;
Pankaj Berde15193092013-03-21 17:30:14 -070015import org.slf4j.Logger;
16import org.slf4j.LoggerFactory;
Pankaj Berde3200ea02013-01-04 15:48:36 -080017
18public class SwitchStorageImpl implements ISwitchStorage {
Pankaj Berde2239f0d2013-04-04 09:42:43 -070019 protected GraphDBConnection conn;
Pankaj Berdeafb20532013-01-08 15:05:24 -080020 protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
Pankaj Berde3200ea02013-01-04 15:48:36 -080021
22 @Override
23 public void update(String dpid, SwitchState state, DM_OPERATION op) {
24 // TODO Auto-generated method stub
Pankaj Berde28cc61c2013-01-08 18:19:33 -080025 log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080026 switch(op) {
27
28 case UPDATE:
29 case INSERT:
30 case CREATE:
31 addSwitch(dpid);
32 if (state != SwitchState.ACTIVE) {
33 setStatus(dpid, state);
34 }
35 break;
36 case DELETE:
37 deleteSwitch(dpid);
38 break;
39 default:
40 }
41 }
42
43 private void setStatus(String dpid, SwitchState state) {
Pankaj Berde15193092013-03-21 17:30:14 -070044 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
45 if (sw != null) {
46 sw.setState(state.toString());
47 conn.endTx(Transaction.COMMIT);
48 log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
49 } else {
50 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde62016142013-04-09 15:35:50 -070051 log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
Pankaj Berde3200ea02013-01-04 15:48:36 -080052 }
Pankaj Berde3200ea02013-01-04 15:48:36 -080053 }
54
55 @Override
56 public void addPort(String dpid, OFPhysicalPort port) {
57 // TODO Auto-generated method stub
Pankaj Berde6a4075d2013-01-22 16:42:54 -080058
59 boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
60 ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
61 if (portDown) {
62 deletePort(dpid, port.getPortNumber());
63 return;
64 }
Pankaj Berde15193092013-03-21 17:30:14 -070065
Pankaj Berde3200ea02013-01-04 15:48:36 -080066 try {
Pankaj Berde15193092013-03-21 17:30:14 -070067 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
68
69 if (sw != null) {
70 IPortObject p = conn.utils().searchPort(conn, dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080071 log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
Pankaj Berde15193092013-03-21 17:30:14 -070072 if (p != null) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -080073 log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
Pankaj Berde0fc4e432013-01-12 09:47:22 -080074 } else {
Pankaj Berde15193092013-03-21 17:30:14 -070075 p = conn.utils().newPort(conn);
76
77 p.setType("port");
78 p.setNumber(port.getPortNumber());
79 p.setState("ACTIVE");
80 p.setPortState(port.getState());
81 p.setDesc(port.getName());
82 sw.addPort(p);
83 conn.endTx(Transaction.COMMIT);
84
Pankaj Berde0fc4e432013-01-12 09:47:22 -080085 }
Pankaj Berde62016142013-04-09 15:35:50 -070086 } else {
87 log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080088 }
Pankaj Berde15193092013-03-21 17:30:14 -070089 } catch (Exception e) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080090 // TODO: handle exceptions
Pankaj Berde62016142013-04-09 15:35:50 -070091 e.printStackTrace();
Pankaj Berde15193092013-03-21 17:30:14 -070092 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde0a31dab2013-01-15 16:06:36 -080093 log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
Pankaj Berde3200ea02013-01-04 15:48:36 -080094 }
95
96 }
97
98 @Override
99 public Collection<OFPhysicalPort> getPorts(long dpid) {
100 // TODO Auto-generated method stub
101 return null;
102 }
103
104 @Override
105 public OFPhysicalPort getPort(String dpid, short portnum) {
106 // TODO Auto-generated method stub
107 return null;
108 }
109
110 @Override
111 public OFPhysicalPort getPort(String dpid, String portName) {
112 // TODO Auto-generated method stub
113 return null;
114 }
115
116 @Override
117 public void addSwitch(String dpid) {
118
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800119 log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
Pankaj Berdeafb20532013-01-08 15:05:24 -0800120
Pankaj Berde62016142013-04-09 15:35:50 -0700121 try {
122 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
123 if (sw != null) {
124 /*
125 * Do nothing or throw exception?
126 */
Pankaj Berde3200ea02013-01-04 15:48:36 -0800127
Pankaj Berde62016142013-04-09 15:35:50 -0700128 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
129 sw.setState(SwitchState.ACTIVE.toString());
130 conn.endTx(Transaction.COMMIT);
131 } else {
132 sw = conn.utils().newSwitch(conn);
133
134 if (sw != null) {
135 sw.setType("switch");
136 sw.setDPID(dpid);
137 sw.setState(SwitchState.ACTIVE.toString());
138 conn.endTx(Transaction.COMMIT);
139 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
140 } else {
141 log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
142 }
143 }
144 } catch (Exception e) {
145 /*
146 * retry?
147 */
148 e.printStackTrace();
149 conn.endTx(Transaction.ROLLBACK);
150 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
151 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800152
153
154 }
155
156 @Override
157 public void deleteSwitch(String dpid) {
158 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde15193092013-03-21 17:30:14 -0700159
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800160 try {
Pankaj Berde15193092013-03-21 17:30:14 -0700161
162 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
163 if (sw != null) {
164 conn.utils().removeSwitch(conn, sw);
165
166 conn.endTx(Transaction.COMMIT);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800167 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
168 }
Pankaj Berde15193092013-03-21 17:30:14 -0700169 } catch (Exception e) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800170 // TODO: handle exceptions
Pankaj Berde62016142013-04-09 15:35:50 -0700171 e.printStackTrace();
Pankaj Berde15193092013-03-21 17:30:14 -0700172 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800173 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
174 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800175
176 }
177
178 @Override
179 public void deletePort(String dpid, short port) {
180 // TODO Auto-generated method stub
Pankaj Berde3200ea02013-01-04 15:48:36 -0800181 try {
Pankaj Berde15193092013-03-21 17:30:14 -0700182 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
183
184 if (sw != null) {
185 IPortObject p = conn.utils().searchPort(conn, dpid, port);
186 if (p != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800187 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde15193092013-03-21 17:30:14 -0700188 sw.removePort(p);
189 conn.utils().removePort(conn, p);
Pankaj Berde5fb27632013-04-05 08:56:12 -0700190 conn.endTx(Transaction.COMMIT);
Pankaj Berde8557a462013-01-07 08:59:31 -0800191 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800192 }
Pankaj Berde15193092013-03-21 17:30:14 -0700193 } catch (Exception e) {
Pankaj Berde3200ea02013-01-04 15:48:36 -0800194 // TODO: handle exceptions
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700195 e.printStackTrace();
Pankaj Berde15193092013-03-21 17:30:14 -0700196 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800197 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800198 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800199 }
200
201 @Override
202 public void deletePort(String dpid, String portName) {
203 // TODO Auto-generated method stub
204
205 }
206
Pankaj Berde5024ec12013-01-31 17:07:29 -0800207
Pankaj Berde3200ea02013-01-04 15:48:36 -0800208
209 @Override
210 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800211
Pankaj Berde15193092013-03-21 17:30:14 -0700212 conn = GraphDBConnection.getInstance(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800213
Pankaj Berde3200ea02013-01-04 15:48:36 -0800214 }
215
Pankaj Berdeff421802013-01-29 20:28:52 -0800216
Pankaj Berdeff421802013-01-29 20:28:52 -0800217
Pankaj Berded18c7622013-02-04 10:28:35 -0800218 public void finalize() {
219 close();
220 }
221
222 @Override
223 public void close() {
Pankaj Berde15193092013-03-21 17:30:14 -0700224 conn.close();
Pankaj Berded18c7622013-02-04 10:28:35 -0800225 }
226
Pankaj Berded1259e82013-01-23 14:10:00 -0800227
Pankaj Berde3200ea02013-01-04 15:48:36 -0800228}