<type>pom</type>
<scope>import</scope>
</dependency>
- <dependency>
- <groupId>org.opendaylight.serviceutils</groupId>
- <artifactId>serviceutils-artifacts</artifactId>
- <version>0.11.0-SNAPSHOT</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
</dependencies>
</dependencyManagement>
<name>ODL :: ovsdb :: ${project.artifactId}</name>
<dependencies>
- <dependency>
- <groupId>org.opendaylight.serviceutils</groupId>
- <artifactId>odl-serviceutils-tools</artifactId>
- <version>0.11.0-SNAPSHOT</version>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-ovsdb-hwvtepsouthbound-api</artifactId>
<artifactId>jakarta.annotation-api</artifactId>
<optional>true</optional>
</dependency>
- <dependency>
- <groupId>org.opendaylight.serviceutils</groupId>
- <artifactId>upgrade</artifactId>
- </dependency>
<dependency>
<groupId>org.apache.karaf.shell</groupId>
<artifactId>org.apache.karaf.shell.core</artifactId>
import org.opendaylight.ovsdb.lib.OvsdbConnection;
import org.opendaylight.ovsdb.utils.mdsal.utils.Scheduler;
import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
-import org.opendaylight.serviceutils.upgrade.UpgradeState;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
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;
private HwvtepReconciliationManager hwvtepReconciliationManager;
private final AtomicBoolean registered = new AtomicBoolean(false);
private ListenerRegistration<HwvtepSouthboundProvider> operTopologyRegistration;
- private final UpgradeState upgradeState;
@Inject
public HwvtepSouthboundProvider(final DataBroker dataBroker, final EntityOwnershipService entityOwnership,
final OvsdbConnection ovsdbConnection, final DOMSchemaService schemaService,
- final BindingNormalizedNodeSerializer serializer,
- final UpgradeState upgradeState) {
+ final BindingNormalizedNodeSerializer serializer) {
this.dataBroker = dataBroker;
- this.entityOwnershipService = entityOwnership;
+ entityOwnershipService = entityOwnership;
registration = null;
this.ovsdbConnection = ovsdbConnection;
- this.upgradeState = upgradeState;
// FIXME: eliminate this static wiring
HwvtepSouthboundUtil.setInstanceIdentifierCodec(new InstanceIdentifierCodec(schemaService, serializer));
LOG.info("HwvtepSouthboundProvider ovsdbConnectionService: {}", ovsdbConnection);
LOG.info("HwvtepSouthboundProvider Session Initiated");
txInvoker = new TransactionInvokerImpl(dataBroker);
cm = new HwvtepConnectionManager(dataBroker, txInvoker, entityOwnershipService, ovsdbConnection);
- registerConfigListenerPostUpgrade();
+ hwvtepDTListener = new HwvtepDataChangeListener(dataBroker, cm);
+ hwvtepReconciliationManager = new HwvtepReconciliationManager(dataBroker, cm);
//Register listener for entityOnwership changes
providerOwnershipChangeListener =
- new HwvtepsbPluginInstanceEntityOwnershipListener(this,this.entityOwnershipService);
+ new HwvtepsbPluginInstanceEntityOwnershipListener(this,entityOwnershipService);
//register instance entity to get the ownership of the provider
Entity instanceEntity = new Entity(ENTITY_TYPE, ENTITY_TYPE);
}, HwvtepSouthboundConstants.PORT_OPEN_MAX_DELAY_IN_MINS, TimeUnit.MINUTES);
}
- private void registerConfigListenerPostUpgrade() {
- if (upgradeState.isUpgradeInProgress()) {
- LOG.error("Upgrade is in progress delay config data change listener registration");
- Scheduler.getScheduledExecutorService().schedule(this::registerConfigListenerPostUpgrade,
- 60, TimeUnit.SECONDS);
- return;
- }
- hwvtepDTListener = new HwvtepDataChangeListener(dataBroker, cm);
- hwvtepReconciliationManager = new HwvtepReconciliationManager(dataBroker, cm);
- }
-
@Override
@PreDestroy
@SuppressWarnings("checkstyle:IllegalCatch")
}
public void close() {
- this.listenerRegistration.close();
+ listenerRegistration.close();
}
@Override
<reference id="dOMSchemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService"/>
<reference id="entityOwnershipService" interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService"/>
<reference id="ovsdbConnection" interface="org.opendaylight.ovsdb.lib.OvsdbConnection"/>
- <reference id="upgradeState" interface="org.opendaylight.serviceutils.upgrade.UpgradeState"/>
<bean id="hwvtepSouthboundProvider" class="org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundProvider" init-method="init" destroy-method="close">
<argument ref="dataBroker"/>
<argument ref="entityOwnershipService"/>
<argument ref="ovsdbConnection"/>
<argument ref="dOMSchemaService"/>
<argument ref="bindingNormalizedNodeSerializer"/>
- <argument ref="upgradeState"/>
</bean>
<service ref="hwvtepSouthboundProvider" interface="org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundProviderInfo"/>
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>org.opendaylight.serviceutils</groupId>
- <artifactId>odl-serviceutils-tools</artifactId>
- <version>0.11.0-SNAPSHOT</version>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>org.opendaylight.ovsdb</groupId>
<artifactId>odl-ovsdb-utils</artifactId>
<groupId>org.opendaylight.infrautils</groupId>
<artifactId>ready-api</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.serviceutils</groupId>
- <artifactId>upgrade</artifactId>
- </dependency>
<!-- external dependencies -->
<dependency>
<groupId>org.opendaylight.infrautils</groupId>
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.opendaylight.ovsdb.southbound.reconciliation.connection.ConnectionReconciliationTask;
import org.opendaylight.ovsdb.southbound.transactions.md.OvsdbNodeRemoveCommand;
import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
-import org.opendaylight.serviceutils.upgrade.UpgradeState;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAttributes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
public class OvsdbConnectionManager implements OvsdbConnectionListener, AutoCloseable {
- private final Map<ConnectionInfo, OvsdbConnectionInstance> clients =
- new ConcurrentHashMap<>();
+ 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 OvsdbConnection ovsdbConnection;
private final ReconciliationManager reconciliationManager;
private final InstanceIdentifierCodec instanceIdentifierCodec;
- private final UpgradeState upgradeState;
public OvsdbConnectionManager(final DataBroker db,final TransactionInvoker txInvoker,
final EntityOwnershipService entityOwnershipService,
final OvsdbConnection ovsdbConnection,
- final InstanceIdentifierCodec instanceIdentifierCodec,
- final UpgradeState upgradeState) {
+ final InstanceIdentifierCodec instanceIdentifierCodec) {
this.db = db;
this.txInvoker = txInvoker;
this.entityOwnershipService = entityOwnershipService;
this.ovsdbConnection = ovsdbConnection;
reconciliationManager = new ReconciliationManager(db, instanceIdentifierCodec);
this.instanceIdentifierCodec = instanceIdentifierCodec;
- this.upgradeState = upgradeState;
}
@Override
}
public void reconcileConnection(final InstanceIdentifier<Node> iid, final OvsdbNodeAugmentation ovsdbNode) {
- this.retryConnection(iid, ovsdbNode,
+ retryConnection(iid, ovsdbNode,
ConnectionReconciliationTriggers.ON_CONTROLLER_INITIATED_CONNECTION_FAILURE);
}
//*this* instance of southbound plugin is owner of the device,
//so register for monitor callbacks
ovsdbConnectionInstance.registerCallbacks(instanceIdentifierCodec);
- LOG.trace("Ovsdb isUpgradeInProgress {}", upgradeState.isUpgradeInProgress());
- if (!upgradeState.isUpgradeInProgress()) {
- reconcileBridgeConfigurations(ovsdbConnectionInstance);
- }
+
+ reconcileBridgeConfigurations(ovsdbConnectionInstance);
} else {
//You were owner of the device, but now you are not. With the current ownership
//grant mechanism, this scenario should not occur. Because this scenario will occur
}
}
- public void reconcileBridgeConfigurations(final OvsdbConnectionInstance client) {
+ private void reconcileBridgeConfigurations(final OvsdbConnectionInstance client) {
final InstanceIdentifier<Node> nodeIid = client.getInstanceIdentifier();
final ReconciliationTask task = new BridgeConfigReconciliationTask(
reconciliationManager, OvsdbConnectionManager.this, nodeIid, client, instanceIdentifierCodec);
return state;
}
}
-
- public Map<ConnectionInfo, OvsdbConnectionInstance> getClients() {
- return clients;
- }
}
import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
import org.opendaylight.ovsdb.lib.OvsdbConnection;
-import org.opendaylight.ovsdb.southbound.reconciliation.OvsdbUpgradeStateListener;
import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvokerImpl;
-import org.opendaylight.serviceutils.upgrade.UpgradeState;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
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;
private final OvsdbConnection ovsdbConnection;
private final InstanceIdentifierCodec instanceIdentifierCodec;
private final SystemReadyMonitor systemReadyMonitor;
- private final UpgradeState upgradeState;
private final AtomicBoolean registered = new AtomicBoolean(false);
private ListenerRegistration<SouthboundProvider> operTopologyRegistration;
private final OvsdbDiagStatusProvider ovsdbStatusProvider;
- private OvsdbUpgradeStateListener ovsdbUpgradeStateListener;
@Inject
public SouthboundProvider(final DataBroker dataBroker,
final DOMSchemaService schemaService,
final BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer,
final SystemReadyMonitor systemReadyMonitor,
- final DiagStatusService diagStatusService,
- final UpgradeState upgradeState) {
+ final DiagStatusService diagStatusService) {
SouthboundProvider.db = dataBroker;
entityOwnershipService = entityOwnershipServiceDependency;
registration = null;
ovsdbStatusProvider = new OvsdbDiagStatusProvider(diagStatusService);
instanceIdentifierCodec = new InstanceIdentifierCodec(schemaService, bindingNormalizedNodeSerializer);
this.systemReadyMonitor = systemReadyMonitor;
- this.upgradeState = upgradeState;
LOG.info("SouthboundProvider ovsdbConnectionService Initialized");
}
ovsdbStatusProvider.reportStatus(ServiceState.STARTING, "OVSDB initialization in progress");
txInvoker = new TransactionInvokerImpl(db);
cm = new OvsdbConnectionManager(db, txInvoker, entityOwnershipService, ovsdbConnection,
- instanceIdentifierCodec, upgradeState);
+ instanceIdentifierCodec);
ovsdbDataTreeChangeListener = new OvsdbDataTreeChangeListener(db, cm, instanceIdentifierCodec);
ovsdbOperGlobalListener = new OvsdbOperGlobalListener(db, cm, txInvoker);
LOG.trace("Registering listener for path {}", treeId);
operTopologyRegistration = db.registerDataTreeChangeListener(treeId, this);
- ovsdbUpgradeStateListener = new OvsdbUpgradeStateListener(db, cm);
}
@Override
operTopologyRegistration = null;
}
ovsdbStatusProvider.reportStatus(ServiceState.UNREGISTERED, "OVSDB Service stopped");
- if (ovsdbUpgradeStateListener != null) {
- ovsdbUpgradeStateListener.close();
- }
}
private static void initializeOvsdbTopology(final @NonNull LogicalDatastoreType type) {
boolean isRegistered() {
return registered.get();
}
-
- public UpgradeState getUpgradeState() {
- return upgradeState;
- }
}
+++ /dev/null
-/*
- * 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.ovsdb.southbound.reconciliation;
-
-import java.util.Collection;
-import java.util.Map;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
-import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
-import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
-import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.upgrade.rev180702.UpgradeConfig;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class OvsdbUpgradeStateListener implements ClusteredDataTreeChangeListener<UpgradeConfig>, AutoCloseable {
-
- private static final Logger LOG = LoggerFactory.getLogger(OvsdbUpgradeStateListener.class);
-
- private final DataBroker dataBroker;
-
- /** The connection manager. */
- private final OvsdbConnectionManager cm;
-
- /** Our registration. */
- private final ListenerRegistration<DataTreeChangeListener<UpgradeConfig>> registration;
-
- public OvsdbUpgradeStateListener(final DataBroker db, OvsdbConnectionManager cm) {
-
- DataTreeIdentifier<UpgradeConfig> dataTreeIdentifier =
- DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
- InstanceIdentifier.create(UpgradeConfig.class));
- registration = db.registerDataTreeChangeListener(dataTreeIdentifier, this);
-
- this.dataBroker = db;
- this.cm = cm;
- LOG.info("OvsdbUpgradeStateListener (ovsdb) initialized");
- }
-
- @Override
- public void close() {
- registration.close();
- LOG.info("OVSDB topology listener has been closed.");
- }
-
- @Override
- public void onDataTreeChanged(@NonNull Collection<DataTreeModification<UpgradeConfig>> changes) {
- LOG.trace("onDataTreeChanged: {}", changes);
- for (DataTreeModification<UpgradeConfig> change: changes) {
-
- if (change.getRootNode().getModificationType() == ModificationType.WRITE) {
- UpgradeConfig before = change.getRootNode().getDataBefore();
- UpgradeConfig after = change.getRootNode().getDataAfter();
- if (before != null && before.getUpgradeInProgress() && after != null && !after.getUpgradeInProgress()) {
- LOG.info("Upgrade Flag is set from {} to {}, Trigger Reconciliation",
- before.getUpgradeInProgress(), after.getUpgradeInProgress());
- //TODO Trigger Reconciliation on all the ovsDbConnectionInstance
- for (Map.Entry<ConnectionInfo, OvsdbConnectionInstance> entry : cm.getClients().entrySet()) {
- ConnectionInfo connectionInfo = entry.getKey();
- OvsdbConnectionInstance connectionInstance = entry.getValue();
- LOG.trace("ConnectionInfo : {}", connectionInfo);
- LOG.trace("OvsdbConnectionInstance : {}", connectionInstance);
- cm.reconcileBridgeConfigurations(connectionInstance);
- }
- }
- }
-
- }
- }
-}
<reference id="domSchemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService"/>
<reference id="entityOwnershipService" interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService"/>
<reference id="ovsdbConnection" interface="org.opendaylight.ovsdb.lib.OvsdbConnection"/>
- <reference id="upgradeState" interface="org.opendaylight.serviceutils.upgrade.UpgradeState"/>
<bean id="southboundProvider" class="org.opendaylight.ovsdb.southbound.SouthboundProvider" init-method="init" destroy-method="close">
<argument ref="dataBroker"/>
<argument ref="bindingNormalizedNodeSerializer"/>
<argument ref="systemReadyMonitor"/>
<argument ref="diagStatusService"/>
- <argument ref="upgradeState"/>
</bean>
</blueprint>
import org.opendaylight.ovsdb.lib.OvsdbConnection;
import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvokerImpl;
import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
-import org.opendaylight.serviceutils.upgrade.UpgradeState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
dataBroker = getDataBroker();
EntityOwnershipService entityOwnershipService = mock(EntityOwnershipService.class);
InstanceIdentifierCodec instanceIdentifierCodec = mock(InstanceIdentifierCodec.class);
- UpgradeState upgradeState = mock(UpgradeState.class);
listener = new OvsdbDataTreeChangeListener(dataBroker,
new OvsdbConnectionManager(dataBroker, new TransactionInvokerImpl(dataBroker), entityOwnershipService,
- ovsdbConnection, instanceIdentifierCodec, upgradeState), instanceIdentifierCodec);
+ ovsdbConnection, instanceIdentifierCodec), instanceIdentifierCodec);
}
@Test
import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState;
import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
import org.opendaylight.ovsdb.lib.OvsdbConnection;
-import org.opendaylight.serviceutils.upgrade.UpgradeState;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
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.TopologyKey;
Mockito.mock(DOMSchemaService.class),
Mockito.mock(BindingNormalizedNodeSerializer.class),
new TestSystemReadyMonitor(IMMEDIATE),
- Mockito.mock(DiagStatusService.class),
- Mockito.mock(UpgradeState.class))) {
+ Mockito.mock(DiagStatusService.class))) {
// Initiate the session
southboundProvider.init();
Mockito.mock(DOMSchemaService.class),
Mockito.mock(BindingNormalizedNodeSerializer.class),
new TestSystemReadyMonitor(IMMEDIATE),
- Mockito.mock(DiagStatusService.class),
- Mockito.mock(UpgradeState.class))) {
+ Mockito.mock(DiagStatusService.class))) {
// Initiate the session
southboundProvider.init();
Mockito.mock(DOMSchemaService.class),
Mockito.mock(BindingNormalizedNodeSerializer.class),
new TestSystemReadyMonitor(IMMEDIATE),
- Mockito.mock(DiagStatusService.class),
- Mockito.mock(UpgradeState.class))) {
+ Mockito.mock(DiagStatusService.class))) {
southboundProvider.init();
Mockito.mock(DOMSchemaService.class),
Mockito.mock(BindingNormalizedNodeSerializer.class),
new TestSystemReadyMonitor(IMMEDIATE),
- Mockito.mock(DiagStatusService.class),
- Mockito.mock(UpgradeState.class))) {
+ Mockito.mock(DiagStatusService.class))) {
southboundProvider.init();