DpnId waiter fix 72/50072/1
authorKonsta Pozdeev <konsta.pozdeev@hpe.com>
Thu, 29 Dec 2016 10:48:05 +0000 (12:48 +0200)
committerDavid Goldberg <gdavid@hpe.com>
Thu, 5 Jan 2017 16:38:45 +0000 (18:38 +0200)
Change-Id: I68c6ba8a6eb6242c72dbc4f212abdd35e5414168
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

index e696b749c7f6d0bb9bd7272a31c591b932f895b7..f11ea929e9d972de7fded6005db59c0228cd51b6 100644 (file)
@@ -32,6 +32,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface.EtreeInterfaceType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -285,18 +287,35 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
             MdsalUtils.commitTransaction(tx);
         }
 
+        waitForInterfaceDpn(vpnName, rd, interfaceName);
+
+        NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(),
+                uni.getMacAddress());
+    }
+
+    private void waitForInterfaceDpn(String vpnName, String rd, String interfaceName) {
         InstanceIdentifier<VpnInstanceOpDataEntry> vpnId = NetvirtVpnUtils.getVpnInstanceOpDataIdentifier(rd);
+        DataWaitGetter<VpnInstanceOpDataEntry> getInterfByName = (vpn) -> {
+            if (vpn.getVpnToDpnList() == null)
+                return null;
+            for (VpnToDpnList is : vpn.getVpnToDpnList()) {
+                if (is.getVpnInterfaces() == null)
+                    continue;
+                for (VpnInterfaces i : is.getVpnInterfaces()) {
+                    if (i.getInterfaceName().equals(interfaceName))
+                        return interfaceName;
+                }
+            }
+            return null;
+        };
         @SuppressWarnings("resource")
         DataWaitListener<VpnInstanceOpDataEntry> vpnInstanceWaiter = new DataWaitListener<>(dataBroker, vpnId, 10,
-                LogicalDatastoreType.OPERATIONAL, vpn -> vpn.getVpnToDpnList());
+                LogicalDatastoreType.OPERATIONAL, getInterfByName);
         if (!vpnInstanceWaiter.waitForData()) {
             String errorMessage = String.format("Fail to wait for vpn to dpn list %s", vpnName);
             Log.error(errorMessage);
             throw new UnsupportedOperationException(errorMessage);
         }
-
-        NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(),
-                uni.getMacAddress());
     }
 
     private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
index 665b2effefbcd105fe18abc32b92c0306e973186..a180cb32b3bdea172f1b43d4f0063fb148150c58 100644 (file)
@@ -315,7 +315,7 @@ public class NetvirtVpnUtils {
 
     public static void addDirectSubnetToVpn(DataBroker dataBroker,
             final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
-            IpPrefix subnetIpPrefix, String interfaceName, int waitForElan) {
+            IpPrefix subnetIpPrefix, String interfaceName, String intfMac, int waitForElan) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName);
 
         @SuppressWarnings("resource") // AutoCloseable
@@ -332,7 +332,7 @@ public class NetvirtVpnUtils {
 
         String subnetIp = getSubnetFromPrefix(ipPrefixToString(subnetIpPrefix));
         logger.info("Adding subnet {} {} to vpn {}", subnetName, subnetIp, vpnName);
-        updateSubnetNode(dataBroker, new Uuid(vpnName), subnetId, subnetIp);
+        updateSubnetNode(dataBroker, new Uuid(vpnName), subnetId, subnetIp, intfMac);
 
         logger.info("Adding port {} to subnet {}", interfaceName, subnetName);
         updateSubnetmapNodeWithPorts(dataBroker, subnetId, new Uuid(interfaceName), null, vpnName);
@@ -404,7 +404,8 @@ public class NetvirtVpnUtils {
         logger.debug("Deleted subnet-network mapping for  network {}", networkId.getValue());
     }
 
-    protected static void updateSubnetNode(DataBroker dataBroker, Uuid vpnId, Uuid subnetId, String subnetIp) {
+    protected static void updateSubnetNode(DataBroker dataBroker, Uuid vpnId, Uuid subnetId, String subnetIp,
+            String intfMac) {
         Subnetmap subnetmap = null;
         SubnetmapBuilder builder = null;
         InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class)
@@ -423,6 +424,7 @@ public class NetvirtVpnUtils {
             builder.setSubnetIp(subnetIp);
             builder.setNetworkId(subnetId);
             builder.setVpnId(vpnId);
+            builder.setRouterIntfMacAddress(intfMac);
 
             subnetmap = builder.build();
             logger.debug("Creating/Updating subnetMap node: {} ", subnetId.getValue());
index 147d572400fada995a048cead0d3c415a294390a..e4bbd8045e3097aa8b1156adc5c5f8ebf2d043b4 100644 (file)
@@ -45,7 +45,7 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
     private final int waitForElanInterval;
 
     public SubnetListener(final DataBroker dataBroker, final NotificationPublishService notPublishService,
-             final IGwMacListener gwMacListener, int sleepInterval) {
+            final IGwMacListener gwMacListener, int sleepInterval) {
         super(dataBroker);
         this.notificationPublishService = notPublishService;
         this.gwMacListener = gwMacListener;
@@ -122,7 +122,6 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
         ipUniSubnets.forEach(s -> removeNetwork(s, uniId, ipUniId, ipvcId));
     }
 
-
     private void createNetwork(DataTreeModification<Subnet> newDataObject) {
         Subnet newSubnet = newDataObject.getRootNode().getDataAfter();
 
@@ -184,10 +183,12 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
             return;
         }
 
-        String srcTpAddressStr = NetvirtVpnUtils.getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+        String srcTpAddressStr = NetvirtVpnUtils
+                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
         IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
         String subnet = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
-        gwMacListener.resolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, newSubnet.getGateway(), subnet);
+        gwMacListener.resolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, newSubnet.getGateway(),
+                subnet);
     }
 
     private void checkCreateDirectNetwork(Subnet newSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId,
@@ -196,8 +197,16 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
             return;
         }
 
+        org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni operUni = MefInterfaceUtils
+                .getUni(dataBroker, newSubnet.getUniId().getValue(), LogicalDatastoreType.OPERATIONAL);
+        if (operUni == null) {
+            Log.error("Uni {} for network {} is not operational", newSubnet.getUniId(), newSubnet.getSubnet());
+            return;
+        }
+        String portMacAddress = operUni.getMacAddress().getValue();
+
         NetvirtVpnUtils.addDirectSubnetToVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
-                vpnElan.getElanId(), newSubnet.getSubnet(), vpnElan.getElanPort(), waitForElanInterval);
+                vpnElan.getElanId(), newSubnet.getSubnet(), vpnElan.getElanPort(), portMacAddress, waitForElanInterval);
 
     }
 
@@ -243,7 +252,6 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
                 vpnElan.getElanId(), vpnElan.getElanPort(), subnetStr);
     }
 
-
     private void removeDirectNetwork(Subnet deletedSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId) {
         if (deletedSubnet.getGateway() != null) {
             return;
@@ -281,10 +289,12 @@ public class SubnetListener extends UnimgrDataTreeChangeListener<Subnet> impleme
             return;
         }
 
-        String srcTpAddressStr = NetvirtVpnUtils.getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+        String srcTpAddressStr = NetvirtVpnUtils
+                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
         IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
         String subnet = NetvirtVpnUtils.ipPrefixToString(deletedSubnet.getSubnet());
-        gwMacListener.unResolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, deletedSubnet.getGateway(), subnet);
+        gwMacListener.unResolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress,
+                deletedSubnet.getGateway(), subnet);
 
         NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getSubnet());
         NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getGateway());