Merge "Adding the Add/Remove ExternalEndpoint commands."
authorSam Hague <shague@redhat.com>
Wed, 5 Oct 2016 12:22:24 +0000 (12:22 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 5 Oct 2016 12:22:24 +0000 (12:22 +0000)
18 files changed:
interfacemanager/interfacemanager-api/src/main/yang/odl-interface-meta.yang
interfacemanager/interfacemanager-api/src/main/yang/odl-interface-rpc.yang
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/IfmUtil.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/InterfaceManagerCommonUtils.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/listeners/InterfaceInventoryStateListener.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/rpcservice/InterfaceManagerRpcService.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/config/helpers/FlowBasedIngressServicesConfigBindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/config/helpers/FlowBasedIngressServicesConfigUnbindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/state/helpers/FlowBasedEgressServicesStateBindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/state/helpers/FlowBasedEgressServicesStateUnbindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/state/helpers/FlowBasedIngressServicesStateBindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/state/helpers/FlowBasedIngressServicesStateUnbindHelper.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java
interfacemanager/interfacemanager-impl/src/test/java/org/opendaylight/genius/interfacemanager/test/IfmUtilTest.java
interfacemanager/interfacemanager-impl/src/test/java/org/opendaylight/genius/interfacemanager/test/StateInterfaceTest.java

index 60550870194f2632884b21cdaa9ae9bbd5dd22b4..7b5f24d5b1e789600fdee1f28c9e19da7f71314e 100644 (file)
@@ -116,5 +116,23 @@ module odl-interface-meta {
                   type string;
               }
           }
-      }
+   }
+
+   container dpn-to-interface-list {
+        config false;
+        description "Contains the list of interfaces on the given dpn";
+
+        list dpn-to-interface {
+            key dpid;
+            leaf dpid {
+                type uint64;
+            }
+            list interface-name-entry {
+                key interface-name;
+                leaf interface-name {
+                    type string;
+                }
+            }
+        }
+   }
 }
\ No newline at end of file
index 98796776850c7cd5dca44540f57f4edb339b0d52..95d79347a782f50693d46e771f20134aa0164a0e 100644 (file)
@@ -204,4 +204,18 @@ module odl-interface-rpc {
              }
         }
     }
+
+    rpc get-dpn-interface-list {
+        description "used to retrieve interface list for a given Dpn";
+        input {
+            leaf dpid {
+                 type uint64;
+            }
+        }
+        output {
+            leaf-list interfaces-list {
+               type string;
+            }
+        }
+    }
 }
\ No newline at end of file
index 1907e6e9aa4a409b43c6017a740da9c3c78e6e4b..5168aeedc1bdf3182968e76db68df570c49064ca 100755 (executable)
@@ -93,18 +93,18 @@ public class IfmUtil {
                     .put(TunnelTypeVxlanGpe.class, InterfaceInfo.InterfaceType.VXLAN_TRUNK_INTERFACE)
                     .build();
 
-    public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
+    public static BigInteger getDpnFromNodeConnectorId(NodeConnectorId portId) {
         /*
          * NodeConnectorId is of form 'openflow:dpnid:portnum'
          */
         String[] split = portId.getValue().split(IfmConstants.OF_URI_SEPARATOR);
-        return split[1];
+        return new BigInteger(split[1]);
     }
 
     public static BigInteger getDpnFromInterface(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState){
         NodeConnectorId ncId = getNodeConnectorIdFromInterface(ifState);
         if(ncId != null){
-            return new BigInteger(getDpnFromNodeConnectorId(ncId));
+            return getDpnFromNodeConnectorId(ncId);
         }
         return null;
     }
index 113bb79d5581300c0a0bd2695d82cb7b3346697e..07ba6089f09e2e46a2aa05d15382323cfbcd36a3 100644 (file)
@@ -311,7 +311,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
         BigInteger dpId = org.opendaylight.genius.interfacemanager.globals.IfmConstants.INVALID_DPID;
         Integer portNo = org.opendaylight.genius.interfacemanager.globals.IfmConstants.INVALID_PORT_NO;
         if (ncId != null) {
-            dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId));
+            dpId = IfmUtil.getDpnFromNodeConnectorId(ncId);
             portNo = Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId));
         }
         if (interfaceType == InterfaceInfo.InterfaceType.VLAN_INTERFACE) {
@@ -367,7 +367,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
         Integer lportTag = ifState.getIfIndex();
         NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
         if (ncId != null) {
-            interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId)));
+            interfaceInfo.setDpId(IfmUtil.getDpnFromNodeConnectorId(ncId));
             interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId)));
         }
         InterfaceInfo.InterfaceOpState opState ;
@@ -410,7 +410,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
         NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
         if (ncId != null) {
             interfaceInfo.setPortName(IfmUtil.getPortName(dataBroker, ncId));
-            interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId)));
+            interfaceInfo.setDpId(IfmUtil.getDpnFromNodeConnectorId(ncId));
             interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId)));
         }
         InterfaceInfo.InterfaceOpState opState ;
index b1ebc2b16103534618fd6c5d53b2ab21854a00ab..20008bf73447304c9989feae86a50a9ae2b35276 100644 (file)
@@ -42,11 +42,18 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 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.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.DpnToInterfaceList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeMplsOverGre;
@@ -328,13 +335,16 @@ public class InterfaceManagerCommonUtils {
         interfaceOperShardTransaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true);
 
         // install ingress flow
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
         if (interfaceInfo != null && interfaceInfo.isEnabled() && ifState
                 .getOperStatus() == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) {
             FlowBasedServicesUtils.installLportIngressFlow(dpId, portNo, interfaceInfo, futures, dataBroker, ifIndex);
             FlowBasedServicesUtils.bindDefaultEgressDispatcherService(dataBroker, futures, interfaceInfo, Long.toString(portNo), interfaceName, ifIndex);
         }
+
+        // Update the DpnToInterfaceList OpDS
+        createOrUpdateDpnToInterface(dpId, interfaceName,interfaceOperShardTransaction);
     }
 
     public static boolean checkIfBfdStateIsDown(String interfaceName){
@@ -344,7 +354,7 @@ public class InterfaceManagerCommonUtils {
     }
 
     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface addStateEntry(
-            Interface interfaceInfo, String interfaceName, WriteTransaction transaction, IdManagerService idManager,
+            DataBroker dataBroker, Interface interfaceInfo, String interfaceName, WriteTransaction transaction, IdManagerService idManager,
             PhysAddress physAddress,
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus,
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus adminStatus,
@@ -374,6 +384,10 @@ public class InterfaceManagerCommonUtils {
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = ifaceBuilder
                 .build();
         transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifState, true);
+
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
+        // Update the DpnToInterfaceList OpDS
+        createOrUpdateDpnToInterface(dpId, interfaceName, transaction);
         return ifState;
     }
 
@@ -493,4 +507,39 @@ public class InterfaceManagerCommonUtils {
         return matcher.matches();
     }
 
+
+    public static void createOrUpdateDpnToInterface(BigInteger dpId, String infName, WriteTransaction transaction) {
+        DpnToInterfaceKey dpnToInterfaceKey = new DpnToInterfaceKey(dpId);
+        InterfaceNameEntryKey interfaceNameEntryKey = new InterfaceNameEntryKey(infName);
+        InstanceIdentifier<InterfaceNameEntry> intfid = InstanceIdentifier.builder(DpnToInterfaceList.class)
+                                                        .child(DpnToInterface.class, dpnToInterfaceKey)
+                                                        .child(InterfaceNameEntry.class, interfaceNameEntryKey)
+                                                        .build();
+        InterfaceNameEntryBuilder entryBuilder = new InterfaceNameEntryBuilder().setKey(interfaceNameEntryKey).setInterfaceName(infName);
+        transaction.put(LogicalDatastoreType.OPERATIONAL, intfid, entryBuilder.build(), true);
+    }
+
+    public static void deleteDpnToInterface(DataBroker dataBroker, BigInteger dpId, String infName, WriteTransaction transaction) {
+        DpnToInterfaceKey dpnToInterfaceKey = new DpnToInterfaceKey(dpId);
+        InstanceIdentifier<DpnToInterface> dpnToInterfaceId = InstanceIdentifier.builder(DpnToInterfaceList.class)
+                .child(DpnToInterface.class, dpnToInterfaceKey).build();
+        Optional<DpnToInterface> dpnToInterfaceOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, dpnToInterfaceId, dataBroker);
+        if (!dpnToInterfaceOptional.isPresent()) {
+            LOG.debug("DPN {} is already removed from the Operational DS", dpId);
+            return;
+        }
+
+        List<InterfaceNameEntry> interfaceNameEntries = dpnToInterfaceOptional.get().getInterfaceNameEntry();
+        InterfaceNameEntryKey interfaceNameEntryKey = new InterfaceNameEntryKey(infName);
+        InstanceIdentifier<InterfaceNameEntry> intfid = InstanceIdentifier.builder(DpnToInterfaceList.class)
+                .child(DpnToInterface.class, dpnToInterfaceKey)
+                .child(InterfaceNameEntry.class, interfaceNameEntryKey)
+                .build();
+        transaction.delete(LogicalDatastoreType.OPERATIONAL, intfid);
+
+        if (interfaceNameEntries.size() <=1) {
+            transaction.delete(LogicalDatastoreType.OPERATIONAL, dpnToInterfaceId);
+        }
+    }
+
 }
index 8ba42de682384ef56a1983c90ad5f3846641d234..ed3b0de6335cadc3c100dba34d523e8c9c70f032 100644 (file)
@@ -155,7 +155,7 @@ public class InterfaceInventoryStateListener extends AsyncClusteredDataTreeChang
 
     private String getDpnPrefixedPortName(NodeConnectorId nodeConnectorId, String portName) {
         portName = new StringBuilder(
-                IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId))
+                (IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)).toString())
                         .append(IfmConstants.OF_URI_SEPARATOR)
                         .append(portName).toString();
         return portName;
index 9e0863abfc4085cbb2edc0ca47a6dc3432dbbefd..a2e34f742538edf2edddd1aa4cbfe58654e7419d 100644 (file)
@@ -65,7 +65,7 @@ public class OvsInterfaceStateAddHelper {
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface iface =
                 InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker);
 
-        Interface ifState = InterfaceManagerCommonUtils.addStateEntry(iface, interfaceName, defaultOperationalShardTransaction, idManager,
+        Interface ifState = InterfaceManagerCommonUtils.addStateEntry(dataBroker, iface, interfaceName, defaultOperationalShardTransaction, idManager,
                 physAddress, operStatus, adminStatus, nodeConnectorId);
 
         // If this interface is a tunnel interface, create the tunnel ingress flow,and start tunnel monitoring
@@ -78,7 +78,7 @@ public class OvsInterfaceStateAddHelper {
         // install ingress flow if this is an l2vlan interface
         if(InterfaceManagerCommonUtils.isVlanInterface(iface) && iface.isEnabled() &&
                 ifState.getOperStatus() == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) {
-            BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+            BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
             long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
             List<MatchInfo> matches = FlowBasedServicesUtils.getMatchInfoForVlanPortAtIngressTable(dpId, portNo, iface);
             FlowBasedServicesUtils.installLportIngressFlow(dpId, portNo, iface, futures, dataBroker, ifState.getIfIndex());
@@ -93,7 +93,7 @@ public class OvsInterfaceStateAddHelper {
                                                       IMdsalApiManager mdsalApiManager,AlivenessMonitorService alivenessMonitorService,
                                                       NodeConnectorId nodeConnectorId, WriteTransaction transaction, Integer ifindex,
                                                       IfTunnel ifTunnel, String interfaceName){
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
         InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, ifTunnel, dpId, portNo, interfaceName,
                 ifindex, NwConstants.ADD_FLOW);
index 6cad5e5f5ec5b7973951219ddf92fcaf4e57fa7f..feee7e5b0e6c17f94515458419cc6c3046aa75b7 100644 (file)
@@ -46,7 +46,7 @@ public class OvsInterfaceStateRemoveHelper {
         NodeConnectorId nodeConnectorId = nodeConnectorIdOld != null && !nodeConnectorIdNew.equals(nodeConnectorIdOld) ?
                 nodeConnectorIdOld : nodeConnectorIdNew;
         // delete the port entry from interface operational DS
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
 
         //VM Migration: Update the interface state to unknown only if remove event received for same switch
         if(!isNodePresent && nodeConnectorIdNew.equals(nodeConnectorIdOld)){
@@ -75,6 +75,9 @@ public class OvsInterfaceStateRemoveHelper {
                 FlowBasedServicesUtils.removeIngressFlow(interfaceName, dpId, dataBroker, futures);
                 FlowBasedServicesUtils.unbindDefaultEgressDispatcherService(dataBroker, interfaceName);
             }
+
+            // Delete the Vpn Interface from DpnToInterface Op DS.
+            InterfaceManagerCommonUtils.deleteDpnToInterface(dataBroker, dpId, interfaceName, defaultOperationalShardTransaction);
         }
         futures.add(defaultOperationalShardTransaction.submit());
         return futures;
index 69887087f8aba50d06b615a55424dd3fd3d23b13..65f352f271f783d1670490e411370d8357232960 100644 (file)
@@ -16,8 +16,11 @@ import com.google.common.util.concurrent.SettableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.Future;
+import java.util.stream.Collectors;
+
 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;
@@ -39,12 +42,17 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
 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.genius.interfacemanager.meta.rev160406.DpnToInterfaceList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.IfIndexesInterfaceMap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
@@ -79,6 +87,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpc
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetTunnelTypeOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.RemoveTerminatingServiceActionsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpnInterfaceListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpnInterfaceListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpnInterfaceListOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
@@ -119,7 +130,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService {
                 if (ifState != null) {
                     String lowerLayerIf = ifState.getLowerLayerIf().get(0);
                     NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf);
-                    dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+                    dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
                 } else {
                      rpcResultBuilder = getRpcErrorResultForGetDpnIdRpc(interfaceName, "missing Interface-state");
                      return Futures.immediateFuture(rpcResultBuilder.build());
@@ -349,7 +360,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService {
             if (ifState != null) {
                 String lowerLayerIf = ifState.getLowerLayerIf().get(0);
                 NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf);
-                dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+                dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
                 portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
                 // FIXME Assuming portName and interfaceName are same
                 GetPortFromInterfaceOutputBuilder output = new GetPortFromInterfaceOutputBuilder().setDpid(dpId).
@@ -412,6 +423,30 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService {
         return Futures.immediateFuture(rpcResultBuilder.build());
     }
 
+    @Override
+    public Future<RpcResult<GetDpnInterfaceListOutput>> getDpnInterfaceList(GetDpnInterfaceListInput input) {
+        BigInteger dpnid = input.getDpid();
+        RpcResultBuilder<GetDpnInterfaceListOutput> rpcResultBuilder = null;
+        try {
+            InstanceIdentifier<DpnToInterface> id =
+                    InstanceIdentifier.builder(DpnToInterfaceList.class).child(DpnToInterface.class , new DpnToInterfaceKey(dpnid)).build();
+            Optional<DpnToInterface> entry = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, id, dataBroker);
+            if (entry.isPresent()) {
+                List<InterfaceNameEntry> interfaceNameEntries = entry.get().getInterfaceNameEntry();
+                if (interfaceNameEntries != null && !interfaceNameEntries.isEmpty()) {
+                    List<String> interfaceList = interfaceNameEntries.stream().map((a) -> a.getInterfaceName()).collect(Collectors.toList());
+                    GetDpnInterfaceListOutputBuilder output = new GetDpnInterfaceListOutputBuilder().setInterfacesList(interfaceList);
+                    rpcResultBuilder = RpcResultBuilder.success();
+                    rpcResultBuilder.withResult(output.build());
+                }
+            }
+        } catch (Exception e) {
+            LOG.error("Retrieval of interfaceNameList for the dpnId {} failed due to {}", dpnid, e);
+            rpcResultBuilder = RpcResultBuilder.failed();
+        }
+        return Futures.immediateFuture(rpcResultBuilder.build());
+    }
+
     protected static List<Instruction> buildInstructions(List<InstructionInfo> listInstructionInfo) {
         if (listInstructionInfo != null) {
             List<Instruction> instructions = new ArrayList<>();
index 599b3605d04ebc2dc12065af1191445f24374dc9..96cd23debd59353789686cabe45a7bddf2717b14 100644 (file)
@@ -112,7 +112,7 @@ public class FlowBasedIngressServicesConfigBindHelper implements FlowBasedServic
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(ifState);
         long portNo = Long.parseLong(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         Interface iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(ifState.getName(), dataBroker);
         if (allServices.size() == 1) {
index a2822fc712a1bb543469ac277e5e3cbfd792d24d..f6efe45a0243c243b8fc0a3ffad3202960f8d32d 100644 (file)
@@ -158,7 +158,7 @@ public class FlowBasedIngressServicesConfigUnbindHelper implements FlowBasedServ
         WriteTransaction t = dataBroker.newWriteOnlyTransaction();
         NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(ifState);
         long portNo = Long.parseLong(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
 
         if (boundServices.isEmpty()) {
             // Remove entry from Ingress Table.
index 904cc2633bc3d54f27dadd47129bc9ba5a0b05e3..ed8b32db4a9011ae23087b21f84ac8e30069ff0e 100644 (file)
@@ -101,7 +101,7 @@ public class FlowBasedEgressServicesStateBindHelper implements FlowBasedServices
             Interface ifState, DataBroker dataBroker) {
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(ifState);
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         WriteTransaction t = dataBroker.newWriteOnlyTransaction();
         Collections.sort(allServices, new Comparator<BoundServices>() {
             @Override
index d2096485871207a19870c73b13b4d02fb875eb7e..ad7654f532d181c9fb74a69c125292b9346ef9c5 100644 (file)
@@ -106,7 +106,7 @@ public class FlowBasedEgressServicesStateUnbindHelper implements FlowBasedServic
         if(nodeConnectorId == null){
             return futures;
         }
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         Collections.sort(allServices, new Comparator<BoundServices>() {
             @Override
             public int compare(BoundServices serviceInfo1, BoundServices serviceInfo2) {
index 4f9d34ae8cc00848fa7c1ee01825e22266cb4716..46754734d27a0c65e85ab33a5f92fdd8dc995f66 100644 (file)
@@ -99,7 +99,7 @@ public class FlowBasedIngressServicesStateBindHelper implements FlowBasedService
                 InterfaceManagerCommonUtils.getInterfaceFromConfigDS(ifState.getName(), dataBroker);
         NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(ifState);
         long portNo = Long.parseLong(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         List<MatchInfo> matches = FlowBasedServicesUtils.getMatchInfoForTunnelPortAtIngressTable (dpId, portNo);
         BoundServices highestPriorityBoundService = FlowBasedServicesUtils.getHighestPriorityService(allServices);
         WriteTransaction t = dataBroker.newWriteOnlyTransaction();
@@ -123,7 +123,7 @@ public class FlowBasedIngressServicesStateBindHelper implements FlowBasedService
             Interface ifState, DataBroker dataBroker) {
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         NodeConnectorId nodeConnectorId = FlowBasedServicesUtils.getNodeConnectorIdFromInterface(ifState);
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         WriteTransaction t = dataBroker.newWriteOnlyTransaction();
         Collections.sort(allServices, new Comparator<BoundServices>() {
             @Override
index 378818ed0d93a7b3027cbe5521bf6eac82e7fad8..aa3fd83bc56ed95717539808084bd48a33ba7841 100644 (file)
@@ -106,7 +106,7 @@ public class FlowBasedIngressServicesStateUnbindHelper implements FlowBasedServi
         }
         BoundServices highestPriorityBoundService = FlowBasedServicesUtils.getHighestPriorityService(allServices);
 
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         FlowBasedServicesUtils.removeIngressFlow(iface.getName(), highestPriorityBoundService, dpId, t);
 
         for (BoundServices boundService : allServices) {
@@ -129,7 +129,7 @@ public class FlowBasedIngressServicesStateUnbindHelper implements FlowBasedServi
         if(nodeConnectorId == null){
             return futures;
         }
-        BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        BigInteger dpId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
         Collections.sort(allServices, new Comparator<BoundServices>() {
             @Override
             public int compare(BoundServices serviceInfo1, BoundServices serviceInfo2) {
index 320049d67c2fa139acec0d9f6d2d52349f89784b..4f836ab272ee76e33b3c5e4b0caf1f46ec413e73 100644 (file)
@@ -116,7 +116,7 @@ public class FlowBasedServicesUtils {
             List<String> ofportIds = ifState.getLowerLayerIf();
             nodeConnectorId = new NodeConnectorId(ofportIds.get(0));
         }
-        return new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
+        return IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
     }
 
     public static List<MatchInfo> getMatchInfoForVlanPortAtIngressTable(BigInteger dpId, long portNo, Interface iface) {
index d4fd4cca5482cd5e9249399d02b39e320e52e9ab..d2713c70a4453fd615ec8b77b5bfcc3b51a4b689 100644 (file)
@@ -34,7 +34,7 @@ public class IfmUtilTest {
         String NodeId = IfmUtil.buildDpnNodeId(BigInteger.valueOf(101)).getValue();
         assertEquals("openflow:101", NodeId);
         when(ncId.getValue()).thenReturn("openflow:101:11");
-        assertEquals("101",IfmUtil.getDpnFromNodeConnectorId(ncId));
+        assertEquals(new BigInteger("101"),IfmUtil.getDpnFromNodeConnectorId(ncId));
     }
 
 }
index e20695ef0e5d462eb9065a0285b25cc488236c82..7530f2abb242532b43e8ecc7360008cff893d5e3 100644 (file)
@@ -42,6 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.DpnToInterfaceList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.IfIndexesInterfaceMap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceKey;
@@ -50,6 +51,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.met
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.DpnToInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.dpn.to._interface.list.dpn.to._interface.InterfaceNameEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeGre;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -96,6 +102,7 @@ public class StateInterfaceTest {
     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateInterface;
     InterfaceParentEntry interfaceParentEntry;
     InterfaceParentEntry higherLayerInterfaceParentEntry;
+    DpnToInterface dpnToInterface;
 
     @Mock DataBroker dataBroker;
     @Mock
@@ -124,6 +131,8 @@ public class StateInterfaceTest {
     }
 
     private void setupMocks() {
+        List<InterfaceNameEntry> interfaceNameEntries = new ArrayList<>();
+        interfaceNameEntries.add(new InterfaceNameEntryBuilder().setInterfaceName(InterfaceManagerTestUtil.interfaceName).build());
         nodeConnectorId = InterfaceManagerTestUtil.buildNodeConnectorId(BigInteger.valueOf(1), 2);
         nodeConnector = InterfaceManagerTestUtil.buildFlowCapableNodeConnector(nodeConnectorId);
         fcNodeConnectorNew = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
@@ -161,6 +170,7 @@ public class StateInterfaceTest {
         InterfaceParentEntryBuilder higherLayerIfParentEntryBuilder = new InterfaceParentEntryBuilder();
         List<InterfaceChildEntry> ifaceChildEntryListForHigherParent= new ArrayList<>();
         higherLayerInterfaceParentEntry = higherLayerIfParentEntryBuilder.setInterfaceChildEntry(ifaceChildEntryListForHigherParent).build();
+        dpnToInterface = new DpnToInterfaceBuilder().setDpid(dpId).setInterfaceNameEntry(interfaceNameEntries).build();
 
         when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
         when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
@@ -235,6 +245,9 @@ public class StateInterfaceTest {
         Optional<InterfaceParentEntry> higherLayerParentOptional = Optional.of(higherLayerInterfaceParentEntry);
         InstanceIdentifier<Node> nodeInstanceIdentifier = InstanceIdentifier.builder(Nodes.class).child(Node.class, InterfaceManagerTestUtil.nodeKey).build();
         Optional<Node> nodeOptional = Optional.of(mockNode);
+        Optional<DpnToInterface> dpnToInterfaceOptional = Optional.of(dpnToInterface);
+        InstanceIdentifier<DpnToInterface> dpnToInterfaceInstanceIdentifier =
+                InstanceIdentifier.builder(DpnToInterfaceList.class).child(DpnToInterface.class, new DpnToInterfaceKey(BigInteger.ONE)).build();
 
         doReturn(Futures.immediateCheckedFuture(expectedIfindexInterface)).when(mockReadTx).read(
                 LogicalDatastoreType.OPERATIONAL, ifIndexId);
@@ -250,6 +263,8 @@ public class StateInterfaceTest {
                 LogicalDatastoreType.CONFIGURATION, higherLevelInterfaceParentEntryIdentifier);
         doReturn(Futures.immediateCheckedFuture(nodeOptional)).when(mockReadTx).read(
                 LogicalDatastoreType.OPERATIONAL, nodeInstanceIdentifier);
+        doReturn(Futures.immediateCheckedFuture(dpnToInterfaceOptional)).when(mockReadTx).read(
+                LogicalDatastoreType.OPERATIONAL, dpnToInterfaceInstanceIdentifier);
 
         ReleaseIdInput getIdInput = new ReleaseIdInputBuilder()
                 .setPoolName(IfmConstants.IFM_IDPOOL_NAME)