Improve NeutronVpnUtils.getIsExternal()
[netvirt.git] / neutronvpn / impl / src / main / java / org / opendaylight / netvirt / neutronvpn / NeutronvpnUtils.java
index ac4fd13cf04b613f57b32e92ff4906526d17a8c2..f1228b1617fc98b3d62a9ace232be43d78bac52f 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.neutronvpn;
 
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
@@ -13,12 +12,12 @@ import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
-import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -26,7 +25,6 @@ import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -75,6 +73,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.Dhcpv6Base;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAclBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.IpPrefixOrAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.IpVersionBase;
@@ -159,6 +158,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -175,14 +175,11 @@ public class NeutronvpnUtils {
             .put(NetworkTypeVxlan.class, SegmentTypeVxlan.class)
             .build();
 
-    private static final Set<Class<? extends NetworkTypeBase>> SUPPORTED_NETWORK_TYPES = new HashSet<>();
-
-    static {
-        SUPPORTED_NETWORK_TYPES.add(NetworkTypeFlat.class);
-        SUPPORTED_NETWORK_TYPES.add(NetworkTypeVlan.class);
-        SUPPORTED_NETWORK_TYPES.add(NetworkTypeVxlan.class);
-        SUPPORTED_NETWORK_TYPES.add(NetworkTypeGre.class);
-    }
+    private static final ImmutableSet<Class<? extends NetworkTypeBase>> SUPPORTED_NETWORK_TYPES = ImmutableSet.of(
+        NetworkTypeFlat.class,
+        NetworkTypeVlan.class,
+        NetworkTypeVxlan.class,
+        NetworkTypeGre.class);
 
     private final ConcurrentMap<Uuid, Network> networkMap = new ConcurrentHashMap<>();
     private final ConcurrentMap<Uuid, Router> routerMap = new ConcurrentHashMap<>();
@@ -235,8 +232,8 @@ public class NeutronvpnUtils {
     protected Uuid getVpnForNetwork(Uuid network) {
         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
         Optional<VpnMaps> optionalVpnMaps = read(LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
-        if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
-            for (VpnMap vpnMap : optionalVpnMaps.get().nonnullVpnMap()) {
+        if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().nonnullVpnMap() != null) {
+            for (VpnMap vpnMap : new ArrayList<>(optionalVpnMaps.get().nonnullVpnMap())) {
                 List<Uuid> netIds = vpnMap.getNetworkIds();
                 if (netIds != null && netIds.contains(network)) {
                     return vpnMap.getVpnId();
@@ -280,8 +277,8 @@ public class NeutronvpnUtils {
 
         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
         Optional<VpnMaps> optionalVpnMaps = read(LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
-        if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
-            for (VpnMap vpnMap : optionalVpnMaps.get().nonnullVpnMap()) {
+        if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().nonnullVpnMap() != null) {
+            for (VpnMap vpnMap : new ArrayList<>(optionalVpnMaps.get().nonnullVpnMap())) {
                 List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.vpnmaps.vpnmap
                     .RouterIds> routerIdsList = vpnMap.getRouterIds();
                 if (routerIdsList == null || routerIdsList.isEmpty()) {
@@ -333,7 +330,11 @@ public class NeutronvpnUtils {
         Optional<VpnMap> optionalVpnMap = read(LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
         if (optionalVpnMap.isPresent()) {
             VpnMap vpnMap = optionalVpnMap.get();
-            return vpnMap.getNetworkIds();
+            if (vpnMap.getNetworkIds() != null && !vpnMap.getNetworkIds().isEmpty()) {
+                return new ArrayList<>(vpnMap.getNetworkIds());
+            } else {
+                return null;
+            }
         }
         LOG.error("getNetworksforVpn: Failed as VPNMaps DS is absent for VPN {}", vpnId.getValue());
         return null;
@@ -440,6 +441,20 @@ public class NeutronvpnUtils {
         return null;
     }
 
+    protected static boolean isDhcpServerPort(Port port) {
+        return port.getDeviceOwner().equals("network:dhcp");
+    }
+
+    protected InterfaceAcl getDhcpInterfaceAcl(Port port) {
+        InterfaceAclBuilder interfaceAclBuilder = new InterfaceAclBuilder();
+        interfaceAclBuilder.setPortSecurityEnabled(false);
+        interfaceAclBuilder.setInterfaceType(InterfaceAcl.InterfaceType.DhcpService);
+        List<AllowedAddressPairs> aclAllowedAddressPairs = NeutronvpnUtils.getAllowedAddressPairsForAclService(
+                port.getMacAddress(), port.getFixedIps());
+        interfaceAclBuilder.setAllowedAddressPairs(aclAllowedAddressPairs);
+        return interfaceAclBuilder.build();
+    }
+
     /**
      * Returns port_security_enabled status with the port.
      *
@@ -738,7 +753,7 @@ public class NeutronvpnUtils {
             aclAllowedAddressPairs.addAll(NeutronvpnUtils.getAllowedAddressPairsForAclService(portAllowedAddressPairs));
         }
         interfaceAclBuilder.setAllowedAddressPairs(aclAllowedAddressPairs);
-
+        interfaceAclBuilder.setInterfaceType(InterfaceAcl.InterfaceType.AccessPort);
         populateSubnetInfo(interfaceAclBuilder, port);
     }
 
@@ -999,8 +1014,8 @@ public class NeutronvpnUtils {
     }
 
     static Boolean getIsExternal(Network network) {
-        return network.augmentation(NetworkL3Extension.class) != null
-                && network.augmentation(NetworkL3Extension.class).isExternal();
+        NetworkL3Extension ext = network.augmentation(NetworkL3Extension.class);
+        return ext != null && ext.isExternal();
     }
 
     static InstanceIdentifier<NetworkMap> buildNetworkMapIdentifier(Uuid networkId) {
@@ -1085,22 +1100,23 @@ public class NeutronvpnUtils {
 
     static boolean isNetworkTypeSupported(Network network) {
         NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
-        return npe != null && npe.getNetworkType() != null && SUPPORTED_NETWORK_TYPES.contains(npe.getNetworkType());
+        return npe != null && SUPPORTED_NETWORK_TYPES.contains(npe.getNetworkType());
     }
 
-    static boolean isNetworkOfType(Network network, Class<? extends NetworkTypeBase> type) {
-        NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
-        if (npe != null && npe.getNetworkType() != null) {
-            return type.isAssignableFrom(npe.getNetworkType());
+    static boolean isFlatOrVlanNetwork(Network network) {
+        if (network != null) {
+            NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
+            if (npe != null) {
+                Class<? extends NetworkTypeBase> npeType = npe.getNetworkType();
+                if (npeType != null) {
+                    return NetworkTypeVlan.class.isAssignableFrom(npeType)
+                            || NetworkTypeFlat.class.isAssignableFrom(npeType);
+                }
+            }
         }
         return false;
     }
 
-    static boolean isFlatOrVlanNetwork(Network network) {
-        return network != null
-                && (isNetworkOfType(network, NetworkTypeVlan.class) || isNetworkOfType(network, NetworkTypeFlat.class));
-    }
-
     static boolean isVlanOrVxlanNetwork(Class<? extends NetworkTypeBase> type) {
         return type.isAssignableFrom(NetworkTypeVxlan.class) || type.isAssignableFrom(NetworkTypeVlan.class);
     }
@@ -1586,7 +1602,7 @@ public class NeutronvpnUtils {
             LOG.error("updateVpnInstanceWithFallback: vpnInstanceOpDataEntry not found for vpn {}", vpnName);
             return;
         }
-        Long internetBgpVpnId = vpnInstanceOpDataEntry.getVpnId();
+        Long internetBgpVpnId = vpnInstanceOpDataEntry.getVpnId().toJava();
         List<Uuid> routerIds = new ArrayList<>();
         //Handle router specific V6 internet fallback flow else handle all V6 external routers
         if (routerId != null) {
@@ -1603,12 +1619,12 @@ public class NeutronvpnUtils {
             if (rtrId == null) {
                 continue;
             }
-            List<BigInteger> dpnIds = getDpnsForRouter(rtrId.getValue());
+            List<Uint64> dpnIds = getDpnsForRouter(rtrId.getValue());
             if (dpnIds.isEmpty()) {
                 continue;
             }
             VpnInstanceOpDataEntry vpnOpDataEntry = getVpnInstanceOpDataEntryFromVpnId(rtrId.getValue());
-            Long routerIdAsLong = vpnOpDataEntry.getVpnId();
+            Long routerIdAsLong = vpnOpDataEntry.getVpnId().toJava();
             long vpnId;
             Uuid rtrVpnId = getVpnForRouter(rtrId, true);
             if (rtrVpnId == null) {
@@ -1617,17 +1633,17 @@ public class NeutronvpnUtils {
             } else {
                 vpnId = getVpnId(rtrVpnId.getValue());
             }
-            for (BigInteger dpnId : dpnIds) {
+            for (Uint64 dpnId : dpnIds) {
                 if (add) {
                     LoggingFutures.addErrorLogging(
                         txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
-                            tx -> ipV6InternetDefRt.installDefaultRoute(tx, dpnId, rtrId.getValue(), internetBgpVpnId,
-                                vpnId)), LOG, "Error adding default route");
+                            tx -> ipV6InternetDefRt.installDefaultRoute(tx, dpnId, rtrId.getValue(),
+                                internetBgpVpnId, vpnId)), LOG, "Error adding default route");
                 } else {
                     LoggingFutures.addErrorLogging(
                         txRunner.callWithNewReadWriteTransactionAndSubmit(Datastore.CONFIGURATION,
-                            tx -> ipV6InternetDefRt.removeDefaultRoute(tx, dpnId, rtrId.getValue(), internetBgpVpnId,
-                                vpnId)), LOG,
+                            tx -> ipV6InternetDefRt.removeDefaultRoute(tx, dpnId, rtrId.getValue(),
+                                internetBgpVpnId, vpnId)), LOG,
                         "Error removing default route");
                 }
             }
@@ -1679,13 +1695,13 @@ public class NeutronvpnUtils {
     }
 
     @NonNull
-    public List<BigInteger> getDpnsForRouter(String routerUuid) {
+    public List<Uint64> getDpnsForRouter(String routerUuid) {
         InstanceIdentifier id = InstanceIdentifier.builder(NeutronRouterDpns.class)
             .child(RouterDpnList.class, new RouterDpnListKey(routerUuid)).build();
         Optional<RouterDpnList> routerDpnListData =
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                         LogicalDatastoreType.OPERATIONAL, id);
-        List<BigInteger> dpns = new ArrayList<>();
+        List<Uint64> dpns = new ArrayList<>();
         if (routerDpnListData.isPresent()) {
             for (DpnVpninterfacesList dpnVpnInterface : routerDpnListData.get().nonnullDpnVpninterfacesList()) {
                 dpns.add(dpnVpnInterface.getDpnId());
@@ -1722,7 +1738,7 @@ public class NeutronvpnUtils {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                 LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
-                        .VpnInstance::getVpnId).orElse(null);
+                        .VpnInstance::getVpnId).orElse(null).toJava();
     }
 
     protected boolean isV6SubnetPartOfRouter(Uuid routerId) {