EVPN RT2 elan changes to adv/withdraw RT2 routes..
[netvirt.git] / vpnservice / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / netvirt / vpnmanager / VpnManagerImpl.java
index 6395c6aaa5858dc45cdbbf71f4639d6d25e3774f..96a9f42df4de123b08f6cb55011c78b9f6f7f955 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015 - 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,20 +9,23 @@ package org.opendaylight.netvirt.vpnmanager;
 
 import java.math.BigInteger;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.mdsalutil.MatchInfoBase;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchRegister;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
-import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
 import org.opendaylight.netvirt.vpnmanager.arp.responder.ArpResponderUtil;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 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.flow.types.rev131026.instruction.list.Instruction;
@@ -30,6 +33,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+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.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
@@ -46,6 +53,7 @@ public class VpnManagerImpl implements IVpnManager {
     private final VpnFootprintService vpnFootprintService;
     private final OdlInterfaceRpcService ifaceMgrRpcService;
     private final IElanService elanService;
+    private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
 
     public VpnManagerImpl(final DataBroker dataBroker,
                           final IdManagerService idManagerService,
@@ -54,7 +62,8 @@ public class VpnManagerImpl implements IVpnManager {
                           final IMdsalApiManager mdsalManager,
                           final VpnFootprintService vpnFootprintService,
                           final OdlInterfaceRpcService ifaceMgrRpcService,
-                          final IElanService elanService) {
+                          final IElanService elanService,
+                          final VpnSubnetRouteHandler vpnSubnetRouteHandler) {
         this.dataBroker = dataBroker;
         this.vpnInterfaceManager = vpnInterfaceManager;
         this.vpnInstanceListener = vpnInstanceListener;
@@ -63,6 +72,7 @@ public class VpnManagerImpl implements IVpnManager {
         this.vpnFootprintService = vpnFootprintService;
         this.ifaceMgrRpcService = ifaceMgrRpcService;
         this.elanService = elanService;
+        this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
     }
 
     public void start() {
@@ -72,25 +82,25 @@ public class VpnManagerImpl implements IVpnManager {
 
     private void createIdPool() {
         CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
-                .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
-                .setLow(VpnConstants.VPN_IDPOOL_START)
-                .setHigh(new BigInteger(VpnConstants.VPN_IDPOOL_SIZE).longValue())
-                .build();
+            .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
+            .setLow(VpnConstants.VPN_IDPOOL_LOW)
+            .setHigh(VpnConstants.VPN_IDPOOL_HIGH)
+            .build();
         try {
             Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
             if (result != null && result.get().isSuccessful()) {
                 LOG.info("Created IdPool for VPN Service");
             }
         } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to create idPool for VPN Service",e);
+            LOG.error("Failed to create idPool for VPN Service", e);
         }
 
         // Now an IdPool for InterVpnLink endpoint's pseudo ports
         CreateIdPoolInput createPseudoLporTagPool =
-                new CreateIdPoolInputBuilder().setPoolName(VpnConstants.PSEUDO_LPORT_TAG_ID_POOL_NAME)
-                        .setLow(VpnConstants.LOWER_PSEUDO_LPORT_TAG)
-                        .setHigh(VpnConstants.UPPER_PSEUDO_LPORT_TAG)
-                        .build();
+            new CreateIdPoolInputBuilder().setPoolName(VpnConstants.PSEUDO_LPORT_TAG_ID_POOL_NAME)
+                .setLow(VpnConstants.LOWER_PSEUDO_LPORT_TAG)
+                .setHigh(VpnConstants.UPPER_PSEUDO_LPORT_TAG)
+                .build();
         try {
             Future<RpcResult<Void>> result = idManager.createIdPool(createPseudoLporTagPool);
             if (result != null && result.get().isSuccessful()) {
@@ -98,34 +108,32 @@ public class VpnManagerImpl implements IVpnManager {
             } else {
                 Collection<RpcError> errors = result.get().getErrors();
                 StringBuilder errMsg = new StringBuilder();
-                for ( RpcError err : errors ) {
+                for (RpcError err : errors) {
                     errMsg.append(err.getMessage()).append("\n");
                 }
                 LOG.error("IdPool creation for PseudoPort tags failed. Reasons: {}", errMsg);
             }
         } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to create idPool for Pseudo Port tags",e);
+            LOG.error("Failed to create idPool for Pseudo Port tags", e);
         }
     }
 
     @Override
-    public void setFibManager(IFibManager fibManager) {
-
-    }
-
-    @Override
-    public void addExtraRoute(String destination, String nextHop, String rd, String routerID, int label,
-                              RouteOrigin origin) {
+    public void addExtraRoute(String vpnName, String destination, String nextHop, String rd, String routerID,
+        int label,RouteOrigin origin) {
         LOG.info("Adding extra route with destination {}, nextHop {}, label{} and origin {}",
-                 destination, nextHop, label, origin);
-        vpnInterfaceManager.addExtraRoute(destination, nextHop, rd, routerID, label, origin, /*intfName*/ null,
-                                          null, null);
+            destination, nextHop, label, origin);
+        VpnInstanceOpDataEntry vpnOpEntry = VpnUtil.getVpnInstanceOpData(dataBroker, rd);
+        Boolean isVxlan = VpnUtil.isL3VpnOverVxLan(vpnOpEntry.getL3vni());
+        VrfEntry.EncapType encapType = VpnUtil.getEncapType(isVxlan);
+        vpnInterfaceManager.addExtraRoute(vpnName, destination, nextHop, rd, routerID, label, vpnOpEntry.getL3vni(),
+                origin,/*intfName*/ null, null /*Adjacency*/, encapType, null);
     }
 
     @Override
-    public void delExtraRoute(String destination, String nextHop, String rd, String routerID) {
+    public void delExtraRoute(String vpnName, String destination, String nextHop, String rd, String routerID) {
         LOG.info("Deleting extra route with destination {} and nextHop {}", destination, nextHop);
-        vpnInterfaceManager.delExtraRoute(destination, nextHop, rd, routerID, null, null);
+        vpnInterfaceManager.delExtraRoute(vpnName, destination, nextHop, rd, routerID, null, null);
     }
 
     @Override
@@ -138,27 +146,21 @@ public class VpnManagerImpl implements IVpnManager {
         return VpnUtil.getDpnsOnVpn(dataBroker, vpnInstanceName);
     }
 
-    @Override
-    public void updateVpnFootprint(BigInteger dpId, String vpnName, String interfaceName, boolean add) {
-        vpnFootprintService.updateVpnToDpnMapping(dpId, vpnName, interfaceName, add);
-    }
-
     @Override
     public boolean existsVpn(String vpnName) {
         return VpnUtil.getVpnInstance(dataBroker, vpnName) != null;
     }
 
     @Override
-    public long getArpCacheTimeoutMillis() {
-        return ArpConstants.ARP_CACHE_TIMEOUT_MILLIS;
-    }
+    public void setupSubnetMacIntoVpnInstance(String vpnName, String subnetVpnName, String srcMacAddress,
+        BigInteger dpnId, WriteTransaction writeTx, int addOrRemove) {
+        if (vpnName == null) {
+            LOG.warn("Cannot setup subnet MAC {} on DPN {}, null vpnName", srcMacAddress, dpnId);
+            return;
+        }
 
-    @Override
-    public void setupSubnetMacIntoVpnInstance(String vpnName, String srcMacAddress,
-                                              BigInteger dpnId, WriteTransaction writeTx,
-                                              int addOrRemove) {
-        VpnUtil.setupSubnetMacIntoVpnInstance(dataBroker, mdsalManager, vpnName, srcMacAddress,
-                dpnId, writeTx, addOrRemove);
+        VpnUtil.setupSubnetMacIntoVpnInstance(dataBroker, mdsalManager, vpnName, subnetVpnName,
+                srcMacAddress, dpnId, writeTx, addOrRemove);
     }
 
     @Override
@@ -188,7 +190,9 @@ public class VpnManagerImpl implements IVpnManager {
             submit = true;
             writeTx = dataBroker.newWriteOnlyTransaction();
         }
-        setupSubnetMacIntoVpnInstance(vpnId.getValue(), routerGwMac, dpnId, writeTx, addOrRemove);
+
+        setupSubnetMacIntoVpnInstance(vpnId.getValue(), null, routerGwMac, dpnId, writeTx,
+                addOrRemove);
         if (submit) {
             writeTx.submit();
         }
@@ -231,7 +235,7 @@ public class VpnManagerImpl implements IVpnManager {
 
     @Override
     public void setupArpResponderFlowsToExternalNetworkIps(String id, Collection<String> fixedIps, String macAddress,
-            BigInteger dpnId, long vpnId, String extInterfaceName, int lPortTag, WriteTransaction writeTx,
+            BigInteger dpnId, long vpnId, String extInterfaceName, int lportTag, WriteTransaction writeTx,
             int addOrRemove) {
         if (fixedIps == null || fixedIps.isEmpty()) {
             LOG.debug("No external IPs defined for {}", id);
@@ -249,10 +253,10 @@ public class VpnManagerImpl implements IVpnManager {
 
         for (String fixedIp : fixedIps) {
             if (addOrRemove == NwConstants.ADD_FLOW) {
-                installArpResponderFlowsToExternalNetworkIp(macAddress, dpnId, extInterfaceName, lPortTag, vpnId, fixedIp,
-                        writeTx);
+                installArpResponderFlowsToExternalNetworkIp(macAddress, dpnId, extInterfaceName, lportTag, vpnId,
+                        fixedIp, writeTx);
             } else {
-                removeArpResponderFlowsToExternalNetworkIp(dpnId, lPortTag, fixedIp, writeTx);
+                removeArpResponderFlowsToExternalNetworkIp(dpnId, lportTag, fixedIp, writeTx);
             }
         }
 
@@ -261,8 +265,20 @@ public class VpnManagerImpl implements IVpnManager {
         }
     }
 
-    private void installArpResponderFlowsToExternalNetworkIp(String macAddress, BigInteger dpnId, String extInterfaceName,
-            Integer lportTag, long vpnId, String fixedIp, WriteTransaction writeTx) {
+    @Override
+    public List<MatchInfoBase> getEgressMatchesForVpn(String vpnName) {
+        long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
+        if (vpnId == VpnConstants.INVALID_ID) {
+            LOG.warn("No VPN id found for {}", vpnName);
+            return Collections.emptyList();
+        }
+
+        return Collections
+                .singletonList(new NxMatchRegister(VpnConstants.VPN_REG_ID, vpnId, MetaDataUtil.getVpnIdMaskForReg()));
+    }
+
+    private void installArpResponderFlowsToExternalNetworkIp(String macAddress, BigInteger dpnId,
+            String extInterfaceName, Integer lportTag, long vpnId, String fixedIp, WriteTransaction writeTx) {
         String flowId = ArpResponderUtil.getFlowID(lportTag, fixedIp);
         List<Instruction> instructions = ArpResponderUtil.getExtInterfaceInstructions(ifaceMgrRpcService,
                 extInterfaceName, fixedIp, macAddress);
@@ -287,4 +303,25 @@ public class VpnManagerImpl implements IVpnManager {
         return VpnUtil.getVpnId(dataBroker, vpnInstanceId.getValue());
     }
 
+    @Override
+    public void onSubnetAddedToVpn(Subnetmap subnetmap, boolean isBgpVpn, Long elanTag) {
+        vpnSubnetRouteHandler.onSubnetAddedToVpn(subnetmap, isBgpVpn, elanTag);
+    }
+
+    @Override
+    public void onSubnetDeletedFromVpn(Subnetmap subnetmap, boolean isBgpVpn) {
+        vpnSubnetRouteHandler.onSubnetDeletedFromVpn(subnetmap, isBgpVpn);
+    }
+
+    public VpnInstance getVpnInstance(DataBroker broker, String vpnInstanceName) {
+        return VpnUtil.getVpnInstance(broker, vpnInstanceName);
+    }
+
+    public String getVpnRd(DataBroker broker, String vpnName) {
+        return VpnUtil.getVpnRd(broker, vpnName);
+    }
+
+    public VpnPortipToPort getNeutronPortFromVpnPortFixedIp(DataBroker broker, String vpnName, String fixedIp) {
+        return VpnUtil.getNeutronPortFromVpnPortFixedIp(broker, vpnName, fixedIp);
+    }
 }