From eb631c5ab0c30cd07e2968d2f2b1724a862145ed Mon Sep 17 00:00:00 2001 From: Faseela K Date: Sun, 24 Jan 2016 00:32:26 +0530 Subject: [PATCH] Bug 5064 - Deletion of tunnel interfaces not removing the TEP from switch Change-Id: I8fae09299a257e47a924f37fc75e5424a878da4c Signed-off-by: Faseela K (cherry picked from commit 973f90816ea93d263c9369a94c9e5f590826337a) --- .../commons/InterfaceMetaUtils.java | 21 ++++++++++++++ .../OvsInterfaceConfigAddHelper.java | 2 -- .../OvsInterfaceTopologyStateAddHelper.java | 20 +++++-------- ...OvsInterfaceTopologyStateRemoveHelper.java | 4 +++ .../ovs/utilities/SouthboundUtils.java | 29 +++++++++++++++++++ 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java index a123fccc..3ce243cd 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceMetaUtils.java @@ -8,12 +8,17 @@ package org.opendaylight.vpnservice.interfacemgr.commons; import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; +import org.eclipse.xtend.lib.annotations.Data; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.idmanager.IdManager; import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities.SouthboundUtils; +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.OvsdbBridgeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.BridgeInterfaceInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.BridgeRefInfo; @@ -32,10 +37,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.met import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + public class InterfaceMetaUtils { public static InstanceIdentifier getBridgeRefEntryIdentifier(BridgeRefEntryKey bridgeRefEntryKey) { InstanceIdentifier.InstanceIdentifierBuilder bridgeRefEntryInstanceIdentifierBuilder = @@ -168,4 +178,15 @@ public class InterfaceMetaUtils { } IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName); } + + public static void createBridgeRefEntry(BigInteger dpnId, InstanceIdentifier bridgeIid, + WriteTransaction tx){ + BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId); + InstanceIdentifier bridgeEntryId = + InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey); + BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder = + new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(dpnId) + .setBridgeReference(new OvsdbBridgeRef(bridgeIid)); + tx.put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true); + } } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java index 70fca216..901604f8 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java @@ -140,8 +140,6 @@ public class OvsInterfaceConfigAddHelper { return; } - //createBridgeEntryIfNotPresent(dpId, dataBroker, t); - BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceNew.getName()); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java index 4fa4c1bf..ae9dccf3 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java @@ -41,7 +41,7 @@ public class OvsInterfaceTopologyStateAddHelper { public static List> addPortToBridge(InstanceIdentifier bridgeIid, OvsdbBridgeAugmentation bridgeNew, DataBroker dataBroker) { List> futures = new ArrayList<>(); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); if (bridgeNew.getDatapathId() == null) { LOG.warn("DataPathId found as null for Bridge Augmentation: {}... retrying...", bridgeNew); @@ -62,13 +62,11 @@ public class OvsInterfaceTopologyStateAddHelper { return futures; } - BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId); - InstanceIdentifier bridgeEntryId = - InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey); - BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder = - new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(dpnId) - .setBridgeReference(new OvsdbBridgeRef(bridgeIid)); - t.put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true); + // create bridge reference entry in interface meta operational DS + InterfaceMetaUtils.createBridgeRefEntry(dpnId, bridgeIid, writeTransaction); + + // FIX for OVSDB Bug - manually copying the bridge info from topology operational DS to config DS + SouthboundUtils.addBridge(bridgeIid, bridgeNew, dataBroker, futures); BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpnId); InstanceIdentifier bridgeEntryInstanceIdentifier = @@ -77,7 +75,7 @@ public class OvsInterfaceTopologyStateAddHelper { InterfaceMetaUtils.getBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier, dataBroker); if (bridgeEntry == null) { - futures.add(t.submit()); + futures.add(writeTransaction.submit()); return futures; } @@ -88,12 +86,10 @@ public class OvsInterfaceTopologyStateAddHelper { Interface iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker); if (iface.getAugmentation(IfTunnel.class) != null) { SouthboundUtils.addPortToBridge(bridgeIid, iface, bridgeNew, bridgeName, portName, dataBroker, futures); - InterfaceMetaUtils.createBridgeInterfaceEntryInConfigDS(bridgeEntryKey, - new BridgeInterfaceEntryKey(portName), portName, t); } } - futures.add(t.submit()); + futures.add(writeTransaction.submit()); return futures; } } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java index 90fcf360..dd4f25db 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateRemoveHelper.java @@ -13,6 +13,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities.SouthboundUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; @@ -42,6 +43,9 @@ public class OvsInterfaceTopologyStateRemoveHelper { InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey); t.delete(LogicalDatastoreType.OPERATIONAL, bridgeEntryId); + // FIX for ovsdb bug for delete TEP + SouthboundUtils.deleteBridge(bridgeIid, dataBroker, futures); + futures.add(t.submit()); return futures; } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java index 690a5eee..4bf4d42f 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/utilities/SouthboundUtils.java @@ -20,11 +20,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; 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.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder; @@ -57,6 +59,26 @@ public class SouthboundUtils { futures.add(tx.submit()); } + public static void addBridge(InstanceIdentifier bridgeIid, + OvsdbBridgeAugmentation bridgeAugmentation, + DataBroker dataBroker, List> futures){ + WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); + NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId(); + NodeBuilder bridgeNodeBuilder = new NodeBuilder(); + bridgeNodeBuilder.setNodeId(nodeId); + bridgeNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, bridgeAugmentation); + tx.put(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId), bridgeNodeBuilder.build(), true); + futures.add(tx.submit()); + } + + public static void deleteBridge(InstanceIdentifier bridgeIid, + DataBroker dataBroker, List> futures){ + WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); + NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId(); + tx.delete(LogicalDatastoreType.CONFIGURATION, createNodeInstanceIdentifier(nodeId)); + futures.add(tx.submit()); + } + private static void addVlanPortToBridge(InstanceIdentifier bridgeIid, IfL2vlan ifL2vlan, OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName, String portName, DataBroker dataBroker, WriteTransaction t) { @@ -160,4 +182,11 @@ public class SouthboundUtils { LOG.debug("Termination point InstanceIdentifier generated : {}",terminationPointPath); return terminationPointPath; } + + public static InstanceIdentifier createNodeInstanceIdentifier(NodeId nodeId) { + return InstanceIdentifier + .create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)) + .child(Node.class,new NodeKey(nodeId)); + } } \ No newline at end of file -- 2.36.6