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;
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());
}
}