GENIUS-145: Creation of OFPort on ITM Direct Tunnels. 44/79844/22
authorDimple Jain <dimple.jain@ericsson.com>
Wed, 23 Jan 2019 11:01:14 +0000 (16:31 +0530)
committerFaseela K <faseela.k@ericsson.com>
Tue, 7 May 2019 05:45:08 +0000 (05:45 +0000)
Change-Id: Ic6d229f22eb540b4859d61450b5b3f53cee9faaa
Signed-off-by: Dimple Jain <dimple.jain@ericsson.com>
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/OfEndPointCache.java [new file with mode: 0644]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmInternalTunnelAddWorker.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/renderer/ovs/utilities/DirectTunnelUtils.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/listeners/TransportZoneListener.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/recovery/impl/ItmTepInstanceRecoveryHandler.java
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/impl/ItmInternalTunnelAddTest.java

diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/OfEndPointCache.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/OfEndPointCache.java
new file mode 100644 (file)
index 0000000..685b6da
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019 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,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.cache;
+
+import java.math.BigInteger;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import javax.inject.Singleton;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Singleton
+public class OfEndPointCache {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OfEndPointCache.class);
+
+    private final ConcurrentMap<BigInteger, String> ofEndPtMap =
+            new ConcurrentHashMap<>();
+
+    public void add(BigInteger dpnId, String ofTunnelName) {
+        ofEndPtMap.put(dpnId, ofTunnelName);
+    }
+
+    public String get(BigInteger dpnId) {
+        return ofEndPtMap.get(dpnId);
+    }
+
+    public String remove(BigInteger dpnId) {
+        return ofEndPtMap.remove(dpnId);
+    }
+
+    public Set<BigInteger> getAll() {
+        return ofEndPtMap.keySet();
+    }
+}
\ No newline at end of file
index 1dbf2f4dcb15c76802aa4444102733f801a24b0e..ed888054936903d5357104410498c361579f3752 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.itm.impl.ITMBatchingUtils;
@@ -87,12 +88,14 @@ public final class ItmInternalTunnelAddWorker {
     private final DirectTunnelUtils directTunnelUtils;
     private final IInterfaceManager interfaceManager;
     private final OvsBridgeRefEntryCache ovsBridgeRefEntryCache;
+    private final OfEndPointCache ofEndPointCache;
 
     public ItmInternalTunnelAddWorker(DataBroker dataBroker, JobCoordinator jobCoordinator,
                                       TunnelMonitoringConfig tunnelMonitoringConfig, ItmConfig itmCfg,
                                       DirectTunnelUtils directTunnelUtil,
                                       IInterfaceManager interfaceManager,
-                                      OvsBridgeRefEntryCache ovsBridgeRefEntryCache) {
+                                      OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
+                                      OfEndPointCache ofEndPointCache) {
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.jobCoordinator = jobCoordinator;
@@ -100,6 +103,7 @@ public final class ItmInternalTunnelAddWorker {
         this.directTunnelUtils = directTunnelUtil;
         this.interfaceManager = interfaceManager;
         this.ovsBridgeRefEntryCache = ovsBridgeRefEntryCache;
+        this.ofEndPointCache = ofEndPointCache;
 
         isTunnelMonitoringEnabled = tunnelMonitoringConfig.isTunnelMonitoringEnabled();
         monitorProtocol = tunnelMonitoringConfig.getMonitorProtocol();
@@ -342,9 +346,15 @@ public final class ItmInternalTunnelAddWorker {
         final DpnsTepsBuilder dpnsTepsBuilder = new DpnsTepsBuilder();
         final List<DpnsTeps> dpnTeps = new ArrayList<>();
         final List<RemoteDpns> remoteDpns = new ArrayList<>();
+        String ofTunnelPortName = null;
         dpnsTepsBuilder.withKey(new DpnsTepsKey(srcDpnId));
         dpnsTepsBuilder.setTunnelType(srcte.getTunnelType());
         dpnsTepsBuilder.setSourceDpnId(srcDpnId);
+        if (itmCfg.isUseOfTunnels()) {
+            String tunnelType = ItmUtils.convertTunnelTypetoString(srcte.getTunnelType());
+            ofTunnelPortName = directTunnelUtils.generateOfPortName(srcDpnId, tunnelType);
+            dpnsTepsBuilder.setOfTunnel(ofTunnelPortName);
+        }
 
         RemoteDpnsBuilder remoteDpn = new RemoteDpnsBuilder();
         remoteDpn.withKey(new RemoteDpnsKey(dstDpnId));
@@ -358,7 +368,7 @@ public final class ItmInternalTunnelAddWorker {
         dpnTeps.add(dpnsTepsBuilder.build());
         dpnTepsStateBuilder.setDpnsTeps(dpnTeps);
         updateDpnTepInterfaceInfoToConfig(dpnTepsStateBuilder.build());
-        addTunnelConfiguration(iface);
+        addTunnelConfiguration(iface, ofTunnelPortName);
     }
 
     private static void updateDpnTepInterfaceInfoToConfig(DpnTepsState dpnTeps) {
@@ -367,7 +377,8 @@ public final class ItmInternalTunnelAddWorker {
         ITMBatchingUtils.update(dpnTepsII, dpnTeps, ITMBatchingUtils.EntityType.DEFAULT_CONFIG);
     }
 
-    private void addTunnelConfiguration(Interface iface) throws ReadFailedException {
+    private void addTunnelConfiguration(Interface iface, String ofTunnelPortName)
+                                                                throws ReadFailedException {
         // ITM Direct Tunnels This transaction is not being used -- CHECK
         ParentRefs parentRefs = iface.augmentation(ParentRefs.class);
         if (parentRefs == null) {
@@ -382,20 +393,24 @@ public final class ItmInternalTunnelAddWorker {
                     iface.getName());
             return;
         }
-
-        LOG.info("adding tunnel configuration for {}", iface.getName());
-        LOG.debug("creating bridge interfaceEntry in ConfigDS {}", dpId);
-        DirectTunnelUtils.createBridgeTunnelEntryInConfigDS(dpId, iface.getName());
-
+        String tunnelName = ofTunnelPortName != null ? ofTunnelPortName : iface.getName();
         // create bridge on switch, if switch is connected
         Optional<OvsBridgeRefEntry> ovsBridgeRefEntry = ovsBridgeRefEntryCache.get(dpId);
-
-        if (ovsBridgeRefEntry.isPresent()) {
-            LOG.debug("creating bridge interface on dpn {}", dpId);
-            InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
-                    (InstanceIdentifier<OvsdbBridgeAugmentation>) ovsBridgeRefEntry.get()
-                            .getOvsBridgeReference().getValue();
-            addPortToBridge(bridgeIid, iface, iface.getName());
+        LOG.info("adding tunnel port configuration for tunnelName: {}", tunnelName);
+        if (createTunnelPort(dpId)) {
+            LOG.debug("creating dpn tunnel mapping  for dpn: {} tunnelName: {}", dpId, tunnelName);
+            DirectTunnelUtils.createBridgeTunnelEntryInConfigDS(dpId, tunnelName);
+            if (ofTunnelPortName != null) {
+                ofEndPointCache.add(dpId, tunnelName);
+            }
+            if (ovsBridgeRefEntry.isPresent()) {
+                LOG.debug("creating bridge interface on dpn {}", dpId);
+                InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
+                        (InstanceIdentifier<OvsdbBridgeAugmentation>) ovsBridgeRefEntry.get()
+                                .getOvsBridgeReference().getValue();
+                LOG.debug("adding port to the bridge:{} tunnelName: {}", bridgeIid, tunnelName);
+                addPortToBridge(bridgeIid, iface, tunnelName);
+            }
         }
     }
 
@@ -405,4 +420,11 @@ public final class ItmInternalTunnelAddWorker {
             directTunnelUtils.addTunnelPortToBridge(ifTunnel, bridgeIid, iface, portName);
         }
     }
+
+    private boolean createTunnelPort(BigInteger dpId) {
+        if (!itmCfg.isUseOfTunnels()) {
+            return true;
+        }
+        return (ofEndPointCache.get(dpId) == null);
+    }
 }
index b74e65a5da718e5756283f11193178944d35b559..78a26102ab983f1c68dc32d556ee833c49e15d8f 100644 (file)
@@ -11,11 +11,13 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
@@ -497,7 +499,9 @@ public final class DirectTunnelUtils {
             tpAugmentationBuilder.setVlanTag(new VlanId(vlanId));
         }
 
-        if (ifTunnel.isMonitorEnabled()
+        if (itmConfig.isUseOfTunnels()) {
+            LOG.warn("BFD Monitoring not supported for OFTunnels");
+        } else if (ifTunnel.isMonitorEnabled()
                 && TunnelMonitoringTypeBfd.class.isAssignableFrom(ifTunnel.getMonitorProtocol())) { //checkBfdMonEnabled
             List<InterfaceBfd> bfdParams = DirectTunnelUtils.getBfdParams(ifTunnel);
             tpAugmentationBuilder.setInterfaceBfd(bfdParams);
@@ -575,4 +579,11 @@ public final class DirectTunnelUtils {
     public boolean isEntityOwner() {
         return entityOwnershipUtils.isEntityOwner(ITMConstants.ITM_CONFIG_ENTITY, ITMConstants.ITM_CONFIG_ENTITY);
     }
+
+    public static String generateOfPortName(BigInteger dpId, String tunnelType) {
+        String trunkInterfaceName = String.format("%s:%s", dpId.toString(), tunnelType);
+        String uuidStr = UUID.nameUUIDFromBytes(trunkInterfaceName.getBytes(StandardCharsets.UTF_8)).toString()
+                .substring(0, 12).replace("-", "");
+        return String.format("%s%s", "of", uuidStr);
+    }
 }
\ No newline at end of file
index 2137e5f0476cd22fef17bccb757832da56f01047..5d1023d94dd08622a20e31a023ae0c18d42ba6ee 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
 import org.opendaylight.genius.itm.cache.DpnTepStateCache;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.cache.TunnelStateCache;
@@ -109,6 +110,7 @@ public class TransportZoneListener extends AbstractSyncDataTreeChangeListener<Tr
                                  final DpnTepStateCache dpnTepStateCache, final OvsBridgeEntryCache ovsBridgeEntryCache,
                                  final OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
                                  final IInterfaceManager interfaceManager,
+                                 final OfEndPointCache ofEndPointCache,
                                  final ServiceRecoveryRegistry serviceRecoveryRegistry) {
         super(dataBroker, LogicalDatastoreType.CONFIGURATION,
               InstanceIdentifier.create(TransportZones.class).child(TransportZone.class));
@@ -123,7 +125,8 @@ public class TransportZoneListener extends AbstractSyncDataTreeChangeListener<Tr
                 tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
                 ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
         this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
-                tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager, ovsBridgeRefEntryCache);
+                tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
+                ovsBridgeRefEntryCache, ofEndPointCache);
         this.externalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig, dpnTEPsInfoCache);
         serviceRecoveryRegistry.addRecoverableListener(ItmServiceRecoveryHandler.getServiceRegistryKey(), this);
     }
index 929ec4347a912417cdaaec342af25acab3b543d5..9ed83d0511e1bca18d96a152baf307597bfce38e 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
 import org.opendaylight.genius.itm.cache.DpnTepStateCache;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.cache.TunnelStateCache;
@@ -85,6 +86,7 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
                                          IInterfaceManager interfaceManager,
                                          ServiceRecoveryRegistry serviceRecoveryRegistry,
                                          EntityOwnershipUtils entityOwnershipUtils,
+                                         OfEndPointCache ofEndPointCache,
                                          DataTreeEventCallbackRegistrar eventCallbacks) {
         this.dataBroker = dataBroker;
         this.itmConfig = itmConfig;
@@ -95,8 +97,10 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
         this.eventCallbacks = eventCallbacks;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
-                tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager, ovsBridgeRefEntryCache);
-        this.itmExternalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig, dpntePsInfoCache);
+                tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
+                ovsBridgeRefEntryCache, ofEndPointCache);
+        this.itmExternalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig,
+                dpntePsInfoCache);
         this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
                 tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
                 ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
index 4908e4b61cb2e392ce2a571ad7ed957c0a50be5d..5dc9c1bc7ca21fb6dcfc4a88a58bb8b9465b6639 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.confighelpers.ItmInternalTunnelAddWorker;
 import org.opendaylight.genius.itm.globals.ITMConstants;
@@ -190,8 +191,9 @@ public class ItmInternalTunnelAddTest {
         directTunnelUtils = new DirectTunnelUtils(idManagerService, mdsalApiManager, entityOwnershipUtils, itmConfig);
         itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
                 new TunnelMonitoringConfig(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
-                itmConfig, directTunnelUtils, interfaceManager, new OvsBridgeRefEntryCache(dataBroker,
-                new GuavaCacheProvider(new CacheManagersRegistryImpl())));
+                itmConfig, directTunnelUtils, interfaceManager,
+                new OvsBridgeRefEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
+                new OfEndPointCache());
     }
 
     @After