import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.ovsdb.lib.message.TableUpdates;
import org.opendaylight.ovsdb.lib.notation.Mutator;
import org.opendaylight.ovsdb.lib.notation.Row;
+import org.opendaylight.ovsdb.lib.notation.UUID;
import org.opendaylight.ovsdb.lib.operations.Mutate;
import org.opendaylight.ovsdb.lib.operations.Operation;
import org.opendaylight.ovsdb.lib.operations.OperationResult;
private Entity connectedEntity;
private EntityOwnershipCandidateRegistration deviceOwnershipCandidateRegistration;
private OvsdbNodeAugmentation initialCreateData = null;
+ private Map<UUID, InstanceIdentifier<Node>> ports = new ConcurrentHashMap<>();
+ private Map<String, InstanceIdentifier<Node>> portInterfaces = new ConcurrentHashMap<>();
OvsdbConnectionInstance(final ConnectionInfo key, final OvsdbClient client, final TransactionInvoker txInvoker,
final InstanceIdentifier<Node> iid) {
this.instanceIdentifier = iid;
}
+ public void updatePort(UUID uuid, InstanceIdentifier<Node> iid) {
+ ports.put(uuid, iid);
+ }
+
+ public void removePort(UUID uuid) {
+ ports.remove(uuid);
+ }
+
+ public InstanceIdentifier<Node> getPort(UUID uuid) {
+ return ports.get(uuid);
+ }
+
+ public void updatePortInterface(String name, InstanceIdentifier<Node> iid) {
+ portInterfaces.put(name, iid);
+ }
+
+ public void removePortInterface(String name) {
+ portInterfaces.remove(name);
+ }
+
+ public InstanceIdentifier<Node> getPortInterface(String name) {
+ return portInterfaces.get(name);
+ }
+
/**
* Apply the given command to the given events, based on the given bridge state.
*
*/
package org.opendaylight.ovsdb.southbound.transactions.md;
-import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@Override
public void execute(final ReadWriteTransaction transaction) {
- Collection<Port> portRemovedRows = TyperUtils.extractRowsRemoved(
- Port.class, getUpdates(), getDbSchema()).values();
+ Map<UUID, Port> portRemovedRows = TyperUtils.extractRowsRemoved(
+ Port.class, getUpdates(), getDbSchema());
Map<UUID, Port> portUpdatedRows = TyperUtils.extractRowsUpdated(
Port.class, getUpdates(), getDbSchema());
Map<UUID,Bridge> bridgeUpdatedRows = TyperUtils.extractRowsUpdated(
Bridge.class, getUpdates(), getDbSchema());
Map<UUID,Bridge> bridgeUpdatedOldRows = TyperUtils.extractRowsOld(
Bridge.class, getUpdates(), getDbSchema());
- for (Port port : portRemovedRows) {
+ for (Entry<UUID, Port> portRemoved: portRemovedRows.entrySet()) {
+ final UUID portUuid = portRemoved.getKey();
+ final Port port = portRemoved.getValue();
final String portName = port.getName();
boolean isPortInUpdatedRows = portUpdatedRows.values()
.stream().anyMatch(updatedPort -> portName.equals(updatedPort.getName()));
instanceIdentifierCodec, getOvsdbConnectionInstance(), bridgeData)
.child(TerminationPoint.class, new TerminationPointKey(new TpId(portName)));
transaction.delete(LogicalDatastoreType.OPERATIONAL, nodePath);
+ // Remove from OvsdbConnection Instance cache
+ getOvsdbConnectionInstance().removePort(portUuid);
+ getOvsdbConnectionInstance().removePortInterface(portName);
}
}
}
if (bridgeIid.isPresent()) {
NodeId bridgeId = SouthboundMapper.createManagedNodeId(bridgeIid.get());
TerminationPointKey tpKey = new TerminationPointKey(new TpId(portName));
+ getOvsdbConnectionInstance().updatePortInterface(portName, bridgeIid.get());
TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
tpBuilder.withKey(tpKey);
tpBuilder.setTpId(tpKey.getTpId());
}
for (Entry<UUID, Interface> interfaceUpdate : interfaceUpdatedRows.entrySet()) {
String interfaceName = null;
+ Optional<InstanceIdentifier<Node>> bridgeIid = Optional.absent();
interfaceName = interfaceUpdatedRows.get(interfaceUpdate.getKey()).getNameColumn().getData();
- Optional<InstanceIdentifier<Node>> bridgeIid = getTerminationPointBridge(transaction, node, interfaceName);
+ if (getOvsdbConnectionInstance().getPortInterface(interfaceName) != null) {
+ bridgeIid = Optional.of(getOvsdbConnectionInstance().getPortInterface(interfaceName));
+ }
+ if (!bridgeIid.isPresent()) {
+ bridgeIid = getTerminationPointBridge(transaction, node, interfaceName);
+ }
if (bridgeIid.isPresent()) {
TerminationPointKey tpKey = new TerminationPointKey(new TpId(interfaceName));
TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
}
private Optional<InstanceIdentifier<Node>> getTerminationPointBridge(UUID portUuid) {
- for (Entry<UUID, Bridge> entry : this.bridgeUpdatedRows.entrySet()) {
- UUID bridgeUuid = entry.getKey();
- if (entry.getValue().getPortsColumn().getData().contains(portUuid)) {
- return Optional.of(
- SouthboundMapper.createInstanceIdentifier(instanceIdentifierCodec, getOvsdbConnectionInstance(),
- this.bridgeUpdatedRows.get(bridgeUuid)));
+
+ if (bridgeUpdatedRows != null) {
+ for (Entry<UUID, Bridge> entry : this.bridgeUpdatedRows.entrySet()) {
+ UUID bridgeUuid = entry.getKey();
+ if (this.bridgeUpdatedRows.get(bridgeUuid).getPortsColumn().getData()
+ .contains(portUuid)) {
+ InstanceIdentifier<Node> iid = SouthboundMapper.createInstanceIdentifier(
+ instanceIdentifierCodec, getOvsdbConnectionInstance(),
+ this.bridgeUpdatedRows.get(bridgeUuid));
+ getOvsdbConnectionInstance().updatePort(portUuid, iid);
+ return Optional.of(iid);
+ }
}
}
+ if (getOvsdbConnectionInstance().getPort(portUuid) != null) {
+ return Optional.of(getOvsdbConnectionInstance().getPort(portUuid));
+ }
return Optional.absent();
}
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
doNothing().when(ovsdbPortUpdateCommand).updateTerminationPoints(any(ReadWriteTransaction.class),
any(Node.class));
ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
+ PowerMockito.mockStatic(SouthboundUtil.class);
+ PowerMockito.when(SouthboundUtil.readNode(any(ReadTransaction.class), any(InstanceIdentifier.class)))
+ .thenReturn(node);
ovsdbPortUpdateCommand.execute(transaction);
verify(ovsdbConnectionInstance).getInstanceIdentifier();
verify(ovsdbPortUpdateCommand).updateTerminationPoints(any(ReadWriteTransaction.class), any(Node.class));
Column<GenericTableSchema, String> interfaceColumn = mock(Column.class);
when(interfaceUpdate.getNameColumn()).thenReturn(interfaceColumn);
when(interfaceColumn.getData()).thenReturn(INTERFACE_NAME);
+ when(ovsdbPortUpdateCommand.getOvsdbConnectionInstance()).thenReturn(mock(OvsdbConnectionInstance.class));
PowerMockito.doReturn(bridgeIid).when(ovsdbPortUpdateCommand, "getTerminationPointBridge",
any(ReadWriteTransaction.class), any(Node.class), anyString());