From d470c0a64e59091c2e4f1fbdc8d64a10ac824c83 Mon Sep 17 00:00:00 2001 From: Faseela K Date: Wed, 23 Dec 2015 17:49:24 +0530 Subject: [PATCH] creation of tunnel ingress flow and lfib table entries moved to interface manager Change-Id: I921d2af650f78f15c13077fb12c2cecf20d85045 Signed-off-by: Faseela K --- .../vpnservice/interfacemgr/IfmConstants.java | 3 + .../interfacemgr/InterfacemgrProvider.java | 2 +- .../commons/InterfaceManagerCommonUtils.java | 81 +++++++------------ .../InterfaceInventoryStateListener.java | 9 ++- .../OvsInterfaceStateAddHelper.java | 41 +++++++--- .../OvsInterfaceStateRemoveHelper.java | 38 ++++++--- .../ovs/utilities/SouthboundUtils.java | 8 +- .../InterfaceManagerRpcService.java | 75 ++++++++++------- .../FlowBasedServicesConfigBindHelper.java | 9 +-- .../FlowBasedServicesConfigUnbindHelper.java | 4 +- .../FlowBasedServicesStateUnbindHelper.java | 5 +- .../utilities/FlowBasedServicesUtils.java | 24 ++++-- .../interfacemgr/test/StateInterfaceTest.java | 21 +++-- .../interfaces/IMdsalApiManager.java | 5 ++ .../mdsalutil/internal/MDSALManager.java | 9 +-- .../mdsalutil/internal/MDSALUtilProvider.java | 13 ++- .../vpnservice/VpnInterfaceManager.java | 4 +- 17 files changed, 206 insertions(+), 145 deletions(-) diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmConstants.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmConstants.java index 79076578..ce95c4c3 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmConstants.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmConstants.java @@ -18,10 +18,13 @@ public class IfmConstants { public static final String OF_URI_PREFIX = "openflow:"; public static final String OF_URI_SEPARATOR = ":"; public static final int DEFAULT_IFINDEX = 65536; + public static final int DEFAULT_FLOW_PRIORITY = 5; public static final String IFM_LPORT_TAG_IDPOOL_NAME = "vlaninterfaces.lporttag"; public static final short VLAN_INTERFACE_INGRESS_TABLE = 0; public static final short INTERNAL_TUNNEL_TABLE = 22; public static final short EXTERNAL_TUNNEL_TABLE = 23; + public static final short LFIB_TABLE = 20; + public static final BigInteger COOKIE_VM_LFIB_TABLE = new BigInteger("8000002", 16);; public static final String TUNNEL_TABLE_FLOWID_PREFIX = "TUNNEL."; public static final BigInteger TUNNEL_TABLE_COOKIE = new BigInteger("9000000", 16); } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index 5865e7b0..46fccb11 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -79,7 +79,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager); interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); - interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker, idManager); + interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker, idManager, mdsalManager); interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); topologyStateListener = new InterfaceTopologyStateListener(dataBroker); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java index 3456bf3e..fe34b5a4 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java @@ -9,11 +9,16 @@ package org.opendaylight.vpnservice.interfacemgr.commons; import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; 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.VpnConstants; import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.mdsalutil.*; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; @@ -24,12 +29,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeMplsOverGre; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -50,44 +59,6 @@ public class InterfaceManagerCommonUtils { return nodeConnectorOptional.get(); } - /*public static void addInterfaceEntryToInventoryOperDS(NodeConnectorId nodeConnectorId, long lporttag, String interfaceName, - DataBroker dataBroker, WriteTransaction t) { - NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId); - TunnelInterfaceInventoryInfoKey tunnelInterfaceInventoryInfoKey = new TunnelInterfaceInventoryInfoKey(lporttag); - InstanceIdentifier inventoryIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)) - .augmentation(TunnelInterfaceNames.class) - .child(TunnelInterfaceInventoryInfo.class, tunnelInterfaceInventoryInfoKey).build(); - TunnelInterfaceInventoryInfoBuilder builder = new TunnelInterfaceInventoryInfoBuilder().setKey(tunnelInterfaceInventoryInfoKey) - .setTunIntfName(interfaceName); - t.put(LogicalDatastoreType.OPERATIONAL, inventoryIdentifier, builder.build(), true); - } - - public static void removeInterfaceEntryFromInventoryOperDS(NodeConnectorId nodeConnectorId, long lporttag, - String interfaceName, DataBroker dataBroker, - WriteTransaction t) { - NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId); - TunnelInterfaceInventoryInfoKey tunnelInterfaceInventoryInfoKey = new TunnelInterfaceInventoryInfoKey(lporttag); - InstanceIdentifier inventoryIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)) - .augmentation(TunnelInterfaceNames.class) - .child(TunnelInterfaceInventoryInfo.class, tunnelInterfaceInventoryInfoKey).build(); - t.delete(LogicalDatastoreType.OPERATIONAL, inventoryIdentifier); - } - - public static void removeInterfaceEntryFromInventoryOperDS(NodeConnectorId nodeConnectorId, long lporttag, - DataBroker dataBroker) { - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); - NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId); - TunnelInterfaceInventoryInfoKey tunnelInterfaceInventoryInfoKey = new TunnelInterfaceInventoryInfoKey(lporttag); - InstanceIdentifier inventoryIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)) - .augmentation(TunnelInterfaceNames.class) - .child(TunnelInterfaceInventoryInfo.class, tunnelInterfaceInventoryInfoKey).build(); - t.delete(LogicalDatastoreType.OPERATIONAL, inventoryIdentifier); - t.submit(); // This is a Best-Effort Deletion. If Node is already removed, this may fail. - } */ - public static InstanceIdentifier getInterfaceIdentifier(InterfaceKey interfaceKey) { InstanceIdentifier.InstanceIdentifierBuilder interfaceInstanceIdentifierBuilder = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, interfaceKey); @@ -115,22 +86,28 @@ public class InterfaceManagerCommonUtils { return ifStateOptional.get(); } + public static void makeTunnelIngressFlow(List> futures, IMdsalApiManager mdsalApiManager, + IfTunnel tunnel, BigInteger dpnId, long portNo, Interface iface, int addOrRemoveFlow) { + String flowRef = InterfaceManagerCommonUtils.getTunnelInterfaceFlowRef(dpnId, VpnConstants.LPORT_INGRESS_TABLE, iface.getName()); + List matches = new ArrayList(); + List mkInstructions = new ArrayList(); + if (NwConstants.ADD_FLOW == addOrRemoveFlow) { + matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] { + dpnId, BigInteger.valueOf(portNo) })); + short tableId = tunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class) ? IfmConstants.LFIB_TABLE : + tunnel.isInternal() ? IfmConstants.INTERNAL_TUNNEL_TABLE : IfmConstants.EXTERNAL_TUNNEL_TABLE; + mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {tableId}));} - public static String getJobKey(String dpId, String portName) { - String jobKey = ""; - if (dpId != null && !"".equals(dpId)) { - jobKey = dpId.toString() + ":"; + BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16); + FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, IfmConstants.VLAN_INTERFACE_INGRESS_TABLE, flowRef, + IfmConstants.DEFAULT_FLOW_PRIORITY, iface.getName(), 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions); + if (NwConstants.ADD_FLOW == addOrRemoveFlow) { + futures.add(mdsalApiManager.installFlow(dpnId, flowEntity)); + } else { + futures.add(mdsalApiManager.removeFlow(dpnId, flowEntity)); } - jobKey = jobKey + portName; - return jobKey; } - - public static String getJobKey(BigInteger dpId, String portName) { - String jobKey = ""; - if (dpId != null && dpId.longValue() != 0) { - jobKey = dpId.toString() + ":"; - } - jobKey = jobKey + portName; - return jobKey; + public static String getTunnelInterfaceFlowRef(BigInteger dpnId, short tableId, String ifName) { + return new StringBuilder().append(dpnId).append(tableId).append(ifName).toString(); } } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java index f496bbc0..e99e2912 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceInventoryStateListener.java @@ -17,6 +17,7 @@ import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInt import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateUpdateHelper; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; @@ -42,11 +43,13 @@ public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class); private DataBroker dataBroker; private IdManagerService idManager; + private IMdsalApiManager mdsalApiManager; - public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManager) { + public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManager, final IMdsalApiManager mdsalApiManager) { super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class); this.dataBroker = dataBroker; this.idManager = idManager; + this.mdsalApiManager = mdsalApiManager; } @Override @@ -121,7 +124,7 @@ public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase public Object call() throws Exception { // If another renderer(for eg : CSS) needs to be supported, check can be performed here // to call the respective helpers. - return OvsInterfaceStateAddHelper.addState(dataBroker, idManager, nodeConnectorId, + return OvsInterfaceStateAddHelper.addState(dataBroker, idManager, mdsalApiManager, nodeConnectorId, portName, fcNodeConnectorNew); } @@ -191,7 +194,7 @@ public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase public Object call() throws Exception { // If another renderer(for eg : CSS) needs to be supported, check can be performed here // to call the respective helpers. - return OvsInterfaceStateRemoveHelper.removeState(idManager, key, dataBroker, portName, fcNodeConnectorOld); + return OvsInterfaceStateRemoveHelper.removeState(idManager, mdsalApiManager, key, dataBroker, portName, fcNodeConnectorOld); } @Override diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java index 9891226d..ecc08854 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java @@ -12,25 +12,34 @@ 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.VpnConstants; import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; +import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils; +import org.opendaylight.vpnservice.mdsalutil.*; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -45,11 +54,11 @@ import java.util.List; public class OvsInterfaceStateAddHelper { private static final Logger LOG = LoggerFactory.getLogger(OvsInterfaceStateAddHelper.class); - public static List> addState(DataBroker dataBroker, IdManagerService idManager, NodeConnectorId nodeConnectorId, - String portName, FlowCapableNodeConnector fcNodeConnectorNew) { + public static List> addState(DataBroker dataBroker, IdManagerService idManager, IMdsalApiManager mdsalApiManager, + NodeConnectorId nodeConnectorId, String portName, FlowCapableNodeConnector fcNodeConnectorNew) { LOG.debug("Adding Interface State to Oper DS for port: {}", portName); List> futures = new ArrayList<>(); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); //Retrieve PbyAddress & OperState from the DataObject PhysAddress physAddress = new PhysAddress(fcNodeConnectorNew.getHardwareAddress().getValue()); @@ -77,12 +86,22 @@ public class OvsInterfaceStateAddHelper { InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setOperStatus(operStatus) .setAdminStatus(adminStatus).setPhysAddress(physAddress).setIfIndex(ifIndex).setLowerLayerIf(lowerLayerIfList) .setKey(IfmUtil.getStateInterfaceKeyFromName(portName)); - t.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true); + transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true); // allocate lport tag and set in if-index - InterfaceMetaUtils.createLportTagInterfaceMap(t, portName, ifIndex); + InterfaceMetaUtils.createLportTagInterfaceMap(transaction, portName, ifIndex); if (iface == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); + return futures; + } + + // If this interface is a tunnel interface, create the tunnel ingress flow + IfTunnel tunnel = iface.getAugmentation(IfTunnel.class); + if(tunnel != null){ + BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); + long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); + InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, tunnel,dpId, portNo, iface, + NwConstants.ADD_FLOW); return futures; } @@ -90,7 +109,7 @@ public class OvsInterfaceStateAddHelper { // should also be created here. IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class); if (ifL2vlan == null || ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.Trunk) { - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } @@ -98,13 +117,13 @@ public class OvsInterfaceStateAddHelper { InterfaceParentEntry interfaceParentEntry = InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker); if (interfaceParentEntry == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } List interfaceChildEntries = interfaceParentEntry.getInterfaceChildEntry(); if (interfaceChildEntries == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } @@ -130,7 +149,7 @@ public class OvsInterfaceStateAddHelper { InterfaceBuilder childIfaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus).setOperStatus(operStatus) .setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList); childIfaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceChild.getName())); - t.put(LogicalDatastoreType.OPERATIONAL, ifChildStateId, childIfaceBuilder.build(), true); + transaction.put(LogicalDatastoreType.OPERATIONAL, ifChildStateId, childIfaceBuilder.build(), true); } /** Below code will be needed if we want to update the vlan-trunks on the of-port @@ -156,7 +175,7 @@ public class OvsInterfaceStateAddHelper { VlanTrunkSouthboundUtils.addTerminationPointWithTrunks(bridgeIid, trunks, iface.getName(), t); */ - futures.add(t.submit()); + futures.add(transaction.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/OvsInterfaceStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java index 9d9c668e..fb3ac13a 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java @@ -14,44 +14,64 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; +import org.opendaylight.vpnservice.mdsalutil.MDSALUtil; +import org.opendaylight.vpnservice.mdsalutil.NwConstants; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.math.BigInteger; import java.util.ArrayList; import java.util.List; public class OvsInterfaceStateRemoveHelper { private static final Logger LOG = LoggerFactory.getLogger(OvsInterfaceStateRemoveHelper.class); - public static List> removeState(IdManagerService idManager, + public static List> removeState(IdManagerService idManager, IMdsalApiManager mdsalApiManager, InstanceIdentifier key, DataBroker dataBroker, String portName, FlowCapableNodeConnector fcNodeConnectorOld) { LOG.debug("Removing interface-state for port: {}", portName); List> futures = new ArrayList<>(); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); InstanceIdentifier ifStateId = IfmUtil.buildStateInterfaceId(portName); /* Remove entry from if-index-interface-name map and deallocate Id from Idmanager. */ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(portName, dataBroker); - InterfaceMetaUtils.removeLportTagInterfaceMap(t, idManager, dataBroker, interfaceState.getName(), interfaceState.getIfIndex()); + InterfaceMetaUtils.removeLportTagInterfaceMap(transaction, idManager, dataBroker, interfaceState.getName(), interfaceState.getIfIndex()); - t.delete(LogicalDatastoreType.OPERATIONAL, ifStateId); + transaction.delete(LogicalDatastoreType.OPERATIONAL, ifStateId); // For Vlan-Trunk Interface, remove the trunk-member operstates as well... InterfaceKey interfaceKey = new InterfaceKey(portName); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker); if (iface == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); + return futures; + } + + // If this interface is a tunnel interface, remove the tunnel ingress flow + IfTunnel tunnel = iface.getAugmentation(IfTunnel.class); + if(tunnel != null){ + NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId(); + BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); + long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); + InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, tunnel, dpId, portNo, iface, + NwConstants.DEL_FLOW); return futures; } @@ -59,13 +79,13 @@ public class OvsInterfaceStateRemoveHelper { InterfaceParentEntry interfaceParentEntry = InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey, dataBroker); if (interfaceParentEntry == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } List interfaceChildEntries = interfaceParentEntry.getInterfaceChildEntry(); if (interfaceChildEntries == null) { - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } @@ -73,7 +93,7 @@ public class OvsInterfaceStateRemoveHelper { for (InterfaceChildEntry interfaceChildEntry : interfaceChildEntries) { InstanceIdentifier ifChildStateId = IfmUtil.buildStateInterfaceId(interfaceChildEntry.getChildInterface()); - t.delete(LogicalDatastoreType.OPERATIONAL, ifChildStateId); + transaction.delete(LogicalDatastoreType.OPERATIONAL, ifChildStateId); } /* Below code will be needed if we want to update the vlan-trunk in the of-port. @@ -95,7 +115,7 @@ public class OvsInterfaceStateRemoveHelper { InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), interfaceOld.getName()); t.delete(LogicalDatastoreType.CONFIGURATION, tpIid); */ - futures.add(t.submit()); + futures.add(transaction.submit()); return futures; } } \ No newline at end of file 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 e20b81dc..690a5eee 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 @@ -18,10 +18,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*; 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.IfL2vlan; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan; +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.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId; @@ -73,7 +70,8 @@ public class SouthboundUtils { Class type = null; LOG.debug("adding tunnel port {} to bridge {}",portName, bridgeName); - if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeGre.class)) { + if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeGre.class) || + ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class)) { type = InterfaceTypeGre.class; } else if (ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) { type = InterfaceTypeVxlan.class; diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java index 95d81df6..bd2b8b93 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java @@ -41,6 +41,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.met import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeMplsOverGre; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.*; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError; @@ -94,33 +95,16 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { } @Override - public Future> createTerminatingServiceActions(CreateTerminatingServiceActionsInput input) { + public Future> createTerminatingServiceActions(final CreateTerminatingServiceActionsInput input) { final SettableFuture> result = SettableFuture.create(); try{ - List mkMatches = new ArrayList(); - WriteTransaction t = dataBroker.newWriteOnlyTransaction(); LOG.info("create terminatingServiceAction on DpnId = {} for tunnel-key {}", input.getDpid() , input.getTunnelKey()); - - // Matching metadata - mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] {input.getTunnelKey()})); - List instructions = input.getInstruction(); Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(input.getInterfaceName()),dataBroker); IfTunnel tunnelInfo = interfaceInfo.getAugmentation(IfTunnel.class); if(tunnelInfo != null) { - short tableId = tunnelInfo.isInternal() ? IfmConstants.INTERNAL_TUNNEL_TABLE : - IfmConstants.EXTERNAL_TUNNEL_TABLE; - List instructionSet = new ArrayList(); - if (instructions != null && !instructions.isEmpty()) { - for (Instruction info : instructions) { - instructionSet.add(info); - } - } - final String flowRef = getFlowRef(input.getDpid(),tableId, input.getTunnelKey()); - Flow terminatingSerFlow = MDSALUtil.buildFlowNew(tableId, flowRef, - 5, "TST Flow Entry", 0, 0, - IfmConstants.TUNNEL_TABLE_COOKIE.add(input.getTunnelKey()), mkMatches, instructionSet); - - ListenableFuture installFlowResult = mdsalMgr.installFlow(input.getDpid(), terminatingSerFlow); + ListenableFuture installFlowResult = (tunnelInfo.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class)) ? + makeLFIBFlow(input.getDpid(),input.getTunnelKey(), input.getInstruction(), NwConstants.ADD_FLOW) : + makeTerminatingServiceFlow(tunnelInfo, input.getDpid(), input.getTunnelKey(), input.getInstruction(), NwConstants.ADD_FLOW); Futures.addCallback(installFlowResult, new FutureCallback(){ @Override @@ -130,7 +114,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { @Override public void onFailure(Throwable error) { - String msg = String.format("Unable to install terminating service flow %s", flowRef); + String msg = String.format("Unable to install terminating service flow for %s", input.getInterfaceName()); LOG.error("create terminating service actions failed. {}. {}", msg, error); result.set(RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, msg, error).build()); } @@ -150,7 +134,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { } @Override - public Future> removeTerminatingServiceActions(RemoveTerminatingServiceActionsInput input) { + public Future> removeTerminatingServiceActions(final RemoveTerminatingServiceActionsInput input) { final SettableFuture> result = SettableFuture.create(); try{ WriteTransaction t = dataBroker.newWriteOnlyTransaction(); @@ -159,13 +143,9 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(input.getInterfaceName()),dataBroker); IfTunnel tunnelInfo = interfaceInfo.getAugmentation(IfTunnel.class); if(tunnelInfo != null) { - short tableId = tunnelInfo.isInternal() ? IfmConstants.INTERNAL_TUNNEL_TABLE : - IfmConstants.EXTERNAL_TUNNEL_TABLE; - final String flowRef = getFlowRef(input.getDpid(),tableId, input.getTunnelKey()); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(input.getDpid(), tableId, flowRef, - 0, flowRef, 0, 0, - null, null, null); - ListenableFuture removeFlowResult = mdsalMgr.removeFlow(input.getDpid(), flowEntity); + ListenableFuture removeFlowResult = (tunnelInfo.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class)) ? + makeLFIBFlow(input.getDpid(),input.getTunnelKey(), null, NwConstants.DEL_FLOW) : + makeTerminatingServiceFlow(tunnelInfo, input.getDpid(), input.getTunnelKey(), null, NwConstants.DEL_FLOW); Futures.addCallback(removeFlowResult, new FutureCallback(){ @Override @@ -175,7 +155,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { @Override public void onFailure(Throwable error) { - String msg = String.format("Unable to install terminating service flow %s", flowRef); + String msg = String.format("Unable to install terminating service flow %s", input.getInterfaceName()); LOG.error("create terminating service actions failed. {}. {}", msg, error); result.set(RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, msg, error).build()); } @@ -388,6 +368,39 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { return null; } + private ListenableFuture makeTerminatingServiceFlow(IfTunnel tunnelInfo, BigInteger dpnId, BigInteger tunnelKey, List instruction, int addOrRemove) { + List mkMatches = new ArrayList(); + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] {tunnelKey})); + short tableId = tunnelInfo.isInternal() ? IfmConstants.INTERNAL_TUNNEL_TABLE : + IfmConstants.EXTERNAL_TUNNEL_TABLE; + final String flowRef = getFlowRef(dpnId,tableId, tunnelKey); + Flow terminatingSerFlow = MDSALUtil.buildFlowNew(tableId, flowRef, + 5, "TST Flow Entry", 0, 0, + IfmConstants.TUNNEL_TABLE_COOKIE.add(tunnelKey), mkMatches, instruction); + if (addOrRemove == NwConstants.ADD_FLOW) { + return mdsalMgr.installFlow(dpnId, terminatingSerFlow); + } + + return mdsalMgr.removeFlow(dpnId, terminatingSerFlow); + } + + private ListenableFuture makeLFIBFlow(BigInteger dpnId, BigInteger tunnelKey, List instruction, int addOrRemove) { + List mkMatches = new ArrayList(); + mkMatches.add(new MatchInfo(MatchFieldType.eth_type, + new long[]{0x8847L})); + mkMatches.add(new MatchInfo(MatchFieldType.mpls_label, new String[]{Long.toString(tunnelKey.longValue())})); + // Install the flow entry in L3_LFIB_TABLE + String flowRef = getFlowRef(dpnId, IfmConstants.LFIB_TABLE, tunnelKey); + + Flow lfibFlow = MDSALUtil.buildFlowNew(IfmConstants.LFIB_TABLE, flowRef, + IfmConstants.DEFAULT_FLOW_PRIORITY, "LFIB Entry", 0, 0, + IfmConstants.COOKIE_VM_LFIB_TABLE, mkMatches, instruction); + if (addOrRemove == NwConstants.ADD_FLOW) { + return mdsalMgr.installFlow(dpnId, lfibFlow); + } + return mdsalMgr.removeFlow(dpnId, lfibFlow); + } + private String getFlowRef(BigInteger dpnId, short tableId, BigInteger tunnelKey) { return new StringBuffer().append(IfmConstants.TUNNEL_TABLE_FLOWID_PREFIX).append(dpnId).append(NwConstants.FLOWID_SEPARATOR) .append(tableId).append(NwConstants.FLOWID_SEPARATOR).append(tunnelKey).toString(); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigBindHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigBindHelper.java index 1b02e872..de503d11 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigBindHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigBindHelper.java @@ -72,7 +72,6 @@ public class FlowBasedServicesConfigBindHelper { long portNo = Long.parseLong(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); - Long lportTag = FlowBasedServicesUtils.getLPortTag(iface, dataBroker); if (allServices.size() == 1) { // If only one service present, install instructions in table 0. int vlanId = 0; @@ -89,7 +88,7 @@ public class FlowBasedServicesConfigBindHelper { if (matches != null) { FlowBasedServicesUtils.installInterfaceIngressFlow(dpId, iface.getName(), vlanId, boundServiceNew, - dataBroker, t, matches, lportTag.intValue(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); + dataBroker, t, matches, ifState.getIfIndex(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); } if (t != null) { @@ -118,11 +117,11 @@ public class FlowBasedServicesConfigBindHelper { if (!isCurrentServiceHighestPriority) { FlowBasedServicesUtils.installLPortDispatcherFlow(dpId, boundServiceNew, iface, dataBroker, t, - lportTag.intValue()); + ifState.getIfIndex()); } else { BoundServices serviceToReplace = tmpServicesMap.get(highestPriority); FlowBasedServicesUtils.installLPortDispatcherFlow(dpId, serviceToReplace, iface, dataBroker, t, - lportTag.intValue()); + ifState.getIfIndex()); int vlanId = 0; List matches = null; if (iface.getType().isAssignableFrom(L2vlan.class)) { @@ -135,7 +134,7 @@ public class FlowBasedServicesConfigBindHelper { if (matches != null) { FlowBasedServicesUtils.removeIngressFlow(iface, serviceToReplace, dpId, dataBroker, t); FlowBasedServicesUtils.installInterfaceIngressFlow(dpId, iface.getName(), vlanId, boundServiceNew, dataBroker, t, - matches, lportTag.intValue(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); + matches, ifState.getIfIndex(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); } } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigUnbindHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigUnbindHelper.java index 45222b5a..bfeed508 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigUnbindHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/confighelpers/FlowBasedServicesConfigUnbindHelper.java @@ -64,7 +64,7 @@ public class FlowBasedServicesConfigUnbindHelper { NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(iface, dataBroker); long portNo = Long.parseLong(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId)); BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); - Long lportTag = FlowBasedServicesUtils.getLPortTag(iface, dataBroker); + int vlanId = 0; if (iface.getType().isAssignableFrom(L2vlan.class)) { IfL2vlan l2vlan = iface.getAugmentation(IfL2vlan.class); @@ -109,7 +109,7 @@ public class FlowBasedServicesConfigUnbindHelper { BoundServices toBeMoved = tmpServicesMap.get(highestPriority); FlowBasedServicesUtils.removeIngressFlow(iface, boundServiceOld, dpId, dataBroker, t); FlowBasedServicesUtils.installInterfaceIngressFlow(dpId, iface.getName(), vlanId, toBeMoved, dataBroker, t, - matches, lportTag.intValue(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); + matches, ifState.getIfIndex(), IfmConstants.VLAN_INTERFACE_INGRESS_TABLE); FlowBasedServicesUtils.removeLPortDispatcherFlow(dpId, iface, toBeMoved, dataBroker, t); if (t != null) { diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/statehelpers/FlowBasedServicesStateUnbindHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/statehelpers/FlowBasedServicesStateUnbindHelper.java index 23705809..362a3bdf 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/statehelpers/FlowBasedServicesStateUnbindHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/statehelpers/FlowBasedServicesStateUnbindHelper.java @@ -57,9 +57,10 @@ public class FlowBasedServicesStateUnbindHelper { InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker); NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(iface, dataBroker); + if(nodeConnectorId == null){ + return futures; + } BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)); - Long lportTag = FlowBasedServicesUtils.getLPortTag(iface, dataBroker); - FlowBasedServicesUtils.removeIngressFlow(iface, highestPriorityBoundService, dpId, dataBroker, t); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java index 539fa78c..221bff99 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java @@ -63,8 +63,11 @@ public class FlowBasedServicesUtils { public static NodeConnectorId getNodeConnectorIdFromInterface(Interface iface, DataBroker dataBroker) { org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(iface.getName(), dataBroker); - List ofportIds = ifState.getLowerLayerIf(); - return new NodeConnectorId(ofportIds.get(0)); + if(ifState != null) { + List ofportIds = ifState.getLowerLayerIf(); + return new NodeConnectorId(ofportIds.get(0)); + } + return null; } public static List getMatchInfoForVlanPortAtIngressTable(BigInteger dpId, long portNo, long vlanId) { @@ -155,10 +158,10 @@ public class FlowBasedServicesUtils { Flow ingressFlow = MDSALUtil.buildFlowNew(tableId, flowRef, stypeOpenflow.getFlowPriority(), serviceRef, 0, 0, stypeOpenflow.getFlowCookie(), matches, instructionSet); - installFlow(dpId, ingressFlow, dataBroker, t); + installFlow(dpId, ingressFlow, t); } - private static void installFlow(BigInteger dpId, Flow flow, DataBroker dataBroker, WriteTransaction t) { + public static void installFlow(BigInteger dpId, Flow flow, WriteTransaction t) { FlowKey flowKey = new FlowKey(new FlowId(flow.getId())); Node nodeDpn = buildInventoryDpnNode(dpId); InstanceIdentifier flowInstanceId = InstanceIdentifier.builder(Nodes.class) @@ -168,6 +171,17 @@ public class FlowBasedServicesUtils { t.put(LogicalDatastoreType.CONFIGURATION, flowInstanceId, flow, true); } + public static void removeFlow(String flowRef, BigInteger dpId, WriteTransaction t) { + LOG.debug("Removing Ingress Flows"); + FlowKey flowKey = new FlowKey(new FlowId(flowRef)); + Node nodeDpn = buildInventoryDpnNode(dpId); + InstanceIdentifier flowInstanceId = InstanceIdentifier.builder(Nodes.class) + .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class) + .child(Table.class, new TableKey(IfmConstants.VLAN_INTERFACE_INGRESS_TABLE)).child(Flow.class, flowKey).build(); + + t.delete(LogicalDatastoreType.CONFIGURATION, flowInstanceId); + } + private static Node buildInventoryDpnNode(BigInteger dpnId) { NodeId nodeId = new NodeId("openflow:" + dpnId); Node nodeDpn = new NodeBuilder().setId(nodeId).setKey(new NodeKey(nodeId)).build(); @@ -209,7 +223,7 @@ public class FlowBasedServicesUtils { String flowRef = getFlowRef(dpId, iface.getName(), boundService); Flow ingressFlow = MDSALUtil.buildFlowNew(stypeOpenFlow.getDispatcherTableId(), flowRef, boundService.getServicePriority(), serviceRef, 0, 0, stypeOpenFlow.getFlowCookie(), matches, instructions); - installFlow(dpId, ingressFlow, dataBroker, t); + installFlow(dpId, ingressFlow, t); } public static void removeIngressFlow(Interface iface, BoundServices serviceOld, BigInteger dpId, diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java index ad68fc05..6bff195a 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java @@ -26,6 +26,8 @@ import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateAddHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; @@ -36,7 +38,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.IfIndexesInterfaceMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -58,10 +59,9 @@ public class StateInterfaceTest { NodeConnectorId nodeConnectorId = null; NodeConnector nodeConnector = null; FlowCapableNodeConnector fcNodeConnectorNew = null; - Interface interfaceEnabled = null; - Interface interfaceDisabled = null; + Interface vlanInterfaceEnabled = null; + Interface vlanInterfaceDisabled = null; IfIndexInterface IfindexInterface = null; - InstanceIdentifier bridgeEntryIid = null; InstanceIdentifier interfaceInstanceIdentifier = null; InstanceIdentifier fcNodeConnectorId = null; InstanceIdentifier ifIndexId =null; @@ -70,6 +70,7 @@ public class StateInterfaceTest { @Mock DataBroker dataBroker; @Mock IdManagerService idManager; + @Mock IMdsalApiManager mdsalManager; @Mock ListenerRegistration dataChangeListenerRegistration; @Mock ReadOnlyTransaction mockReadTx; @Mock WriteTransaction mockWriteTx; @@ -97,10 +98,8 @@ public class StateInterfaceTest { ifIndexId = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(100)).build(); interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(InterfaceManagerTestUtil.interfaceName)); interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.interfaceName); - interfaceEnabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.interfaceName, "Test Interface1", true, TunnelTypeGre.class - , "192.168.56.101", "192.168.56.102"); - interfaceDisabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.interfaceName, "Test Interface1", false, TunnelTypeGre.class - , "192.168.56.101", "192.168.56.102"); + vlanInterfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", true, L2vlan.class, BigInteger.valueOf(1)); + vlanInterfaceDisabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", false, L2vlan.class, BigInteger.valueOf(1)); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); List lowerLayerIfList = new ArrayList<>(); lowerLayerIfList.add(nodeConnectorId.getValue()); @@ -116,7 +115,7 @@ public class StateInterfaceTest { @Test public void testAddStateInterface() { - Optional expectedInterface = Optional.of(interfaceEnabled); + Optional expectedInterface = Optional.of(vlanInterfaceEnabled); AllocateIdOutput expectedId = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("100")).build(); Future> idOutputOptional = RpcResultBuilder.success(expectedId).buildFuture(); @@ -128,7 +127,7 @@ public class StateInterfaceTest { .setIdKey(InterfaceManagerTestUtil.interfaceName).build(); doReturn(idOutputOptional).when(idManager).allocateId(getIdInput); - addHelper.addState(dataBroker, idManager, nodeConnectorId, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); + addHelper.addState(dataBroker, idManager, mdsalManager, nodeConnectorId, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); //Add some verifications verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, @@ -152,7 +151,7 @@ public class StateInterfaceTest { doReturn(Futures.immediateFuture(RpcResultBuilder.success().build())).when(idManager).releaseId(getIdInput); - removeHelper.removeState(idManager, fcNodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); + removeHelper.removeState(idManager, mdsalManager, fcNodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL, ifIndexId); diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java index a86ad651..defa0f59 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java @@ -11,6 +11,7 @@ import java.math.BigInteger; import java.util.List; import com.google.common.util.concurrent.CheckedFuture; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.vpnservice.mdsalutil.ActionInfo; import org.opendaylight.vpnservice.mdsalutil.FlowEntity; @@ -23,8 +24,12 @@ public interface IMdsalApiManager { public CheckedFuture installFlow(BigInteger dpId, Flow flowEntity); + public CheckedFuture removeFlow(BigInteger dpId, Flow flowEntity); + public CheckedFuture removeFlow(BigInteger dpId, FlowEntity flowEntity); + public CheckedFuture installFlow(BigInteger dpId, FlowEntity flowEntity); + public void removeFlow(FlowEntity flowEntity); public void installGroup(GroupEntity groupEntity); diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java index 05accb36..defe0226 100644 --- a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java +++ b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java @@ -134,7 +134,6 @@ public class MDSALManager implements AutoCloseable { InstanceIdentifier flowInstanceId = InstanceIdentifier.builder(Nodes.class) .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class) .child(Table.class, new TableKey(flow.getTableId())).child(Flow.class,flowKey).build(); - WriteTransaction modification = m_dataBroker.newWriteOnlyTransaction(); modification.put(LogicalDatastoreType.CONFIGURATION, flowInstanceId, flow, true); return modification.submit(); @@ -222,14 +221,14 @@ public class MDSALManager implements AutoCloseable { } } - public CheckedFuture removeFlowNew(FlowEntity flowEntity) { + public CheckedFuture removeFlowNew(BigInteger dpnId, Flow flowEntity) { s_logger.debug("Remove flow {}",flowEntity); - Node nodeDpn = buildDpnNode(flowEntity.getDpnId()); - FlowKey flowKey = new FlowKey(new FlowId(flowEntity.getFlowId())); + Node nodeDpn = buildDpnNode(dpnId); + FlowKey flowKey = new FlowKey(new FlowId(flowEntity.getId())); InstanceIdentifier flowInstanceId = InstanceIdentifier.builder(Nodes.class) .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class) .child(Table.class, new TableKey(flowEntity.getTableId())).child(Flow.class, flowKey).build(); - WriteTransaction modification = m_dataBroker.newWriteOnlyTransaction(); + WriteTransaction modification = m_dataBroker.newWriteOnlyTransaction(); modification.delete(LogicalDatastoreType.CONFIGURATION,flowInstanceId ); return modification.submit(); } diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java index eca7a5cd..b75bd4c4 100644 --- a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java +++ b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java @@ -13,6 +13,7 @@ import java.util.List; import com.google.common.util.concurrent.CheckedFuture; 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.TransactionCommitFailedException; import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; @@ -64,9 +65,19 @@ public class MDSALUtilProvider implements BindingAwareConsumer, IMdsalApiManager return mdSalMgr.installFlow(dpId, flowEntity); } + @Override + public CheckedFuture installFlow(BigInteger dpId, FlowEntity flowEntity) { + return mdSalMgr.installFlow(dpId, flowEntity.getFlowBuilder().build()); + } + + @Override + public CheckedFuture removeFlow(BigInteger dpId, Flow flowEntity) { + return mdSalMgr.removeFlowNew(dpId, flowEntity); + } + @Override public CheckedFuture removeFlow(BigInteger dpId, FlowEntity flowEntity) { - return mdSalMgr.removeFlowNew(flowEntity); + return mdSalMgr.removeFlowNew(dpId, flowEntity.getFlowBuilder().build()); } @Override diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index 0fc976e7..3e59ac85 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -554,7 +554,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener matches = new ArrayList(); @@ -574,7 +574,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener { -- 2.36.6