Fix for missing flows in table 19 35/53435/6
authorKonsta Pozdeev <konsta.pozdeev@hpe.com>
Thu, 16 Mar 2017 16:41:00 +0000 (18:41 +0200)
committerKonsta Pozdeev <konsta.pozdeev@hpe.com>
Mon, 20 Mar 2017 11:12:04 +0000 (13:12 +0200)
Change-Id: I8d489b3d080e4234c252ef5f48c975387e8f311f
Signed-off-by: Konsta Pozdeev <konsta.pozdeev@hpe.com>
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java
netvirt/src/main/resources/org/opendaylight/blueprint/netvirt-driver.xml

index 78714d52c7fe9d3da708c0059a380bb6b742835b..054515ae540b914538fc7ef4b176d2567a0b3a06 100644 (file)
@@ -12,11 +12,13 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
@@ -64,11 +66,16 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
     private OdlInterfaceRpcService odlInterfaceRpcService;
     private final SouthboundUtils southBoundUtils;
     private final org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils mdsalUtils;
+    private final NotificationPublishService notificationPublishService;
+
     private static final String LOCAL_IP = "local_ip";
 
+    // TODO: make it as service
+    private ConcurrentHashMap<String, BigInteger> portToDpn;
+
     public IpvcListener(final DataBroker dataBroker, final IUniPortManager uniPortManager,
             final ISubnetManager subnetManager, final UniQosManager uniQosManager,
-            final OdlInterfaceRpcService odlInterfaceRpcService) {
+            final OdlInterfaceRpcService odlInterfaceRpcService, final NotificationPublishService notPublishService) {
         super(dataBroker);
         this.uniPortManager = uniPortManager;
         this.subnetManager = subnetManager;
@@ -77,6 +84,8 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
         this.odlInterfaceRpcService = odlInterfaceRpcService;
         this.mdsalUtils = new org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils(dataBroker);
         this.southBoundUtils = new SouthboundUtils(mdsalUtils);
+        this.portToDpn = new ConcurrentHashMap<>();
+        this.notificationPublishService = notPublishService;
 
         registerListener();
     }
@@ -310,6 +319,11 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
             subnetManager.assignIpUniNetworks(uni.getUniId(), ipUni.getIpUniId(), ipvcId);
         }
         updateQos(uniToCreate);
+
+        for (BigInteger dpId : portToDpn.values()) {
+            NetvirtVpnUtils.refreshDpnGw(notificationPublishService, vpnName, dpId);
+        }
+
     }
 
     private void updateIpvc(DataTreeModification<Ipvc> modifiedDataObject) {
@@ -370,16 +384,15 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
         String interfaceName = null;
         String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId, ipUniId);
 
-        String srcIpAddressStr = NetvirtVpnUtils
-                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
-        IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray());
-        NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, new Uuid(elanName), ipAddress);
-
         synchronized (vpnName.intern()) {
             Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : null;
 
-            interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx,
-                    ipUni.getSegmentationId());
+            interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, tx, ipUni.getSegmentationId());
+
+            String portMacAddress = uni.getMacAddress().getValue();
+            NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, vpnName, new Uuid(elanName), ipUni.getIpAddress(),
+                    interfaceName, portMacAddress);
+
             uniQosManager.mapUniPortBandwidthLimits(uniId, interfaceName, uniInService.getIngressBwProfile());
             createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx);
             NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(),
@@ -391,10 +404,9 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
     }
 
     private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
-            Long vlan, IpAddress ipAddress, WriteTransaction tx, Long segmentationId) {
+            Long vlan, WriteTransaction tx, Long segmentationId) {
         Log.info("Adding elan instance: " + elanName);
         NetvirtUtils.updateElanInstance(elanName, tx, segmentationId);
-        NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, new Uuid(elanName), ipAddress);
 
         Log.info("Added trunk interface for uni {} vlan: {}", uniId, vlan);
         if (vlan != null) {
@@ -417,7 +429,7 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
             IpUni ipUni, String interfaceName, String elanName, WriteTransaction tx) {
 
         Log.info("Adding vpn interface: " + interfaceName);
-        BigInteger dpId = NetvirtUtils.getDpnForInterface(odlInterfaceRpcService, interfaceName);
+        BigInteger dpId = getPortDpId(interfaceName);
         IpAddress nextHop = getNodeIP(dpId);
         NetvirtVpnUtils.createUpdateVpnInterface(vpnName, interfaceName, nextHop, ipUni.getIpAddress(),
                 uni.getMacAddress().getValue(), true, null, elanName, tx);
@@ -448,6 +460,7 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
         }
 
         synchronized (vpnName.intern()) {
+            NetvirtVpnUtils.unregisterDirectSubnetForVpn(dataBroker, vpnName, new Uuid(vpnElans.getElanId()), vpnElans.getElanPort());
             uniQosManager.unMapUniPortBandwidthLimits(uniId, vpnElans.getElanPort());
             NetvirtVpnUtils.removeLearnedVpnVipToPort(dataBroker, vpnName, vpnElans.getElanPort());
             removeVpnInterface(vpnName, vpnElans, uniId, ipUni);
@@ -514,7 +527,6 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
         String interfaceName = vpnElans.getElanPort();
 
         Log.info("Removing elan instance {} and interface {}: ", elanName, interfaceName);
-        NetvirtVpnUtils.unregisterDirectSubnetForVpn(dataBroker, new Uuid(elanName));
         NetvirtUtils.deleteElanInterface(interfaceName, tx);
         NetvirtUtils.deleteElanInstance(elanName, tx);
         MdsalUtils.commitTransaction(tx);
@@ -583,4 +595,15 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements
         return node;
 
     }
+
+    private BigInteger getPortDpId(String logicalPortId) {
+        BigInteger dpId = BigInteger.ZERO;
+        if (portToDpn.containsKey(logicalPortId)) {
+            dpId = portToDpn.get(logicalPortId);
+        } else {
+            dpId = NetvirtUtils.getDpnForInterface(odlInterfaceRpcService, logicalPortId);
+            portToDpn.put(logicalPortId, dpId);
+        }
+        return dpId;
+    }
 }
index eac08a6b04bbc02269f50a574ce7ade0d878090e..d85461cdf90995b6555a9b4ca84f29523cac6bd4 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.unimgr.mef.netvirt;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -44,11 +45,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.in
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEventBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AdjacenciesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.add.dpn.event.AddEventDataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyKey;
@@ -142,8 +145,8 @@ public class NetvirtVpnUtils {
     }
 
     public static void createUpdateVpnInterface(String vpnName, String interfaceName, IpAddress primaryNextHop,
-            IpPrefix ifPrefix,
-            String macAddress, boolean primary, IpPrefix gwIpAddress, String directSubnetId, WriteTransaction tx) {
+            IpPrefix ifPrefix, String macAddress, boolean primary, IpPrefix gwIpAddress, String directSubnetId,
+            WriteTransaction tx) {
         synchronized (interfaceName.intern()) {
             String ipAddress = null;
             String nextHopIp = null;
@@ -345,28 +348,55 @@ public class NetvirtVpnUtils {
         tx.delete(LogicalDatastoreType.CONFIGURATION, id);
     }
 
-    public static void registerDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName, IpAddress gwIpAddress) {
+    public static void registerDirectSubnetForVpn(DataBroker dataBroker, String vpnName, Uuid subnetName, IpPrefix interfacePrefix, String interfaceName, String portMacAddress) {
         final SubnetKey subnetkey = new SubnetKey(subnetName);
 
         final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
                 .child(Subnets.class).child(Subnet.class, subnetkey);
 
+        String interfaceIp = NetvirtVpnUtils.getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(interfacePrefix));
+        IpAddress ipAddress = new IpAddress(interfaceIp.toCharArray());
+
+        logger.info("Adding subnet {}", ipAddress);
         SubnetBuilder subnetBuilder = new SubnetBuilder();
         subnetBuilder.setIpVersion(IpVersionV4.class);
-        subnetBuilder.setGatewayIp(gwIpAddress);
+        subnetBuilder.setGatewayIp(ipAddress);
         subnetBuilder.setKey(subnetkey);
+        subnetBuilder.setNetworkId(subnetName);
         MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier, subnetBuilder.build());
+        
+        logger.info("Adding subnet {} {} to elan map", subnetName, subnetName);
+        createSubnetToNetworkMapping(dataBroker, subnetName, subnetName);
+
+        String subnetIp = getSubnetFromPrefix(interfacePrefix);
+        logger.info("Adding subnet {} {} to vpn {}", subnetName, subnetIp, vpnName);
+        updateSubnetNode(dataBroker, new Uuid(vpnName), subnetName, subnetIp, portMacAddress);
+
+        logger.info("Adding port {} to subnet {}", interfaceName, subnetName);
+        updateSubnetmapNodeWithPorts(dataBroker, subnetName, new Uuid(interfaceName), null, vpnName);
     }
 
-    public static void unregisterDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName) {
+    public static void unregisterDirectSubnetForVpn(DataBroker dataBroker,  String vpnName, Uuid subnetName,  String interfaceName) {
         final SubnetKey subnetkey = new SubnetKey(subnetName);
         final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
                 .child(Subnets.class).child(Subnet.class, subnetkey);
 
         MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
+        
+
+        logger.info("Removing port {} from subnet {}", interfaceName, subnetName);
+        updateSubnetmapNodeWithPorts(dataBroker, subnetName, null, new Uuid(interfaceName), vpnName);
+
+        logger.info("Removing subnet {} from vpn {}", subnetName, vpnName);
+        removeSubnetNode(dataBroker, subnetName);
+
+        logger.info("Removing subnet {} to elan map", subnetName);
+        removeSubnetToNetworkMapping(dataBroker, subnetName);
+
+        logger.info("Finished  remove  subnet {}", subnetName);
     }
 
-    public static void addDirectSubnetToVpn(DataBroker dataBroker,
+    public static void publishDirectSubnetToVpn(DataBroker dataBroker,
             final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
             IpPrefix subnetIpPrefix, String interfaceName, String intfMac, int waitForElan) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName);
@@ -380,15 +410,7 @@ public class NetvirtVpnUtils {
         }
 
         Uuid subnetId = new Uuid(subnetName);
-        logger.info("Adding subnet {} {} to elan map", subnetId, subnetId);
-        createSubnetToNetworkMapping(dataBroker, subnetId, subnetId);
-
         String subnetIp = getSubnetFromPrefix(ipPrefixToString(subnetIpPrefix));
-        logger.info("Adding subnet {} {} to vpn {}", subnetName, subnetIp, vpnName);
-        updateSubnetNode(dataBroker, new Uuid(vpnName), subnetId, subnetIp, intfMac);
-
-        logger.info("Adding port {} to subnet {}", interfaceName, subnetName);
-        updateSubnetmapNodeWithPorts(dataBroker, subnetId, new Uuid(interfaceName), null, vpnName);
 
         Optional<ElanInstance> elanInstance = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
                 elanIdentifierId);
@@ -397,9 +419,27 @@ public class NetvirtVpnUtils {
         logger.info("Publish subnet {}", subnetName);
         publishSubnetAddNotification(notificationPublishService, subnetId, subnetIp, vpnName, elanTag);
         logger.info("Finished Working on subnet {}", subnetName);
+      
+    }
+    
+    public static void refreshDpnGw(final NotificationPublishService notificationPublishService, String vpnName, BigInteger dpId) {
+        
+        AddDpnEventBuilder addDpnEventBuilder = new AddDpnEventBuilder();
+        AddEventDataBuilder eventData = new AddEventDataBuilder();
+        eventData.setVpnName(vpnName);
+        eventData.setDpnId(dpId);
+        
+        addDpnEventBuilder.setAddEventData(eventData.build());
+        try {
+            logger.info("Refrehein dpId {}", dpId);
+            notificationPublishService.putNotification(addDpnEventBuilder.build());
+        } catch (InterruptedException e) {
+            logger.error("Fail to publish notification {}", addDpnEventBuilder, e);
+            throw new RuntimeException(e.getMessage());
+        }
     }
 
-    public static void removeDirectSubnetFromVpn(DataBroker dataBroker,
+    public static void publishRemoveDirectSubnetFromVpn(DataBroker dataBroker,
             final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
             String interfaceName) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = InstanceIdentifier.builder(ElanInstances.class)
@@ -417,16 +457,7 @@ public class NetvirtVpnUtils {
         logger.info("Publish subnet remove {}", subnetName);
         publishSubnetRemoveNotification(notificationPublishService, subnetId, vpnName, elanTag);
 
-        logger.info("Removing port {} from subnet {}", interfaceName, subnetName);
-        updateSubnetmapNodeWithPorts(dataBroker, subnetId, null, new Uuid(interfaceName), vpnName);
-
-        logger.info("Removing subnet {} from vpn {}", subnetName, vpnName);
-        removeSubnetNode(dataBroker, new Uuid(vpnName));
-
-        logger.info("Removing subnet {} to elan map", subnetId);
-        removeSubnetToNetworkMapping(dataBroker, subnetId);
-
-        logger.info("Finished Working on subnet {}", subnetName);
+        logger.info("Finished publish remove on subnet {}", subnetName);
     }
 
     private static void createSubnetToNetworkMapping(DataBroker dataBroker, Uuid subnetId, Uuid networkId) {
@@ -523,6 +554,9 @@ public class NetvirtVpnUtils {
                     }
                     builder.setRouterId(new Uuid(vpnName));
                     builder.setPortList(portList);
+                } else {
+                    builder.setRouterId(new Uuid(vpnName));
+                    builder.setPortList(new ArrayList<>());
                 }
                 subnetmap = builder.build();
                 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, id, subnetmap);
@@ -568,7 +602,7 @@ public class NetvirtVpnUtils {
         builder.setSubnetId(subnetId);
         builder.setSubnetIp(subnetIp);
         builder.setVpnName(vpnName);
-        builder.setExternalVpn(true);
+        builder.setBgpVpn(true);
         builder.setElanTag(elanTag);
 
         try {
@@ -587,7 +621,7 @@ public class NetvirtVpnUtils {
 
         builder.setSubnetId(subnetId);
         builder.setVpnName(vpnName);
-        builder.setExternalVpn(true);
+        builder.setBgpVpn(true);
         builder.setElanTag(elanTag);
 
         try {
index 1cd26f68861731f4f1c4617109f3c553d210e251..60a3b5e978ba55ed006923bddf6b67c84fee578c 100644 (file)
@@ -134,36 +134,37 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
     private void createNetwork(Subnet newSubnet, Identifier45 nwUniId, Identifier45 nwIpUniId) {
         String subnetStr = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
 
-        InstanceIdentifier<Ipvc> ipvcId = findService(nwUniId, nwIpUniId, getMefServices());
-        if (ipvcId == null) {
-            Log.info("Subnet Uni {} IpUNI {} is not assosiated to service", nwUniId, nwIpUniId);
-            return;
-        }
-        IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
-        if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
-            Log.error("Subnet Uni {} IpUNI {} is not operational", nwUniId, nwIpUniId);
-            return;
-        }
-        VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(newSubnet, ipvcVpn);
-        if (vpnElan == null) {
-            Log.error("Subnet Uni {} IpUNI {} for network {} is not operational", nwUniId, nwIpUniId, subnetStr);
-            return;
-        }
-        if (MefServicesUtils.findNetwork(newSubnet, vpnElan) != null) {
-            Log.info("Network {} exists already", subnetStr);
-            return;
-        }
+        synchronized (subnetStr.intern()) {
+            InstanceIdentifier<Ipvc> ipvcId = findService(nwUniId, nwIpUniId, getMefServices());
+            if (ipvcId == null) {
+                Log.info("Subnet Uni {} IpUNI {} is not assosiated to service", nwUniId, nwIpUniId);
+                return;
+            }
+            IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
+            if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
+                Log.error("Subnet Uni {} IpUNI {} is not operational", nwUniId, nwIpUniId);
+                return;
+            }
+            VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(newSubnet, ipvcVpn);
+            if (vpnElan == null) {
+                Log.error("Subnet Uni {} IpUNI {} for network {} is not operational", nwUniId, nwIpUniId, subnetStr);
+                return;
+            }
+            if (MefServicesUtils.findNetwork(newSubnet, vpnElan) != null) {
+                Log.info("Network {} exists already", subnetStr);
+                return;
+            }
 
-        String vpnId = ipvcVpn.getVpnId();
-        synchronized (vpnId.intern()) {
+            String vpnId = ipvcVpn.getVpnId();
             if (newSubnet.getGateway() == null) {
                 checkCreateDirectNetwork(newSubnet, ipvcVpn, ipvcId, vpnElan);
             } else {
                 createNonDirectNetwork(newSubnet, ipvcVpn, ipvcId, vpnElan);
             }
+
+            MefServicesUtils.addOperIpvcVpnElan(dataBroker, ipvcId, ipvcVpn.getVpnId(), nwUniId, nwIpUniId,
+                    vpnElan.getElanId(), vpnElan.getElanPort(), Collections.singletonList(subnetStr));
         }
-        MefServicesUtils.addOperIpvcVpnElan(dataBroker, ipvcId, ipvcVpn.getVpnId(), nwUniId, nwIpUniId,
-                vpnElan.getElanId(), vpnElan.getElanPort(), Collections.singletonList(subnetStr));
 
     }
 
@@ -205,7 +206,7 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
         }
         String portMacAddress = operUni.getMacAddress().getValue();
 
-        NetvirtVpnUtils.addDirectSubnetToVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
+        NetvirtVpnUtils.publishDirectSubnetToVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
                 vpnElan.getElanId(), newSubnet.getSubnet(), vpnElan.getElanPort(), portMacAddress, waitForElanInterval);
 
     }
@@ -214,7 +215,7 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
         Subnet deletedSubnet = deletedDataObject.getRootNode().getDataBefore();
         Identifier45 dlUniId = deletedSubnet.getUniId();
         Identifier45 dlIpUniId = deletedSubnet.getIpUniId();
-        InstanceIdentifier<Ipvc> ipvcId = findService(dlUniId, dlIpUniId, getMefServicesOper());
+        InstanceIdentifier<Ipvc> ipvcId = findServiceOper(dlUniId, dlIpUniId, getMefServicesOper());
         if (ipvcId == null) {
             Log.info("Subnet Uni {} IpUNI {} for deleted network is not assosiated to service", dlUniId, dlIpUniId);
             return;
@@ -225,31 +226,33 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
     private void removeNetwork(Subnet dlSubnet, Identifier45 dlUniId, Identifier45 dlIpUniId,
             InstanceIdentifier<Ipvc> ipvcId) {
         String subnetStr = NetvirtVpnUtils.ipPrefixToString(dlSubnet.getSubnet());
-        IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
-        if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
-            Log.error("Subnet Uni {} IpUNI {} is not operational", dlUniId, dlIpUniId);
-            return;
-        }
-        VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(dlSubnet, ipvcVpn);
-        if (vpnElan == null) {
-            Log.error("Trying to remove non-operational network {}", subnetStr);
-            return;
-        }
-        if (MefServicesUtils.findNetwork(dlSubnet, vpnElan) == null) {
-            Log.error("Trying to remove non-operational network {}", subnetStr);
-            return;
-        }
+        synchronized (subnetStr.intern()) {
+
+            IpvcVpn ipvcVpn = MefServicesUtils.getOperIpvcVpn(dataBroker, ipvcId);
+            if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
+                Log.error("Subnet Uni {} IpUNI {} is not operational", dlUniId, dlIpUniId);
+                return;
+            }
+            VpnElans vpnElan = MefServicesUtils.findVpnForNetwork(dlSubnet, ipvcVpn);
+            if (vpnElan == null) {
+                Log.error("Trying to remove non-operational network {}", subnetStr);
+                return;
+            }
+            if (MefServicesUtils.findNetwork(dlSubnet, vpnElan) == null) {
+                Log.error("Trying to remove non-operational network {}", subnetStr);
+                return;
+            }
 
-        String vpnId = ipvcVpn.getVpnId();
-        synchronized (vpnId.intern()) {
+            String vpnId = ipvcVpn.getVpnId();
             if (dlSubnet.getGateway() == null) {
                 removeDirectNetwork(dlSubnet, ipvcVpn, ipvcId);
             } else {
                 removeNonDirectNetwork(dlSubnet, ipvcVpn, ipvcId);
             }
+
+            MefServicesUtils.removeOperIpvcSubnet(dataBroker, ipvcId, ipvcVpn.getVpnId(), dlUniId, dlIpUniId,
+                    vpnElan.getElanId(), vpnElan.getElanPort(), subnetStr);
         }
-        MefServicesUtils.removeOperIpvcSubnet(dataBroker, ipvcId, ipvcVpn.getVpnId(), dlUniId, dlIpUniId,
-                vpnElan.getElanId(), vpnElan.getElanPort(), subnetStr);
     }
 
     private void removeDirectNetwork(Subnet deletedSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId) {
@@ -264,7 +267,7 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
             return;
         }
 
-        NetvirtVpnUtils.removeDirectSubnetFromVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
+        NetvirtVpnUtils.publishRemoveDirectSubnetFromVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
                 vpnElan.getElanId(), vpnElan.getElanPort());
 
     }
@@ -334,4 +337,31 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
         Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
         return null;
     }
+
+    private InstanceIdentifier<Ipvc> findServiceOper(Identifier45 uniId, Identifier45 ipUniId,
+            Optional<MefServices> mefServices) {
+        if (!mefServices.isPresent() || mefServices.get() == null) {
+            Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
+            return null;
+        }
+        for (MefService service : mefServices.get().getMefService()) {
+            if (service.getMefServiceChoice() instanceof IpvcChoice) {
+                Ipvc ipvc = ((IpvcChoice) service.getMefServiceChoice()).getIpvc();
+                IpvcVpn ipvcVpn = ipvc.getAugmentation(IpvcVpn.class);
+                if (ipvcVpn == null || ipvcVpn.getVpnElans() == null) {
+                    Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
+                    return null;
+                }
+                List<VpnElans> vpnElans = ipvcVpn.getVpnElans();
+                for (VpnElans vpnElan : vpnElans) {
+                    if (vpnElan.getUniId().equals(uniId) && vpnElan.getIpUniId().equals(ipUniId)) {
+                        Log.info("Find service {} for uni {} ipuni {}", service.getSvcId(), uniId, ipUniId);
+                        return MefServicesUtils.getIpvcInstanceIdentifier(service.getSvcId());
+                    }
+                }
+            }
+        }
+        Log.info("Uni {} IpUni {} is not assosiated with service", uniId, ipUniId);
+        return null;
+    }
 }
index 33c627bbe388b9cbfa50973fa9f5e396df26947d..fab4380c217bec7a27de5f53b2a91aef8af07ffe 100644 (file)
@@ -37,7 +37,8 @@
                <argument ref="uniPortManager" />
                <argument ref="subnetListener" />
                <argument ref="uniQosManager" />
-               <argument ref="odlInterfaceRpcService" />               
+               <argument ref="odlInterfaceRpcService" />
+        <argument ref="notificationPublishService" />                  
        </bean>
 
        <bean id="subnetListener" class="org.opendaylight.unimgr.mef.netvirt.SubnetListener">