Committed by
Gerrit Code Review
ONOS-2707
Fix bug of process ovsdb table update Change-Id: I55a879da1bf8770b68cb13c676f54482f685e60d
Showing
1 changed file
with
413 additions
and
429 deletions
| 1 | -/* | 1 | +/* |
| 2 | - * Copyright 2015 Open Networking Laboratory | 2 | + * Copyright 2015 Open Networking Laboratory |
| 3 | - * | 3 | + * |
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | - * you may not use this file except in compliance with the License. | 5 | + * you may not use this file except in compliance with the License. |
| 6 | - * You may obtain a copy of the License at | 6 | + * You may obtain a copy of the License at |
| 7 | - * | 7 | + * |
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | 8 | + * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | - * | 9 | + * |
| 10 | - * Unless required by applicable law or agreed to in writing, software | 10 | + * Unless required by applicable law or agreed to in writing, software |
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | 11 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | - * See the License for the specific language governing permissions and | 13 | + * See the License for the specific language governing permissions and |
| 14 | - * limitations under the License. | 14 | + * limitations under the License. |
| 15 | - */ | 15 | + */ |
| 16 | -package org.onosproject.ovsdb.controller.impl; | 16 | +package org.onosproject.ovsdb.controller.impl; |
| 17 | - | 17 | + |
| 18 | -import static com.google.common.base.Preconditions.checkNotNull; | 18 | +import static com.google.common.base.Preconditions.checkNotNull; |
| 19 | - | 19 | + |
| 20 | -import java.math.BigInteger; | 20 | +import java.math.BigInteger; |
| 21 | -import java.util.HashSet; | 21 | +import java.util.HashSet; |
| 22 | -import java.util.List; | 22 | +import java.util.Iterator; |
| 23 | -import java.util.Map; | 23 | +import java.util.List; |
| 24 | -import java.util.Set; | 24 | +import java.util.Map; |
| 25 | -import java.util.concurrent.ConcurrentHashMap; | 25 | +import java.util.Set; |
| 26 | -import java.util.concurrent.CopyOnWriteArraySet; | 26 | +import java.util.concurrent.ConcurrentHashMap; |
| 27 | -import java.util.concurrent.ExecutionException; | 27 | +import java.util.concurrent.CopyOnWriteArraySet; |
| 28 | - | 28 | +import java.util.concurrent.ExecutionException; |
| 29 | -import org.apache.felix.scr.annotations.Activate; | 29 | + |
| 30 | -import org.apache.felix.scr.annotations.Component; | 30 | +import org.apache.felix.scr.annotations.Activate; |
| 31 | -import org.apache.felix.scr.annotations.Deactivate; | 31 | +import org.apache.felix.scr.annotations.Component; |
| 32 | -import org.apache.felix.scr.annotations.Service; | 32 | +import org.apache.felix.scr.annotations.Deactivate; |
| 33 | -import org.onlab.packet.IpAddress; | 33 | +import org.apache.felix.scr.annotations.Service; |
| 34 | -import org.onlab.packet.MacAddress; | 34 | +import org.onlab.packet.IpAddress; |
| 35 | -import org.onosproject.ovsdb.controller.DefaultEventSubject; | 35 | +import org.onlab.packet.MacAddress; |
| 36 | -import org.onosproject.ovsdb.controller.EventSubject; | 36 | +import org.onosproject.ovsdb.controller.DefaultEventSubject; |
| 37 | -import org.onosproject.ovsdb.controller.OvsdbClientService; | 37 | +import org.onosproject.ovsdb.controller.EventSubject; |
| 38 | -import org.onosproject.ovsdb.controller.OvsdbConstant; | 38 | +import org.onosproject.ovsdb.controller.OvsdbClientService; |
| 39 | -import org.onosproject.ovsdb.controller.OvsdbController; | 39 | +import org.onosproject.ovsdb.controller.OvsdbConstant; |
| 40 | -import org.onosproject.ovsdb.controller.OvsdbDatapathId; | 40 | +import org.onosproject.ovsdb.controller.OvsdbController; |
| 41 | -import org.onosproject.ovsdb.controller.OvsdbEvent; | 41 | +import org.onosproject.ovsdb.controller.OvsdbDatapathId; |
| 42 | -import org.onosproject.ovsdb.controller.OvsdbEvent.Type; | 42 | +import org.onosproject.ovsdb.controller.OvsdbEvent; |
| 43 | -import org.onosproject.ovsdb.controller.OvsdbEventListener; | 43 | +import org.onosproject.ovsdb.controller.OvsdbEvent.Type; |
| 44 | -import org.onosproject.ovsdb.controller.OvsdbIfaceId; | 44 | +import org.onosproject.ovsdb.controller.OvsdbEventListener; |
| 45 | -import org.onosproject.ovsdb.controller.OvsdbNodeId; | 45 | +import org.onosproject.ovsdb.controller.OvsdbIfaceId; |
| 46 | -import org.onosproject.ovsdb.controller.OvsdbNodeListener; | 46 | +import org.onosproject.ovsdb.controller.OvsdbNodeId; |
| 47 | -import org.onosproject.ovsdb.controller.OvsdbPortName; | 47 | +import org.onosproject.ovsdb.controller.OvsdbNodeListener; |
| 48 | -import org.onosproject.ovsdb.controller.OvsdbPortNumber; | 48 | +import org.onosproject.ovsdb.controller.OvsdbPortName; |
| 49 | -import org.onosproject.ovsdb.controller.OvsdbPortType; | 49 | +import org.onosproject.ovsdb.controller.OvsdbPortNumber; |
| 50 | -import org.onosproject.ovsdb.controller.driver.OvsdbAgent; | 50 | +import org.onosproject.ovsdb.controller.OvsdbPortType; |
| 51 | -import org.onosproject.ovsdb.rfc.jsonrpc.Callback; | 51 | +import org.onosproject.ovsdb.controller.driver.OvsdbAgent; |
| 52 | -import org.onosproject.ovsdb.rfc.message.TableUpdate; | 52 | +import org.onosproject.ovsdb.rfc.jsonrpc.Callback; |
| 53 | -import org.onosproject.ovsdb.rfc.message.TableUpdates; | 53 | +import org.onosproject.ovsdb.rfc.message.TableUpdate; |
| 54 | -import org.onosproject.ovsdb.rfc.message.UpdateNotification; | 54 | +import org.onosproject.ovsdb.rfc.message.TableUpdates; |
| 55 | -import org.onosproject.ovsdb.rfc.notation.OvsdbMap; | 55 | +import org.onosproject.ovsdb.rfc.message.UpdateNotification; |
| 56 | -import org.onosproject.ovsdb.rfc.notation.OvsdbSet; | 56 | +import org.onosproject.ovsdb.rfc.notation.OvsdbMap; |
| 57 | -import org.onosproject.ovsdb.rfc.notation.Row; | 57 | +import org.onosproject.ovsdb.rfc.notation.OvsdbSet; |
| 58 | -import org.onosproject.ovsdb.rfc.notation.UUID; | 58 | +import org.onosproject.ovsdb.rfc.notation.Row; |
| 59 | -import org.onosproject.ovsdb.rfc.schema.DatabaseSchema; | 59 | +import org.onosproject.ovsdb.rfc.notation.UUID; |
| 60 | -import org.onosproject.ovsdb.rfc.table.Bridge; | 60 | +import org.onosproject.ovsdb.rfc.schema.DatabaseSchema; |
| 61 | -import org.onosproject.ovsdb.rfc.table.Interface; | 61 | +import org.onosproject.ovsdb.rfc.table.Bridge; |
| 62 | -import org.onosproject.ovsdb.rfc.table.OvsdbTable; | 62 | +import org.onosproject.ovsdb.rfc.table.Interface; |
| 63 | -import org.onosproject.ovsdb.rfc.table.Port; | 63 | +import org.onosproject.ovsdb.rfc.table.OvsdbTable; |
| 64 | -import org.onosproject.ovsdb.rfc.table.TableGenerator; | 64 | +import org.onosproject.ovsdb.rfc.table.TableGenerator; |
| 65 | -import org.onosproject.ovsdb.rfc.utils.FromJsonUtil; | 65 | +import org.onosproject.ovsdb.rfc.utils.FromJsonUtil; |
| 66 | -import org.osgi.service.component.ComponentContext; | 66 | +import org.osgi.service.component.ComponentContext; |
| 67 | -import org.slf4j.Logger; | 67 | +import org.slf4j.Logger; |
| 68 | -import org.slf4j.LoggerFactory; | 68 | +import org.slf4j.LoggerFactory; |
| 69 | - | 69 | + |
| 70 | -import com.fasterxml.jackson.databind.JsonNode; | 70 | +import com.fasterxml.jackson.databind.JsonNode; |
| 71 | - | 71 | + |
| 72 | -/** | 72 | +/** |
| 73 | - * The implementation of OvsdbController. | 73 | + * The implementation of OvsdbController. |
| 74 | - */ | 74 | + */ |
| 75 | -@Component(immediate = true) | 75 | +@Component(immediate = true) |
| 76 | -@Service | 76 | +@Service |
| 77 | -public class OvsdbControllerImpl implements OvsdbController { | 77 | +public class OvsdbControllerImpl implements OvsdbController { |
| 78 | - | 78 | + |
| 79 | - public static final Logger log = LoggerFactory | 79 | + public static final Logger log = LoggerFactory |
| 80 | - .getLogger(OvsdbControllerImpl.class); | 80 | + .getLogger(OvsdbControllerImpl.class); |
| 81 | - | 81 | + |
| 82 | - protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientService> ovsdbClients = | 82 | + protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientService> ovsdbClients = |
| 83 | - new ConcurrentHashMap<OvsdbNodeId, OvsdbClientService>(); | 83 | + new ConcurrentHashMap<OvsdbNodeId, OvsdbClientService>(); |
| 84 | - | 84 | + |
| 85 | - protected OvsdbAgent agent = new InternalOvsdbNodeAgent(); | 85 | + protected OvsdbAgent agent = new InternalOvsdbNodeAgent(); |
| 86 | - protected InternalMonitorCallBack updateCallback = new InternalMonitorCallBack(); | 86 | + protected InternalMonitorCallBack updateCallback = new InternalMonitorCallBack(); |
| 87 | - | 87 | + |
| 88 | - protected Set<OvsdbNodeListener> ovsdbNodeListener = new CopyOnWriteArraySet<>(); | 88 | + protected Set<OvsdbNodeListener> ovsdbNodeListener = new CopyOnWriteArraySet<>(); |
| 89 | - protected Set<OvsdbEventListener> ovsdbEventListener = new CopyOnWriteArraySet<>(); | 89 | + protected Set<OvsdbEventListener> ovsdbEventListener = new CopyOnWriteArraySet<>(); |
| 90 | - | 90 | + |
| 91 | - protected ConcurrentHashMap<String, OvsdbClientService> requestNotification = | 91 | + protected ConcurrentHashMap<String, OvsdbClientService> requestNotification = |
| 92 | - new ConcurrentHashMap<String, OvsdbClientService>(); | 92 | + new ConcurrentHashMap<String, OvsdbClientService>(); |
| 93 | - | 93 | + |
| 94 | - protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<String, String>(); | 94 | + protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<String, String>(); |
| 95 | - | 95 | + |
| 96 | - private final Controller controller = new Controller(); | 96 | + private final Controller controller = new Controller(); |
| 97 | - | 97 | + |
| 98 | - @Activate | 98 | + @Activate |
| 99 | - public void activate(ComponentContext context) { | 99 | + public void activate(ComponentContext context) { |
| 100 | - controller.start(agent, updateCallback); | 100 | + controller.start(agent, updateCallback); |
| 101 | - log.info("Started"); | 101 | + log.info("Started"); |
| 102 | - } | 102 | + } |
| 103 | - | 103 | + |
| 104 | - @Deactivate | 104 | + @Deactivate |
| 105 | - public void deactivate() { | 105 | + public void deactivate() { |
| 106 | - controller.stop(); | 106 | + controller.stop(); |
| 107 | - log.info("Stoped"); | 107 | + log.info("Stoped"); |
| 108 | - } | 108 | + } |
| 109 | - | 109 | + |
| 110 | - @Override | 110 | + @Override |
| 111 | - public void addNodeListener(OvsdbNodeListener listener) { | 111 | + public void addNodeListener(OvsdbNodeListener listener) { |
| 112 | - if (!ovsdbNodeListener.contains(listener)) { | 112 | + if (!ovsdbNodeListener.contains(listener)) { |
| 113 | - this.ovsdbNodeListener.add(listener); | 113 | + this.ovsdbNodeListener.add(listener); |
| 114 | - } | 114 | + } |
| 115 | - } | 115 | + } |
| 116 | - | 116 | + |
| 117 | - @Override | 117 | + @Override |
| 118 | - public void removeNodeListener(OvsdbNodeListener listener) { | 118 | + public void removeNodeListener(OvsdbNodeListener listener) { |
| 119 | - this.ovsdbNodeListener.remove(listener); | 119 | + this.ovsdbNodeListener.remove(listener); |
| 120 | - } | 120 | + } |
| 121 | - | 121 | + |
| 122 | - @Override | 122 | + @Override |
| 123 | - public void addOvsdbEventListener(OvsdbEventListener listener) { | 123 | + public void addOvsdbEventListener(OvsdbEventListener listener) { |
| 124 | - if (!ovsdbEventListener.contains(listener)) { | 124 | + if (!ovsdbEventListener.contains(listener)) { |
| 125 | - this.ovsdbEventListener.add(listener); | 125 | + this.ovsdbEventListener.add(listener); |
| 126 | - } | 126 | + } |
| 127 | - } | 127 | + } |
| 128 | - | 128 | + |
| 129 | - @Override | 129 | + @Override |
| 130 | - public void removeOvsdbEventListener(OvsdbEventListener listener) { | 130 | + public void removeOvsdbEventListener(OvsdbEventListener listener) { |
| 131 | - this.ovsdbEventListener.remove(listener); | 131 | + this.ovsdbEventListener.remove(listener); |
| 132 | - } | 132 | + } |
| 133 | - | 133 | + |
| 134 | - @Override | 134 | + @Override |
| 135 | - public List<OvsdbNodeId> getNodeIds() { | 135 | + public List<OvsdbNodeId> getNodeIds() { |
| 136 | - // TODO Auto-generated method stub | 136 | + // TODO Auto-generated method stub |
| 137 | - return null; | 137 | + return null; |
| 138 | - } | 138 | + } |
| 139 | - | 139 | + |
| 140 | - @Override | 140 | + @Override |
| 141 | - public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) { | 141 | + public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) { |
| 142 | - return ovsdbClients.get(nodeId); | 142 | + return ovsdbClients.get(nodeId); |
| 143 | - } | 143 | + } |
| 144 | - | 144 | + |
| 145 | - /** | 145 | + /** |
| 146 | - * Implementation of an Ovsdb Agent which is responsible for keeping track | 146 | + * Implementation of an Ovsdb Agent which is responsible for keeping track |
| 147 | - * of connected node and the state in which they are. | 147 | + * of connected node and the state in which they are. |
| 148 | - */ | 148 | + */ |
| 149 | - private class InternalOvsdbNodeAgent implements OvsdbAgent { | 149 | + private class InternalOvsdbNodeAgent implements OvsdbAgent { |
| 150 | - @Override | 150 | + @Override |
| 151 | - public void addConnectedNode(OvsdbNodeId nodeId, | 151 | + public void addConnectedNode(OvsdbNodeId nodeId, |
| 152 | - OvsdbClientService ovsdbClient) { | 152 | + OvsdbClientService ovsdbClient) { |
| 153 | - | 153 | + |
| 154 | - if (ovsdbClients.get(nodeId) != null) { | 154 | + if (ovsdbClients.get(nodeId) != null) { |
| 155 | - return; | 155 | + return; |
| 156 | - } else { | 156 | + } else { |
| 157 | - ovsdbClients.put(nodeId, ovsdbClient); | 157 | + ovsdbClients.put(nodeId, ovsdbClient); |
| 158 | - | 158 | + |
| 159 | - try { | 159 | + try { |
| 160 | - List<String> dbNames = ovsdbClient.listDbs().get(); | 160 | + List<String> dbNames = ovsdbClient.listDbs().get(); |
| 161 | - for (String dbName : dbNames) { | 161 | + for (String dbName : dbNames) { |
| 162 | - DatabaseSchema dbSchema; | 162 | + DatabaseSchema dbSchema; |
| 163 | - dbSchema = ovsdbClient.getOvsdbSchema(dbName).get(); | 163 | + dbSchema = ovsdbClient.getOvsdbSchema(dbName).get(); |
| 164 | - | 164 | + |
| 165 | - log.debug("Begin to monitor tables"); | 165 | + log.debug("Begin to monitor tables"); |
| 166 | - String id = java.util.UUID.randomUUID().toString(); | 166 | + String id = java.util.UUID.randomUUID().toString(); |
| 167 | - TableUpdates updates = ovsdbClient | 167 | + TableUpdates updates = ovsdbClient |
| 168 | - .monitorTables(dbName, id).get(); | 168 | + .monitorTables(dbName, id).get(); |
| 169 | - | 169 | + |
| 170 | - requestDbName.put(id, dbName); | 170 | + requestDbName.put(id, dbName); |
| 171 | - requestNotification.put(id, ovsdbClient); | 171 | + requestNotification.put(id, ovsdbClient); |
| 172 | - | 172 | + |
| 173 | - if (updates != null) { | 173 | + if (updates != null) { |
| 174 | - processTableUpdates(ovsdbClient, updates, | 174 | + processTableUpdates(ovsdbClient, updates, |
| 175 | - dbSchema.name()); | 175 | + dbSchema.name()); |
| 176 | - } | 176 | + } |
| 177 | - } | 177 | + } |
| 178 | - } catch (InterruptedException e) { | 178 | + } catch (InterruptedException e) { |
| 179 | - log.warn("Interrupted while waiting to get message from ovsdb"); | 179 | + log.warn("Interrupted while waiting to get message from ovsdb"); |
| 180 | - Thread.currentThread().interrupt(); | 180 | + Thread.currentThread().interrupt(); |
| 181 | - } catch (ExecutionException e) { | 181 | + } catch (ExecutionException e) { |
| 182 | - log.error("Exception thrown while to get message from ovsdb"); | 182 | + log.error("Exception thrown while to get message from ovsdb"); |
| 183 | - } | 183 | + } |
| 184 | - | 184 | + |
| 185 | - log.debug("Add node to north"); | 185 | + log.debug("Add node to north"); |
| 186 | - for (OvsdbNodeListener l : ovsdbNodeListener) { | 186 | + for (OvsdbNodeListener l : ovsdbNodeListener) { |
| 187 | - l.nodeAdded(nodeId); | 187 | + l.nodeAdded(nodeId); |
| 188 | - } | 188 | + } |
| 189 | - return; | 189 | + return; |
| 190 | - } | 190 | + } |
| 191 | - } | 191 | + } |
| 192 | - | 192 | + |
| 193 | - @Override | 193 | + @Override |
| 194 | - public void removeConnectedNode(OvsdbNodeId nodeId) { | 194 | + public void removeConnectedNode(OvsdbNodeId nodeId) { |
| 195 | - ovsdbClients.remove(nodeId); | 195 | + ovsdbClients.remove(nodeId); |
| 196 | - log.debug("Node connection is removed"); | 196 | + log.debug("Node connection is removed"); |
| 197 | - for (OvsdbNodeListener l : ovsdbNodeListener) { | 197 | + for (OvsdbNodeListener l : ovsdbNodeListener) { |
| 198 | - l.nodeRemoved(nodeId); | 198 | + l.nodeRemoved(nodeId); |
| 199 | - } | 199 | + } |
| 200 | - } | 200 | + } |
| 201 | - } | 201 | + } |
| 202 | - | 202 | + |
| 203 | - /** | 203 | + /** |
| 204 | - * Processes table updates. | 204 | + * Processes table updates. |
| 205 | - * | 205 | + * |
| 206 | - * @param clientService OvsdbClientService instance | 206 | + * @param clientService OvsdbClientService instance |
| 207 | - * @param updates TableUpdates instance | 207 | + * @param updates TableUpdates instance |
| 208 | - * @param dbName ovsdb database name | 208 | + * @param dbName ovsdb database name |
| 209 | - */ | 209 | + */ |
| 210 | - private void processTableUpdates(OvsdbClientService clientService, | 210 | + private void processTableUpdates(OvsdbClientService clientService, |
| 211 | - TableUpdates updates, String dbName) | 211 | + TableUpdates updates, String dbName) |
| 212 | - throws InterruptedException { | 212 | + throws InterruptedException { |
| 213 | - checkNotNull(clientService, "OvsdbClientService is not null"); | 213 | + checkNotNull(clientService, "OvsdbClientService is not null"); |
| 214 | - | 214 | + |
| 215 | - DatabaseSchema dbSchema = clientService.getDatabaseSchema(dbName); | 215 | + DatabaseSchema dbSchema = clientService.getDatabaseSchema(dbName); |
| 216 | - | 216 | + |
| 217 | - for (String tableName : updates.result().keySet()) { | 217 | + for (String tableName : updates.result().keySet()) { |
| 218 | - TableUpdate update = updates.result().get(tableName); | 218 | + TableUpdate update = updates.result().get(tableName); |
| 219 | - for (UUID uuid : (Set<UUID>) update.rows().keySet()) { | 219 | + for (UUID uuid : (Set<UUID>) update.rows().keySet()) { |
| 220 | - log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}", | 220 | + log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}", |
| 221 | - uuid.value(), dbName, tableName); | 221 | + uuid.value(), dbName, tableName); |
| 222 | - | 222 | + |
| 223 | - Row row = clientService.getRow(dbName, tableName, uuid.value()); | 223 | + Row oldRow = update.getOld(uuid); |
| 224 | - clientService.updateOvsdbStore(dbName, tableName, uuid.value(), | 224 | + Row newRow = update.getNew(uuid); |
| 225 | - update.getNew(uuid)); | 225 | + if (newRow != null) { |
| 226 | - if (update.getNew(uuid) != null) { | 226 | + clientService.updateOvsdbStore(dbName, tableName, |
| 227 | - boolean isNewRow = (row == null) ? true : false; | 227 | + uuid.value(), newRow); |
| 228 | - if (isNewRow) { | 228 | + |
| 229 | - if (OvsdbConstant.PORT.equals(tableName)) { | 229 | + if (OvsdbConstant.INTERFACE.equals(tableName)) { |
| 230 | - dispatchEvent(clientService, update.getNew(uuid), | 230 | + dispatchInterfaceEvent(clientService, |
| 231 | - null, OvsdbEvent.Type.PORT_ADDED, | 231 | + newRow, null, |
| 232 | - dbSchema); | 232 | + OvsdbEvent.Type.PORT_ADDED, |
| 233 | - } | 233 | + dbSchema); |
| 234 | - } | 234 | + } |
| 235 | - } else if (update.getOld(uuid) != null) { | 235 | + } else if (update.getOld(uuid) != null) { |
| 236 | - clientService.removeRow(dbName, tableName, uuid.toString()); | 236 | + clientService.removeRow(dbName, tableName, uuid.value()); |
| 237 | - if (update.getOld(uuid) != null) { | 237 | + if (OvsdbConstant.PORT.equals(tableName)) { |
| 238 | - if (OvsdbConstant.PORT.equals(tableName)) { | 238 | + dispatchInterfaceEvent(clientService, null, |
| 239 | - dispatchEvent(clientService, null, | 239 | + oldRow, |
| 240 | - update.getOld(uuid), | 240 | + OvsdbEvent.Type.PORT_REMOVED, |
| 241 | - OvsdbEvent.Type.PORT_REMOVED, | 241 | + dbSchema); |
| 242 | - dbSchema); | 242 | + } |
| 243 | - } | 243 | + } |
| 244 | - } | 244 | + } |
| 245 | - } | 245 | + } |
| 246 | - } | 246 | + } |
| 247 | - } | 247 | + |
| 248 | - } | 248 | + /** |
| 249 | - | 249 | + * Dispatches event to the north. |
| 250 | - /** | 250 | + * |
| 251 | - * Dispatches event to the north. | 251 | + * @param clientService OvsdbClientService instance |
| 252 | - * | 252 | + * @param newRow a new row |
| 253 | - * @param clientService OvsdbClientService instance | 253 | + * @param oldRow an old row |
| 254 | - * @param newRow a new row | 254 | + * @param eventType type of event |
| 255 | - * @param oldRow an old row | 255 | + * @param dbSchema ovsdb database schema |
| 256 | - * @param eventType type of event | 256 | + */ |
| 257 | - * @param dbSchema ovsdb database schema | 257 | + private void dispatchInterfaceEvent(OvsdbClientService clientService, |
| 258 | - */ | 258 | + Row newRow, Row oldRow, |
| 259 | - private void dispatchEvent(OvsdbClientService clientService, Row newRow, | 259 | + Type eventType, |
| 260 | - Row oldRow, Type eventType, | 260 | + DatabaseSchema dbSchema) { |
| 261 | - DatabaseSchema dbSchema) { | 261 | + |
| 262 | - Port port = null; | 262 | + long dpid = getDataPathid(clientService, dbSchema); |
| 263 | - if (OvsdbEvent.Type.PORT_ADDED.equals(eventType)) { | 263 | + Interface intf = (Interface) TableGenerator |
| 264 | - port = (Port) TableGenerator.getTable(dbSchema, newRow, | 264 | + .getTable(dbSchema, newRow, OvsdbTable.INTERFACE); |
| 265 | - OvsdbTable.PORT); | 265 | + if (intf == null) { |
| 266 | - } else if (OvsdbEvent.Type.PORT_REMOVED.equals(eventType)) { | 266 | + return; |
| 267 | - port = (Port) TableGenerator.getTable(dbSchema, oldRow, | 267 | + } |
| 268 | - OvsdbTable.PORT); | 268 | + |
| 269 | - } | 269 | + String portType = (String) intf.getTypeColumn().data(); |
| 270 | - if (port == null) { | 270 | + long localPort = getOfPort(intf); |
| 271 | - return; | 271 | + if (localPort < 0) { |
| 272 | - } | 272 | + return; |
| 273 | - | 273 | + } |
| 274 | - long dpid = getDataPathid(clientService, dbSchema); | 274 | + String[] macAndIfaceId = getMacAndIfaceid(intf); |
| 275 | - OvsdbSet intfUuidSet = (OvsdbSet) port.getInterfacesColumn().data(); | 275 | + if (macAndIfaceId == null) { |
| 276 | - @SuppressWarnings({ "unchecked" }) | 276 | + return; |
| 277 | - Set<UUID> intfUuids = intfUuidSet.set(); | 277 | + } |
| 278 | - for (UUID intfUuid : intfUuids) { | 278 | + |
| 279 | - Row intfRow = clientService | 279 | + EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf( |
| 280 | - .getRow(OvsdbConstant.DATABASENAME, "Interface", | 280 | + macAndIfaceId[0]), |
| 281 | - intfUuid.toString()); | 281 | + new HashSet<IpAddress>(), |
| 282 | - if (intfRow == null) { | 282 | + new OvsdbPortName(intf |
| 283 | - continue; | 283 | + .getName()), |
| 284 | - } | 284 | + new OvsdbPortNumber(localPort), |
| 285 | - Interface intf = (Interface) TableGenerator | 285 | + new OvsdbDatapathId(Long |
| 286 | - .getTable(dbSchema, intfRow, OvsdbTable.INTERFACE); | 286 | + .toString(dpid)), |
| 287 | - | 287 | + new OvsdbPortType(portType), |
| 288 | - String portType = (String) intf.getTypeColumn().data(); | 288 | + new OvsdbIfaceId(macAndIfaceId[1])); |
| 289 | - long localPort = getOfPort(intf); | 289 | + for (OvsdbEventListener listener : ovsdbEventListener) { |
| 290 | - String[] macAndIfaceId = getMacAndIfaceid(intf); | 290 | + listener.handle(new OvsdbEvent<EventSubject>(eventType, |
| 291 | - if (macAndIfaceId == null) { | 291 | + eventSubject)); |
| 292 | - return; | 292 | + } |
| 293 | - } | 293 | + } |
| 294 | - EventSubject eventSubject = new DefaultEventSubject( | 294 | + |
| 295 | - MacAddress | 295 | + /** |
| 296 | - .valueOf(macAndIfaceId[0]), | 296 | + * Gets mac and iface from the table Interface. |
| 297 | - new HashSet<IpAddress>(), | 297 | + * |
| 298 | - new OvsdbPortName(port.getName()), | 298 | + * @param intf Interface instance |
| 299 | - new OvsdbPortNumber(localPort), | 299 | + * @return attachedMac, ifaceid |
| 300 | - new OvsdbDatapathId(Long.toString(dpid)), | 300 | + */ |
| 301 | - new OvsdbPortType(portType), | 301 | + private String[] getMacAndIfaceid(Interface intf) { |
| 302 | - new OvsdbIfaceId(macAndIfaceId[1])); | 302 | + OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data(); |
| 303 | - for (OvsdbEventListener listener : ovsdbEventListener) { | 303 | + @SuppressWarnings("unchecked") |
| 304 | - listener.handle(new OvsdbEvent<EventSubject>(eventType, | 304 | + Map<String, String> externalIds = ovsdbMap.map(); |
| 305 | - eventSubject)); | 305 | + if (externalIds == null) { |
| 306 | - } | 306 | + log.warn("The external_ids is null"); |
| 307 | - | 307 | + return null; |
| 308 | - } | 308 | + } |
| 309 | - | 309 | + |
| 310 | - } | 310 | + String attachedMac = externalIds.get(OvsdbConstant.EXTERNAL_ID_VM_MAC); |
| 311 | - | 311 | + if (attachedMac == null) { |
| 312 | - /** | 312 | + log.warn("The attachedMac is null"); |
| 313 | - * Gets mac and iface from the table Interface. | 313 | + return null; |
| 314 | - * | 314 | + } |
| 315 | - * @param intf Interface instance | 315 | + String ifaceid = externalIds |
| 316 | - * @return attachedMac, ifaceid | 316 | + .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID); |
| 317 | - */ | 317 | + if (ifaceid == null) { |
| 318 | - private String[] getMacAndIfaceid(Interface intf) { | 318 | + log.warn("The ifaceid is null"); |
| 319 | - OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data(); | 319 | + return null; |
| 320 | - @SuppressWarnings("unchecked") | 320 | + } |
| 321 | - Map<String, String> externalIds = ovsdbMap.map(); | 321 | + return new String[] {attachedMac, ifaceid}; |
| 322 | - if (externalIds == null) { | 322 | + } |
| 323 | - log.warn("The external_ids is null"); | 323 | + |
| 324 | - return null; | 324 | + /** |
| 325 | - } | 325 | + * Gets ofPorts number from table Interface. |
| 326 | - | 326 | + * |
| 327 | - String attachedMac = externalIds.get(OvsdbConstant.EXTERNAL_ID_VM_MAC); | 327 | + * @param intf Interface instance |
| 328 | - if (attachedMac == null) { | 328 | + * @return ofport the ofport number |
| 329 | - log.warn("The attachedMac is null"); | 329 | + */ |
| 330 | - return null; | 330 | + private long getOfPort(Interface intf) { |
| 331 | - } | 331 | + OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data(); |
| 332 | - String ifaceid = externalIds | 332 | + @SuppressWarnings("unchecked") |
| 333 | - .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID); | 333 | + Set<Integer> ofPorts = ofPortSet.set(); |
| 334 | - if (ifaceid == null) { | 334 | + while (ofPorts == null || ofPorts.size() <= 0) { |
| 335 | - log.warn("The ifaceid is null"); | 335 | + log.debug("The ofport is null in {}", intf.getName()); |
| 336 | - return null; | 336 | + return -1; |
| 337 | - } | 337 | + } |
| 338 | - return new String[] {attachedMac, ifaceid}; | 338 | + Iterator<Integer> it = ofPorts.iterator(); |
| 339 | - } | 339 | + return Long.parseLong(it.next().toString()); |
| 340 | - | 340 | + } |
| 341 | - /** | 341 | + |
| 342 | - * Gets ofPorts number from table Interface. | 342 | + /** |
| 343 | - * | 343 | + * Gets datapathid from table bridge. |
| 344 | - * @param intf Interface instance | 344 | + * |
| 345 | - * @return ofport the ofport number | 345 | + * @param clientService OvsdbClientService instance |
| 346 | - */ | 346 | + * @param dbSchema ovsdb database schema |
| 347 | - private long getOfPort(Interface intf) { | 347 | + * @return datapathid the bridge datapathid |
| 348 | - OvsdbSet ovsdbSet = (OvsdbSet) intf.getOpenFlowPortColumn().data(); | 348 | + */ |
| 349 | - @SuppressWarnings("unchecked") | 349 | + private long getDataPathid(OvsdbClientService clientService, |
| 350 | - Set<Long> ofPorts = ovsdbSet.set(); | 350 | + DatabaseSchema dbSchema) { |
| 351 | - while (ofPorts == null || ofPorts.size() <= 0) { | 351 | + String bridgeUuid = clientService |
| 352 | - log.debug("The ofport is null in {}", intf.getName()); | 352 | + .getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE); |
| 353 | - return 0; | 353 | + if (bridgeUuid == null) { |
| 354 | - } | 354 | + log.debug("Unable to spot bridge uuid for {} in {}", |
| 355 | - return (long) ofPorts.toArray()[0]; | 355 | + OvsdbConstant.INTEGRATION_BRIDGE, clientService); |
| 356 | - } | 356 | + return 0; |
| 357 | - | 357 | + } |
| 358 | - /** | 358 | + |
| 359 | - * Gets datapathid from table bridge. | 359 | + Row bridgeRow = clientService.getRow(OvsdbConstant.DATABASENAME, |
| 360 | - * | 360 | + "Bridge", bridgeUuid); |
| 361 | - * @param clientService OvsdbClientService instance | 361 | + Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, |
| 362 | - * @param dbSchema ovsdb database schema | 362 | + OvsdbTable.BRIDGE); |
| 363 | - * @return datapathid the bridge datapathid | 363 | + OvsdbSet dpidSet = (OvsdbSet) bridge.getDatapathIdColumn().data(); |
| 364 | - */ | 364 | + @SuppressWarnings("unchecked") |
| 365 | - private long getDataPathid(OvsdbClientService clientService, | 365 | + Set<String> dpids = dpidSet.set(); |
| 366 | - DatabaseSchema dbSchema) { | 366 | + if (dpids == null || dpids.size() == 0) { |
| 367 | - String bridgeUuid = clientService | 367 | + return 0; |
| 368 | - .getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE); | 368 | + } |
| 369 | - if (bridgeUuid == null) { | 369 | + return stringToLong((String) dpids.toArray()[0]); |
| 370 | - log.debug("Unable to spot bridge uuid for {} in {}", | 370 | + } |
| 371 | - OvsdbConstant.INTEGRATION_BRIDGE, clientService); | 371 | + |
| 372 | - return 0; | 372 | + private long stringToLong(String values) { |
| 373 | - } | 373 | + long value = (new BigInteger(values.replaceAll(":", ""), 16)) |
| 374 | - | 374 | + .longValue(); |
| 375 | - Row bridgeRow = clientService.getRow(OvsdbConstant.DATABASENAME, | 375 | + return value; |
| 376 | - "Bridge", bridgeUuid); | 376 | + } |
| 377 | - Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, | 377 | + |
| 378 | - OvsdbTable.BRIDGE); | 378 | + /** |
| 379 | - OvsdbSet ovsdbSet = (OvsdbSet) bridge.getDatapathIdColumn().data(); | 379 | + * Implementation of an Callback which is responsible for receiving request |
| 380 | - @SuppressWarnings("unchecked") | 380 | + * infomation from ovsdb. |
| 381 | - Set<String> dpids = ovsdbSet.set(); | 381 | + */ |
| 382 | - if (dpids == null || dpids.size() == 0) { | 382 | + private class InternalMonitorCallBack implements Callback { |
| 383 | - return 0; | 383 | + @Override |
| 384 | - } | 384 | + public void update(UpdateNotification updateNotification) { |
| 385 | - return stringToLong((String) dpids.toArray()[0]); | 385 | + Object key = updateNotification.jsonValue(); |
| 386 | - } | 386 | + OvsdbClientService ovsdbClient = requestNotification.get(key); |
| 387 | - | 387 | + |
| 388 | - private long stringToLong(String values) { | 388 | + String dbName = requestDbName.get(key); |
| 389 | - long value = (new BigInteger(values.replaceAll(":", ""), 16)) | 389 | + JsonNode updatesJson = updateNotification.tbUpdatesJsonNode(); |
| 390 | - .longValue(); | 390 | + DatabaseSchema dbSchema = ovsdbClient.getDatabaseSchema(dbName); |
| 391 | - return value; | 391 | + TableUpdates updates = FromJsonUtil |
| 392 | - } | 392 | + .jsonNodeToTableUpdates(updatesJson, dbSchema); |
| 393 | - | 393 | + try { |
| 394 | - /** | 394 | + processTableUpdates(ovsdbClient, updates, dbName); |
| 395 | - * Implementation of an Callback which is responsible for receiving request | 395 | + } catch (InterruptedException e) { |
| 396 | - * infomation from ovsdb. | 396 | + log.warn("Interrupted while processing table updates"); |
| 397 | - */ | 397 | + Thread.currentThread().interrupt(); |
| 398 | - private class InternalMonitorCallBack implements Callback { | 398 | + } |
| 399 | - @Override | 399 | + } |
| 400 | - public void update(UpdateNotification updateNotification) { | 400 | + |
| 401 | - Object key = updateNotification.jsonValue(); | 401 | + @Override |
| 402 | - OvsdbClientService ovsdbClient = requestNotification.get(key); | 402 | + public void locked(List<String> ids) { |
| 403 | - | 403 | + // TODO Auto-generated method stub |
| 404 | - String dbName = requestDbName.get(key); | 404 | + } |
| 405 | - JsonNode updatesJson = updateNotification.tbUpdatesJsonNode(); | 405 | + |
| 406 | - DatabaseSchema dbSchema = ovsdbClient.getDatabaseSchema(dbName); | 406 | + @Override |
| 407 | - TableUpdates updates = FromJsonUtil | 407 | + public void stolen(List<String> ids) { |
| 408 | - .jsonNodeToTableUpdates(updatesJson, dbSchema); | 408 | + // TODO Auto-generated method stub |
| 409 | - try { | 409 | + } |
| 410 | - processTableUpdates(ovsdbClient, updates, dbName); | 410 | + |
| 411 | - } catch (InterruptedException e) { | 411 | + } |
| 412 | - log.warn("Interrupted while processing table updates"); | 412 | + |
| 413 | - Thread.currentThread().interrupt(); | 413 | +} |
| 414 | - } | ||
| 415 | - } | ||
| 416 | - | ||
| 417 | - @Override | ||
| 418 | - public void locked(List<String> ids) { | ||
| 419 | - // TODO Auto-generated method stub | ||
| 420 | - } | ||
| 421 | - | ||
| 422 | - @Override | ||
| 423 | - public void stolen(List<String> ids) { | ||
| 424 | - // TODO Auto-generated method stub | ||
| 425 | - } | ||
| 426 | - | ||
| 427 | - } | ||
| 428 | - | ||
| 429 | -} | ... | ... |
-
Please register or login to post a comment