import org.slf4j.LoggerFactory;
public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoCloseable {
-
- private final ConcurrentMap<ConnectionInfo, OvsdbConnectionInstance> clients = new ConcurrentHashMap<>();
private static final Logger LOG = LoggerFactory.getLogger(OvsdbConnectionManager.class);
private static final String ENTITY_TYPE = "ovsdb";
private static final int DB_FETCH_TIMEOUT = 1000;
- private final DataBroker db;
- private final TransactionInvoker txInvoker;
- private final Map<OvsdbClient, OvsdbClient> alreadyProcessedClients = new ConcurrentHashMap<>();
- private final Map<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers =
- new ConcurrentHashMap<>();
- private final Map<InstanceIdentifier<Node>, OvsdbConnectionInstance> nodeIdVsConnectionInstance =
+ private final ConcurrentMap<ConnectionInfo, OvsdbConnectionInstance> clients = new ConcurrentHashMap<>();
+ private final ConcurrentMap<OvsdbClient, OvsdbClient> alreadyProcessedClients = new ConcurrentHashMap<>();
+ private final ConcurrentMap<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers =
new ConcurrentHashMap<>();
- private final Map<Entity, OvsdbConnectionInstance> entityConnectionMap =
+ private final ConcurrentMap<InstanceIdentifier<Node>, OvsdbConnectionInstance> nodeIdVsConnectionInstance =
new ConcurrentHashMap<>();
+ private final ConcurrentMap<Entity, OvsdbConnectionInstance> entityConnectionMap = new ConcurrentHashMap<>();
+ private final DataBroker db;
+ private final TransactionInvoker txInvoker;
private final EntityOwnershipService entityOwnershipService;
private final OvsdbDeviceEntityOwnershipListener ovsdbDeviceEntityOwnershipListener;
private final OvsdbConnection ovsdbConnection;
public OvsdbConnectionManager(final DataBroker db,final TransactionInvoker txInvoker,
final EntityOwnershipService entityOwnershipService,
final OvsdbConnection ovsdbConnection,
- final InstanceIdentifierCodec instanceIdentifierCodec) {
+ final InstanceIdentifierCodec instanceIdentifierCodec,
+ final List<String> reconcileBridgeInclusionList,
+ final List<String> reconcileBridgeExclusionList) {
this.db = db;
this.txInvoker = txInvoker;
this.entityOwnershipService = entityOwnershipService;
ovsdbDeviceEntityOwnershipListener = new OvsdbDeviceEntityOwnershipListener(this, entityOwnershipService);
this.ovsdbConnection = ovsdbConnection;
- reconciliationManager = new ReconciliationManager(db, instanceIdentifierCodec);
+ reconciliationManager = new ReconciliationManager(db, instanceIdentifierCodec,
+ reconcileBridgeInclusionList, reconcileBridgeExclusionList);
this.instanceIdentifierCodec = instanceIdentifierCodec;
}
}
private void reconcileBridgeConfigurations(final OvsdbConnectionInstance client) {
- final InstanceIdentifier<Node> nodeIid = client.getInstanceIdentifier();
- final ReconciliationTask task = new BridgeConfigReconciliationTask(
- reconciliationManager, OvsdbConnectionManager.this, nodeIid, client, instanceIdentifierCodec);
-
- reconciliationManager.enqueue(task);
+ reconciliationManager.enqueue(new BridgeConfigReconciliationTask(reconciliationManager, this,
+ client.getInstanceIdentifier(), client, instanceIdentifierCodec));
}
private static final class OvsdbDeviceEntityOwnershipListener implements EntityOwnershipListener {
private static final Logger LOG = LoggerFactory.getLogger(SouthboundProvider.class);
private static final String ENTITY_TYPE = "ovsdb-southbound-provider";
- // FIXME: get rid of this static
- private static List<String> reconcileBridgeInclusionList = List.of();
- // FIXME: get rid of this static
- private static List<String> reconcileBridgeExclusionList = List.of();
-
- public static List<String> getBridgesReconciliationInclusionList() {
- return reconcileBridgeInclusionList;
- }
-
- public static List<String> getBridgesReconciliationExclusionList() {
- return reconcileBridgeExclusionList;
- }
-
- @VisibleForTesting
- @SuppressFBWarnings("EI_EXPOSE_STATIC_REP2")
- public static void setBridgesReconciliationInclusionList(final List<String> list) {
- reconcileBridgeInclusionList = list;
- }
-
private final OvsdbConnectionManager cm;
private final TransactionInvoker txInvoker;
private final OvsdbDataTreeChangeListener ovsdbDataTreeChangeListener;
List.of(configuration.bridge$_$reconciliation$_$exclusion$_$list()));
}
- @SuppressFBWarnings(
- value = { "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" },
- justification = "This is not a final class due to deep mocking. There is a FIXME for the static wiring above")
+ @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
+ justification = "This is not a final class due to deep mocking")
public SouthboundProvider(final DataBroker dataBroker,
final EntityOwnershipService entityOwnershipServiceDependency,
final OvsdbConnection ovsdbConnection,
final SystemReadyMonitor systemReadyMonitor,
final DiagStatusService diagStatusService,
final boolean skipMonitoringManagerStatus,
- final List<String> bridgeReconciliationInclusions,
- final List<String> bridgeReconciliationExclusions) {
+ final List<String> bridgeReconciliationInclusionList,
+ final List<String> bridgeReconciliationExclusionList) {
this.dataBroker = requireNonNull(dataBroker);
- // FIXME: get rid of this static wiring
- reconcileBridgeInclusionList = bridgeReconciliationInclusions;
- reconcileBridgeExclusionList = bridgeReconciliationExclusions;
LOG.debug("skipManagerStatus set to {}", skipMonitoringManagerStatus);
if (skipMonitoringManagerStatus) {
SouthboundConstants.SKIP_COLUMN_FROM_TABLE.get("Manager").add("status");
ovsdbStatusProvider.reportStatus(ServiceState.STARTING, "OVSDB initialization in progress");
txInvoker = new TransactionInvokerImpl(dataBroker);
cm = new OvsdbConnectionManager(dataBroker, txInvoker, entityOwnershipService, ovsdbConnection,
- instanceIdentifierCodec);
+ instanceIdentifierCodec, bridgeReconciliationInclusionList, bridgeReconciliationExclusionList);
ovsdbDataTreeChangeListener = new OvsdbDataTreeChangeListener(dataBroker, cm, instanceIdentifierCodec);
ovsdbOperGlobalListener = new OvsdbOperGlobalListener(dataBroker, cm, txInvoker);
private Registration bridgeCreatedDataTreeChangeRegistration = null;
private final ReconciliationTaskManager reconTaskManager = new ReconciliationTaskManager();
+ private final List<String> reconcileBridgeInclusionList;
+ private final List<String> reconcileBridgeExclusionList;
- public ReconciliationManager(final DataBroker db, final InstanceIdentifierCodec instanceIdentifierCodec) {
+ public ReconciliationManager(final DataBroker db, final InstanceIdentifierCodec instanceIdentifierCodec,
+ final List<String> reconcileBridgeInclusionList, final List<String> reconcileBridgeExclusionList) {
this.db = db;
this.instanceIdentifierCodec = instanceIdentifierCodec;
+ this.reconcileBridgeInclusionList = List.copyOf(reconcileBridgeInclusionList);
+ this.reconcileBridgeExclusionList = List.copyOf(reconcileBridgeExclusionList);
+
reconcilers = SpecialExecutors.newBoundedCachedThreadPool(NO_OF_RECONCILER, RECON_TASK_QUEUE_SIZE,
"ovsdb-reconciler", getClass());
bridgeNodeCache = buildBridgeNodeCache();
}
+ public List<String> getBridgesReconciliationInclusionList() {
+ return reconcileBridgeInclusionList;
+ }
+
+ public List<String> getBridgesReconciliationExclusionList() {
+ return reconcileBridgeExclusionList;
+ }
+
public boolean isEnqueued(final ReconciliationTask task) {
return reconTaskManager.isTaskQueued(task);
}
import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
import org.opendaylight.ovsdb.southbound.SouthboundConstants;
import org.opendaylight.ovsdb.southbound.SouthboundMapper;
-import org.opendaylight.ovsdb.southbound.SouthboundProvider;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.BridgeOperationalState;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangeEvent;
import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangesManagedByOvsdbNodeEvent;
@Override
public boolean reconcileConfiguration(final OvsdbConnectionManager connectionManagerOfDevice) {
-
String nodeIdVal = nodeIid.firstKeyOf(Node.class).getNodeId().getValue();
List<String> bridgeReconcileIncludeList = getNodeIdForBridges(nodeIdVal,
- SouthboundProvider.getBridgesReconciliationInclusionList());
+ reconciliationManager.getBridgesReconciliationInclusionList());
List<String> bridgeReconcileExcludeList = getNodeIdForBridges(nodeIdVal,
- SouthboundProvider.getBridgesReconciliationExclusionList());
+ reconciliationManager.getBridgesReconciliationExclusionList());
LOG.trace("bridgeReconcileIncludeList : {}", bridgeReconcileIncludeList);
LOG.trace("bridgeReconcileExcludeList : {}", bridgeReconcileExcludeList);
// wildcard on node id (ie: ovsdb://uuid/<device uuid>/bridge/*) r attributes
readTopologyFuture = tx.read(LogicalDatastoreType.CONFIGURATION, topologyInstanceIdentifier);
}
- readTopologyFuture.addCallback(new FutureCallback<Optional<Topology>>() {
+ readTopologyFuture.addCallback(new FutureCallback<>() {
@Override
- public void onSuccess(@Nullable final Optional<Topology> optionalTopology) {
+ public void onSuccess(final Optional<Topology> optionalTopology) {
if (optionalTopology != null && optionalTopology.isPresent()) {
Map<NodeKey, Node> nodes = optionalTopology.orElseThrow().getNode();
if (nodes != null) {
import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.Futures;
import java.net.InetAddress;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
field(OvsdbConnectionManager.class, "entityOwnershipService").set(ovsdbConnManager, entityOwnershipService);
field(OvsdbConnectionManager.class, "reconciliationManager").set(ovsdbConnManager, reconciliationManager);
field(OvsdbConnectionManager.class, "ovsdbConnection").set(ovsdbConnManager, ovsdbConnection);
- field(OvsdbConnectionManager.class, "alreadyProcessedClients").set(ovsdbConnManager, new HashMap<>());
+ field(OvsdbConnectionManager.class, "alreadyProcessedClients").set(ovsdbConnManager, new ConcurrentHashMap<>());
entityConnectionMap = new ConcurrentHashMap<>();
OvsdbConnectionInfo info = mock(OvsdbConnectionInfo.class);
OvsdbConnectionInstance.class));
instanceIdentifiers = new ConcurrentHashMap<>();
field(OvsdbConnectionManager.class, "instanceIdentifiers").set(ovsdbConnManager, instanceIdentifiers);
- field(OvsdbConnectionManager.class, "nodeIdVsConnectionInstance").set(ovsdbConnManager, new HashMap<>());
+ field(OvsdbConnectionManager.class, "nodeIdVsConnectionInstance").set(ovsdbConnManager,
+ new ConcurrentHashMap<>());
MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "reconcileConnection",
InstanceIdentifier.class, OvsdbNodeAugmentation.class));
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.List;
import java.util.concurrent.ExecutionException;
import org.junit.Before;
import org.junit.Test;
InstanceIdentifierCodec instanceIdentifierCodec = mock(InstanceIdentifierCodec.class);
listener = new OvsdbDataTreeChangeListener(dataBroker,
new OvsdbConnectionManager(dataBroker, new TransactionInvokerImpl(dataBroker), entityOwnershipService,
- ovsdbConnection, instanceIdentifierCodec), instanceIdentifierCodec);
+ ovsdbConnection, instanceIdentifierCodec, List.of(), List.of()), instanceIdentifierCodec);
}
@Test
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.ReadTransaction;
NodeKey nodeKey = new NodeKey(new NodeId(new Uri(NODE_ID)));
iid = SouthboundMapper.createInstanceIdentifier(nodeKey.getNodeId());
- SouthboundProvider.setBridgesReconciliationInclusionList(List.of(BR_INT));
Node brIntNode = createBridgeNode(NODE_ID + "/bridge/" + BR_INT);
when(reconciliationManager.getDb()).thenReturn(db);
+ when(reconciliationManager.getBridgesReconciliationInclusionList()).thenReturn(List.of(BR_INT));
ReadTransaction tx = mock(ReadTransaction.class);
- Mockito.when(db.newReadOnlyTransaction()).thenReturn(tx);
- Mockito.when(tx.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class)))
+ when(db.newReadOnlyTransaction()).thenReturn(tx);
+ when(tx.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class)))
.thenReturn(FluentFutures.immediateFluentFuture(Optional.of(brIntNode)));
when(topology.getNode()).thenReturn(Map.of(brIntNode.key(), brIntNode));
- configurationReconciliationTask =
- new BridgeConfigReconciliationTask(reconciliationManager, ovsdbConnectionManager, iid,
- ovsdbConnectionInstance, mock(InstanceIdentifierCodec.class));
+ configurationReconciliationTask = new BridgeConfigReconciliationTask(reconciliationManager,
+ ovsdbConnectionManager, iid, ovsdbConnectionInstance, mock(InstanceIdentifierCodec.class));
}
@Test