String QOS_LINUX_FQ_CODEL = "linux-fq_codel";
String QOS_EGRESS_POLICER = "egress-policer";
String URI_SEPERATOR = "/";
+ String CREATED_BY = "created_by";
+ String ODL = "odl";
+
ImmutableBiMap<Class<? extends QosTypeBase>,String> QOS_TYPE_MAP
= new ImmutableBiMap.Builder<Class<? extends QosTypeBase>,String>()
.put(QosTypeLinuxHtb.class,QOS_LINUX_HTB)
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIdsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortExternalIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortExternalIdsBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
public static void schemaMismatchLog(String column, String table, SchemaVersionMismatchException ex) {
LOG.debug(SCHEMA_VERSION_MISMATCH, column, table, SouthboundConstants.OPEN_V_SWITCH, ex.getMessage());
}
+
+ public static PortExternalIds createExternalIdsForPort(String key, String value) {
+ return new PortExternalIdsBuilder()
+ .setExternalIdKey(key)
+ .setExternalIdValue(value).build();
+ }
+
+ public static InterfaceExternalIds createExternalIdsForInterface(String key, String value) {
+ return new InterfaceExternalIdsBuilder()
+ .setExternalIdKey(key)
+ .setExternalIdValue(value).build();
+ }
}
import com.google.common.base.Optional;
import com.google.common.util.concurrent.CheckedFuture;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import org.opendaylight.ovsdb.southbound.SouthboundConstants;
import org.opendaylight.ovsdb.southbound.SouthboundMapper;
import org.opendaylight.ovsdb.southbound.SouthboundProvider;
+import org.opendaylight.ovsdb.southbound.SouthboundUtil;
import org.opendaylight.ovsdb.utils.yang.YangUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
// Configure port with the above interface details
String portUuid = "Port_" + SouthboundMapper.getRandomUuid();
Port port = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Port.class);
- createPort(terminationPoint, port, interfaceUuid);
+ final String opendaylightIid = instanceIdentifierCodec.serialize(terminationPointIid);
+ createPort(terminationPoint, port, interfaceUuid, opendaylightIid);
transaction.add(op.insert(port).withId(portUuid));
LOG.info("Created Termination Point : {} with Uuid : {}",
terminationPoint.getName(),portUuid);
private void createPort(
final OvsdbTerminationPointAugmentation terminationPoint,
- final Port port, final String interfaceUuid) {
+ final Port port, final String interfaceUuid, final String opendaylightIid) {
port.setName(terminationPoint.getName());
port.setInterfaces(Collections.singleton(new UUID(interfaceUuid)));
createPortVlanTag(terminationPoint, port);
createPortVlanTrunk(terminationPoint, port);
createPortVlanMode(terminationPoint, port);
- createPortExternalIds(terminationPoint, port);
+ createPortExternalIds(terminationPoint, port, opendaylightIid);
}
private void createOfPort(
List<InterfaceExternalIds> interfaceExternalIds =
terminationPoint.getInterfaceExternalIds();
if (interfaceExternalIds != null && !interfaceExternalIds.isEmpty()) {
- try {
- ovsInterface.setExternalIds(YangUtils.convertYangKeyValueListToMap(interfaceExternalIds,
- InterfaceExternalIds::getExternalIdKey, InterfaceExternalIds::getExternalIdValue));
- } catch (NullPointerException e) {
- LOG.warn("Incomplete OVSDB interface external_ids", e);
- }
+ interfaceExternalIds.add(SouthboundUtil.createExternalIdsForInterface(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ } else {
+ interfaceExternalIds = Arrays.asList(SouthboundUtil.createExternalIdsForInterface(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ }
+ try {
+ ovsInterface.setExternalIds(YangUtils.convertYangKeyValueListToMap(interfaceExternalIds,
+ InterfaceExternalIds::getExternalIdKey, InterfaceExternalIds::getExternalIdValue));
+ } catch (NullPointerException e) {
+ LOG.warn("Incomplete OVSDB interface external_ids", e);
}
}
private void createPortExternalIds(
final OvsdbTerminationPointAugmentation terminationPoint,
- final Port port) {
+ final Port port, final String opendaylightIid) {
+ // Set the iid external_id
List<PortExternalIds> portExternalIds = terminationPoint.getPortExternalIds();
if (portExternalIds != null && !portExternalIds.isEmpty()) {
- try {
- port.setExternalIds(YangUtils.convertYangKeyValueListToMap(portExternalIds,
- PortExternalIds::getExternalIdKey, PortExternalIds::getExternalIdValue));
- } catch (NullPointerException e) {
- LOG.warn("Incomplete OVSDB port external_ids", e);
- }
+ portExternalIds.add(SouthboundUtil.createExternalIdsForPort(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ portExternalIds.add(SouthboundUtil.createExternalIdsForPort(
+ SouthboundConstants.IID_EXTERNAL_ID_KEY, opendaylightIid));
+ } else {
+ portExternalIds = new ArrayList<PortExternalIds>();
+ portExternalIds.add(SouthboundUtil.createExternalIdsForPort(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ portExternalIds.add(SouthboundUtil.createExternalIdsForPort(
+ SouthboundConstants.IID_EXTERNAL_ID_KEY, opendaylightIid));
+ }
+ try {
+ port.setExternalIds(YangUtils.convertYangKeyValueListToMap(portExternalIds,
+ PortExternalIds::getExternalIdKey, PortExternalIds::getExternalIdValue));
+ //YangUtils.copyYangKeyValueListToMap(externalIdMap, terminationPoint.getPortExternalIds(),
+ // PortExternalIds::getExternalIdKey, PortExternalIds::getExternalIdValue);
+ } catch (NullPointerException e) {
+ LOG.warn("Incomplete OVSDB port external_ids", e);
}
}
.where(port.getNameColumn().getSchema().opEqual(interfaceName))
.build());
}
-
-}
+}
\ No newline at end of file
Set<InstanceIdentifier<OvsdbTerminationPointAugmentation>> removedTps) {
for (InstanceIdentifier<OvsdbTerminationPointAugmentation> removedTpIid: removedTps) {
LOG.debug("Received request to delete termination point {}", removedTpIid);
-
OvsdbTerminationPointAugmentation original = originals.get(removedTpIid);
Node originalNode = originalNodes.get(removedTpIid.firstIdentifierOf(Node.class));
+ LOG.trace("Termination point's associated original node {}", originalNode);
OvsdbBridgeAugmentation originalOvsdbBridgeAugmentation =
originalNode.augmentation(OvsdbBridgeAugmentation.class);
String bridgeName = null;
LOG.error("Bridge does not exist for termination point {}", removedTpIid);
}
}
-
Port port = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Port.class,null);
Optional<OvsdbTerminationPointAugmentation> tpAugmentation =
state.getOvsdbTerminationPointAugmentation(removedTpIid);
-
if (tpAugmentation.isPresent()) {
OvsdbTerminationPointAugmentation tp = tpAugmentation.get();
if (tp.getPortUuid() != null) {
import com.google.common.base.Optional;
import com.google.common.util.concurrent.CheckedFuture;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
import org.opendaylight.ovsdb.southbound.SouthboundConstants;
import org.opendaylight.ovsdb.southbound.SouthboundProvider;
+import org.opendaylight.ovsdb.southbound.SouthboundUtil;
import org.opendaylight.ovsdb.utils.yang.YangUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
TerminationPointCreateCommand.stampInstanceIdentifier(transaction,
iid.firstIdentifierOf(OvsdbTerminationPointAugmentation.class), terminationPoint.getName(),
instanceIdentifierCodec);
-
+ final String opendaylightIid = instanceIdentifierCodec.serialize(iid);
// Update port
// Bug#6136
Optional<OvsdbBridgeAugmentation> ovsdbBridgeOptional = state.getOvsdbBridgeAugmentation(iid);
if (operBridge != null) {
Port port = TyperUtils.getTypedRowWrapper(
transaction.getDatabaseSchema(), Port.class);
- updatePort(terminationPoint, port, operBridge);
+ updatePort(terminationPoint, port, operBridge, opendaylightIid);
Port extraPort = TyperUtils.getTypedRowWrapper(
transaction.getDatabaseSchema(), Port.class);
extraPort.setName("");
private void updatePort(
final OvsdbTerminationPointAugmentation terminationPoint,
final Port port,
- final OvsdbBridgeAugmentation operBridge) {
+ final OvsdbBridgeAugmentation operBridge,
+ final String opendaylightIid) {
updatePortOtherConfig(terminationPoint, port);
updatePortVlanTag(terminationPoint, port);
updatePortVlanTrunk(terminationPoint, port);
updatePortVlanMode(terminationPoint, port);
- updatePortExternalIds(terminationPoint, port);
+ updatePortExternalIds(terminationPoint, port, opendaylightIid);
updatePortQos(terminationPoint, port, operBridge);
}
List<InterfaceExternalIds> interfaceExternalIds =
terminationPoint.getInterfaceExternalIds();
if (interfaceExternalIds != null && !interfaceExternalIds.isEmpty()) {
- try {
- ovsInterface.setExternalIds(YangUtils.convertYangKeyValueListToMap(interfaceExternalIds,
- InterfaceExternalIds::getExternalIdKey, InterfaceExternalIds::getExternalIdValue));
- } catch (NullPointerException e) {
- LOG.warn("Incomplete OVSDB interface external_ids", e);
- }
+ interfaceExternalIds.add(SouthboundUtil.createExternalIdsForInterface(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ } else {
+ interfaceExternalIds = Arrays.asList(SouthboundUtil.createExternalIdsForInterface(
+ SouthboundConstants.CREATED_BY, SouthboundConstants.ODL));
+ }
+ try {
+ ovsInterface.setExternalIds(YangUtils.convertYangKeyValueListToMap(interfaceExternalIds,
+ InterfaceExternalIds::getExternalIdKey, InterfaceExternalIds::getExternalIdValue));
+ } catch (NullPointerException e) {
+ LOG.warn("Incomplete OVSDB interface external_ids", e);
}
}
private void updatePortExternalIds(
final OvsdbTerminationPointAugmentation terminationPoint,
- final Port port) {
+ final Port port,
+ final String opendaylightIid) {
- List<PortExternalIds> portExternalIds = terminationPoint.getPortExternalIds();
- if (portExternalIds != null && !portExternalIds.isEmpty()) {
- try {
- port.setExternalIds(YangUtils.convertYangKeyValueListToMap(portExternalIds,
- PortExternalIds::getExternalIdKey, PortExternalIds::getExternalIdValue));
- } catch (NullPointerException e) {
- LOG.warn("Incomplete OVSDB port external_ids", e);
- }
+ Map<String, String> externalIdMap = new HashMap<>();
+ externalIdMap.put(SouthboundConstants.IID_EXTERNAL_ID_KEY, opendaylightIid);
+ externalIdMap.put(SouthboundConstants.CREATED_BY, SouthboundConstants.ODL);
+ try {
+ YangUtils.copyYangKeyValueListToMap(externalIdMap, terminationPoint.getPortExternalIds(),
+ PortExternalIds::getExternalIdKey, PortExternalIds::getExternalIdValue);
+ } catch (NullPointerException e) {
+ LOG.warn("Incomplete OVSDB port external_ids", e);
}
+ port.setExternalIds(externalIdMap);
}
private void updatePortVlanTag(
}
}
}
-
}
import com.google.common.cache.LoadingCache;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.common.util.concurrent.UncheckedExecutionException;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactUtils;
import org.opendaylight.ovsdb.southbound.reconciliation.configuration.TerminationPointConfigReconciliationTask;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
nodeConnectionMetadata.getNode(),
nodeConnectionMetadata.getNodeIid(),
nodeConnectionMetadata.getConnectionInstance(),
+ nodeConnectionMetadata.getOperTerminationPoints(),
instanceIdentifierCodec
));
}
if (!bridgeNodeCache.asMap().isEmpty()) {
Map<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> nodes =
TransactUtils.extractCreated(changes, OvsdbBridgeAugmentation.class);
+ Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ terminationPointsAug =
+ TransactUtils.extractCreated(changes, OvsdbTerminationPointAugmentation.class);
for (Map.Entry<InstanceIdentifier<OvsdbBridgeAugmentation>, OvsdbBridgeAugmentation> entry :
nodes.entrySet()) {
InstanceIdentifier<?> bridgeIid = entry.getKey();
try {
NodeConnectionMetadata bridgeNodeMetaData = bridgeNodeCache.get(nodeKey);
bridgeNodeMetaData.setNodeIid(bridgeIid);
+ bridgeNodeMetaData.setOperTerminationPoints(
+ filterTerminationPointsForBridge(nodeKey, terminationPointsAug));
TerminationPointConfigReconciliationTask tpReconciliationTask =
new TerminationPointConfigReconciliationTask(ReconciliationManager.this,
bridgeNodeMetaData.getConnectionManager(),
bridgeNodeMetaData.getNode(),
bridgeIid,
bridgeNodeMetaData.getConnectionInstance(),
+ bridgeNodeMetaData.getOperTerminationPoints(),
instanceIdentifierCodec);
enqueue(tpReconciliationTask);
bridgeNodeCache.invalidate(nodeKey);
}
}
+ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "https://github.com/spotbugs/spotbugs/issues/811")
+ private Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ filterTerminationPointsForBridge(NodeKey nodeKey,
+ Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ terminationPoints) {
+
+ Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ filteredTerminationPoints = new HashMap<>();
+ for (Map.Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> entry :
+ terminationPoints.entrySet()) {
+ InstanceIdentifier<?> bridgeIid = entry.getKey();
+ NodeKey terminationPointNodeKey = bridgeIid.firstKeyOf(Node.class);
+ if (terminationPointNodeKey.getNodeId().equals(nodeKey.getNodeId())) {
+ LOG.trace("TP Match found: {} {} ", terminationPointNodeKey.getNodeId(), nodeKey.getNodeId());
+ filteredTerminationPoints.put(entry.getKey(), entry.getValue());
+ } else {
+ LOG.trace("TP No Match found : {} {} ", terminationPointNodeKey.getNodeId(), nodeKey.getNodeId());
+ }
+ }
+ return filteredTerminationPoints;
+
+ }
+
private void cleanupBridgeCreatedDataTreeChangeRegistration() {
if (bridgeCreatedDataTreeChangeRegistration != null) {
bridgeCreatedDataTreeChangeRegistration.close();
private InstanceIdentifier<?> nodeIid;
private final OvsdbConnectionManager connectionManager;
private final OvsdbConnectionInstance connectionInstance;
+ private Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ operTerminationPoints;
+
+ public Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ getOperTerminationPoints() {
+ return operTerminationPoints;
+ }
+
+ public void setOperTerminationPoints(
+ Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ operTerminationPoints) {
+ this.operTerminationPoints = operTerminationPoints;
+ }
NodeConnectionMetadata(Node node,
OvsdbConnectionManager connectionManager,
brChanges.putAll(extractBridgeConfigurationChanges(node, bridge));
tpChanges.add(node);
} else if (node.key().getNodeId().getValue().startsWith(
- nodeIid.firstKeyOf(Node.class).getNodeId().getValue())
- && node.getTerminationPoint() != null && !node.getTerminationPoint().isEmpty()) {
+ nodeIid.firstKeyOf(Node.class).getNodeId().getValue())) {
+ //&& node.getTerminationPoint() != null && !node.getTerminationPoint().isEmpty()) {
+ // Above check removed to handle delete reconciliation with ManagedBy
+ // param not set in config DS
tpChanges.add(node);
} else {
LOG.trace("Ignoring Reconcilation of Bridge: {}", node.key().getNodeId().getValue());
+
}
}
*/
package org.opendaylight.ovsdb.southbound.reconciliation.configuration;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
+
import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
+import org.opendaylight.ovsdb.southbound.SouthboundConstants;
import org.opendaylight.ovsdb.southbound.SouthboundMapper;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.BridgeOperationalState;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangeEvent;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.TerminationPointCreateCommand;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TerminationPointDeleteCommand;
import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager;
import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationTask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortExternalIds;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
private static final Logger LOG = LoggerFactory.getLogger(TerminationPointConfigReconciliationTask.class);
private final OvsdbConnectionInstance connectionInstance;
private final InstanceIdentifierCodec instanceIdentifierCodec;
+ private final Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ operTerminationPoints;
public TerminationPointConfigReconciliationTask(final ReconciliationManager reconciliationManager,
final OvsdbConnectionManager connectionManager, final Node bridgeNode,
final InstanceIdentifier<?> bridgeIid, final OvsdbConnectionInstance connectionInstance,
+ final Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation>
+ operTerminationPoints,
final InstanceIdentifierCodec instanceIdentifierCodec) {
super(reconciliationManager, connectionManager, bridgeIid, bridgeNode);
this.connectionInstance = connectionInstance;
this.instanceIdentifierCodec = instanceIdentifierCodec;
+ this.operTerminationPoints = operTerminationPoints;
}
@Override
public boolean reconcileConfiguration(final OvsdbConnectionManager connectionManager) {
- LOG.debug("Reconcile Termination Point Configuration for node {}", ((Node) configData).getNodeId());
final Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
- changes.putAll(SouthboundMapper.extractTerminationPointConfigurationChanges((Node) configData));
-
+ final Node configNodeData = ((Node) configData);
+ LOG.debug("Reconcile Termination Point Configuration for node {}", configNodeData.getNodeId());
+ changes.putAll(SouthboundMapper.extractTerminationPointConfigurationChanges(configNodeData));
DataChangeEvent changeEvents = new DataChangeEvent() {
@Override
public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {
new BridgeOperationalState(reconciliationManager.getDb(), changeEvents),
changeEvents, instanceIdentifierCodec);
+ List<String> configTerminationPoints = new ArrayList<>();
+ if (configNodeData.getTerminationPoint() != null) {
+ configNodeData.getTerminationPoint().forEach(entry -> {
+ configTerminationPoints.add(entry.getTpId().getValue());
+ });
+ }
+
+ Set<InstanceIdentifier<?>> removeTerminationPoints = new HashSet<>();
+ final Map<InstanceIdentifier<?>, DataObject> original = new HashMap<>();
+ final InstanceIdentifier<Node> bridgeNodeIid =
+ SouthboundMapper.createInstanceIdentifier(configNodeData.getNodeId());
+ original.put(bridgeNodeIid, configNodeData);
+ LOG.trace("Config Topology Termination Points during Reconciliation {} for bridge {}",
+ configTerminationPoints, bridgeNodeIid);
+ LOG.trace("Oper Topology Termination Points during Reconciliation {} for bridge {}",
+ operTerminationPoints, bridgeNodeIid);
+ for (Map.Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> entry :
+ operTerminationPoints.entrySet()) {
+ OvsdbTerminationPointAugmentation terminationPoint = entry.getValue();
+ if (configTerminationPoints.contains(terminationPoint.getName())) {
+ LOG.trace("Termination Point {} from Oper Topology also present in config topology During Reconcile",
+ terminationPoint.getName());
+ } else {
+ LOG.trace("Termination Point {} from Oper Topology NOT present in config topology During Reconcile,"
+ + "checking if this created by ODL and perform delete reconciliation",
+ terminationPoint.getName());
+ List<PortExternalIds> externalIds = terminationPoint.getPortExternalIds();
+ if (externalIds != null) {
+ for (PortExternalIds portExternalIds : externalIds) {
+ if (portExternalIds.getExternalIdKey().equals(SouthboundConstants.CREATED_BY)
+ && portExternalIds.getExternalIdValue().equals(SouthboundConstants.ODL)) {
+ LOG.trace("Termination Point {} created by ODL. Marking for deletion during reconcile",
+ entry.getKey());
+ removeTerminationPoints.add(entry.getKey());
+ original.put(entry.getKey(), entry.getValue());
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ DataChangeEvent deleteChangeEvents = new DataChangeEvent() {
+ @Override
+ public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() {
+ return original;
+ }
+
+ @Override
+ public Map<InstanceIdentifier<?>, DataObject> getOriginalData() {
+ return original;
+ }
+
+ @Override
+ public Set<InstanceIdentifier<?>> getRemovedPaths() {
+ return removeTerminationPoints;
+ }
+ };
+
+ connectionInstance.transact(new TerminationPointDeleteCommand(),
+ new BridgeOperationalState(reconciliationManager.getDb(), deleteChangeEvents),
+ deleteChangeEvents, instanceIdentifierCodec);
+
return true;
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeExternalIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeExternalIdsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigs;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
private static final String PATCH_PORT_TYPE = "patch";
// External ID key used for mapping between an OVSDB port and an interface name
private static final String EXTERNAL_INTERFACE_ID_KEY = "iface-id";
-
+ private static final String CREATED_BY = "created_by";
+ private static final String ODL = "odl";
private static final String FORMAT = "(\\d+)\\.(\\d+)\\.(\\d+)";
private static final Pattern PATTERN = Pattern.compile(FORMAT);
bridgeOtherConfigsBuilder.setBridgeOtherConfigValue("true");
otherConfigs.add(bridgeOtherConfigsBuilder.build());
ovsdbBridgeAugmentationBuilder.setBridgeOtherConfigs(otherConfigs);
+ ovsdbBridgeAugmentationBuilder.setBridgeExternalIds(setBridgeExternalIds());
setManagedByForBridge(ovsdbBridgeAugmentationBuilder, ovsdbNode.key());
if (dpType != null) {
ovsdbBridgeAugmentationBuilder.setDatapathType(dpType);
}
return false;
}
+
+ private List<BridgeExternalIds> setBridgeExternalIds() {
+ List<BridgeExternalIds> externalIdsList = new ArrayList<>();
+ externalIdsList.add(new BridgeExternalIdsBuilder()
+ .setBridgeExternalIdKey(CREATED_BY)
+ .setBridgeExternalIdValue(ODL)
+ .build());
+ return externalIdsList;
+ }
}