*/
package org.opendaylight.ovsdb.hwvtepsouthbound;
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-
-public class HwvtepSouthboundProvider implements AutoCloseable {
+public class HwvtepSouthboundProvider implements ClusteredDataTreeChangeListener<Topology>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(HwvtepSouthboundProvider.class);
private static final String ENTITY_TYPE = "ovsdb-hwvtepsouthbound-provider";
private HwvtepsbPluginInstanceEntityOwnershipListener providerOwnershipChangeListener;
private HwvtepDataChangeListener hwvtepDTListener;
private HwvtepReconciliationManager hwvtepReconciliationManager;
+ private AtomicBoolean registered = new AtomicBoolean(false);
+ private ListenerRegistration<HwvtepSouthboundProvider> operTopologyRegistration;
public HwvtepSouthboundProvider(final DataBroker dataBroker,
final EntityOwnershipService entityOwnershipServiceDependency,
try {
Optional<EntityOwnershipState> ownershipStateOpt = entityOwnershipService.getOwnershipState(instanceEntity);
registration = entityOwnershipService.registerCandidate(instanceEntity);
- if (ownershipStateOpt.isPresent()) {
- EntityOwnershipState ownershipState = ownershipStateOpt.get();
- if (ownershipState.hasOwner() && !ownershipState.isOwner()) {
- ovsdbConnection.registerConnectionListener(cm);
- ovsdbConnection.startOvsdbManager();
- }
- }
} catch (CandidateAlreadyRegisteredException e) {
LOG.warn("HWVTEP Southbound Provider instance entity {} was already "
+ "registered for ownership", instanceEntity, e);
}
+ InstanceIdentifier<Topology> path = InstanceIdentifier
+ .create(NetworkTopology.class)
+ .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
+ DataTreeIdentifier<Topology> treeId =
+ new DataTreeIdentifier<Topology>(LogicalDatastoreType.OPERATIONAL, path);
+
+ LOG.trace("Registering listener for path {}", treeId);
+ operTopologyRegistration = db.registerDataTreeChangeListener(treeId, this);
}
@Override
hwvtepDTListener.close();
hwvtepDTListener = null;
}
+ if (operTopologyRegistration != null) {
+ operTopologyRegistration.close();
+ operTopologyRegistration = null;
+ }
}
private void initializeHwvtepTopology(LogicalDatastoreType type) {
} else {
LOG.info("*This* instance of HWVTEP southbound provider is set as a SLAVE instance");
}
- ovsdbConnection.registerConnectionListener(cm);
- ovsdbConnection.startOvsdbManager();
+ }
+
+
+ @Override
+ public void onDataTreeChanged(Collection<DataTreeModification<Topology>> collection) {
+ if (!registered.getAndSet(true)) {
+ LOG.info("Starting the ovsdb port");
+ ovsdbConnection.registerConnectionListener(cm);
+ ovsdbConnection.startOvsdbManager();
+ }
+ //mdsal registration/deregistration in mdsal update callback should be avoided
+ new Thread(() -> {
+ if (operTopologyRegistration != null) {
+ operTopologyRegistration.close();
+ operTopologyRegistration = null;
+ }
+ }).start();
}
private class HwvtepsbPluginInstanceEntityOwnershipListener implements EntityOwnershipListener {
import com.google.common.base.Optional;
import com.google.common.util.concurrent.CheckedFuture;
+
+import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class SouthboundProvider implements AutoCloseable {
+public class SouthboundProvider implements ClusteredDataTreeChangeListener<Topology>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(SouthboundProvider.class);
private static final String ENTITY_TYPE = "ovsdb-southbound-provider";
private final OvsdbConnection ovsdbConnection;
private final InstanceIdentifierCodec instanceIdentifierCodec;
private static final String SKIP_MONITORING_MANAGER_STATUS_PARAM = "skip-monitoring-manager-status";
+ private AtomicBoolean registered = new AtomicBoolean(false);
+ private ListenerRegistration<SouthboundProvider> operTopologyRegistration;
public SouthboundProvider(final DataBroker dataBroker,
final EntityOwnershipService entityOwnershipServiceDependency,
try {
Optional<EntityOwnershipState> ownershipStateOpt = entityOwnershipService.getOwnershipState(instanceEntity);
registration = entityOwnershipService.registerCandidate(instanceEntity);
- if (ownershipStateOpt.isPresent()) {
- EntityOwnershipState ownershipState = ownershipStateOpt.get();
- if (ownershipState.hasOwner() && !ownershipState.isOwner()) {
- ovsdbConnection.registerConnectionListener(cm);
- ovsdbConnection.startOvsdbManager();
- LOG.info("*This* instance of OVSDB southbound provider is set as a SLAVE instance");
- }
- }
} catch (CandidateAlreadyRegisteredException e) {
LOG.warn("OVSDB Southbound Provider instance entity {} was already "
+ "registered for ownership", instanceEntity, e);
}
+ InstanceIdentifier<Topology> path = InstanceIdentifier
+ .create(NetworkTopology.class)
+ .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID));
+ DataTreeIdentifier<Topology> treeId =
+ new DataTreeIdentifier<Topology>(LogicalDatastoreType.OPERATIONAL, path);
+
+ LOG.trace("Registering listener for path {}", treeId);
+ operTopologyRegistration = db.registerDataTreeChangeListener(treeId, this);
}
@Override
ovsdbDataTreeChangeListener.close();
registration.close();
providerOwnershipChangeListener.close();
+ if (operTopologyRegistration != null) {
+ operTopologyRegistration.close();
+ operTopologyRegistration = null;
+ }
}
private void initializeOvsdbTopology(LogicalDatastoreType type) {
} else {
LOG.info("*This* instance of OVSDB southbound provider is set as a SLAVE instance");
}
- ovsdbConnection.registerConnectionListener(cm);
- ovsdbConnection.startOvsdbManager();
+ }
+
+ @Override
+ public void onDataTreeChanged(Collection<DataTreeModification<Topology>> collection) {
+ if (!registered.getAndSet(true)) {
+ LOG.info("Starting the ovsdb port");
+ ovsdbConnection.registerConnectionListener(cm);
+ ovsdbConnection.startOvsdbManager();
+ //mdsal registration/deregistration in mdsal update callback should be avoided
+ new Thread(() -> {
+ if (operTopologyRegistration != null) {
+ operTopologyRegistration.close();
+ operTopologyRegistration = null;
+ }
+ }).start();
+ }
}
private class SouthboundPluginInstanceEntityOwnershipListener implements EntityOwnershipListener {