Latest netvirt 36/49136/1
authorKonsta Pozdeev <konsta.pozdeev@hpe.com>
Wed, 7 Dec 2016 14:16:54 +0000 (16:16 +0200)
committerKonsta Pozdeev <konsta.pozdeev@hpe.com>
Thu, 8 Dec 2016 09:22:19 +0000 (11:22 +0200)
Bug Fixes

Change-Id: I82e27289d95609351e9b4eb9898108cfd962ede6
Signed-off-by: Konsta Pozdeev <konsta.pozdeev@hpe.com>
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/GwMacListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java
netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java

index 4e6b2181cddc74fcadcd8624c19f0218ca35342c..f2c3d9b00fb37b2a483630c7a2e38c1709ff25a0 100644 (file)
@@ -104,7 +104,7 @@ public class GwMacListener extends UnimgrDataTreeChangeListener<VpnPortipToPort>
         if (gwMacResolver.get(gwMacKey).getGwMac() == null || !gwMacResolver.get(gwMacKey).getGwMac().equals(macAddress)) {
             Log.info("Creating GW for vpn {} port {} ip {} MAC {}", vpnName, portName, ipAddress, macAddress);
             NetvirtVpnUtils.createUpdateVpnInterface(dataBroker, vpnName, portName, gwMacResolver.get(gwMacKey).getSubnet(), macAddress,
-                    false, gwMacResolver.get(gwMacKey).getPortIp());
+                    false, gwMacResolver.get(gwMacKey).getPortIp(), null);
 
             gwMacResolver.get(gwMacKey).setGwMac(macAddress);
         }
index de9d487cc7e7984344c45d1153287eb36d35690c..4fdba752d74b70ac030b2b96e95b80b5145091d4 100644 (file)
@@ -26,8 +26,10 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.serv
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.VpnElans;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.unis.Uni;
 import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+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.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -241,17 +243,23 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
         }
 
         Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : null;
-        String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId);
-        String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, tx);
-        createVpnInterface(vpnName, uni, ipUni, interfaceName, tx);
+        String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId, ipUniId);
+
+        String srcIpAddressStr = NetvirtVpnUtils
+                .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+        IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray());
+
+        String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx);
+        createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx);
         MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, uniInService.getUniId(), uniInService.getIpUniId(),
                 elanName, interfaceName, null, tx);
     }
 
     private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
-            Long vlan, WriteTransaction tx) {
+            Long vlan, IpAddress ipAddress, WriteTransaction tx) {
         Log.info("Adding elan instance: " + elanName);
         NetvirtUtils.updateElanInstance(elanName, tx);
+        NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, new Uuid(elanName), ipAddress);
 
         Log.info("Added trunk interface for uni {} vlan: {}", uniId, vlan);
         if (vlan != null) {
@@ -271,11 +279,11 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
 
     private void createVpnInterface(String vpnName,
             org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni,
-            IpUni ipUni, String interfaceName, WriteTransaction tx) {
+            IpUni ipUni, String interfaceName, String elanName, WriteTransaction tx) {
 
         Log.info("Adding vpn interface: " + interfaceName);
         NetvirtVpnUtils.createUpdateVpnInterface(vpnName, interfaceName, ipUni.getIpAddress(),
-                uni.getMacAddress().getValue(), true, null, tx);
+                uni.getMacAddress().getValue(), true, null, elanName, tx);
         NetvirtVpnUtils.createVpnPortFixedIp(vpnName, interfaceName, ipUni.getIpAddress(), uni.getMacAddress(), tx);
         Log.info("Finished working on vpn instance: " + vpnName);
     }
@@ -305,7 +313,6 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
         }
 
         String vpnName = ipvcVpn.getVpnId();
-
         VpnElans vpnElans = MefServicesUtils.findVpnElanForNetwork(new Identifier45(uniId), ipUni.getIpUniId(),
                 ipvcVpn);
         if (vpnElans == null) {
@@ -330,6 +337,7 @@ public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> {
         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);
     }
index 7d13db1b5edc46e9113b746c35c399804608e60d..8059e745101a30a18f5aa2eb1eaf9fbbedd29daf 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.unimgr.mef.netvirt;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
@@ -31,8 +32,8 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 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.genius.arputil.rev160406.OdlArputilService;
@@ -62,9 +63,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev15060
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import com.google.common.base.Optional;
 
 public class NetvirtVpnUtils {
@@ -106,14 +114,14 @@ public class NetvirtVpnUtils {
     }
 
     public static void createUpdateVpnInterface(DataBroker dataBroker, String vpnName, String interfaceName,
-            String ifAddr, String macAddress, boolean primary, String gwIpAddress) {
+            String ifAddr, String macAddress, boolean primary, String gwIpAddress, String directSubnetId) {
         WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
-        createUpdateVpnInterface(vpnName, interfaceName, ifAddr, macAddress, primary, gwIpAddress, tx);
+        createUpdateVpnInterface(vpnName, interfaceName, ifAddr, macAddress, primary, gwIpAddress, directSubnetId, tx);
         MdsalUtils.commitTransaction(tx);
     }
 
     public static void createUpdateVpnInterface(String vpnName, String interfaceName, IpPrefix ifPrefix,
-            String macAddress, boolean primary, IpPrefix gwIpAddress, WriteTransaction tx) {
+            String macAddress, boolean primary, IpPrefix gwIpAddress, String directSubnetId, WriteTransaction tx) {
         synchronized (interfaceName.intern()) {
             String ipAddress = null;
             String nextHopIp = null;
@@ -123,14 +131,15 @@ public class NetvirtVpnUtils {
                 ipAddress = ipPrefixToString(ifPrefix);
                 nextHopIp = getIpAddressFromPrefix(ipPrefixToString(gwIpAddress));
             }
-            createUpdateVpnInterface(vpnName, interfaceName, ipAddress, macAddress, primary, nextHopIp, tx);
+            createUpdateVpnInterface(vpnName, interfaceName, ipAddress, macAddress, primary, nextHopIp, directSubnetId,
+                    tx);
         }
     }
 
     public static void createUpdateVpnInterface(String vpnName, String interfaceName, String ipAddress,
-            String  macAddress, boolean primary, String nextHopIp, WriteTransaction tx) {
+            String macAddress, boolean primary, String nextHopIp, String subnetId, WriteTransaction tx) {
         synchronized (interfaceName.intern()) {
-            Adjacencies adjancencies = buildInterfaceAdjacency(ipAddress, macAddress, primary, nextHopIp);
+            Adjacencies adjancencies = buildInterfaceAdjacency(ipAddress, macAddress, primary, nextHopIp, subnetId);
             VpnInterfaceBuilder einterfaceBuilder = createVpnInterface(vpnName, interfaceName, adjancencies);
 
             tx.merge(LogicalDatastoreType.CONFIGURATION, getVpnInterfaceInstanceIdentifier(interfaceName),
@@ -148,7 +157,7 @@ public class NetvirtVpnUtils {
     }
 
     private static Adjacencies buildInterfaceAdjacency(String ipAddress, String macAddress, boolean primary,
-            String nextHopIp) {
+            String nextHopIp, String subnetId) {
         AdjacenciesBuilder builder = new AdjacenciesBuilder();
         List<Adjacency> list = new ArrayList<>();
 
@@ -158,6 +167,9 @@ public class NetvirtVpnUtils {
             aBuilder.setMacAddress(macAddress);
         }
         aBuilder.setPrimaryAdjacency(primary);
+        if (subnetId != null) {
+            aBuilder.setSubnetId(new Uuid(subnetId));
+        }
         if (nextHopIp != null) {
             aBuilder.setNextHopIpList(Arrays.asList(nextHopIp));
         }
@@ -174,6 +186,17 @@ public class NetvirtVpnUtils {
     }
 
     public static void removeVpnInterfaceAdjacencies(DataBroker dataBroker, String vpnName, String interfaceName) {
+        InstanceIdentifier<VpnInterface> identifier = getVpnInterfaceInstanceIdentifier(interfaceName);
+        InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
+        Optional<Adjacencies> adjacencies = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
+        List<Adjacency> adjacenciesList = (adjacencies.isPresent() && adjacencies.get().getAdjacency() != null)
+                ? adjacencies.get().getAdjacency() : Collections.emptyList();
+        adjacenciesList.forEach(a -> {
+            String ipStr = getIpAddressFromPrefix(a.getIpAddress());
+            InstanceIdentifier<VpnPortipToPort> id = getVpnPortipToPortIdentifier(vpnName, ipStr);
+            MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        });
+
         AdjacenciesBuilder builder = new AdjacenciesBuilder();
         List<Adjacency> list = new ArrayList<>();
         builder.setAdjacency(list);
@@ -259,6 +282,27 @@ public class NetvirtVpnUtils {
         tx.delete(LogicalDatastoreType.OPERATIONAL, id);
     }
 
+    public static void registerDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName, IpAddress gwIpAddress) {
+        final SubnetKey subnetkey = new SubnetKey(subnetName);
+
+        final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
+                .child(Subnets.class).child(Subnet.class, subnetkey);
+
+        SubnetBuilder subnetBuilder = new SubnetBuilder();
+        subnetBuilder.setIpVersion(IpVersionV4.class);
+        subnetBuilder.setGatewayIp(gwIpAddress);
+        subnetBuilder.setKey(subnetkey);
+        MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier, subnetBuilder.build());
+    }
+
+    public static void unregisterDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName) {
+        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);
+    }
+
     public static void addDirectSubnetToVpn(DataBroker dataBroker,
             final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
             IpPrefix subnetIpPrefix, String interfaceName) {
@@ -287,7 +331,6 @@ public class NetvirtVpnUtils {
         logger.info("Publish subnet {}", subnetName);
         publishSubnetAddNotification(notificationPublishService, subnetId, subnetIp, vpnName, elanTag);
         logger.info("Finished Working on subnet {}", subnetName);
-
     }
 
     public static void removeDirectSubnetFromVpn(DataBroker dataBroker,
@@ -492,6 +535,10 @@ public class NetvirtVpnUtils {
         }
     }
 
+    public static String getElanNameForVpnPort(String uniId, String ipUniId) {
+        return getUUidFromString(ELAN_PREFIX + uniId + ipUniId);
+    }
+
     public static String getIpAddressFromPrefix(String prefix) {
         return prefix.split(IP_MUSK_SEPARATOR)[0];
     }
@@ -515,10 +562,6 @@ public class NetvirtVpnUtils {
         return myAddress + IP_ADDR_SUFFIX;
     }
 
-    public static String getElanNameForVpnPort(String portName) {
-        return getUUidFromString(ELAN_PREFIX + portName);
-    }
-
     public static String getUUidFromString(String key) {
         return java.util.UUID.nameUUIDFromBytes(key.getBytes()).toString();
     }