OF port deletion complete implementation
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / cache / OfTepStateCache.java
index e89e94d6584e9317d1481ba49a75bee93c186798..1fbed8d9e3f9cd3360db596bb67087b613953d49 100644 (file)
@@ -14,11 +14,17 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
 import org.opendaylight.genius.itm.servicebinding.BindServiceUtils;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.cache.DataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.OfTepsState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.of.teps.state.OfTep;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.of.teps.state.OfTepKey;
@@ -31,22 +37,45 @@ import org.slf4j.LoggerFactory;
 public class OfTepStateCache extends DataObjectCache<String, OfTep> {
 
     private final ManagedNewTransactionRunner txRunner;
+    private final IInterfaceManager interfaceManager;
+    private final DirectTunnelUtils directTunnelUtils;
     List<ListenableFuture<Void>> futures = new ArrayList<>();
     private static final Logger LOG = LoggerFactory.getLogger(OfTepStateCache.class);
 
     @Inject
-    public OfTepStateCache(DataBroker dataBroker, CacheProvider cacheProvider) {
+    public OfTepStateCache(DataBroker dataBroker, CacheProvider cacheProvider,
+                           IInterfaceManager interfaceManager, DirectTunnelUtils directTunnelUtils) {
         super(OfTep.class, dataBroker, LogicalDatastoreType.OPERATIONAL,
             InstanceIdentifier.builder(OfTepsState.class).child(OfTep.class).build(), cacheProvider,
             (iid, ofTepList) -> ofTepList.getOfPortName(), ofPortName -> InstanceIdentifier.builder(OfTepsState.class)
                     .child(OfTep.class, new OfTepKey(ofPortName)).build());
+        this.interfaceManager = interfaceManager;
+        this.directTunnelUtils = directTunnelUtils;
         this.txRunner =  new ManagedNewTransactionRunnerImpl(dataBroker);
     }
 
     protected void added(InstanceIdentifier<OfTep> path, OfTep ofTep) {
-        LOG.info("Binding default egress dispatcher service for{}", ofTep.getOfPortName());
-        BindServiceUtils.bindDefaultEgressDispatcherService(txRunner, futures, "VXLAN_TRUNK_INTERFACE",
-                String.valueOf(ofTep.getPortNumber()), ofTep.getOfPortName(),
-                ofTep.getIfIndex());
+        LOG.debug("Adding interface name to internal cache.");
+        List<String> childLowerLayerIfList = new ArrayList<>();
+        String lowref = MDSALUtil.NODE_PREFIX + MDSALUtil.SEPARATOR + ofTep.getSourceDpnId()
+                + MDSALUtil.SEPARATOR + ofTep.getPortNumber();
+        childLowerLayerIfList.add(0, lowref);
+        InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setIfIndex(ofTep.getIfIndex().intValue())
+                .withKey(new InterfaceKey(ofTep.getOfPortName()))
+                .setLowerLayerIf(childLowerLayerIfList).setType(Tunnel.class)
+                .setName(ofTep.getOfPortName());
+        interfaceManager.addInternalTunnelToCache(ofTep.getOfPortName(), ifaceBuilder.build());
+
+        if (directTunnelUtils.isEntityOwner()) {
+            LOG.info("Binding default egress dispatcher service for{}", ofTep.getOfPortName());
+            BindServiceUtils.bindDefaultEgressDispatcherService(txRunner, futures, "VXLAN_TRUNK_INTERFACE",
+                    String.valueOf(ofTep.getPortNumber()), ofTep.getOfPortName(),
+                    ofTep.getIfIndex());
+        }
+    }
+
+    protected void removed(InstanceIdentifier<OfTep> path, OfTep ofTep) {
+        BindServiceUtils.unbindService(futures, txRunner, ofTep.getOfPortName());
+        interfaceManager.removeInternalTunnelFromCache(ofTep.getOfPortName());
     }
 }