blob: 17ab274e99f917d7b34a33b9f6cecc84ad97a9c4 [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 Berde5024ec12013-01-31 17:07:29 -080051 log.info("SwitchStorage:setStatus dpid:{} state: {} failed", 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 Berde3200ea02013-01-04 15:48:36 -080086 }
Pankaj Berde15193092013-03-21 17:30:14 -070087 } catch (Exception e) {
Pankaj Berde3200ea02013-01-04 15:48:36 -080088 // TODO: handle exceptions
Pankaj Berde15193092013-03-21 17:30:14 -070089 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde0a31dab2013-01-15 16:06:36 -080090 log.error("SwitchStorage:addPort dpid:{} port:{} failed", 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 {
Pankaj Berde15193092013-03-21 17:30:14 -0700119 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
120 if (sw != null) {
Pankaj Berde3200ea02013-01-04 15:48:36 -0800121 /*
122 * Do nothing or throw exception?
123 */
Pankaj Berde1ccc7fe2013-01-22 17:31:06 -0800124
125 log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
Pankaj Berde15193092013-03-21 17:30:14 -0700126 sw.setState(SwitchState.ACTIVE.toString());
127 conn.endTx(Transaction.COMMIT);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800128 } else {
Pankaj Berde15193092013-03-21 17:30:14 -0700129 sw = conn.utils().newSwitch(conn);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800130
Pankaj Berde15193092013-03-21 17:30:14 -0700131 sw.setType("switch");
132 sw.setDPID(dpid);
133 sw.setState(SwitchState.ACTIVE.toString());
134 conn.endTx(Transaction.COMMIT);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800135 log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800136 }
Pankaj Berde15193092013-03-21 17:30:14 -0700137 } catch (Exception e) {
Pankaj Berde3200ea02013-01-04 15:48:36 -0800138 /*
Pankaj Berde15193092013-03-21 17:30:14 -0700139 * retry?
Pankaj Berde3200ea02013-01-04 15:48:36 -0800140 */
Pankaj Berde15193092013-03-21 17:30:14 -0700141 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800142 log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800143 }
144
145
146 }
147
148 @Override
149 public void deleteSwitch(String dpid) {
150 // TODO Setting inactive but we need to eventually remove data
Pankaj Berde15193092013-03-21 17:30:14 -0700151
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800152 try {
Pankaj Berde15193092013-03-21 17:30:14 -0700153
154 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
155 if (sw != null) {
156 conn.utils().removeSwitch(conn, sw);
157
158 conn.endTx(Transaction.COMMIT);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800159 log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
160 }
Pankaj Berde15193092013-03-21 17:30:14 -0700161 } catch (Exception e) {
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800162 // TODO: handle exceptions
Pankaj Berde15193092013-03-21 17:30:14 -0700163 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde0a31dab2013-01-15 16:06:36 -0800164 log.error("SwitchStorage:deleteSwitch {} failed", dpid);
165 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800166
167 }
168
169 @Override
170 public void deletePort(String dpid, short port) {
171 // TODO Auto-generated method stub
Pankaj Berde3200ea02013-01-04 15:48:36 -0800172 try {
Pankaj Berde15193092013-03-21 17:30:14 -0700173 ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
174
175 if (sw != null) {
176 IPortObject p = conn.utils().searchPort(conn, dpid, port);
177 if (p != null) {
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800178 log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
Pankaj Berde15193092013-03-21 17:30:14 -0700179 sw.removePort(p);
180 conn.utils().removePort(conn, p);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700181 conn.endTx(Transaction.COMMIT,GenerateEvent.TRUE);
Pankaj Berde8557a462013-01-07 08:59:31 -0800182 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800183 }
Pankaj Berde15193092013-03-21 17:30:14 -0700184 } catch (Exception e) {
Pankaj Berde3200ea02013-01-04 15:48:36 -0800185 // TODO: handle exceptions
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700186 e.printStackTrace();
Pankaj Berde15193092013-03-21 17:30:14 -0700187 conn.endTx(Transaction.ROLLBACK);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800188 log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
Pankaj Berde3200ea02013-01-04 15:48:36 -0800189 }
Pankaj Berde3200ea02013-01-04 15:48:36 -0800190 }
191
192 @Override
193 public void deletePort(String dpid, String portName) {
194 // TODO Auto-generated method stub
195
196 }
197
Pankaj Berde5024ec12013-01-31 17:07:29 -0800198
Pankaj Berde3200ea02013-01-04 15:48:36 -0800199
200 @Override
201 public void init(String conf) {
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800202
Pankaj Berde15193092013-03-21 17:30:14 -0700203 conn = GraphDBConnection.getInstance(conf);
Pankaj Berde28cc61c2013-01-08 18:19:33 -0800204
Pankaj Berde3200ea02013-01-04 15:48:36 -0800205 }
206
Pankaj Berdeff421802013-01-29 20:28:52 -0800207
Pankaj Berdeff421802013-01-29 20:28:52 -0800208
Pankaj Berded18c7622013-02-04 10:28:35 -0800209 public void finalize() {
210 close();
211 }
212
213 @Override
214 public void close() {
Pankaj Berde15193092013-03-21 17:30:14 -0700215 conn.close();
Pankaj Berded18c7622013-02-04 10:28:35 -0800216 }
217
Pankaj Berded1259e82013-01-23 14:10:00 -0800218
Pankaj Berde3200ea02013-01-04 15:48:36 -0800219}