From: Robert Varga Date: Tue, 23 Jan 2024 06:53:36 +0000 (+0100) Subject: Bump upstreams X-Git-Tag: v0.21.0~12 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F20%2F109920%2F23;p=bgpcep.git Bump upstreams Adopt: - yangtools-13.0.1 - mdsal-13.0.0 - controller-9.0.0 - aaa-0.19.1 - netconf-7.0.0 Also convert a few classes to simpler constructs than DataTreeChangeListener, as they typically just need the after-image of a set of changes. Change-Id: I23dbc8dcd123beaa57bdbd1256ad73cf7d284207 Signed-off-by: Robert Varga --- diff --git a/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java b/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java index 526e1b5a8c..04cb1bcc94 100644 --- a/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java +++ b/bgp/benchmark-app/src/main/java/org/opendaylight/protocol/bgp/benchmark/app/AppPeerBenchmark.java @@ -22,9 +22,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcProviderService; -import org.opendaylight.mdsal.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -74,13 +72,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.binding.Rpc; import org.opendaylight.yangtools.yang.binding.util.BindingMap; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class AppPeerBenchmark implements TransactionChainListener, AutoCloseable { +public final class AppPeerBenchmark implements FutureCallback, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(AppPeerBenchmark.class); @@ -105,7 +104,8 @@ public final class AppPeerBenchmark implements TransactionChainListener, AutoClo public AppPeerBenchmark(final DataBroker bindingDataBroker, final RpcProviderService rpcProviderRegistry, final String appRibId) { this.appRibId = requireNonNull(appRibId); - txChain = bindingDataBroker.createMergingTransactionChain(this); + txChain = bindingDataBroker.createMergingTransactionChain(); + txChain.addCallback(this); appIID = InstanceIdentifier.builder(ApplicationRib.class, new ApplicationRibKey(new ApplicationRibId(appRibId))).build(); @@ -141,16 +141,14 @@ public final class AppPeerBenchmark implements TransactionChainListener, AutoClo } @Override - public void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, - final Throwable cause) { - LOG.error("Broken chain {} in DatastoreBaAbstractWrite, transaction {}", chain, transaction.getIdentifier(), - cause); + public void onFailure(final Throwable cause) { + LOG.error("Broken chain in DatastoreBaAbstractWrite", cause); close(); } @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { - LOG.debug("DatastoreBaAbstractWrite closed successfully, chain {}", chain); + public void onSuccess(final Empty result) { + LOG.debug("DatastoreBaAbstractWrite closed successfully"); } @VisibleForTesting diff --git a/bgp/extensions/evpn/pom.xml b/bgp/extensions/evpn/pom.xml index ef8b2275c8..7055c88fb5 100644 --- a/bgp/extensions/evpn/pom.xml +++ b/bgp/extensions/evpn/pom.xml @@ -23,6 +23,20 @@ ${project.artifactId} + + com.github.spotbugs + spotbugs-annotations + true + + + com.guicedee.services + javax.inject + true + + + org.kohsuke.metainf-services + metainf-services + ${project.groupId} bgp-mvpn @@ -55,15 +69,6 @@ org.opendaylight.mdsal mdsal-rfc8294-netty - - org.kohsuke.metainf-services - metainf-services - - - com.guicedee.services - javax.inject - true - org.osgi org.osgi.service.component.annotations diff --git a/bgp/extensions/mvpn/pom.xml b/bgp/extensions/mvpn/pom.xml index 2fb8d8a136..7a9b0d585a 100644 --- a/bgp/extensions/mvpn/pom.xml +++ b/bgp/extensions/mvpn/pom.xml @@ -23,6 +23,20 @@ ${project.artifactId} + + com.github.spotbugs + spotbugs-annotations + true + + + com.guicedee.services + javax.inject + true + + + org.kohsuke.metainf-services + metainf-services + ${project.groupId} bgp-inet @@ -47,15 +61,6 @@ org.opendaylight.yangtools yang-common-netty - - org.kohsuke.metainf-services - metainf-services - - - com.guicedee.services - javax.inject - true - org.osgi org.osgi.service.component.annotations diff --git a/bgp/extensions/route-target/pom.xml b/bgp/extensions/route-target/pom.xml index c4b49a74e7..9fbcc66c61 100644 --- a/bgp/extensions/route-target/pom.xml +++ b/bgp/extensions/route-target/pom.xml @@ -24,6 +24,20 @@ ${project.artifactId} + + com.github.spotbugs + spotbugs-annotations + true + + + com.guicedee.services + javax.inject + true + + + org.kohsuke.metainf-services + metainf-services + ${project.groupId} bgp-parser-impl @@ -48,15 +62,6 @@ org.opendaylight.mdsal.model yang-ext - - org.kohsuke.metainf-services - metainf-services - - - com.guicedee.services - javax.inject - true - org.osgi org.osgi.service.component.annotations diff --git a/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java b/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java index 79de74d234..7d7571302d 100644 --- a/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java +++ b/bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java @@ -30,9 +30,7 @@ import javax.inject.Singleton; import org.checkerframework.checker.lock.qual.GuardedBy; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteOperations; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; @@ -59,6 +57,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.RibKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -75,7 +74,7 @@ import org.slf4j.LoggerFactory; @Component(service = {}) @Designate(ocd = StateProviderImpl.Configuration.class) @RequireServiceComponentRuntime -public final class StateProviderImpl implements TransactionChainListener, AutoCloseable { +public final class StateProviderImpl implements FutureCallback, AutoCloseable { @ObjectClassDefinition public @interface Configuration { @AttributeDefinition(description = "Name of the OpenConfig network instance to which to bind") @@ -130,7 +129,8 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl .child(NetworkInstance.class, new NetworkInstanceKey(networkInstanceName)); this.scheduler = scheduler; - transactionChain = this.dataBroker.createMergingTransactionChain(this); + transactionChain = this.dataBroker.createMergingTransactionChain(); + transactionChain.addCallback(this); final TimerTask task = new TimerTask() { @Override @SuppressWarnings("checkstyle:IllegalCatch") @@ -229,19 +229,18 @@ public final class StateProviderImpl implements TransactionChainListener, AutoCl } @Override - public synchronized void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, - final Throwable cause) { - LOG.error("Transaction chain {} failed for tx {}", - chain, transaction != null ? transaction.getIdentifier() : null, cause); + public synchronized void onFailure(final Throwable cause) { + LOG.error("Transaction chain failed", cause); if (!closed.get()) { transactionChain.close(); - transactionChain = dataBroker.createMergingTransactionChain(this); + transactionChain = dataBroker.createMergingTransactionChain(); + transactionChain.addCallback(this); } } @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { - LOG.debug("Transaction chain {} successful.", chain); + public void onSuccess(final Empty result) { + LOG.debug("Transaction chain successfu."); } } diff --git a/bgp/openconfig-state/src/test/java/org/opendaylight/protocol/bgp/state/StateProviderImplTest.java b/bgp/openconfig-state/src/test/java/org/opendaylight/protocol/bgp/state/StateProviderImplTest.java index 651c26e2e0..cb80ea56b7 100644 --- a/bgp/openconfig-state/src/test/java/org/opendaylight/protocol/bgp/state/StateProviderImplTest.java +++ b/bgp/openconfig-state/src/test/java/org/opendaylight/protocol/bgp/state/StateProviderImplTest.java @@ -278,7 +278,7 @@ public class StateProviderImplTest extends AbstractDataBrokerTest { public DOMStore createOperationalDatastore() { realOperStore = new InMemoryDOMDataStore("OPER", getDataTreeChangeListenerExecutor()); spiedOperStore = spy(realOperStore); - getSchemaService().registerSchemaContextListener(spiedOperStore); + getSchemaService().registerSchemaContextListener(spiedOperStore::onModelContextUpdated); return spiedOperStore; } diff --git a/bgp/rib-impl/pom.xml b/bgp/rib-impl/pom.xml index 5250361e94..41aac2c58b 100644 --- a/bgp/rib-impl/pom.xml +++ b/bgp/rib-impl/pom.xml @@ -141,7 +141,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.mdsal diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java index 54967c2603..96ef601961 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractPeer.java @@ -27,7 +27,6 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteOperations; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.mode.impl.BGPRouteEntryExportParametersImpl; import org.opendaylight.protocol.bgp.rib.impl.spi.PeerTransactionChain; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; @@ -58,6 +57,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -66,7 +66,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; abstract class AbstractPeer extends BGPPeerStateImpl implements BGPRouteEntryImportParameters, Peer, - PeerTransactionChain, DOMTransactionChainListener { + PeerTransactionChain, FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(AbstractPeer.class); final RTCClientRouteCache rtCache = new RTCClientRouteCache(); @@ -185,8 +185,8 @@ abstract class AbstractPeer extends BGPPeerStateImpl implements BGPRouteEntryImp } @Override - public final void onTransactionChainSuccessful(final DOMTransactionChain chain) { - LOG.debug("Transaction chain {} successful.", chain); + public final void onSuccess(final Empty value) { + LOG.debug("Transaction chain successful"); } @Override @@ -504,7 +504,8 @@ abstract class AbstractPeer extends BGPPeerStateImpl implements BGPRouteEntryImp final synchronized void createDomChain() { if (domChain == null) { LOG.info("Creating DOM peer chain {}", getPeerId()); - domChain = rib.createPeerDOMChain(this); + domChain = rib.createPeerDOMChain(); + domChain.addCallback(this); } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java index 79d4a59cac..f57c877acc 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java @@ -19,8 +19,8 @@ import java.util.concurrent.atomic.LongAdder; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.protocol.bgp.rib.impl.spi.Codecs; import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; @@ -36,7 +36,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.update.message.NlriBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.update.message.WithdrawnRoutesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerId; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory; * Instantiated for each peer and table, listens on a particular peer's adj-rib-out, performs transcoding to BA form * (message) and sends it down the channel. This class is NOT thread-safe. */ -final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, PrefixesSentCounters { +final class AdjRibOutListener implements DOMDataTreeChangeListener, PrefixesSentCounters { private static final Logger LOG = LoggerFactory.getLogger(AdjRibOutListener.class); private static final QName PREFIX_QNAME = QName.create(Ipv4Route.QNAME, "prefix").intern(); private static final QName PATHID_QNAME = QName.create(Ipv4Route.QNAME, "path-id").intern(); @@ -65,12 +65,12 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, Pre private final RIBSupport support; // FIXME: this field needs to be eliminated: either subclass this class or create a filtering ribsupport private final boolean mpSupport; - private final ListenerRegistration registerDataTreeChangeListener; + private final Registration registerDataTreeChangeListener; private final LongAdder prefixesSentCounter = new LongAdder(); private boolean initalState; private AdjRibOutListener(final PeerId peerId, final YangInstanceIdentifier ribId, final CodecsRegistry registry, - final RIBSupport support, final DOMDataTreeChangeService service, final ChannelOutputLimiter session, + final RIBSupport support, final DataTreeChangeExtension service, final ChannelOutputLimiter session, final boolean mpSupport) { this.session = requireNonNull(session); this.support = requireNonNull(support); @@ -84,8 +84,8 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, Pre * send EOR marker. initialState flag is distinguishing between first ODTC execution and the rest. */ initalState = true; - registerDataTreeChangeListener = service.registerDataTreeChangeListener( - new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, adjRibOutId), this); + registerDataTreeChangeListener = service.registerTreeChangeListener( + DOMDataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, adjRibOutId), this); } static AdjRibOutListener create( @@ -93,7 +93,7 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, Pre final @NonNull YangInstanceIdentifier ribId, final @NonNull CodecsRegistry registry, final @NonNull RIBSupport support, - final @NonNull DOMDataTreeChangeService service, + final @NonNull DataTreeChangeExtension service, final @NonNull ChannelOutputLimiter session, final boolean mpSupport) { return new AdjRibOutListener(peerId, ribId, registry, support, service, session, mpSupport); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java index a021c6442f..e1759d8d5a 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java @@ -29,9 +29,8 @@ import java.util.Set; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; @@ -51,7 +50,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.RouteTarget; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -94,7 +92,7 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre private final BGPTableTypeRegistryConsumer tableTypeRegistry; private EffectiveRibInWriter effectiveRibInWriter; private AdjRibInWriter adjRibInWriter; - private ListenerRegistration registration; + private Registration registration; private final Set supportedTables = new HashSet<>(); private final BGPSessionStateImpl bgpSessionState = new BGPSessionStateImpl(); private Registration trackerRegistration; @@ -128,7 +126,7 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre peerRibOutIId = peerRib.node(ADJRIBOUT_NID).node(TABLES_NID).toOptimized(); } - public synchronized void instantiateServiceInstance(final DOMDataTreeChangeService dataTreeChangeService, + public synchronized void instantiateServiceInstance(final DataTreeChangeExtension dataTreeChangeService, final DOMDataTreeIdentifier appPeerDOMId) { setActive(true); final var localTables = rib.getLocalTablesKeys(); @@ -148,16 +146,19 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre final RegisterAppPeerListener registerAppPeerListener = () -> { synchronized (this) { if (getDomChain() != null) { - registration = dataTreeChangeService.registerDataTreeChangeListener(appPeerDOMId, this); + registration = dataTreeChangeService.registerTreeChangeListener(appPeerDOMId, this); } } }; peerPath = createPeerPath(peerId); adjRibInWriter = adjRibInWriter.transform(peerId, peerPath, context, localTables, Map.of(), registerAppPeerListener); - effectiveRibInWriter = new EffectiveRibInWriter(this, rib, - rib.createPeerDOMChain(this), peerPath, localTables, tableTypeRegistry, - new ArrayList<>(), rtCache); + + final var chain = rib.createPeerDOMChain(); + chain.addCallback(this); + + effectiveRibInWriter = new EffectiveRibInWriter(this, rib, chain, peerPath, localTables, tableTypeRegistry, + new ArrayList<>(), rtCache); effectiveRibInWriter.init(); bgpSessionState.registerMessagesCounter(this); trackerRegistration = rib.getPeerTracker().registerPeer(this); @@ -331,9 +332,8 @@ public class ApplicationPeer extends AbstractPeer implements ClusteredDOMDataTre } @Override - public void onTransactionChainFailed(final DOMTransactionChain chain, final DOMDataTreeTransaction transaction, - final Throwable cause) { - LOG.error("Transaction chain {} failed.", transaction != null ? transaction.getIdentifier() : null, cause); + public void onFailure(final Throwable cause) { + LOG.error("Transaction chain failed.", cause); } @Override diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index 7ea1f2e41d..cf98d83220 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -40,9 +41,6 @@ import org.checkerframework.checker.lock.qual.Holding; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; -import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; import org.opendaylight.protocol.bgp.parser.BGPError; @@ -100,6 +98,7 @@ import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.Rpc; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.slf4j.Logger; @@ -367,15 +366,16 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener { currentSession = session; sessionUp = true; - ribOutChain = rib.createPeerDOMChain(new DOMTransactionChainListener() { + final var chain = rib.createPeerDOMChain(); + ribOutChain = chain; + chain.addCallback(new FutureCallback() { @Override - public void onTransactionChainSuccessful(final DOMTransactionChain chain) { + public void onSuccess(final Empty result) { LOG.debug("RibOut transaction chain {} successful.", chain); } @Override - public void onTransactionChainFailed(final DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { + public void onFailure(final Throwable cause) { onRibOutChainFailed(cause); } }); @@ -499,10 +499,10 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener { } private synchronized void createEffRibInWriter() { - effRibInWriter = new EffectiveRibInWriter(this, rib, - rib.createPeerDOMChain(this), - peerPath, tables, tableTypeRegistry, - rtMemberships, + final var chain = rib.createPeerDOMChain(); + chain.addCallback(this); + + effRibInWriter = new EffectiveRibInWriter(this, rib, chain, peerPath, tables, tableTypeRegistry, rtMemberships, rtCache); } @@ -690,8 +690,7 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener { } @Override - public synchronized void onTransactionChainFailed(final DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { + public synchronized void onFailure(final Throwable cause) { LOG.error("Transaction domChain failed.", cause); releaseConnection(true); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java index f97892a5af..709ae409ad 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java @@ -38,8 +38,8 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; @@ -67,7 +67,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.MplsLabeledVpnSubsequentAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.RouteTarget; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -102,8 +102,7 @@ import org.slf4j.LoggerFactory; * This class is NOT thread-safe. */ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesInstalledCounters, - AutoCloseable, ClusteredDOMDataTreeChangeListener { - + AutoCloseable, DOMDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(EffectiveRibInWriter.class); private static final TablesKey IVP4_VPN_TABLE_KEY = new TablesKey(Ipv4AddressFamily.VALUE, MplsLabeledVpnSubsequentAddressFamily.VALUE); @@ -120,11 +119,11 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn private final RIBSupportContextRegistry registry; private final YangInstanceIdentifier peerIId; private final YangInstanceIdentifier effRibTables; - private final DOMDataTreeChangeService service; + private final DataTreeChangeExtension service; private final List rtMemberships; private final RibOutRefresh vpnTableRefresher; private final ClientRouteTargetContrainCache rtCache; - private ListenerRegistration reg; + private Registration reg; private DOMTransactionChain chain; private final Map prefixesReceived; private final Map prefixesInstalled; @@ -160,10 +159,10 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn } public void init() { - final DOMDataTreeIdentifier treeId = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, + final DOMDataTreeIdentifier treeId = DOMDataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, peerIId.node(ADJRIBIN_NID).node(TABLES_NID)); LOG.debug("Registered Effective RIB on {}", peerIId); - reg = requireNonNull(service).registerDataTreeChangeListener(treeId, this); + reg = requireNonNull(service).registerTreeChangeListener(treeId, this); } private static Map buildPrefixesTables(final Set tables) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java index 0e217ec6da..d317126390 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java @@ -31,8 +31,8 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteOperations; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; @@ -57,7 +57,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -74,15 +74,14 @@ import org.slf4j.LoggerFactory; // This class is NOT thread-safe final class LocRibWriter, S extends ChildOf> - implements AutoCloseable, RibOutRefresh, TotalPrefixesCounter, TotalPathsCounter, - ClusteredDOMDataTreeChangeListener { + implements AutoCloseable, RibOutRefresh, TotalPrefixesCounter, TotalPathsCounter, DOMDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(LocRibWriter.class); private final Map> routeEntries = new HashMap<>(); private final long ourAs; private final RIBSupport ribSupport; - private final DOMDataTreeChangeService dataBroker; + private final DataTreeChangeExtension dataBroker; private final PathSelectionMode pathSelectionMode; private final LongAdder totalPathsCounter = new LongAdder(); private final LongAdder totalPrefixesCounter = new LongAdder(); @@ -93,13 +92,13 @@ final class LocRibWriter, S ext private DOMTransactionChain chain; @GuardedBy("this") - private ListenerRegistration reg; + private Registration reg; private LocRibWriter(final RIBSupport ribSupport, final DOMTransactionChain chain, final YangInstanceIdentifier ribIId, final Uint32 ourAs, - final DOMDataTreeChangeService dataBroker, + final DataTreeChangeExtension dataBroker, final BGPRibRoutingPolicy ribPolicies, final BGPPeerTracker peerTracker, final AfiSafiType afiSafiType, @@ -126,7 +125,7 @@ final class LocRibWriter, S ext final @NonNull DOMTransactionChain chain, final @NonNull YangInstanceIdentifier ribIId, final @NonNull AsNumber ourAs, - final @NonNull DOMDataTreeChangeService dataBroker, + final @NonNull DataTreeChangeExtension dataBroker, final BGPRibRoutingPolicy ribPolicies, final @NonNull BGPPeerTracker peerTracker, final @NonNull PathSelectionMode pathSelectionStrategy) { @@ -152,7 +151,7 @@ final class LocRibWriter, S ext } }, MoreExecutors.directExecutor()); - reg = dataBroker.registerDataTreeChangeListener(new DOMDataTreeIdentifier( + reg = dataBroker.registerTreeChangeListener(DOMDataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, ribIId.node(PEER_NID).node(PEER_NID).node(EFFRIBIN_NID).node(TABLES_NID) .node(locRibTableIID.getLastPathArgument())), this); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index ad0fdd7ccf..622171aac3 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -31,12 +31,9 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; -import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; @@ -65,6 +62,7 @@ import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder; @@ -77,7 +75,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; // This class is thread-safe -public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactionChainListener { +public final class RIBImpl extends BGPRibStateImpl implements RIB { private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class); private static final QName RIB_ID_QNAME = QName.create(Rib.QNAME, "id").intern(); @@ -92,7 +90,7 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio private final RIBSupportContextRegistryImpl ribContextRegistry; private final CodecsRegistry codecsRegistry; private final BGPTableTypeRegistryConsumer tableTypeRegistry; - private final DOMDataBrokerExtension domService; + private final DataTreeChangeExtension domService; private final Map> txChainToLocRibWriter = new HashMap<>(); private final Map vpnTableRefresher = new HashMap<>(); private final Map bestPathSelectionStrategies; @@ -131,7 +129,7 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio .collect(Collectors.toCollection(HashSet::new)); this.domDataBroker = requireNonNull(domDataBroker); - domService = domDataBroker.getExtensions().get(DOMDataTreeChangeService.class); + domService = domDataBroker.extension(DataTreeChangeExtension.class); this.extensions = requireNonNull(extensions); this.ribPolicies = requireNonNull(ribPolicies); this.codecsRegistry = codecsRegistry; @@ -172,7 +170,8 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio return; } LOG.debug("Creating LocRIB writer for key {}", key); - final DOMTransactionChain txChain = createPeerDOMChain(this); + final DOMTransactionChain txChain = createPeerDOMChain(); + addCallback(txChain); PathSelectionMode pathSelectionStrategy = bestPathSelectionStrategies.get(key); if (pathSelectionStrategy == null) { pathSelectionStrategy = BasePathSelectionModeFactory.createBestPathSelectionStrategy(); @@ -219,25 +218,32 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio return dispatcher; } - @Override - public synchronized void onTransactionChainFailed(final DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { - LOG.error("Broken chain in RIB {} transaction {}", - getInstanceIdentifier(), transaction != null ? transaction.getIdentifier() : null, cause); + private void addCallback(final DOMTransactionChain txChain) { + txChain.addCallback(new FutureCallback() { + @Override + public void onSuccess(final Empty result) { + LOG.info("RIB {} closed successfully", getInstanceIdentifier()); + } + + @Override + public void onFailure(final Throwable cause) { + RIBImpl.this.onFailure(txChain, cause); + } + }); + } + + private synchronized void onFailure(final DOMTransactionChain chain, final Throwable cause) { + LOG.error("Broken chain in RIB {}", getInstanceIdentifier(), cause); final LocRibWriter locRibWriter = txChainToLocRibWriter.remove(chain); if (locRibWriter != null) { - final DOMTransactionChain newChain = createPeerDOMChain(this); + final DOMTransactionChain newChain = createPeerDOMChain(); + addCallback(newChain); startLocRib(locRibWriter.getTableKey()); locRibWriter.restart(newChain); txChainToLocRibWriter.put(newChain, locRibWriter); } } - @Override - public void onTransactionChainSuccessful(final DOMTransactionChain chain) { - LOG.info("RIB {} closed successfully", getInstanceIdentifier()); - } - @Override public Set getLocalTablesKeys() { return localTablesKeys; @@ -267,8 +273,8 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio } @Override - public DOMDataTreeChangeService getService() { - return (DOMDataTreeChangeService) domService; + public DataTreeChangeExtension getService() { + return domService; } @Override @@ -277,8 +283,8 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio } @Override - public DOMTransactionChain createPeerDOMChain(final DOMTransactionChainListener listener) { - return domDataBroker.createMergingTransactionChain(listener); + public DOMTransactionChain createPeerDOMChain() { + return domDataBroker.createMergingTransactionChain(); } @Override @@ -297,10 +303,12 @@ public final class RIBImpl extends BGPRibStateImpl implements RIB, DOMTransactio } public synchronized void instantiateServiceInstance() { + LOG.debug("Instantiating RIB table {} at {}", ribId, yangRibId); + isServiceInstantiated = true; setActive(true); - domChain = domDataBroker.createMergingTransactionChain(this); - LOG.debug("Instantiating RIB table {} at {}", ribId, yangRibId); + domChain = domDataBroker.createMergingTransactionChain(); + addCallback(domChain); final ContainerNode bgpRib = Builders.containerBuilder().withNodeIdentifier(BGPRIB_NID) .addChild(ImmutableNodes.mapNodeBuilder(RIB_NID).build()).build(); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java index 948512ae20..48793b6b2d 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java @@ -17,7 +17,7 @@ import com.google.common.util.concurrent.ListenableFuture; import java.util.Objects; import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer; @@ -125,7 +125,7 @@ final class AppPeer extends PeerBean { private static final class BgpAppPeerSingletonService implements BGPPeerStateProvider { private final ApplicationPeer applicationPeer; - private final DOMDataTreeChangeService dataTreeChangeService; + private final DataTreeChangeExtension dataTreeChangeService; private final ApplicationRibId appRibId; @GuardedBy("this") private boolean isServiceInstantiated; @@ -139,11 +139,13 @@ final class AppPeer extends PeerBean { synchronized void instantiateServiceInstance() { isServiceInstantiated = true; - final YangInstanceIdentifier yangIId = YangInstanceIdentifier.builder().node(APPRIB) - .nodeWithKey(ApplicationRib.QNAME, APP_ID_QNAME, appRibId.getValue()) - .node(TABLES_NID).node(TABLES_NID).build(); applicationPeer.instantiateServiceInstance(dataTreeChangeService, - new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, yangIId)); + DOMDataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.builder() + .node(APPRIB) + .nodeWithKey(ApplicationRib.QNAME, APP_ID_QNAME, appRibId.getValue()) + .node(TABLES_NID) + .node(TABLES_NID) + .build())); } synchronized ListenableFuture closeServiceInstance() { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java index a978c3839a..47d399bdb6 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.java @@ -36,10 +36,9 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; @@ -52,6 +51,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.t import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborPeerGroupConfig; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; import org.slf4j.Logger; @@ -82,7 +82,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto @GuardedBy("this") private RibImpl ribImpl; @GuardedBy("this") - private ClusterSingletonServiceRegistration cssRegistration; + private Registration cssRegistration; BGPClusterSingletonService( final @NonNull PeerGroupConfigLoader peerGroupLoader, @@ -106,9 +106,9 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto this.stateProviderRegistry = stateProviderRegistry; this.domDataBroker = domDataBroker; this.bgpIid = bgpIid; - serviceGroupIdentifier = ServiceGroupIdentifier.create(getRibInstanceName(bgpIid) + "-service-group"); + serviceGroupIdentifier = new ServiceGroupIdentifier(getRibInstanceName(bgpIid) + "-service-group"); cssRegistration = provider.registerClusterSingletonService(this); - LOG.info("BGPClusterSingletonService {} registered", serviceGroupIdentifier.getName()); + LOG.info("BGPClusterSingletonService {} registered", serviceGroupIdentifier.value()); } @Override @@ -123,12 +123,12 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto peers.values().forEach(PeerBean::instantiateServiceInstance); } instantiated.set(true); - LOG.info("BGPClusterSingletonService {} instantiated", serviceGroupIdentifier.getName()); + LOG.info("BGPClusterSingletonService {} instantiated", serviceGroupIdentifier.value()); } @Override public synchronized ListenableFuture closeServiceInstance() { - LOG.info("BGPClusterSingletonService {} close service instance", serviceGroupIdentifier.getName()); + LOG.info("BGPClusterSingletonService {} close service instance", serviceGroupIdentifier.value()); instantiated.set(false); final List> futurePeerCloseList = peers.values().stream() @@ -239,7 +239,7 @@ public class BGPClusterSingletonService implements ClusterSingletonService, Auto return; } - LOG.info("Closing BGPClusterSingletonService {}", serviceGroupIdentifier.getName()); + LOG.info("Closing BGPClusterSingletonService {}", serviceGroupIdentifier.value()); cssRegistration.close(); cssRegistration = null; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/DefaultBgpDeployer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/DefaultBgpDeployer.java index 872ceb69a0..3f784b066f 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/DefaultBgpDeployer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/DefaultBgpDeployer.java @@ -16,7 +16,6 @@ import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -39,7 +38,7 @@ import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; @@ -61,7 +60,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.re import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.ProtocolsBuilder; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; @@ -95,7 +94,7 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener, } }); private final String networkInstanceName; - private ListenerRegistration registration; + private Registration registration; @GuardedBy("this") private boolean closed; @@ -142,7 +141,7 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener, // Split out of constructor to support partial mocking public synchronized void init() { registration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, networkInstanceIId.child(Protocols.class).child(Protocol.class) .augmentation(NetworkInstanceProtocol.class).child(Bgp.class)), this); LOG.info("BGP Deployer {} started.", networkInstanceName); @@ -158,7 +157,7 @@ public class DefaultBgpDeployer implements ClusteredDataTreeChangeListener, } @Override - public synchronized void onDataTreeChanged(final Collection> changes) { + public synchronized void onDataTreeChanged(final List> changes) { if (closed) { LOG.trace("BGP Deployer was already closed, skipping changes."); return; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OSGiBgpDeployer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OSGiBgpDeployer.java index 6be6f3ff5b..5e85c5c426 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OSGiBgpDeployer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OSGiBgpDeployer.java @@ -10,7 +10,7 @@ package org.opendaylight.protocol.bgp.rib.impl.config; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java index c3eb1ce25d..038e43cb16 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java @@ -23,9 +23,8 @@ import java.util.stream.Collectors; import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; @@ -166,8 +165,8 @@ public final class RibImpl implements RIB, BGPRibStateProvider { } @Override - public synchronized DOMTransactionChain createPeerDOMChain(final DOMTransactionChainListener listener) { - return ribImpl.createPeerDOMChain(listener); + public synchronized DOMTransactionChain createPeerDOMChain() { + return ribImpl.createPeerDOMChain(); } @Override @@ -191,7 +190,7 @@ public final class RibImpl implements RIB, BGPRibStateProvider { } @Override - public synchronized DOMDataTreeChangeService getService() { + public synchronized DataTreeChangeExtension getService() { return ribImpl.getService(); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java index 8ee03ddf31..9896ba8e72 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java @@ -9,9 +9,8 @@ package org.opendaylight.protocol.bgp.rib.impl.spi; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.rib.RibReference; import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; @@ -48,10 +47,9 @@ public interface RIB extends RibReference, RibOutRefresh { /** * Allocate a new transaction chain for use with a peer. * - * @param listener {@link DOMTransactionChainListener} handling recovery * @return A new transaction chain. */ - DOMTransactionChain createPeerDOMChain(DOMTransactionChainListener listener); + DOMTransactionChain createPeerDOMChain(); /** * Return the RIB extensions available to the RIB instance. @@ -84,7 +82,7 @@ public interface RIB extends RibReference, RibOutRefresh { * * @return DOMDataTreeChangeService */ - DOMDataTreeChangeService getService(); + DataTreeChangeExtension getService(); /** * Returns true if RIB supports table. diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java index 8a1dd5dc0d..09d68db280 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractAddPathTest.java @@ -25,9 +25,8 @@ import org.junit.After; import org.junit.Before; import org.mockito.Mock; import org.mockito.Mockito; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.inet.RIBActivator; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.parser.BGPError; @@ -85,6 +84,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; @@ -148,7 +148,7 @@ public abstract class AbstractAddPathTest extends DefaultRibPoliciesMockTest { groups = new BGPNettyGroups(); serverRegistry = new StrictBGPPeerRegistry(); serverDispatcher = new BGPDispatcherImpl(context, groups, serverRegistry); - doReturn(Mockito.mock(ClusterSingletonServiceRegistration.class)).when(clusterSingletonServiceProvider) + doReturn(Mockito.mock(Registration.class)).when(clusterSingletonServiceProvider) .registerClusterSingletonService(any(ClusterSingletonService.class)); codecsRegistry = new ConstantCodecsRegistry(mappingService.currentSerializer()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java index 41eed3acdb..2dbf9d73c4 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.FluentFuture; import java.util.ArrayList; import java.util.Collection; @@ -30,16 +29,14 @@ import org.mockito.MockitoAnnotations; import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.inet.RIBActivator; import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; @@ -58,6 +55,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -95,7 +93,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { private FluentFuture future; @Mock - private DOMDataTreeChangeService service; + private DataTreeChangeExtension service; @Mock private ClusterSingletonServiceProvider clusterSingletonServiceProvider; @@ -117,7 +115,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { a1.startRIBExtensionProvider(context, serializer); mockedMethods(); - doReturn(mock(ClusterSingletonServiceRegistration.class)).when(clusterSingletonServiceProvider) + doReturn(mock(Registration.class)).when(clusterSingletonServiceProvider) .registerClusterSingletonService(any(ClusterSingletonService.class)); rib = new RIBImpl(tableRegistry, new RibId("test"), new AsNumber(Uint32.valueOf(5)), RIB_ID, context, dispatcher, new ConstantCodecsRegistry(serializer), dom, policies, localTables, @@ -128,8 +126,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { private void mockedMethods() throws Exception { MockitoAnnotations.initMocks(this); doReturn(new TestListenerRegistration()).when(service) - .registerDataTreeChangeListener(any(DOMDataTreeIdentifier.class), - any(ClusteredDOMDataTreeChangeListener.class)); + .registerTreeChangeListener(any(DOMDataTreeIdentifier.class), any(DOMDataTreeChangeListener.class)); doNothing().when(domTransWrite).put(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class)); doNothing().when(domTransWrite).delete(eq(LogicalDatastoreType.OPERATIONAL), @@ -140,9 +137,9 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest { doReturn(domTransWrite).when(domChain).newWriteOnlyTransaction(); doNothing().when(getTransaction()).put(eq(LogicalDatastoreType.OPERATIONAL), eq(YangInstanceIdentifier.of(BgpRib.QNAME)), any(NormalizedNode.class)); - doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, service)).when(dom) - .getExtensions(); - doReturn(domChain).when(dom).createMergingTransactionChain(any(DOMTransactionChainListener.class)); + doReturn(service).when(dom).extension(DataTreeChangeExtension.class); + doReturn(domChain).when(dom).createMergingTransactionChain(); + doNothing().when(domChain).addCallback(any()); doReturn(Optional.empty()).when(future).get(); doReturn(future).when(domTransWrite).commit(); doCallRealMethod().when(future).addCallback(any(), any()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java index 2597f8bbd1..1ea3334bc3 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java @@ -55,7 +55,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @Ignore @@ -109,7 +109,7 @@ public class ParserToSalTest extends DefaultRibPoliciesMockTest { final BGPPeer peer = AbstractAddPathTest.configurePeer(tableRegistry, localAddress.getIpv4AddressNoZone(), rib, null, PeerRole.Ibgp, new StrictBGPPeerRegistry()); peer.instantiateServiceInstance(); - final ListenerRegistration reg = mock.registerUpdateListener(peer); + final Registration reg = mock.registerUpdateListener(peer); reg.close(); } @@ -125,7 +125,7 @@ public class ParserToSalTest extends DefaultRibPoliciesMockTest { final BGPPeer peer = AbstractAddPathTest.configurePeer(tableRegistry, localAddress.getIpv4AddressNoZone(), rib, null, PeerRole.Ibgp, new StrictBGPPeerRegistry()); peer.instantiateServiceInstance(); - final ListenerRegistration reg = mock.registerUpdateListener(peer); + final Registration reg = mock.registerUpdateListener(peer); reg.close(); } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java index 2f4bfa9c02..062143d429 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationAndExceptionTest.java @@ -23,7 +23,6 @@ import static org.opendaylight.protocol.bgp.rib.spi.RIBNodeIdentifiers.RIB_NID; import static org.opendaylight.protocol.bgp.rib.spi.RIBNodeIdentifiers.TABLES_NID; import static org.opendaylight.protocol.bgp.rib.spi.RIBNodeIdentifiers.UPTODATE_NID; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; @@ -47,7 +46,7 @@ import org.mockito.Mock; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; @@ -94,7 +93,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.CNextHop; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; @@ -190,16 +189,16 @@ public class SynchronizationAndExceptionTest extends AbstractAddPathTest { doReturn(null).when(futureChannel).addListener(any()); doReturn(futureChannel).when(speakerListener).close(); doReturn(futureChannel).when(speakerListener).writeAndFlush(any(Notify.class)); - doReturn(domChain).when(domBroker).createMergingTransactionChain(any()); + doReturn(domChain).when(domBroker).createMergingTransactionChain(); + doNothing().when(domChain).addCallback(any()); doReturn(tx).when(domChain).newWriteOnlyTransaction(); - final DOMDataTreeChangeService dOMDataTreeChangeService = mock(DOMDataTreeChangeService.class); - final ListenerRegistration listener = mock(ListenerRegistration.class); - doReturn(listener).when(dOMDataTreeChangeService).registerDataTreeChangeListener(any(), any()); + final DataTreeChangeExtension domDataTreeChangeService = mock(DataTreeChangeExtension.class); + final Registration listener = mock(Registration.class); + doReturn(listener).when(domDataTreeChangeService).registerTreeChangeListener(any(), any()); doNothing().when(listener).close(); doNothing().when(domChain).close(); - doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, dOMDataTreeChangeService)) - .when(domBroker).getExtensions(); + doReturn(domDataTreeChangeService).when(domBroker).extension(DataTreeChangeExtension.class); doNothing().when(tx).merge(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class)); doNothing().when(tx).put(eq(LogicalDatastoreType.OPERATIONAL), diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java index e1f033aef4..3ea573058f 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java @@ -21,10 +21,9 @@ import org.junit.Before; import org.mockito.Mock; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.protocol.bgp.rib.impl.BGPPeerTrackerImpl; @@ -47,7 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -70,7 +69,7 @@ class AbstractConfig extends DefaultRibPoliciesMockTest { @Mock protected BGPPeerRegistry bgpPeerRegistry; @Mock - protected ListenerRegistration listener; + protected Registration listener; @Mock protected Future future; @Mock @@ -78,7 +77,7 @@ class AbstractConfig extends DefaultRibPoliciesMockTest { @Mock protected PeerGroupConfigLoader peerGroupLoader; @Mock - private DOMDataTreeChangeService dataTreeChangeService; + private DataTreeChangeExtension dataTreeChangeService; private final BGPPeerTracker peerTracker = new BGPPeerTrackerImpl(); @Override @@ -88,7 +87,8 @@ class AbstractConfig extends DefaultRibPoliciesMockTest { doReturn(InstanceIdentifier.create(BgpRib.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight .params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.Rib.class, new RibKey(RIB_ID))).when(rib) .getInstanceIdentifier(); - doReturn(domTx).when(rib).createPeerDOMChain(any(DOMTransactionChainListener.class)); + doReturn(domTx).when(rib).createPeerDOMChain(); + doNothing().when(domTx).addCallback(any()); doReturn(AS).when(rib).getLocalAs(); doReturn(mock(RIBSupportContextRegistry.class)).when(rib).getRibSupportContext(); @@ -105,7 +105,7 @@ class AbstractConfig extends DefaultRibPoliciesMockTest { doReturn(YangInstanceIdentifier.of(Rib.QNAME)).when(rib).getYangRibId(); doReturn(dataTreeChangeService).when(rib).getService(); - doReturn(listener).when(dataTreeChangeService).registerDataTreeChangeListener(any(), any()); + doReturn(listener).when(dataTreeChangeService).registerTreeChangeListener(any(), any()); doReturn(new BgpId("127.0.0.1")).when(rib).getBgpIdentifier(); doReturn(true).when(future).cancel(true); doReturn(future).when(dispatcher).createReconnectingClient(any(InetSocketAddress.class), diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java index 2f01da4f69..be82ca643a 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java @@ -9,14 +9,12 @@ package org.opendaylight.protocol.bgp.rib.impl.config; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.internal.verification.VerificationModeFactory.times; import java.util.concurrent.ExecutionException; import org.junit.Before; import org.junit.Test; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor; @@ -47,14 +45,14 @@ public class AppPeerTest extends AbstractConfig { appPeer.start(rib, neighbor, null, peerGroupLoader, tableTypeRegistry); verify(rib).getYangRibId(); verify(rib).getService(); - verify(rib).createPeerDOMChain(any(DOMTransactionChainListener.class)); + verify(rib).createPeerDOMChain(); verify(rib, times(1)).getLocalTablesKeys(); appPeer.instantiateServiceInstance(); verify(rib, times(3)).getYangRibId(); verify(rib, times(2)).getRibSupportContext(); verify(rib, times(2)).getLocalTablesKeys(); - verify(rib, times(2)).createPeerDOMChain(any(DOMTransactionChainListener.class)); + verify(rib, times(2)).createPeerDOMChain(); verify(domTx).newWriteOnlyTransaction(); appPeer.closeServiceInstance(); @@ -65,7 +63,7 @@ public class AppPeerTest extends AbstractConfig { appPeer.instantiateServiceInstance(); verify(rib, times(6)).getYangRibId(); verify(rib, times(4)).getService(); - verify(rib, times(4)).createPeerDOMChain(any(DOMTransactionChainListener.class)); + verify(rib, times(4)).createPeerDOMChain(); verify(listener, times(2)).close(); assertTrue(appPeer.containsEqualConfiguration(neighbor)); @@ -76,7 +74,7 @@ public class AppPeerTest extends AbstractConfig { verify(domTx, times(4)).close(); appPeer.instantiateServiceInstance(); - verify(rib, times(6)).createPeerDOMChain(any(DOMTransactionChainListener.class)); + verify(rib, times(6)).createPeerDOMChain(); appPeer.closeServiceInstance(); verify(domTx, times(6)).close(); appPeer.stop().get(); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerTest.java index ad9e0e23de..83da51b04b 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerTest.java @@ -34,8 +34,7 @@ import org.mockito.Mock; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.DefaultBGPRibRoutingPolicyFactory; import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistry; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; @@ -62,6 +61,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; @@ -109,7 +109,7 @@ public class BgpDeployerTest extends DefaultRibPoliciesMockTest { doReturn(TABLE_TYPE).when(tableTypeRegistry).getTableType(any()); doReturn(TABLES_KEY).when(tableTypeRegistry).getTableKey(any()); - final ClusterSingletonServiceRegistration serviceRegistration = mock(ClusterSingletonServiceRegistration.class); + final var serviceRegistration = mock(Registration.class); doReturn(serviceRegistration).when(singletonServiceProvider).registerClusterSingletonService(any()); doNothing().when(serviceRegistration).close(); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java index 4b3107bb57..74ec21a3d4 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java @@ -144,7 +144,7 @@ public class BgpPeerTest extends AbstractConfig { .build(); bgpPeer.start(rib, neighbor, null, peerGroupLoader, tableTypeRegistry); - verify(rib).createPeerDOMChain(any()); + verify(rib).createPeerDOMChain(); verify(rib, times(2)).getLocalAs(); verify(rib).getLocalTables(); @@ -162,7 +162,7 @@ public class BgpPeerTest extends AbstractConfig { bgpPeer.stop().get(); bgpPeer.start(rib, bgpPeer.getCurrentConfiguration(), null, peerGroupLoader, tableTypeRegistry); bgpPeer.instantiateServiceInstance(); - verify(rib, times(2)).createPeerDOMChain(any()); + verify(rib, times(2)).createPeerDOMChain(); verify(rib, times(4)).getLocalAs(); verify(rib, times(2)).getLocalTables(); verify(bgpPeerRegistry, times(2)).addPeer(any(), any(), any()); @@ -186,12 +186,12 @@ public class BgpPeerTest extends AbstractConfig { bgpPeer.closeServiceInstance(); verify(bgpPeerRegistry, times(3)).removePeer(any()); verify(future, times(3)).cancel(true); - verify(rib, times(3)).createPeerDOMChain(any()); + verify(rib, times(3)).createPeerDOMChain(); bgpPeer.stop().get(); bgpPeer.start(rib, bgpPeer.getCurrentConfiguration(), null, peerGroupLoader, tableTypeRegistry); bgpPeer.instantiateServiceInstance(); - verify(rib, times(4)).createPeerDOMChain(any()); + verify(rib, times(4)).createPeerDOMChain(); verify(rib, times(6)).getLocalAs(); verify(rib, times(3)).getLocalTables(); verify(bgpPeerRegistry, times(4)).addPeer(any(), any(), any()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java index 34013f79f3..d3c9db3846 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.ImmutableSet; import java.util.Map; import java.util.Set; @@ -23,7 +22,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; import org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollector; @@ -44,7 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.util.BindingMap; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint8; @@ -84,12 +83,10 @@ public class RibImplTest extends AbstractConfig { final NodeIdentifierWithPredicates niie = NodeIdentifierWithPredicates.of(Rib.QNAME, QName.create("", "test").intern(), "t"); doReturn(niie).when(emptyTable).name(); - doReturn(domTx).when(domDataBroker).createMergingTransactionChain(any()); - final DOMDataTreeChangeService dOMDataTreeChangeService = mock(DOMDataTreeChangeService.class); - doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, dOMDataTreeChangeService)) - .when(domDataBroker).getExtensions(); - doReturn(mock(ListenerRegistration.class)).when(dOMDataTreeChangeService) - .registerDataTreeChangeListener(any(), any()); + doReturn(domTx).when(domDataBroker).createMergingTransactionChain(); + final DataTreeChangeExtension domDataTreeChangeService = mock(DataTreeChangeExtension.class); + doReturn(domDataTreeChangeService).when(domDataBroker).extension(DataTreeChangeExtension.class); + doReturn(mock(Registration.class)).when(domDataTreeChangeService).registerTreeChangeListener(any(), any()); } @Test @@ -97,7 +94,7 @@ public class RibImplTest extends AbstractConfig { final RibImpl ribImpl = new RibImpl(extension, dispatcher, policyProvider, codecsRegistry, new BGPStateCollector(), domDataBroker); ribImpl.start(createGlobal(), "rib-test", tableTypeRegistry); - verify(domDataBroker).getExtensions(); + verify(domDataBroker).extension(DataTreeChangeExtension.class); assertEquals(""" RIBImpl{bgpId=Ipv4Address{value=127.0.0.1}, localTables=[BgpTableTypeImpl [\ getAfi()=Ipv4AddressFamily{qname=\ diff --git a/bgp/topology-provider/pom.xml b/bgp/topology-provider/pom.xml index 2440d7dfb9..527366814b 100644 --- a/bgp/topology-provider/pom.xml +++ b/bgp/topology-provider/pom.xml @@ -83,7 +83,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.slf4j diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java index 9f6326e027..2ecdcad958 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java @@ -14,7 +14,7 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.checkerframework.checker.lock.qual.GuardedBy; @@ -25,9 +25,7 @@ import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; -import org.opendaylight.mdsal.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -44,13 +42,14 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypes; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractTopologyBuilder implements ClusteredDataTreeChangeListener, - TopologyReference, TransactionChainListener { +public abstract class AbstractTopologyBuilder + implements ClusteredDataTreeChangeListener, TopologyReference, FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(AbstractTopologyBuilder.class); // we limit the listener reset interval to be 5 min at most private static final long LISTENER_RESET_LIMIT_IN_MILLSEC = 5 * 60 * 1000; @@ -66,7 +65,7 @@ public abstract class AbstractTopologyBuilder implements Cluste private final int listenerResetEnforceCounter; @GuardedBy("this") - private ListenerRegistration> listenerRegistration = null; + private Registration listenerRegistration = null; @GuardedBy("this") private TransactionChain chain = null; private final AtomicBoolean closed = new AtomicBoolean(false); @@ -84,14 +83,15 @@ public abstract class AbstractTopologyBuilder implements Cluste final int listenerResetEnforceCounter) { this.dataProvider = dataProvider; this.locRibReference = requireNonNull(locRibReference); - this.topologyKey = new TopologyKey(requireNonNull(topologyId)); - this.topologyTypes = types; + topologyKey = new TopologyKey(requireNonNull(topologyId)); + topologyTypes = types; this.afi = afi; this.safi = safi; this.listenerResetLimitInMillsec = listenerResetLimitInMillsec; this.listenerResetEnforceCounter = listenerResetEnforceCounter; - this.topology = InstanceIdentifier.builder(NetworkTopology.class) - .child(Topology.class, this.topologyKey).build(); + topology = InstanceIdentifier.builder(NetworkTopology.class) + .child(Topology.class, topologyKey) + .build(); } protected AbstractTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, @@ -102,8 +102,8 @@ public abstract class AbstractTopologyBuilder implements Cluste } public final synchronized void start() { - LOG.debug("Initiating topology builder from {} at {}. AFI={}, SAFI={}", this.locRibReference, this.topology, - this.afi, this.safi); + LOG.debug("Initiating topology builder from {} at {}. AFI={}, SAFI={}", locRibReference, topology, + afi, safi); initTransactionChain(); initOperationalTopology(); registerDataChangeListener(); @@ -113,27 +113,27 @@ public abstract class AbstractTopologyBuilder implements Cluste * Register to data tree change listener. */ private synchronized void registerDataChangeListener() { - Preconditions.checkState(this.listenerRegistration == null, + Preconditions.checkState(listenerRegistration == null, "Topology Listener on topology %s has been registered before.", this.getInstanceIdentifier()); - final InstanceIdentifier tablesId = this.locRibReference.getInstanceIdentifier() - .child(LocRib.class).child(Tables.class, new TablesKey(this.afi, this.safi)); + final InstanceIdentifier tablesId = locRibReference.getInstanceIdentifier() + .child(LocRib.class).child(Tables.class, new TablesKey(afi, safi)); final DataTreeIdentifier id = DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, getRouteWildcard(tablesId)); - this.listenerRegistration = this.dataProvider.registerDataTreeChangeListener(id, this); + listenerRegistration = dataProvider.registerDataTreeChangeListener(id, this); LOG.debug("Registered listener {} on topology {}. Timestamp={}", this, this.getInstanceIdentifier(), - this.listenerScheduledRestartTime); + listenerScheduledRestartTime); } /** * Unregister to data tree change listener. */ private synchronized void unregisterDataChangeListener() { - if (this.listenerRegistration != null) { + if (listenerRegistration != null) { LOG.debug("Unregistered listener {} on topology {}", this, this.getInstanceIdentifier()); - this.listenerRegistration.close(); - this.listenerRegistration = null; + listenerRegistration.close(); + listenerRegistration = null; } } @@ -147,11 +147,11 @@ public abstract class AbstractTopologyBuilder implements Cluste @Override public final InstanceIdentifier getInstanceIdentifier() { - return this.topology; + return topology; } public final synchronized FluentFuture close() { - if (this.closed.getAndSet(true)) { + if (closed.getAndSet(true)) { LOG.trace("Transaction chain was already closed."); return CommitInfo.emptyFluentFuture(); } @@ -164,9 +164,9 @@ public abstract class AbstractTopologyBuilder implements Cluste @Override @SuppressWarnings("checkstyle:IllegalCatch") - public synchronized void onDataTreeChanged(final Collection> changes) { + public synchronized void onDataTreeChanged(final List> changes) { if (networkTopologyTransaction) { - if (this.closed.get()) { + if (closed.get()) { LOG.trace("Transaction chain was already closed, skipping update."); return; } @@ -175,7 +175,7 @@ public abstract class AbstractTopologyBuilder implements Cluste LOG.debug("The data change {} is disregarded due to restart of listener {}", changes, this); return; } - final ReadWriteTransaction trans = this.chain.newReadWriteTransaction(); + final ReadWriteTransaction trans = chain.newReadWriteTransaction(); LOG.trace("Received data change {} event with transaction {}", changes, trans.getIdentifier()); final AtomicBoolean transactionInError = new AtomicBoolean(false); for (final DataTreeModification change : changes) { @@ -244,11 +244,11 @@ public abstract class AbstractTopologyBuilder implements Cluste } private synchronized void initOperationalTopology() { - requireNonNull(this.chain, "A valid transaction chain must be provided."); - final WriteTransaction trans = this.chain.newWriteOnlyTransaction(); - trans.mergeParentStructurePut(LogicalDatastoreType.OPERATIONAL, this.topology, - new TopologyBuilder().withKey(this.topologyKey).setServerProvided(Boolean.TRUE) - .setTopologyTypes(this.topologyTypes) + requireNonNull(chain, "A valid transaction chain must be provided."); + final WriteTransaction trans = chain.newWriteOnlyTransaction(); + trans.mergeParentStructurePut(LogicalDatastoreType.OPERATIONAL, topology, + new TopologyBuilder().withKey(topologyKey).setServerProvided(Boolean.TRUE) + .setTopologyTypes(topologyTypes) .setLink(Map.of()).setNode(Map.of()).build()); trans.commit().addCallback(new FutureCallback() { @Override @@ -269,8 +269,8 @@ public abstract class AbstractTopologyBuilder implements Cluste * Destroy the current operational topology data. Note a valid transaction must be provided. */ private synchronized FluentFuture destroyOperationalTopology() { - requireNonNull(this.chain, "A valid transaction chain must be provided."); - final WriteTransaction trans = this.chain.newWriteOnlyTransaction(); + requireNonNull(chain, "A valid transaction chain must be provided."); + final WriteTransaction trans = chain.newWriteOnlyTransaction(); trans.delete(LogicalDatastoreType.OPERATIONAL, getInstanceIdentifier()); final FluentFuture future = trans.commit(); future.addCallback(new FutureCallback() { @@ -294,16 +294,17 @@ public abstract class AbstractTopologyBuilder implements Cluste */ private synchronized void initTransactionChain() { LOG.debug("Initializing transaction chain for topology {}", this); - Preconditions.checkState(this.chain == null, + Preconditions.checkState(chain == null, "Transaction chain has to be closed before being initialized"); - this.chain = this.dataProvider.createMergingTransactionChain(this); + chain = dataProvider.createMergingTransactionChain(); + chain.addCallback(this); } /** * Destroy the current transaction chain. */ private synchronized void destroyTransactionChain() { - if (this.chain != null) { + if (chain != null) { LOG.debug("Destroy transaction chain for topology {}", this); // we cannot close the transaction chain, as it will close the AbstractDOMForwardedTransactionFactory // and the transaction factory cannot be reopen even if we recreate the transaction chain @@ -317,7 +318,7 @@ public abstract class AbstractTopologyBuilder implements Cluste // LOG.error("Unable to close transaction chain {} for topology builder {}", this.chain, // getInstanceIdentifier()); // } - this.chain = null; + chain = null; } } @@ -327,7 +328,7 @@ public abstract class AbstractTopologyBuilder implements Cluste */ @VisibleForTesting protected synchronized void resetListener() { - requireNonNull(this.listenerRegistration, "Listener on topology " + this + " hasn't been initialized."); + requireNonNull(listenerRegistration, "Listener on topology " + this + " hasn't been initialized."); LOG.debug("Resetting data change listener for topology builder {}", getInstanceIdentifier()); // unregister current listener to prevent incoming data tree change first unregisterDataChangeListener(); @@ -370,13 +371,13 @@ public abstract class AbstractTopologyBuilder implements Cluste */ @VisibleForTesting protected synchronized boolean restartTransactionChainOnDemand() { - if (this.listenerScheduledRestartTime > 0) { + if (listenerScheduledRestartTime > 0) { // when the #this.listenerScheduledRestartTime timer timed out we can reset the listener, // otherwise we should only reset the transaction chain - if (System.currentTimeMillis() > this.listenerScheduledRestartTime) { + if (System.currentTimeMillis() > listenerScheduledRestartTime) { // reset the the restart timer - this.listenerScheduledRestartTime = 0; - this.listenerScheduledRestartEnforceCounter = 0; + listenerScheduledRestartTime = 0; + listenerScheduledRestartEnforceCounter = 0; resetListener(); return true; } @@ -388,29 +389,27 @@ public abstract class AbstractTopologyBuilder implements Cluste @VisibleForTesting protected synchronized void scheduleListenerRestart() { - if (0 == this.listenerScheduledRestartTime) { - this.listenerScheduledRestartTime = System.currentTimeMillis() + this.listenerResetLimitInMillsec; - } else if (System.currentTimeMillis() > this.listenerScheduledRestartTime - && ++this.listenerScheduledRestartEnforceCounter < this.listenerResetEnforceCounter) { + if (0 == listenerScheduledRestartTime) { + listenerScheduledRestartTime = System.currentTimeMillis() + listenerResetLimitInMillsec; + } else if (System.currentTimeMillis() > listenerScheduledRestartTime + && ++listenerScheduledRestartEnforceCounter < listenerResetEnforceCounter) { // if the transaction failure happens again, we will delay the listener restart up to // #LISTENER_RESET_LIMIT_IN_MILLSEC times - this.listenerScheduledRestartTime += this.listenerResetLimitInMillsec; + listenerScheduledRestartTime += listenerResetLimitInMillsec; } LOG.debug("A listener restart was scheduled at {} (current system time is {})", - this.listenerScheduledRestartTime, System.currentTimeMillis()); + listenerScheduledRestartTime, System.currentTimeMillis()); } @Override - public final synchronized void onTransactionChainFailed(final TransactionChain transactionChain, - final Transaction transaction, final Throwable cause) { - LOG.error("Topology builder for {} failed in transaction {}.", getInstanceIdentifier(), - transaction != null ? transaction.getIdentifier() : null, cause); + public final synchronized void onFailure(final Throwable cause) { + LOG.error("Topology builder for {} failed", getInstanceIdentifier(), cause); scheduleListenerRestart(); restartTransactionChainOnDemand(); } @Override - public final void onTransactionChainSuccessful(final TransactionChain transactionChain) { + public final void onSuccess(final Empty value) { LOG.info("Topology builder for {} shut down", getInstanceIdentifier()); } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java index ddada56bcf..68163081f8 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java @@ -9,8 +9,8 @@ package org.opendaylight.bgpcep.bgp.topology.provider.config; import static java.util.Objects.requireNonNull; -import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.PreDestroy; @@ -26,11 +26,10 @@ import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; 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.yangtools.concepts.AbstractRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.osgi.service.component.annotations.Activate; @@ -57,7 +56,7 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC private final Set topologies = new HashSet<>(); private final DataBroker dataBroker; private final ClusterSingletonServiceProvider singletonProvider; - private ListenerRegistration registration; + private Registration registration; @GuardedBy("this") private boolean closed; @@ -73,7 +72,7 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC } @Override - public synchronized void onDataTreeChanged(final Collection> changes) { + public synchronized void onDataTreeChanged(final List> changes) { if (closed) { LOG.trace("BGP Topology Provider Deployer was already closed, skipping changes."); return; diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java index b66032bc20..0e5907f997 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java @@ -5,7 +5,6 @@ * 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.bgpcep.bgp.topology.provider.config; import static java.util.Objects.requireNonNull; @@ -15,7 +14,7 @@ import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder; import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer; import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService; import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -32,40 +31,40 @@ final class TopologyReferenceSingletonServiceImpl implements TopologyReferenceSi final BgpTopologyDeployer deployer, final Topology configuration) { this.configuration = requireNonNull(configuration); this.topologyBuilder = requireNonNull(topologyBuilder); - this.serviceRegistration = deployer.registerService(this); + serviceRegistration = deployer.registerService(this); } @Override public InstanceIdentifier getInstanceIdentifier() { - return this.topologyBuilder.getInstanceIdentifier(); + return topologyBuilder.getInstanceIdentifier(); } @Override public void close() { - this.serviceRegistration.close(); + serviceRegistration.close(); } @Override public void instantiateServiceInstance() { LOG.info("Topology Singleton Service {} instantiated", getIdentifier()); - this.topologyBuilder.start(); + topologyBuilder.start(); } @Override public FluentFuture closeServiceInstance() { LOG.info("Close Topology Singleton Service {}", getIdentifier()); - return this.topologyBuilder.close(); + return topologyBuilder.close(); } @Override public ServiceGroupIdentifier getIdentifier() { - return ServiceGroupIdentifier.create(getInstanceIdentifier().firstKeyOf(Topology.class) - .getTopologyId().getValue()); + return new ServiceGroupIdentifier( + getInstanceIdentifier().firstKeyOf(Topology.class).getTopologyId().getValue()); } @Override public Topology getConfiguration() { - return this.configuration; + return configuration; } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/TopologyReferenceSingletonService.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/TopologyReferenceSingletonService.java index 3c8e647881..79dca05c61 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/TopologyReferenceSingletonService.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/TopologyReferenceSingletonService.java @@ -5,18 +5,15 @@ * 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.bgpcep.bgp.topology.provider.spi; import org.opendaylight.bgpcep.topology.TopologyReference; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; public interface TopologyReferenceSingletonService extends TopologyReference, AutoCloseable, ClusterSingletonService { - @Override void close(); Topology getConfiguration(); - } diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java index dd438d2b6c..eb09fc6f01 100644 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java +++ b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilderTest.java @@ -394,7 +394,7 @@ public class LinkstateTopologyBuilderTest extends AbstractTopologyBuilderTest { verify(spiedLinkstateTopologyBuilder, never()).resetListener(); Thread.sleep(LISTENER_RESTART_TIME); // manually invoke onTransactionChainFailed() to have the listener restart scheduled again - spiedLinkstateTopologyBuilder.onTransactionChainFailed(null, null, null); + spiedLinkstateTopologyBuilder.onFailure(null); assertEquals(spiedLinkstateTopologyBuilder.listenerScheduledRestartTime, listenerScheduledRestartTime + LISTENER_RESTART_TIME); verify(spiedLinkstateTopologyBuilder, times(5)).restartTransactionChainOnDemand(); diff --git a/binding-parent/pom.xml b/binding-parent/pom.xml index 1e339c7613..2cb1fc59d4 100644 --- a/binding-parent/pom.xml +++ b/binding-parent/pom.xml @@ -12,7 +12,7 @@ org.opendaylight.mdsal binding-parent - 12.0.4 + 13.0.0 diff --git a/bmp/bmp-impl/pom.xml b/bmp/bmp-impl/pom.xml index 3b950e5d26..f10e26e048 100644 --- a/bmp/bmp-impl/pom.xml +++ b/bmp/bmp-impl/pom.xml @@ -104,7 +104,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api io.netty diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java index 10e01044fd..5e6e65f67a 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java @@ -26,10 +26,9 @@ import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bmp.api.BmpDispatcher; import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation; @@ -42,6 +41,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.moni import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.bmp.monitor.Monitor; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.routers.Router; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; @@ -54,7 +54,7 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu private static final QName MONITOR_ID_QNAME = QName.create(Monitor.QNAME, "monitor-id").intern(); private static final ServiceGroupIdentifier SERVICE_GROUP_IDENTIFIER = - ServiceGroupIdentifier.create("bmp-monitors-service-group"); + new ServiceGroupIdentifier("bmp-monitors-service-group"); private final DOMDataBroker domDataBroker; private final InetSocketAddress address; @@ -64,7 +64,7 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu private final RouterSessionManager sessionManager; private final YangInstanceIdentifier yangMonitorId; private Channel channel; - private ClusterSingletonServiceRegistration singletonServiceRegistration; + private Registration singletonServiceRegistration; public BmpMonitoringStationImpl(final DOMDataBroker domDataBroker, final BmpDispatcher dispatcher, final RIBExtensionConsumerContext extensions, final BindingCodecTree codecTree, @@ -83,14 +83,14 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu sessionManager = new RouterSessionManager(yangMonitorId, this.domDataBroker, extensions, codecTree); LOG.info("BMP Monitor Singleton Service {} registered, Monitor Id {}", - getIdentifier().getName(), this.monitorId.getValue()); + getIdentifier().value(), this.monitorId.getValue()); singletonServiceRegistration = singletonProvider.registerClusterSingletonService(this); } @Override public synchronized void instantiateServiceInstance() { LOG.info("BMP Monitor Singleton Service {} instantiated, Monitor Id {}", - getIdentifier().getName(), monitorId.getValue()); + getIdentifier().value(), monitorId.getValue()); final ChannelFuture channelFuture = dispatcher.createServer(address, sessionManager, constructKeys(monitoredRouters)); @@ -128,7 +128,7 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation, Clu @Override public synchronized FluentFuture closeServiceInstance() { LOG.info("BMP Monitor Singleton Service {} instance closed, Monitor Id {}", - getIdentifier().getName(), monitorId.getValue()); + getIdentifier().value(), monitorId.getValue()); if (channel != null) { channel.close().addListener((ChannelFutureListener) future -> { Preconditions.checkArgument(future.isSuccess(), diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java index 76dfd38fca..ab33bb7b2a 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpRouterImpl.java @@ -25,10 +25,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bmp.api.BmpSession; import org.opendaylight.protocol.bmp.impl.spi.BmpRouter; @@ -45,6 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.moni import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.peers.Peer; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.routers.Router; import org.opendaylight.yangtools.yang.binding.Notification; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -53,7 +52,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class BmpRouterImpl implements BmpRouter, DOMTransactionChainListener { +public final class BmpRouterImpl implements BmpRouter, FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(BmpRouterImpl.class); @@ -83,7 +82,8 @@ public final class BmpRouterImpl implements BmpRouter, DOMTransactionChainListen public BmpRouterImpl(final RouterSessionManager sessionManager) { this.sessionManager = requireNonNull(sessionManager); domDataBroker = sessionManager.getDomDataBroker(); - domTxChain = domDataBroker.createMergingTransactionChain(this); + domTxChain = domDataBroker.createMergingTransactionChain(); + domTxChain.addCallback(this); extensions = sessionManager.getExtensions(); tree = sessionManager.getCodecTree(); } @@ -182,14 +182,13 @@ public final class BmpRouterImpl implements BmpRouter, DOMTransactionChainListen } @Override - public synchronized void onTransactionChainFailed(final DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { + public synchronized void onFailure(final Throwable cause) { LOG.error("Transaction chain failed.", cause); } @Override - public void onTransactionChainSuccessful(final DOMTransactionChain chain) { - LOG.debug("Transaction chain {} successfully.", chain); + public void onSuccess(final Empty value) { + LOG.debug("Transaction chain finished successfully."); } private synchronized boolean isDatastoreWritable() { diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java index 6225e275b4..499d3f0cdf 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java @@ -15,6 +15,7 @@ import com.google.common.util.concurrent.MoreExecutors; import java.net.InetSocketAddress; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.annotation.PreDestroy; @@ -32,7 +33,7 @@ import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bmp.api.BmpDispatcher; import org.opendaylight.protocol.bmp.impl.app.BmpMonitoringStationImpl; @@ -44,7 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.moni import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.BmpMonitor; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.MonitorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.bmp.monitor.Monitor; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -82,7 +83,7 @@ public final class BmpDeployerImpl implements ClusteredDataTreeChangeListener bmpMonitorServices = new HashMap<>(); @GuardedBy("this") - private ListenerRegistration registration; + private Registration registration; @Activate @Inject @@ -114,7 +115,7 @@ public final class BmpDeployerImpl implements ClusteredDataTreeChangeListener> changes) { + public synchronized void onDataTreeChanged(final List> changes) { final DataTreeModification dataTreeModification = Iterables.getOnlyElement(changes); final Collection> rootNode = dataTreeModification.getRootNode().getModifiedChildren(); diff --git a/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java b/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java index 5b5b08e2c5..16e367789a 100644 --- a/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java +++ b/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java @@ -46,9 +46,8 @@ import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBro import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTestCustomizer; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.bgp.inet.RIBActivator; import org.opendaylight.protocol.bgp.parser.impl.BGPActivator; import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext; @@ -92,6 +91,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.moni import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.peers.peer.Stats; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.routers.Router; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev200120.routers.RouterKey; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -126,9 +126,9 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest { private ClusterSingletonService singletonService; private ClusterSingletonService singletonService2; @Mock - private ClusterSingletonServiceRegistration singletonServiceRegistration; + private Registration singletonServiceRegistration; @Mock - private ClusterSingletonServiceRegistration singletonServiceRegistration2; + private Registration singletonServiceRegistration2; @Mock private ClusterSingletonServiceProvider clusterSSProv; @Mock diff --git a/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoader.java b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoader.java index bbf3cda4c1..abc507dd1e 100644 --- a/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoader.java +++ b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoader.java @@ -30,7 +30,7 @@ public final class OSGiConfigLoader extends AbstractWatchingConfigLoader { @Reference(policy = ReferencePolicy.DYNAMIC, updated = "setRuntimeContext", unbind = "setRuntimeContext") void setRuntimeContext(final BindingRuntimeContext runtimeContext) { - updateModelContext(runtimeContext.getEffectiveModelContext()); + updateModelContext(runtimeContext.modelContext()); } @Activate diff --git a/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoader.java b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoader.java index cd797a9bef..f2247033e4 100644 --- a/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoader.java +++ b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoader.java @@ -26,9 +26,9 @@ public final class SimpleConfigLoader extends AbstractWatchingConfigLoader imple @Inject public SimpleConfigLoader(final FileWatcher fileWatcher, final BindingRuntimeContext runtimeContext) { - updateModelContext(runtimeContext.getEffectiveModelContext()); - this.watchService = fileWatcher.getWatchService(); - this.directory = new File(fileWatcher.getPathFile()); + updateModelContext(runtimeContext.modelContext()); + watchService = fileWatcher.getWatchService(); + directory = new File(fileWatcher.getPathFile()); } @PostConstruct diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoaderTest.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoaderTest.java index a1f2a21657..af2e9d4082 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoaderTest.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoaderTest.java @@ -45,13 +45,13 @@ public abstract class AbstractConfigLoaderTest extends AbstractConcurrentDataBro public void setUp() throws Exception { MockitoAnnotations.initMocks(this); doNothing().when(processor).loadConfiguration(any()); - configLoader.updateModelContext(getSchemaContext()); + configLoader.updateModelContext(modelContext()); } @Override protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() { - final AbstractDataBrokerTestCustomizer customizer = super.createDataBrokerTestCustomizer(); - this.schemaService = customizer.getSchemaService(); + final var customizer = super.createDataBrokerTestCustomizer(); + schemaService = customizer.getSchemaService(); return customizer; } diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoaderTest.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoaderTest.java index 1d78609e1c..554588d358 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoaderTest.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/OSGiConfigLoaderTest.java @@ -54,7 +54,7 @@ public class OSGiConfigLoaderTest { }).when(watchKey).pollEvents(); doReturn("watchEvent").when(watchEvent).context(); doReturn(true).when(watchKey).reset(); - doReturn(domContext).when(bindingContext).getEffectiveModelContext(); + doReturn(domContext).when(bindingContext).modelContext(); loader = new OSGiConfigLoader(); loader.watcher = watcher; diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoaderTest.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoaderTest.java index b823aecef3..032bd3a84b 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoaderTest.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/SimpleConfigLoaderTest.java @@ -45,7 +45,7 @@ public class SimpleConfigLoaderTest { @Before public void before() throws InterruptedException { - doReturn(domContext).when(bindingContext).getEffectiveModelContext(); + doReturn(domContext).when(bindingContext).modelContext(); doReturn(watchService).when(watcher).getWatchService(); doReturn("foo").when(watcher).getPathFile(); doReturn(watchKey).when(watchService).take(); diff --git a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounter.java b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounter.java index a2535d0f1a..ccfa55ef86 100644 --- a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounter.java +++ b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounter.java @@ -8,19 +8,19 @@ package org.opendaylight.protocol.data.change.counter; +import static java.util.Objects.requireNonNull; + import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collection; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.LongAdder; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; +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.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -32,65 +32,67 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; 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; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class TopologyDataChangeCounter implements ClusteredDataTreeChangeListener, - TransactionChainListener, AutoCloseable { - +final class TopologyDataChangeCounter + implements DataTreeChangeListener, FutureCallback, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(TopologyDataChangeCounter.class); private final DataBroker dataBroker; private final String counterId; private final InstanceIdentifier counterInstanceId; private final LongAdder count = new LongAdder(); - private final ListenerRegistration registration; private final AtomicBoolean closed = new AtomicBoolean(false); + private final Registration registration; + private TransactionChain transactionChain; TopologyDataChangeCounter(final DataBroker dataBroker, final String counterId, final String topologyName) { - this.dataBroker = dataBroker; - this.transactionChain = this.dataBroker.createMergingTransactionChain(this); + this.dataBroker = requireNonNull(dataBroker); + transactionChain = dataBroker.createMergingTransactionChain(); this.counterId = counterId; - this.counterInstanceId = InstanceIdentifier.builder(DataChangeCounter.class) + counterInstanceId = InstanceIdentifier.builder(DataChangeCounter.class) .child(Counter.class, new CounterKey(this.counterId)).build(); - putCount(this.count.longValue()); + putCount(count.longValue()); final InstanceIdentifier topoIId = InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(topologyName))).build(); - this.registration = this.dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, topoIId), this); + registration = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, topoIId), this); LOG.debug("Data change counter {} initiated", this.counterId); + transactionChain.addCallback(this); } @Override - public synchronized void onDataTreeChanged(final Collection> changes) { - this.count.increment(); - final long inc = this.count.sum(); - LOG.debug("Data change #{} for counter {}", inc, this.counterId); + public synchronized void onDataTreeChanged(final List> changes) { + count.increment(); + final long inc = count.sum(); + LOG.debug("Data change #{} for counter {}", inc, counterId); putCount(inc); } @Override public synchronized void close() { - this.registration.close(); - final WriteTransaction wTx = this.dataBroker.newWriteOnlyTransaction(); - wTx.delete(LogicalDatastoreType.OPERATIONAL, this.counterInstanceId); + registration.close(); + final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction(); + wTx.delete(LogicalDatastoreType.OPERATIONAL, counterInstanceId); try { wTx.commit().get(); } catch (final ExecutionException | InterruptedException except) { - LOG.warn("Error on remove data change counter {}", this.counterId, except); + LOG.warn("Error on remove data change counter {}", counterId, except); } - this.transactionChain.close(); - LOG.debug("Data change counter {} removed", this.counterId); + transactionChain.close(); + LOG.debug("Data change counter {} removed", counterId); } private void putCount(final long totalCount) { - final WriteTransaction wTx = this.transactionChain.newWriteOnlyTransaction(); - final Counter counter = new CounterBuilder().setId(this.counterId).setCount(Uint32.valueOf(totalCount)).build(); - wTx.put(LogicalDatastoreType.OPERATIONAL, this.counterInstanceId, counter); + final WriteTransaction wTx = transactionChain.newWriteOnlyTransaction(); + final Counter counter = new CounterBuilder().setId(counterId).setCount(Uint32.valueOf(totalCount)).build(); + wTx.put(LogicalDatastoreType.OPERATIONAL, counterInstanceId, counter); wTx.commit().addCallback(new FutureCallback() { @Override public void onSuccess(final CommitInfo result) { @@ -105,17 +107,17 @@ final class TopologyDataChangeCounter implements ClusteredDataTreeChangeListener } @Override - public synchronized void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, - final Throwable cause) { - LOG.warn("Transaction chain failure. Transaction: {}", transaction, cause); + public synchronized void onFailure(final Throwable cause) { + LOG.warn("Transaction chain failure", cause); if (!closed.get()) { - this.transactionChain.close(); - this.transactionChain = dataBroker.createMergingTransactionChain(this); + transactionChain.close(); + transactionChain = dataBroker.createMergingTransactionChain(); + transactionChain.addCallback(this); } } @Override - public synchronized void onTransactionChainSuccessful(final TransactionChain chain) { - LOG.debug("Transaction chain successful. {}", chain); + public synchronized void onSuccess(final Empty result) { + LOG.debug("Transaction chain successful"); } } diff --git a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java index 1f05000cd1..0583d5bb2e 100644 --- a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java +++ b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java @@ -9,8 +9,8 @@ package org.opendaylight.protocol.data.change.counter; import static java.util.Objects.requireNonNull; -import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.annotation.PreDestroy; import javax.inject.Inject; @@ -23,7 +23,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpcep.data.change.counter.config.rev170424.DataChangeCounterConfig; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -44,14 +44,14 @@ public final class TopologyDataChangeCounterDeployer implements DataTreeChangeLi @GuardedBy("this") private final Map counters = new HashMap<>(); @GuardedBy("this") - private ListenerRegistration registration; + private Registration registration; @Inject @Activate public TopologyDataChangeCounterDeployer(@Reference final DataBroker dataBroker) { this.dataBroker = requireNonNull(dataBroker); - registration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, DATA_CHANGE_COUNTER_IID), this); + registration = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, DATA_CHANGE_COUNTER_IID), this); LOG.info("Data change counter Deployer started"); } @@ -69,21 +69,20 @@ public final class TopologyDataChangeCounterDeployer implements DataTreeChangeLi } @Override - public synchronized void onDataTreeChanged( - final Collection> changes) { + public synchronized void onDataTreeChanged(final List> changes) { for (var change : changes) { final var rootNode = change.getRootNode(); - switch (rootNode.getModificationType()) { + switch (rootNode.modificationType()) { case DELETE: - deleteCounterChange(rootNode.getDataBefore().getCounterId()); + deleteCounterChange(rootNode.dataBefore().getCounterId()); break; case SUBTREE_MODIFIED: case WRITE: - final var counterConfig = rootNode.getDataAfter(); + final var counterConfig = rootNode.dataAfter(); handleCounterChange(counterConfig.getCounterId(), counterConfig.getTopologyName()); break; default: - LOG.error("Unhandled modification Type: {}", rootNode.getModificationType()); + LOG.error("Unhandled modification Type: {}", rootNode.modificationType()); break; } } diff --git a/features/odl-bgpcep-bgp-benchmark/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-benchmark/src/main/feature/feature.xml index 7af481c380..04cd48425a 100644 --- a/features/odl-bgpcep-bgp-benchmark/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-benchmark/src/main/feature/feature.xml @@ -11,7 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker - odl-controller-blueprint + odl-mdsal-broker + odl-controller-blueprint diff --git a/features/odl-bgpcep-bgp-dependencies/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-dependencies/src/main/feature/feature.xml index b7ae84bb1b..c391fcd7b3 100644 --- a/features/odl-bgpcep-bgp-dependencies/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-dependencies/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-yangtools-data-api + odl-yangtools-data-api diff --git a/features/odl-bgpcep-bgp-evpn/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-evpn/src/main/feature/feature.xml index 8096913023..9bda42ccf5 100644 --- a/features/odl-bgpcep-bgp-evpn/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-evpn/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-rfc8294-netty + odl-mdsal-rfc8294-netty diff --git a/features/odl-bgpcep-bgp-labeled-unicast/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-labeled-unicast/src/main/feature/feature.xml index 62b9bf9f68..b87a9a7721 100644 --- a/features/odl-bgpcep-bgp-labeled-unicast/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-labeled-unicast/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-rfc8294-netty + odl-mdsal-rfc8294-netty diff --git a/features/odl-bgpcep-bgp-linkstate/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-linkstate/src/main/feature/feature.xml index 721e4dd6ca..1a036a3fea 100644 --- a/features/odl-bgpcep-bgp-linkstate/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-linkstate/src/main/feature/feature.xml @@ -11,7 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker - odl-mdsal-rfc8294-netty + odl-mdsal-broker + odl-mdsal-rfc8294-netty diff --git a/features/odl-bgpcep-bgp-openconfig-rp-impl/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-openconfig-rp-impl/src/main/feature/feature.xml index ccb4d08964..6f3924cc44 100644 --- a/features/odl-bgpcep-bgp-openconfig-rp-impl/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-openconfig-rp-impl/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-bgp-openconfig-rp-statement/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-openconfig-rp-statement/src/main/feature/feature.xml index a1982781c3..e75930725e 100644 --- a/features/odl-bgpcep-bgp-openconfig-rp-statement/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-openconfig-rp-statement/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-bgp-parser-api/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-parser-api/src/main/feature/feature.xml index ae408a7f03..d1d398f3ae 100644 --- a/features/odl-bgpcep-bgp-parser-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-parser-api/src/main/feature/feature.xml @@ -11,7 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-yangtools-data - odl-yangtools-netty + odl-yangtools-data + odl-yangtools-netty diff --git a/features/odl-bgpcep-bgp-rib-api/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-rib-api/src/main/feature/feature.xml index 81acbf6e3d..dbb7ca5d66 100644 --- a/features/odl-bgpcep-bgp-rib-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-rib-api/src/main/feature/feature.xml @@ -11,9 +11,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-model-rfc8343 - odl-mdsal-singleton-common - odl-mdsal-dom-api - odl-mdsal-binding-runtime + odl-mdsal-model-rfc8343 + odl-mdsal-singleton-common + odl-mdsal-dom-api + odl-mdsal-binding-runtime diff --git a/features/odl-bgpcep-bgp-rib-impl/pom.xml b/features/odl-bgpcep-bgp-rib-impl/pom.xml index c559d534ce..6d08089c4b 100644 --- a/features/odl-bgpcep-bgp-rib-impl/pom.xml +++ b/features/odl-bgpcep-bgp-rib-impl/pom.xml @@ -85,12 +85,6 @@ xml routing-policy-default-config - - org.opendaylight.controller - odl-controller-exp-netty-config - xml - features - org.opendaylight.controller odl-controller-blueprint diff --git a/features/odl-bgpcep-bgp-rib-impl/src/main/feature/feature.xml b/features/odl-bgpcep-bgp-rib-impl/src/main/feature/feature.xml index a3863066bb..cc99f0fb11 100644 --- a/features/odl-bgpcep-bgp-rib-impl/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bgp-rib-impl/src/main/feature/feature.xml @@ -11,8 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-controller-blueprint - odl-controller-exp-netty-config + odl-controller-blueprint mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/routing-policy-default-config diff --git a/features/odl-bgpcep-bmp-config-loader/src/main/feature/feature.xml b/features/odl-bgpcep-bmp-config-loader/src/main/feature/feature.xml index 4a3b5fc2e4..82abd8bfa3 100644 --- a/features/odl-bgpcep-bmp-config-loader/src/main/feature/feature.xml +++ b/features/odl-bgpcep-bmp-config-loader/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-concepts/src/main/feature/feature.xml b/features/odl-bgpcep-concepts/src/main/feature/feature.xml index 54e899a817..e834810277 100644 --- a/features/odl-bgpcep-concepts/src/main/feature/feature.xml +++ b/features/odl-bgpcep-concepts/src/main/feature/feature.xml @@ -11,7 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-model-rfc6991 - odl-mdsal-model-rfc8294 + odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc8294 diff --git a/features/odl-bgpcep-config-loader-impl/src/main/feature/feature.xml b/features/odl-bgpcep-config-loader-impl/src/main/feature/feature.xml index 85dd87da74..270e644cdd 100644 --- a/features/odl-bgpcep-config-loader-impl/src/main/feature/feature.xml +++ b/features/odl-bgpcep-config-loader-impl/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-yangtools-codec + odl-yangtools-codec diff --git a/features/odl-bgpcep-config-loader-spi/src/main/feature/feature.xml b/features/odl-bgpcep-config-loader-spi/src/main/feature/feature.xml index 1b7f976e8a..a155fa5128 100644 --- a/features/odl-bgpcep-config-loader-spi/src/main/feature/feature.xml +++ b/features/odl-bgpcep-config-loader-spi/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-binding-runtime + odl-mdsal-binding-runtime diff --git a/features/odl-bgpcep-data-change-counter/src/main/feature/feature.xml b/features/odl-bgpcep-data-change-counter/src/main/feature/feature.xml index f7dc754add..acb257099c 100644 --- a/features/odl-bgpcep-data-change-counter/src/main/feature/feature.xml +++ b/features/odl-bgpcep-data-change-counter/src/main/feature/feature.xml @@ -8,7 +8,7 @@ --> - odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal - odl-mdsal-broker + odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal + odl-mdsal-broker diff --git a/features/odl-bgpcep-graph-api/src/main/feature/feature.xml b/features/odl-bgpcep-graph-api/src/main/feature/feature.xml index 5d1396dde3..9bb4808221 100644 --- a/features/odl-bgpcep-graph-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-graph-api/src/main/feature/feature.xml @@ -11,7 +11,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-model-rfc6991 - odl-mdsal-model-rfc8294 + odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc8294 diff --git a/features/odl-bgpcep-graph/src/main/feature/feature.xml b/features/odl-bgpcep-graph/src/main/feature/feature.xml index 78b5baf3e0..1f35a27b33 100644 --- a/features/odl-bgpcep-graph/src/main/feature/feature.xml +++ b/features/odl-bgpcep-graph/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-pcep-impl/pom.xml b/features/odl-bgpcep-pcep-impl/pom.xml index c26d10acb0..b7942aa5e0 100644 --- a/features/odl-bgpcep-pcep-impl/pom.xml +++ b/features/odl-bgpcep-pcep-impl/pom.xml @@ -22,12 +22,6 @@ OpenDaylight :: PCEP :: Impl - - org.opendaylight.controller - odl-controller-exp-netty-config - xml - features - org.opendaylight.controller odl-mdsal-broker diff --git a/features/odl-bgpcep-pcep-impl/src/main/feature/feature.xml b/features/odl-bgpcep-pcep-impl/src/main/feature/feature.xml index 1ff0ad1ace..871d2d6da4 100644 --- a/features/odl-bgpcep-pcep-impl/src/main/feature/feature.xml +++ b/features/odl-bgpcep-pcep-impl/src/main/feature/feature.xml @@ -11,7 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-controller-exp-netty-config - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-pcep-p2mp-te-lsp/src/main/feature/feature.xml b/features/odl-bgpcep-pcep-p2mp-te-lsp/src/main/feature/feature.xml index bc1697db93..825804cf4c 100644 --- a/features/odl-bgpcep-pcep-p2mp-te-lsp/src/main/feature/feature.xml +++ b/features/odl-bgpcep-pcep-p2mp-te-lsp/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-programming-api/src/main/feature/feature.xml b/features/odl-bgpcep-programming-api/src/main/feature/feature.xml index 6a237bd8eb..08ef523bfe 100644 --- a/features/odl-bgpcep-programming-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-programming-api/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-singleton-common + odl-mdsal-singleton-common diff --git a/features/odl-bgpcep-programming-impl/pom.xml b/features/odl-bgpcep-programming-impl/pom.xml index 70b4102357..7bbdcd8049 100644 --- a/features/odl-bgpcep-programming-impl/pom.xml +++ b/features/odl-bgpcep-programming-impl/pom.xml @@ -38,11 +38,5 @@ xml features - - org.opendaylight.controller - odl-controller-exp-netty-config - xml - features - diff --git a/features/odl-bgpcep-programming-impl/src/main/feature/feature.xml b/features/odl-bgpcep-programming-impl/src/main/feature/feature.xml index 8bbae52134..17bc6bd5bd 100644 --- a/features/odl-bgpcep-programming-impl/src/main/feature/feature.xml +++ b/features/odl-bgpcep-programming-impl/src/main/feature/feature.xml @@ -11,7 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-controller-exp-netty-config - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-rsvp-api/src/main/feature/feature.xml b/features/odl-bgpcep-rsvp-api/src/main/feature/feature.xml index bf2939369c..2b8360638c 100644 --- a/features/odl-bgpcep-rsvp-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-rsvp-api/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-yangtools-netty + odl-yangtools-netty diff --git a/features/odl-bgpcep-topology-api/src/main/feature/feature.xml b/features/odl-bgpcep-topology-api/src/main/feature/feature.xml index 24d319bb1d..4c95e0365e 100644 --- a/features/odl-bgpcep-topology-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-topology-api/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal + odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal diff --git a/features/odl-bgpcep-topology-config-loader/src/main/feature/feature.xml b/features/odl-bgpcep-topology-config-loader/src/main/feature/feature.xml index 0cfb78a079..fabd0e4156 100644 --- a/features/odl-bgpcep-topology-config-loader/src/main/feature/feature.xml +++ b/features/odl-bgpcep-topology-config-loader/src/main/feature/feature.xml @@ -11,6 +11,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> - odl-mdsal-broker + odl-mdsal-broker diff --git a/features/odl-bgpcep-topology-tunnel-api/src/main/feature/feature.xml b/features/odl-bgpcep-topology-tunnel-api/src/main/feature/feature.xml index ce16a8443f..ac7dbff855 100644 --- a/features/odl-bgpcep-topology-tunnel-api/src/main/feature/feature.xml +++ b/features/odl-bgpcep-topology-tunnel-api/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal + odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal diff --git a/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/ConnectedGraphServer.java b/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/ConnectedGraphServer.java index 731f2ddf76..0cda75ab23 100644 --- a/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/ConnectedGraphServer.java +++ b/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/ConnectedGraphServer.java @@ -26,9 +26,7 @@ import org.opendaylight.graph.ConnectedGraph; import org.opendaylight.graph.ConnectedGraphProvider; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; -import org.opendaylight.mdsal.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -43,6 +41,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.re import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.graph.Vertex; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -59,7 +58,7 @@ import org.slf4j.LoggerFactory; */ @Singleton @Component(immediate = true, service = ConnectedGraphProvider.class) -public final class ConnectedGraphServer implements ConnectedGraphProvider, TransactionChainListener, AutoCloseable { +public final class ConnectedGraphServer implements ConnectedGraphProvider, FutureCallback, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(ConnectedGraphServer.class); private static final @NonNull InstanceIdentifier GRAPH_TOPOLOGY_IDENTIFIER = InstanceIdentifier.create(GraphTopology.class); @@ -95,7 +94,8 @@ public final class ConnectedGraphServer implements ConnectedGraphProvider, Trans private synchronized void initTransactionChain() { LOG.debug("Initializing transaction chain for Graph Model Server {}", this); checkState(chain == null, "Transaction chain has to be closed before being initialized"); - chain = dataBroker.createMergingTransactionChain(this); + chain = dataBroker.createMergingTransactionChain(); + chain.addCallback(this); } /** @@ -373,14 +373,12 @@ public final class ConnectedGraphServer implements ConnectedGraphProvider, Trans } @Override - public synchronized void onTransactionChainFailed(final TransactionChain transactionChain, - final Transaction transaction, final Throwable cause) { - LOG.error("GraphModel builder for {} failed in transaction: {} ", GRAPH_TOPOLOGY_IDENTIFIER, - transaction != null ? transaction.getIdentifier() : null, cause); + public synchronized void onFailure(final Throwable cause) { + LOG.error("GraphModel builder for {} failed", GRAPH_TOPOLOGY_IDENTIFIER, cause); } @Override - public void onTransactionChainSuccessful(final TransactionChain transactionChain) { + public void onSuccess(final Empty result) { LOG.info("GraphModel builder for {} shut down", GRAPH_TOPOLOGY_IDENTIFIER); } diff --git a/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/GraphListener.java b/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/GraphListener.java index 401dd238b1..c1eaa0deb6 100644 --- a/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/GraphListener.java +++ b/graph/graph-impl/src/main/java/org/opendaylight/graph/impl/GraphListener.java @@ -10,6 +10,7 @@ package org.opendaylight.graph.impl; import static java.util.Objects.requireNonNull; import java.util.Collection; +import java.util.List; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; @@ -23,11 +24,10 @@ import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.GraphTopology; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.Graph; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.graph.Edge; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.graph.Prefix; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.graph.Vertex; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.osgi.service.component.annotations.Activate; @@ -51,7 +51,7 @@ public final class GraphListener implements DataTreeChangeListener, AutoC private final ConnectedGraphProvider graphProvider; - private ListenerRegistration listenerRegistration; + private Registration listenerRegistration; @Inject @Activate @@ -61,7 +61,7 @@ public final class GraphListener implements DataTreeChangeListener, AutoC final var graphIdentifier = InstanceIdentifier.builder(GraphTopology.class).child(Graph.class).build(); listenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, graphIdentifier), this); + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, graphIdentifier), this); LOG.info("Registered listener {} on Graph Model at {}", this, graphIdentifier); } @@ -92,9 +92,9 @@ public final class GraphListener implements DataTreeChangeListener, AutoC final Collection> children) { for (var child : children) { final DataObject value; - switch (child.getModificationType()) { + switch (child.modificationType()) { case DELETE: - value = child.getDataBefore(); + value = child.dataBefore(); if (value instanceof Vertex vertex) { cgraph.deleteVertex(vertex.key()); } @@ -107,7 +107,7 @@ public final class GraphListener implements DataTreeChangeListener, AutoC break; case SUBTREE_MODIFIED: case WRITE: - value = child.getDataAfter(); + value = child.dataAfter(); if (value instanceof Vertex vertex) { cgraph.addVertex(vertex); } @@ -125,11 +125,11 @@ public final class GraphListener implements DataTreeChangeListener, AutoC } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - DataObjectModification root = change.getRootNode(); - GraphKey key = change.getRootPath().getRootIdentifier().firstKeyOf(Graph.class); - switch (root.getModificationType()) { + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var root = change.getRootNode(); + final var key = change.getRootPath().path().firstKeyOf(Graph.class); + switch (root.modificationType()) { case DELETE: graphProvider.deleteGraph(key); break; @@ -142,10 +142,10 @@ public final class GraphListener implements DataTreeChangeListener, AutoC /* First look if the Graph was not already configured */ ConnectedGraph cgraph = graphProvider.getConnectedGraph(key); if (cgraph == null) { - graphProvider.addGraph(root.getDataAfter()); + graphProvider.addGraph(root.dataAfter()); } else { /* Graph exist, process Children */ - parseSubTree(cgraph, root.getModifiedChildren()); + parseSubTree(cgraph, root.modifiedChildren()); } break; default: diff --git a/parent/pom.xml b/parent/pom.xml index 253191b273..d38e19890c 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -47,7 +47,7 @@ org.opendaylight.controller controller-artifacts - 8.0.4 + 9.0.0 import pom @@ -55,7 +55,7 @@ org.opendaylight.yangtools yangtools-artifacts - 11.0.5 + 13.0.1 import pom @@ -63,7 +63,7 @@ org.opendaylight.mdsal mdsal-artifacts - 12.0.4 + 13.0.0 pom import @@ -71,7 +71,7 @@ org.opendaylight.netconf netconf-artifacts - 6.0.6 + 7.0.0 pom import diff --git a/pcep/segment-routing/pom.xml b/pcep/segment-routing/pom.xml index 589a9cbed0..d4656a7b55 100644 --- a/pcep/segment-routing/pom.xml +++ b/pcep/segment-routing/pom.xml @@ -48,6 +48,10 @@ ${project.groupId} pcep-base-parser + + ${project.groupId} + pcep-topology-api + com.google.guava guava diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java index 9563bfe6bb..02c079f622 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/DefaultPceServerProvider.java @@ -21,7 +21,7 @@ import org.opendaylight.bgpcep.pcep.server.PceServerProvider; import org.opendaylight.graph.ConnectedGraph; import org.opendaylight.graph.ConnectedGraphProvider; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.graph.topology.GraphKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; @@ -39,26 +39,27 @@ import org.slf4j.LoggerFactory; @Component(immediate = true) public final class DefaultPceServerProvider implements PceServerProvider, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DefaultPceServerProvider.class); + + private final Map pathManagers = new HashMap<>(); + private final Map pathListeners = new HashMap<>(); + private final Map pcepListeners = new HashMap<>(); private final ConnectedGraphProvider graphProvider; private final PathComputationProvider algoProvider; private final DataBroker dataBroker; - private final RpcConsumerRegistry rpcRegistry; - private Map pathManagers = new HashMap(); - private Map pathListeners = new HashMap(); - private Map pcepListeners = new HashMap(); + private final RpcService rpcService; + private volatile ConnectedGraph tedGraph; private volatile GraphKey graphKey; @Inject @Activate public DefaultPceServerProvider(@Reference final ConnectedGraphProvider graphProvider, - @Reference final PathComputationProvider pathComputationProvider, - @Reference final DataBroker dataBroker, - @Reference final RpcConsumerRegistry rpcConsumerRegistry) { + @Reference final PathComputationProvider pathComputationProvider, @Reference final DataBroker dataBroker, + @Reference final RpcService rpcService) { this.graphProvider = requireNonNull(graphProvider); - this.algoProvider = requireNonNull(pathComputationProvider); + algoProvider = requireNonNull(pathComputationProvider); this.dataBroker = requireNonNull(dataBroker); - this.rpcRegistry = requireNonNull(rpcConsumerRegistry); + this.rpcService = requireNonNull(rpcService); } @Override @@ -82,8 +83,7 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl pathManagers.clear(); } - private void closeListenerAndManager(TopologyId key) { - + private void closeListenerAndManager(final TopologyId key) { PathManagerListener pathListener = pathListeners.remove(key); if (pathListener != null) { pathListener.close(); @@ -123,9 +123,10 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl } @Override - public void registerPcepTopology(KeyedInstanceIdentifier topology, GraphKey key) { + public void registerPcepTopology(final KeyedInstanceIdentifier topology, + final GraphKey key) { TopologyId topoKey = requireNonNull(topology).getKey().getTopologyId(); - this.graphKey = requireNonNull(key); + graphKey = requireNonNull(key); LOG.info("Start PCE Server components for Topology {} with TED {}", topoKey.getValue(), graphKey.getName()); @@ -133,7 +134,7 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl closeListenerAndManager(topoKey); /* Then create Path Manger */ - PathManagerProvider pathManager = new PathManagerProvider(dataBroker, topology, rpcRegistry, this); + PathManagerProvider pathManager = new PathManagerProvider(dataBroker, topology, rpcService, this); /* And Listener */ PathManagerListener pathListener = new PathManagerListener(dataBroker, topology, pathManager); @@ -146,9 +147,9 @@ public final class DefaultPceServerProvider implements PceServerProvider, AutoCl } @Override - public void unRegisterPcepTopology(KeyedInstanceIdentifier topology) { + public void unRegisterPcepTopology(final KeyedInstanceIdentifier topology) { TopologyId topoKey = requireNonNull(topology).getKey().getTopologyId(); - this.graphKey = null; + graphKey = null; LOG.info("Stop PCE Server for Topology {}", topoKey.getValue()); closeListenerAndManager(topoKey); diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTeNode.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTeNode.java index c685a2e09a..d3d0808c4f 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTeNode.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTeNode.java @@ -23,27 +23,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ManagedTeNode { - private enum NodeState { Disabled, Enabled, Sync } + private static final Logger LOG = LoggerFactory.getLogger(ManagedTeNode.class); + + private final ConcurrentMap mngPaths = new ConcurrentHashMap<>(); + private final TransactionChain chain; private final NodeId id; private NodeState state; - private ConcurrentMap mngPaths = - new ConcurrentHashMap(); - private final TransactionChain chain; - private static final Logger LOG = LoggerFactory.getLogger(ManagedTeNode.class); public ManagedTeNode(final NodeId id, final TransactionChain chain) { this.id = id; this.chain = chain; - this.state = NodeState.Enabled; + state = NodeState.Enabled; } - public ManagedTeNode(final NodeId id, TransactionChain chain, final NodeState state) { + public ManagedTeNode(final NodeId id, final TransactionChain chain, final NodeState state) { this.id = id; this.chain = chain; this.state = state; diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTePath.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTePath.java index 9bf9a0aef0..a3f22345d5 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTePath.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/ManagedTePath.java @@ -18,7 +18,7 @@ import com.google.common.util.concurrent.MoreExecutors; import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; -import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.graph.ConnectedEdge; import org.opendaylight.graph.ConnectedEdgeTrigger; import org.opendaylight.graph.ConnectedGraph; @@ -98,29 +98,30 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg private static final Logger LOG = LoggerFactory.getLogger(ManagedTePath.class); - public ManagedTePath(ManagedTeNode teNode, InstanceIdentifier topology) { + public ManagedTePath(final ManagedTeNode teNode, final InstanceIdentifier topology) { this.teNode = requireNonNull(teNode); - this.pcepTopology = requireNonNull(topology); - this.pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) + pcepTopology = requireNonNull(topology); + pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) .child(PathComputationClient.class).augmentation(PathComputationClient1.class); } - public ManagedTePath(ManagedTeNode teNode, final ConfiguredLsp lsp, InstanceIdentifier topology) { - this.cfgLsp = requireNonNull(lsp); + public ManagedTePath(final ManagedTeNode teNode, final ConfiguredLsp lsp, + final InstanceIdentifier topology) { + cfgLsp = requireNonNull(lsp); this.teNode = requireNonNull(teNode); - this.pcepTopology = requireNonNull(topology); - this.pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) + pcepTopology = requireNonNull(topology); + pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) .child(PathComputationClient.class).augmentation(PathComputationClient1.class); } - public ManagedTePath(ManagedTeNode teNode, final ManagedTePath mngPath) { + public ManagedTePath(final ManagedTeNode teNode, final ManagedTePath mngPath) { checkArgument(mngPath != null, "Managed TE Path is mandatory. Can't be null or empty!"); - this.cfgLsp = mngPath.getLsp(); - this.sent = mngPath.isSent(); - this.type = mngPath.getType(); + cfgLsp = mngPath.getLsp(); + sent = mngPath.isSent(); + type = mngPath.getType(); this.teNode = requireNonNull(teNode); - this.pcepTopology = mngPath.getTopology(); - this.pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) + pcepTopology = mngPath.getTopology(); + pccIdentifier = pcepTopology.child(Node.class, new NodeKey(teNode.getId())).augmentation(Node1.class) .child(PathComputationClient.class).augmentation(PathComputationClient1.class); } @@ -141,12 +142,12 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg } public ManagedTePath setConfiguredLsp(final ConfiguredLsp lsp) { - this.prevLsp = this.cfgLsp; - this.cfgLsp = lsp; + prevLsp = cfgLsp; + cfgLsp = lsp; return this; } - public ManagedTePath setType(PathType type) { + public ManagedTePath setType(final PathType type) { this.type = type; return this; } @@ -156,7 +157,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg * */ public void sync() { - this.cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Sync).build(); + cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Sync).build(); updateToDataStore(); } @@ -164,14 +165,14 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg * Disabling this TE Path by marking it as Configured. Do not update the Data Store. */ public void disabled() { - this.cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Configured).build(); + cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Configured).build(); } /** * Mark this TE Path as Failed. */ public void failed() { - this.cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Failed).build(); + cfgLsp = new ConfiguredLspBuilder(cfgLsp).setPathStatus(PathStatus.Failed).build(); updateToDataStore(); } @@ -238,7 +239,8 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg return PathStatus.Sync; } - private void configureGraph(ConnectedGraph graph, ComputedPath cpath, Constraints cts, boolean config) { + private void configureGraph(final ConnectedGraph graph, final ComputedPath cpath, final Constraints cts, + final boolean config) { /* Check that Connected Graph is valid */ if (graph == null) { return; @@ -320,19 +322,19 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg triggerFlag = false; } - private boolean edgeAttrNotNull(ConnectedEdge edge) { + private static boolean edgeAttrNotNull(final ConnectedEdge edge) { return edge != null && edge.getEdge() != null && edge.getEdge().getEdgeAttributes() != null; } - public void setGraph(ConnectedGraph graph) { + public void setGraph(final ConnectedGraph graph) { configureGraph(graph, cfgLsp.getComputedPath(), cfgLsp.getIntendedPath().getConstraints(), true); } - public void unsetGraph(ConnectedGraph graph) { + public void unsetGraph(final ConnectedGraph graph) { configureGraph(graph, cfgLsp.getComputedPath(), cfgLsp.getIntendedPath().getConstraints(), false); } - public void updateGraph(ConnectedGraph graph) { + public void updateGraph(final ConnectedGraph graph) { /* First unset Bandwidth and Triggers for the old path if any */ if (prevLsp != null) { configureGraph(graph, prevLsp.getComputedPath(), prevLsp.getIntendedPath().getConstraints(), false); @@ -353,7 +355,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg } @Override - public boolean verifyVertex(@Nullable ConnectedVertex next, @Nullable Vertex current) { + public boolean verifyVertex(final ConnectedVertex next, final Vertex current) { /* Check if there is an on-going trigger */ if (triggerFlag) { return false; @@ -380,7 +382,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg } @Override - public boolean verifyEdge(@Nullable ConnectedEdge next, @Nullable Edge current) { + public boolean verifyEdge(final ConnectedEdge next, final Edge current) { /* Check if there is an on-going trigger */ if (triggerFlag) { return false; @@ -501,12 +503,12 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg final Ipv4Builder ipBuilder = new Ipv4Builder() .setDestinationIpv4Address(new Ipv4AddressNoZone(iPath.getDestination().getIpv4Address())) .setSourceIpv4Address(new Ipv4AddressNoZone(iPath.getSource().getIpv4Address())); - epb.setAddressFamily((new Ipv4CaseBuilder().setIpv4(ipBuilder.build()).build())); + epb.setAddressFamily(new Ipv4CaseBuilder().setIpv4(ipBuilder.build()).build()); } else if (cfgLsp.getIntendedPath().getSource().getIpv6Address() != null) { final Ipv6Builder ipBuilder = new Ipv6Builder() .setDestinationIpv6Address(new Ipv6AddressNoZone(iPath.getDestination().getIpv6Address())) .setSourceIpv6Address(new Ipv6AddressNoZone(iPath.getSource().getIpv6Address())); - epb.setAddressFamily((new Ipv6CaseBuilder().setIpv6(ipBuilder.build()).build())); + epb.setAddressFamily(new Ipv6CaseBuilder().setIpv6(ipBuilder.build()).build()); } else { // In case of ... return null; @@ -595,7 +597,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg */ public ListenableFuture> addPath(final AddLsp addLsp) { /* Check if we could add this path */ - if ((type != PathType.Initiated) || !teNode.isSync()) { + if (type != PathType.Initiated || !teNode.isSync()) { return null; } @@ -605,9 +607,9 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg } sent = true; - final ListenableFuture> enforce = addLsp.invoke(getAddLspInput()); + final var enforce = addLsp.invoke(getAddLspInput()); LOG.info("Call Add LSP to {} with {}", addLsp, enforce); - Futures.addCallback(enforce, new FutureCallback>() { + Futures.addCallback(enforce, new FutureCallback<>() { @Override public void onSuccess(final RpcResult result) { if (result.isSuccessful()) { @@ -634,7 +636,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg * * @return new Update LSP Input */ - private UpdateLspInput getUpdateLspInput() { + private @NonNull UpdateLspInput getUpdateLspInput() { /* Create Path Setup Type */ final IntendedPath iPath = cfgLsp.getIntendedPath(); final PathSetupTypeBuilder pstBuilder = new PathSetupTypeBuilder(); @@ -721,7 +723,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg public ListenableFuture> updatePath(final UpdateLsp updateLsp) { /* Check if we could update this path */ - if ((type != PathType.Initiated && type != PathType.Delegated) || !teNode.isSync()) { + if (type != PathType.Initiated && type != PathType.Delegated || !teNode.isSync()) { return null; } @@ -732,9 +734,9 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg sent = true; final NodeId id = teNode.getId(); - final ListenableFuture> enforce = updateLsp.invoke(getUpdateLspInput()); + final var enforce = updateLsp.invoke(getUpdateLspInput()); LOG.info("Call Update LSP to {} with {}", updateLsp, enforce); - Futures.addCallback(enforce, new FutureCallback>() { + Futures.addCallback(enforce, new FutureCallback<>() { @Override public void onSuccess(final RpcResult result) { if (result.isSuccessful()) { @@ -767,7 +769,7 @@ public class ManagedTePath implements ConnectedEdgeTrigger, ConnectedVertexTrigg public ListenableFuture> removePath(final RemoveLsp removeLsp) { /* Check if we could remove this path */ - if ((type != PathType.Initiated) || !teNode.isSync() || cfgLsp.getPathStatus() != PathStatus.Sync) { + if (type != PathType.Initiated || !teNode.isSync() || cfgLsp.getPathStatus() != PathStatus.Sync) { return null; } diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathComputationImpl.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathComputationImpl.java index cffac39ac0..6c4037c22a 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathComputationImpl.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathComputationImpl.java @@ -50,7 +50,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.Metrics; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq.message.Requests; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq.message.requests.segment.computation.P2p; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.SubobjectType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.IpPrefixCase; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Uint32; @@ -246,11 +245,11 @@ public class PathComputationImpl implements PathComputation { private VertexKey getDestinationVertexKey(final EndpointsObj endPoints) { IpAddress address = null; - if (endPoints.getAddressFamily() instanceof Ipv4Case) { - address = new IpAddress(((Ipv4Case) endPoints.getAddressFamily()).getIpv4().getDestinationIpv4Address()); + if (endPoints.getAddressFamily() instanceof Ipv4Case ipv4) { + address = new IpAddress(ipv4.getIpv4().getDestinationIpv4Address()); } - if (endPoints.getAddressFamily() instanceof Ipv6Case) { - address = new IpAddress(((Ipv6Case) endPoints.getAddressFamily()).getIpv6().getDestinationIpv6Address()); + if (endPoints.getAddressFamily() instanceof Ipv6Case ipv6) { + address = new IpAddress(ipv6.getIpv6().getDestinationIpv6Address()); } if (address == null) { return null; @@ -262,30 +261,35 @@ public class PathComputationImpl implements PathComputation { } /* Convert Exclude Route Object (list of IP prefix) into Exclude Route (list of IP address) */ - private static List getExcludeRoute(final Xro xro, AddressFamily af) { - if (xro == null || xro.getSubobject() == null || xro.getSubobject().isEmpty()) { + private static List getExcludeRoute(final Xro xro, final AddressFamily af) { + if (xro == null) { + return null; + } + final var subobjects = xro.getSubobject(); + if (subobjects == null || subobjects.isEmpty()) { return null; } - ArrayList erl = new ArrayList(); - for (int i = 0; i < xro.getSubobject().size(); i++) { - final SubobjectType sbt = xro.getSubobject().get(i).getSubobjectType(); - if (sbt instanceof IpPrefixCase) { - final IpPrefixCase ipc = (IpPrefixCase) sbt; + + final var erl = new ArrayList(); + for (var element : subobjects) { + final var sbt = element.getSubobjectType(); + if (sbt instanceof IpPrefixCase ipc) { switch (af) { - case Ipv4: - case SrIpv4: - erl.add(new ExcludeRouteBuilder().setIpv4(new Ipv4Address( + case Ipv4, SrIpv4 -> { + erl.add(new ExcludeRouteBuilder() + .setIpv4(new Ipv4Address( ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) - .build()); - break; - case Ipv6: - case SrIpv6: - erl.add(new ExcludeRouteBuilder().setIpv6(new Ipv6Address( + .build()); + } + case Ipv6, SrIpv6 -> { + erl.add(new ExcludeRouteBuilder() + .setIpv6(new Ipv6Address( ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) - .build()); - break; - default: - break; + .build()); + } + default -> { + // No-op + } } } } @@ -293,30 +297,35 @@ public class PathComputationImpl implements PathComputation { } /* Convert Include Route Object (list of IP prefix) into Exclude Route (list of IP address) */ - private static List getIncludeRoute(final Iro iro, AddressFamily af) { - if (iro == null || iro.getSubobject() == null || iro.getSubobject().isEmpty()) { + private static List getIncludeRoute(final Iro iro, final AddressFamily af) { + if (iro == null) { + return null; + } + + final var subobjects = iro.getSubobject(); + if (subobjects == null || subobjects.isEmpty()) { return null; } - ArrayList irl = new ArrayList(); - for (int i = 0; i < iro.getSubobject().size(); i++) { - final SubobjectType sbt = iro.getSubobject().get(i).getSubobjectType(); - if (sbt instanceof IpPrefixCase) { - final IpPrefixCase ipc = (IpPrefixCase) sbt; + final var irl = new ArrayList(); + for (var element : subobjects) { + final var sbt = element.getSubobjectType(); + if (sbt instanceof IpPrefixCase ipc) { switch (af) { - case Ipv4: - case SrIpv4: - irl.add(new IncludeRouteBuilder().setIpv4(new Ipv4Address( + case Ipv4, SrIpv4 -> { + irl.add(new IncludeRouteBuilder() + .setIpv4(new Ipv4Address( ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) - .build()); - break; - case Ipv6: - case SrIpv6: - irl.add(new IncludeRouteBuilder().setIpv6(new Ipv6Address( + .build()); + } + case Ipv6, SrIpv6 -> { + irl.add(new IncludeRouteBuilder() + .setIpv6(new Ipv6Address( ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) - .build()); - break; - default: - break; + .build()); + } + default -> { + // No-op + } } } } diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerListener.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerListener.java index 67a06d67ac..91253171aa 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerListener.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerListener.java @@ -9,7 +9,6 @@ package org.opendaylight.bgpcep.pcep.server.provider; import static java.util.Objects.requireNonNull; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import org.opendaylight.mdsal.binding.api.DataBroker; @@ -24,9 +23,8 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. 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; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,20 +38,18 @@ import org.slf4j.LoggerFactory; public final class PathManagerListener implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(PathManagerListener.class); - private ListenerRegistration listenerRegistration; + + private Registration listenerRegistration; private final PathManagerProvider pathManager; - public PathManagerListener(final DataBroker dataBroker, KeyedInstanceIdentifier topology, - final PathManagerProvider pathManager) { - requireNonNull(dataBroker); - requireNonNull(topology); + public PathManagerListener(final DataBroker dataBroker, + final KeyedInstanceIdentifier topology, final PathManagerProvider pathManager) { this.pathManager = requireNonNull(pathManager); - final InstanceIdentifier nodeTopology = topology.child(Node.class); - this.listenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, nodeTopology), this); + listenerRegistration = dataBroker.registerLegacyTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, topology.child(Node.class)), this); LOG.info("Registered listener for Managed TE Path on Topology {}", - topology.getKey().getTopologyId().getValue()); + topology.getKey().getTopologyId().getValue()); } /** @@ -61,10 +57,10 @@ public final class PathManagerListener implements DataTreeChangeListener, */ @Override public void close() { - if (this.listenerRegistration != null) { + if (listenerRegistration != null) { LOG.debug("Unregistered listener {} for Managed TE Path", this); - this.listenerRegistration.close(); - this.listenerRegistration = null; + listenerRegistration.close(); + listenerRegistration = null; } } @@ -74,18 +70,19 @@ public final class PathManagerListener implements DataTreeChangeListener, * @param nodeId Node Identifier to which the modified children belongs to. * @param lspMod List of Configured LSP modifications. */ - private void handleLspChange(NodeId nodeId, List> lspMod) { + private void handleLspChange(final NodeId nodeId, + final List> lspMod) { for (DataObjectModification lsp : lspMod) { ConfiguredLsp cfgLsp; - switch (lsp.getModificationType()) { + switch (lsp.modificationType()) { case DELETE: - cfgLsp = (ConfiguredLsp) lsp.getDataBefore(); + cfgLsp = (ConfiguredLsp) lsp.dataBefore(); LOG.debug("Delete Managed TE Path: {}", cfgLsp.getName()); pathManager.deleteManagedTePath(nodeId, cfgLsp.key()); break; case SUBTREE_MODIFIED: case WRITE: - cfgLsp = (ConfiguredLsp) lsp.getDataAfter(); + cfgLsp = (ConfiguredLsp) lsp.dataAfter(); LOG.debug("Update Managed TE Path {}", cfgLsp); pathManager.createManagedTePath(nodeId, cfgLsp); break; @@ -104,10 +101,11 @@ public final class PathManagerListener implements DataTreeChangeListener, * @param nodeId Node Identifier to which the modified children belongs to. * @param pccMod List of PCEP Node Configuration modifications. */ - private void handlePccChange(NodeId nodeId, List> pccMod) { - for (DataObjectModification node : pccMod) { + private void handlePccChange(final NodeId nodeId, + final List> pccMod) { + for (var node : pccMod) { /* First, process PCC modification */ - switch (node.getModificationType()) { + switch (node.modificationType()) { case DELETE: LOG.debug("Delete Managed TE Node: {}", nodeId); pathManager.deleteManagedTeNode(nodeId); @@ -115,14 +113,14 @@ public final class PathManagerListener implements DataTreeChangeListener, case SUBTREE_MODIFIED: case WRITE: /* First look if the Managed TE Node belongs to this PCC was not already created */ - final PcepNodeConfig pccNode = (PcepNodeConfig) node.getDataAfter(); + final var pccNode = (PcepNodeConfig) node.dataAfter(); if (!pathManager.checkManagedTeNode(nodeId)) { LOG.info("Create new Managed Node {}", nodeId); pathManager.createManagedTeNode(nodeId, pccNode); } else { /* Then, look to Configured LSP modification */ - final List> lspMod = node.getModifiedChildren() - .stream().filter(mod -> mod.getDataType().equals(ConfiguredLsp.class)) + final var lspMod = node.modifiedChildren() + .stream().filter(mod -> mod.dataType().equals(ConfiguredLsp.class)) .collect(Collectors.toList()); if (!lspMod.isEmpty()) { handleLspChange(nodeId, lspMod); @@ -136,13 +134,13 @@ public final class PathManagerListener implements DataTreeChangeListener, } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - DataObjectModification root = change.getRootNode(); + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var root = change.getRootNode(); - final String nodeAddr = root.getModificationType() == DataObjectModification.ModificationType.DELETE - ? root.getDataBefore().getNodeId().getValue() - : root.getDataAfter().getNodeId().getValue(); + final String nodeAddr = root.modificationType() == DataObjectModification.ModificationType.DELETE + ? root.dataBefore().getNodeId().getValue() + : root.dataAfter().getNodeId().getValue(); NodeId nodeId; if (nodeAddr.startsWith("pcc://")) { nodeId = new NodeId(nodeAddr); @@ -151,8 +149,9 @@ public final class PathManagerListener implements DataTreeChangeListener, } /* Look only to PcepNodeConfig.class modification */ - final List> pccMod = root.getModifiedChildren().stream() - .filter(mod -> mod.getDataType().equals(PcepNodeConfig.class)).collect(Collectors.toList()); + final var pccMod = root.modifiedChildren().stream() + .filter(mod -> mod.dataType().equals(PcepNodeConfig.class)) + .collect(Collectors.toList()); if (!pccMod.isEmpty()) { handlePccChange(nodeId, pccMod); } diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerProvider.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerProvider.java index 03157c49e3..4bc669bc05 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerProvider.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PathManagerProvider.java @@ -11,11 +11,11 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; +import com.google.common.util.concurrent.FutureCallback; import java.util.Collection; import java.util.HashMap; import java.util.Map; import javax.annotation.PreDestroy; -import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.graph.ConnectedEdge; import org.opendaylight.graph.ConnectedEdgeTrigger; import org.opendaylight.graph.ConnectedGraph; @@ -23,10 +23,8 @@ import org.opendaylight.graph.ConnectedGraphTrigger; import org.opendaylight.graph.ConnectedVertex; import org.opendaylight.graph.ConnectedVertexTrigger; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; -import org.opendaylight.mdsal.binding.api.Transaction; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.Edge; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.graph.rev220720.Vertex; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.path.computation.rev220324.ComputationStatus; @@ -48,6 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.osgi.service.component.annotations.Deactivate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,7 +57,7 @@ import org.slf4j.LoggerFactory; * @author Olivier Dugeon */ -public final class PathManagerProvider implements TransactionChainListener, AutoCloseable, ConnectedGraphTrigger { +public final class PathManagerProvider implements FutureCallback, AutoCloseable, ConnectedGraphTrigger { private static final Logger LOG = LoggerFactory.getLogger(PathManagerProvider.class); private final InstanceIdentifier pcepTopology; private final DataBroker dataBroker; @@ -69,16 +68,17 @@ public final class PathManagerProvider implements TransactionChainListener, Auto private TransactionChain chain = null; private ConnectedGraph tedGraph = null; - private final Map mngNodes = new HashMap(); + private final Map mngNodes = new HashMap<>(); - public PathManagerProvider(final DataBroker dataBroker, KeyedInstanceIdentifier topology, - final RpcConsumerRegistry rpcRegistry, final DefaultPceServerProvider pceServerProvider) { + public PathManagerProvider(final DataBroker dataBroker, + final KeyedInstanceIdentifier topology, final RpcService rpcService, + final DefaultPceServerProvider pceServerProvider) { this.dataBroker = requireNonNull(dataBroker); this.pceServerProvider = requireNonNull(pceServerProvider); - this.addLsp = rpcRegistry.getRpc(AddLsp.class); - this.updateLsp = rpcRegistry.getRpc(UpdateLsp.class); - this.removeLsp = rpcRegistry.getRpc(RemoveLsp.class); - this.pcepTopology = requireNonNull(topology); + addLsp = rpcService.getRpc(AddLsp.class); + updateLsp = rpcService.getRpc(UpdateLsp.class); + removeLsp = rpcService.getRpc(RemoveLsp.class); + pcepTopology = requireNonNull(topology); initTransactionChain(); tedGraph = getGraph(); LOG.info("Path Manager Server started for topology {}", topology.getKey().getTopologyId().getValue()); @@ -91,7 +91,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto @Deactivate @PreDestroy public void close() { - this.tedGraph = pceServerProvider.getTedGraph(); + tedGraph = pceServerProvider.getTedGraph(); if (tedGraph != null) { tedGraph.unRegisterTrigger(this, InstanceIdentifier.keyOf(pcepTopology)); } @@ -100,7 +100,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto private ConnectedGraph getGraph() { if (tedGraph == null) { - this.tedGraph = pceServerProvider.getTedGraph(); + tedGraph = pceServerProvider.getTedGraph(); if (tedGraph != null) { tedGraph.registerTrigger(this, InstanceIdentifier.keyOf(pcepTopology)); } @@ -113,17 +113,18 @@ public final class PathManagerProvider implements TransactionChainListener, Auto */ private synchronized void initTransactionChain() { LOG.debug("Initializing transaction chain for Path Manager Server {}", this); - checkState(this.chain == null, "Transaction chain has to be closed before being initialized"); - this.chain = dataBroker.createMergingTransactionChain(this); + checkState(chain == null, "Transaction chain has to be closed before being initialized"); + chain = dataBroker.createMergingTransactionChain(); + chain.addCallback(this); } /** * Destroy the current transaction chain. */ private synchronized void destroyTransactionChain() { - if (this.chain != null) { + if (chain != null) { LOG.debug("Destroy transaction chain for Path Manager {}", this); - this.chain = null; + chain = null; } } @@ -139,14 +140,12 @@ public final class PathManagerProvider implements TransactionChainListener, Auto } @Override - public synchronized void onTransactionChainFailed(final TransactionChain transactionChain, - final Transaction transaction, final Throwable cause) { - LOG.error("Path Manager Provider for {} failed in transaction: {} ", pcepTopology, - transaction != null ? transaction.getIdentifier() : null, cause); + public synchronized void onFailure(final Throwable cause) { + LOG.error("Path Manager Provider for {}", pcepTopology, cause); } @Override - public void onTransactionChainSuccessful(final TransactionChain transactionChain) { + public void onSuccess(final Empty value) { LOG.info("Path Manager Provider for {} shut down", pcepTopology); } @@ -260,7 +259,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto * * @param mngPath Managed TE Path to be updated */ - private void updateComputedPath(final ManagedTePath mngPath, boolean add) { + private void updateComputedPath(final ManagedTePath mngPath, final boolean add) { checkArgument(mngPath != null, "Provided Managed TE Path is a null object"); final ManagedTeNode teNode = mngPath.getManagedTeNode(); @@ -307,7 +306,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto * * @return new or updated TE Path i.e. original TE Path augmented by a valid computed route. */ - public ConfiguredLsp createManagedTePath(final NodeId id, ConfiguredLsp cfgLsp) { + public ConfiguredLsp createManagedTePath(final NodeId id, final ConfiguredLsp cfgLsp) { checkArgument(id != null, "Provided Node ID is a null object"); checkArgument(cfgLsp != null, "Provided TE Path is a null object"); @@ -417,7 +416,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto * * @return Newly created or Updated Managed TE Path */ - public ManagedTePath registerTePath(NodeId id, final ConfiguredLsp rptPath, final PathType ptype) { + public ManagedTePath registerTePath(final NodeId id, final ConfiguredLsp rptPath, final PathType ptype) { checkArgument(id != null, "Provided Node ID is a null object"); /* Verify we got a valid reported TE Path */ @@ -496,8 +495,8 @@ public final class PathManagerProvider implements TransactionChainListener, Auto } /* Check if Current Path has no valid route while Reported Path has one */ - if ((curPath.getLsp().getComputedPath().getPathDescription() == null) - && (rptPath.getComputedPath().getPathDescription() != null)) { + if (curPath.getLsp().getComputedPath().getPathDescription() == null + && rptPath.getComputedPath().getPathDescription() != null) { curPath.setConfiguredLsp(new ConfiguredLspBuilder(rptPath).setPathStatus(PathStatus.Sync).build()); curPath.updateGraph(getGraph()); curPath.updateToDataStore(); @@ -582,7 +581,7 @@ public final class PathManagerProvider implements TransactionChainListener, Auto * @return True if Managed TE Node exist, false otherwise */ public boolean checkManagedTeNode(final NodeId id) { - return (mngNodes.get(id) != null); + return mngNodes.get(id) != null; } /** @@ -744,8 +743,8 @@ public final class PathManagerProvider implements TransactionChainListener, Auto } @Override - public void verifyVertex(Collection triggers, @Nullable ConnectedVertex current, - @Nullable Vertex next) { + public void verifyVertex(final Collection triggers, final ConnectedVertex current, + final Vertex next) { for (ConnectedVertexTrigger trigger : triggers) { if (trigger.verifyVertex(current, next)) { updateComputedPath((ManagedTePath )trigger, false); @@ -754,8 +753,8 @@ public final class PathManagerProvider implements TransactionChainListener, Auto } @Override - public void verifyEdge(Collection triggers, @Nullable ConnectedEdge current, - @Nullable Edge next) { + public void verifyEdge(final Collection triggers, final ConnectedEdge current, + final Edge next) { for (ConnectedEdgeTrigger trigger : triggers) { if (trigger.verifyEdge(current, next)) { updateComputedPath((ManagedTePath )trigger, false); diff --git a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PcepTopologyListener.java b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PcepTopologyListener.java index ccf0f22eb9..6d42218d7a 100644 --- a/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PcepTopologyListener.java +++ b/pcep/server/server-provider/src/main/java/org/opendaylight/bgpcep/pcep/server/provider/PcepTopologyListener.java @@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.Iterables; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import org.opendaylight.mdsal.binding.api.DataBroker; @@ -35,8 +34,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Path1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4Case; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv6Case; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv4._case.Ipv4; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv6._case.Ipv6; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.SrSubobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.sr.subobject.nai.IpAdjacency; @@ -50,10 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ser import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.server.rev220321.pcc.configured.lsp.configured.lsp.IntendedPathBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.server.rev220321.pcc.configured.lsp.configured.lsp.intended.path.ConstraintsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.Ero; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.ero.Subobject; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.Metrics; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reported.route.object.Rro; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.SubobjectType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.IpPrefixCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.Node1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.PccSyncState; @@ -64,9 +58,8 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. 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; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Uint32; @@ -82,17 +75,16 @@ import org.slf4j.LoggerFactory; public final class PcepTopologyListener implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(PcepTopologyListener.class); - private ListenerRegistration listenerRegistration; + private final PathManagerProvider pathManager; + private Registration listenerRegistration; + public PcepTopologyListener(final DataBroker dataBroker, final KeyedInstanceIdentifier topology, final PathManagerProvider pathManager) { - requireNonNull(dataBroker); - requireNonNull(topology); this.pathManager = requireNonNull(pathManager); - final InstanceIdentifier nodeTopology = topology.child(Node.class); - listenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, nodeTopology), this); + listenerRegistration = dataBroker.registerLegacyTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, topology.child(Node.class)), this); LOG.info("Registered PCE Server listener {} for Operational PCEP Topology {}", listenerRegistration, topology.getKey().getTopologyId().getValue()); } @@ -119,22 +111,21 @@ public final class PcepTopologyListener implements DataTreeChangeListener, for (DataObjectModification lsp : lspMod) { ReportedLsp rptLsp; - switch (lsp.getModificationType()) { + switch (lsp.modificationType()) { case DELETE: - rptLsp = (ReportedLsp) lsp.getDataBefore(); + rptLsp = (ReportedLsp) lsp.dataBefore(); LOG.debug("Un-Register Managed TE Path: {}", rptLsp.getName()); pathManager.unregisterTePath(nodeId, new ConfiguredLspKey(rptLsp.getName())); break; case SUBTREE_MODIFIED: case WRITE: - rptLsp = (ReportedLsp) lsp.getDataAfter(); + rptLsp = (ReportedLsp) lsp.dataAfter(); LOG.debug("Register Managed TE Path {}", rptLsp.getName()); pathManager.registerTePath(nodeId, getConfiguredLsp(rptLsp), getPathType(rptLsp)); break; default: break; } - } } @@ -149,7 +140,7 @@ public final class PcepTopologyListener implements DataTreeChangeListener, private void handlePccChange(final NodeId nodeId, final List> pccMod) { for (DataObjectModification node : pccMod) { /* First, process PCC modification */ - switch (node.getModificationType()) { + switch (node.modificationType()) { case DELETE: LOG.debug("Un-Register Managed TE Node: {}", nodeId); pathManager.disableManagedTeNode(nodeId); @@ -160,8 +151,8 @@ public final class PcepTopologyListener implements DataTreeChangeListener, /* First look if the PCC was already created or not yet */ if (pathManager.checkManagedTeNode(nodeId)) { /* Check if PCC State is Synchronized */ - if (node.getModifiedChildren() == null || node.getModifiedChildren().isEmpty()) { - PathComputationClient pcc = (PathComputationClient) node.getDataAfter(); + if (node.modifiedChildren() == null || node.modifiedChildren().isEmpty()) { + PathComputationClient pcc = (PathComputationClient) node.dataAfter(); if (pcc.getStateSync() == PccSyncState.Synchronized) { LOG.debug("Synchronize Managed TE Node {}", nodeId); pathManager.syncManagedTeNode(nodeId); @@ -178,8 +169,8 @@ public final class PcepTopologyListener implements DataTreeChangeListener, } /* Then, look to reported LSP modification */ - final List> lspMod = node.getModifiedChildren() - .stream().filter(mod -> mod.getDataType().equals(ReportedLsp.class)) + final List> lspMod = node.modifiedChildren() + .stream().filter(mod -> mod.dataType().equals(ReportedLsp.class)) .collect(Collectors.toList()); if (!lspMod.isEmpty()) { handleLspChange(nodeId, lspMod); @@ -197,8 +188,8 @@ public final class PcepTopologyListener implements DataTreeChangeListener, private void handleNode1Change(final NodeId nodeId, final List> node1Mod) { for (DataObjectModification child : node1Mod) { /* Then, look only to PathComputationClient.class modification */ - final List> pccMod = child.getModifiedChildren() - .stream().filter(mod -> mod.getDataType().equals(PathComputationClient.class)) + final List> pccMod = child.modifiedChildren() + .stream().filter(mod -> mod.dataType().equals(PathComputationClient.class)) .collect(Collectors.toList()); if (!pccMod.isEmpty()) { handlePccChange(nodeId, pccMod); @@ -207,18 +198,17 @@ public final class PcepTopologyListener implements DataTreeChangeListener, } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - DataObjectModification root = change.getRootNode(); + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var root = change.getRootNode(); final NodeId nodeId = - root.getModificationType() == DataObjectModification.ModificationType.DELETE - ? root.getDataBefore().getNodeId() - : root.getDataAfter().getNodeId(); + root.modificationType() == DataObjectModification.ModificationType.DELETE + ? root.dataBefore().getNodeId() : root.dataAfter().getNodeId(); /* Look only to Node1.class modification */ - final List> node1Mod = root.getModifiedChildren().stream() - .filter(mod -> mod.getDataType().equals(Node1.class)) + final List> node1Mod = root.modifiedChildren().stream() + .filter(mod -> mod.dataType().equals(Node1.class)) .collect(Collectors.toList()); if (!node1Mod.isEmpty()) { handleNode1Change(nodeId, node1Mod); @@ -235,42 +225,33 @@ public final class PcepTopologyListener implements DataTreeChangeListener, * @return Path Description of the corresponding ERO SubObject. */ private static PathDescription getSrPath(final SrSubobject srObj, final AddressFamily af) { - switch (af) { - case SrIpv4: - switch (srObj.getNaiType()) { - case Ipv4Adjacency: - return new PathDescriptionBuilder() - .setSid(srObj.getSid()) - .setIpv4(((IpAdjacency)srObj.getNai()).getLocalIpAddress().getIpv4AddressNoZone()) - .setRemoteIpv4(((IpAdjacency)srObj.getNai()).getRemoteIpAddress().getIpv4AddressNoZone()) - .build(); - case Ipv4NodeId: - return new PathDescriptionBuilder() - .setSid(srObj.getSid()) - .setRemoteIpv4(((IpNodeId)srObj.getNai()).getIpAddress().getIpv4AddressNoZone()) - .build(); - default: - return null; - } - case SrIpv6: - switch (srObj.getNaiType()) { - case Ipv6Adjacency: - return new PathDescriptionBuilder() - .setSid(srObj.getSid()) - .setIpv6(((IpAdjacency)srObj.getNai()).getLocalIpAddress().getIpv6AddressNoZone()) - .setRemoteIpv6(((IpAdjacency)srObj.getNai()).getRemoteIpAddress().getIpv6AddressNoZone()) - .build(); - case Ipv6NodeId: - return new PathDescriptionBuilder() - .setSid(srObj.getSid()) - .setRemoteIpv6(((IpNodeId)srObj.getNai()).getIpAddress().getIpv6AddressNoZone()) - .build(); - default: - return null; - } - default: - return null; - } + return switch (af) { + case SrIpv4 -> switch (srObj.getNaiType()) { + case Ipv4Adjacency -> new PathDescriptionBuilder() + .setSid(srObj.getSid()) + .setIpv4(((IpAdjacency)srObj.getNai()).getLocalIpAddress().getIpv4AddressNoZone()) + .setRemoteIpv4(((IpAdjacency)srObj.getNai()).getRemoteIpAddress().getIpv4AddressNoZone()) + .build(); + case Ipv4NodeId -> new PathDescriptionBuilder() + .setSid(srObj.getSid()) + .setRemoteIpv4(((IpNodeId)srObj.getNai()).getIpAddress().getIpv4AddressNoZone()) + .build(); + default -> null; + }; + case SrIpv6 -> switch (srObj.getNaiType()) { + case Ipv6Adjacency -> new PathDescriptionBuilder() + .setSid(srObj.getSid()) + .setIpv6(((IpAdjacency)srObj.getNai()).getLocalIpAddress().getIpv6AddressNoZone()) + .setRemoteIpv6(((IpAdjacency)srObj.getNai()).getRemoteIpAddress().getIpv6AddressNoZone()) + .build(); + case Ipv6NodeId -> new PathDescriptionBuilder() + .setSid(srObj.getSid()) + .setRemoteIpv6(((IpNodeId)srObj.getNai()).getIpAddress().getIpv6AddressNoZone()) + .build(); + default -> null; + }; + default -> null; + }; } /** @@ -282,18 +263,17 @@ public final class PcepTopologyListener implements DataTreeChangeListener, * @return Path Description of the corresponding ERO SubObject. */ private static PathDescription getIpPath(final IpPrefixCase ipc, final AddressFamily af) { - switch (af) { - case Ipv4: - return new PathDescriptionBuilder().setRemoteIpv4( - new Ipv4Address(ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) - .build(); - case Ipv6: - return new PathDescriptionBuilder().setRemoteIpv6( - new Ipv6Address(ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) - .build(); - default: - return null; - } + return switch (af) { + case Ipv4 -> new PathDescriptionBuilder() + .setRemoteIpv4( + new Ipv4Address(ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) + .build(); + case Ipv6 -> new PathDescriptionBuilder() + .setRemoteIpv6( + new Ipv6Address(ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) + .build(); + default -> null; + }; } /** @@ -306,18 +286,17 @@ public final class PcepTopologyListener implements DataTreeChangeListener, */ private static PathDescription getIpPath(final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang .rsvp.rev150820._record.route.subobjects.subobject.type.IpPrefixCase ipc, final AddressFamily af) { - switch (af) { - case Ipv4: - return new PathDescriptionBuilder().setRemoteIpv4( - new Ipv4Address(ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) - .build(); - case Ipv6: - return new PathDescriptionBuilder().setRemoteIpv6( - new Ipv6Address(ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) - .build(); - default: - return null; - } + return switch (af) { + case Ipv4 -> new PathDescriptionBuilder() + .setRemoteIpv4( + new Ipv4Address(ipc.getIpPrefix().getIpPrefix().getIpv4Prefix().getValue().split("/")[0])) + .build(); + case Ipv6 -> new PathDescriptionBuilder() + .setRemoteIpv6( + new Ipv6Address(ipc.getIpPrefix().getIpPrefix().getIpv6Prefix().getValue().split("/")[0])) + .build(); + default -> null; + }; } /** @@ -329,13 +308,13 @@ public final class PcepTopologyListener implements DataTreeChangeListener, * @return Path Description of the corresponding TE Path. */ private static List getPathDescription(final Ero ero, final AddressFamily af) { - final ArrayList pathDesc = new ArrayList<>(); - for (Subobject element : ero.getSubobject()) { - final SubobjectType sbt = element.getSubobjectType(); - if (sbt instanceof SrSubobject) { - pathDesc.add(getSrPath((SrSubobject) sbt, af)); - } else if (sbt instanceof IpPrefixCase) { - pathDesc.add(getIpPath((IpPrefixCase) sbt, af)); + final var pathDesc = new ArrayList(); + for (var element : ero.nonnullSubobject()) { + final var sbt = element.getSubobjectType(); + if (sbt instanceof SrSubobject sr) { + pathDesc.add(getSrPath(sr, af)); + } else if (sbt instanceof IpPrefixCase ip) { + pathDesc.add(getIpPath(ip, af)); } } return pathDesc.isEmpty() ? null : pathDesc; @@ -350,15 +329,15 @@ public final class PcepTopologyListener implements DataTreeChangeListener, * @return Path Description of the corresponding TE Path. */ private static List getPathDescription(final Rro rro, final AddressFamily af) { - final ArrayList pathDesc = new ArrayList<>(); + final var pathDesc = new ArrayList(); for (var element : rro.nonnullSubobject()) { final var sbt = element.getSubobjectType(); - if (sbt instanceof SrSubobject) { - pathDesc.add(getSrPath((SrSubobject) sbt, af)); - } else if (sbt instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820 - ._record.route.subobjects.subobject.type.IpPrefixCase) { - pathDesc.add(getIpPath((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820 - ._record.route.subobjects.subobject.type.IpPrefixCase)sbt, af)); + if (sbt instanceof SrSubobject sr) { + pathDesc.add(getSrPath(sr, af)); + } else if (sbt + instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820._record + .route.subobjects.subobject.type.IpPrefixCase ip) { + pathDesc.add(getIpPath(ip, af)); } } return pathDesc.isEmpty() ? null : pathDesc; @@ -391,7 +370,7 @@ public final class PcepTopologyListener implements DataTreeChangeListener, cb.setBandwidth(new DecimalBandwidth(Decimal64.valueOf(2, convert.longValue()))); } if (path.getMetrics() != null) { - for (Metrics metric: path.getMetrics()) { + for (var metric : path.getMetrics()) { convert = ByteBuffer.wrap(metric.getMetric().getValue().getValue()).getFloat(); switch (metric.getMetric().getMetricType().intValue()) { case MessagesUtil.IGP_METRIC: @@ -416,17 +395,16 @@ public final class PcepTopologyListener implements DataTreeChangeListener, final Path1 p1 = path.augmentation(Path1.class); final Uint8 pst = p1.getPathSetupType() != null ? p1.getPathSetupType().getPst() : Uint8.ZERO; final Lsp lsp = p1.getLsp(); - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp - .identifiers.tlv.lsp.identifiers.AddressFamily af = lsp.getTlvs().getLspIdentifiers().getAddressFamily(); + final var af = lsp.getTlvs().getLspIdentifiers().getAddressFamily(); IpAddress source = null; IpAddress destination = null; - if (af instanceof Ipv4Case) { - final Ipv4 ipv4 = ((Ipv4Case) af).getIpv4(); + if (af instanceof Ipv4Case v4) { + final var ipv4 = v4.getIpv4(); source = new IpAddress(ipv4.getIpv4TunnelSenderAddress()); destination = new IpAddress(ipv4.getIpv4TunnelEndpointAddress()); cb.setAddressFamily(pst == Uint8.ZERO ? AddressFamily.Ipv4 : AddressFamily.SrIpv4); - } else if (af instanceof Ipv6Case) { - final Ipv6 ipv6 = ((Ipv6Case) af).getIpv6(); + } else if (af instanceof Ipv6Case v6) { + final var ipv6 = v6.getIpv6(); source = new IpAddress(ipv6.getIpv6TunnelSenderAddress()); destination = new IpAddress(ipv6.getIpv6TunnelSenderAddress()); cb.setAddressFamily(pst == Uint8.ZERO ? AddressFamily.Ipv6 : AddressFamily.SrIpv6); @@ -496,6 +474,5 @@ public final class PcepTopologyListener implements DataTreeChangeListener, } return PathType.Initiated; } - } diff --git a/pcep/topology/topology-provider/pom.xml b/pcep/topology/topology-provider/pom.xml index 803a66e7a0..57f25b7810 100644 --- a/pcep/topology/topology-provider/pom.xml +++ b/pcep/topology/topology-provider/pom.xml @@ -29,6 +29,26 @@ + + com.github.spotbugs + spotbugs-annotations + true + + + com.google.guava + guava + + + com.guicedee.services + javax.inject + true + + + jakarta.annotation + jakarta.annotation-api + provided + true + ${project.groupId} pcep-api @@ -103,7 +123,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.mdsal.model @@ -146,26 +166,11 @@ org.osgi org.osgi.service.component.annotations - - jakarta.annotation - jakarta.annotation-api - provided - true - - - com.guicedee.services - javax.inject - true - ${project.groupId} pcep-impl - - com.google.guava - guava - diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java index dd1ef27ff9..c1af8e1dd0 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposal.java @@ -12,12 +12,12 @@ import static com.google.common.base.Verify.verifyNotNull; import com.google.common.annotations.VisibleForTesting; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.net.InetSocketAddress; -import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; 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.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -42,8 +42,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; final class PCEPStatefulPeerProposal extends AbstractRegistration implements PCEPPeerProposal { - private abstract static class AbstractListener - implements ClusteredDataTreeChangeListener { + private abstract static class AbstractListener implements DataTreeChangeListener { final Map map = new ConcurrentHashMap<>(); final Registration reg; @@ -51,7 +50,7 @@ final class PCEPStatefulPeerProposal extends AbstractRegistration implements PCE justification = "Stateless specializations in this nest") AbstractListener(final DataBroker dataBroker, final @NonNull LogicalDatastoreType datastore, final @NonNull InstanceIdentifier wildcard) { - reg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(datastore, wildcard), this); + reg = dataBroker.registerTreeChangeListener(DataTreeIdentifier.of(datastore, wildcard), this); } final void remove(final DataTreeModification modification) { @@ -68,7 +67,7 @@ final class PCEPStatefulPeerProposal extends AbstractRegistration implements PCE } private static @NonNull NodeId extractNodeId(final DataTreeModification modification) { - return verifyNotNull(modification.getRootPath().getRootIdentifier().firstKeyOf(Node.class)).getNodeId(); + return verifyNotNull(modification.getRootPath().path().firstKeyOf(Node.class)).getNodeId(); } } @@ -81,9 +80,9 @@ final class PCEPStatefulPeerProposal extends AbstractRegistration implements PCE } @Override - public void onDataTreeChanged(final Collection> changes) { + public void onDataTreeChanged(final List> changes) { for (var change : changes) { - final var config = change.getRootNode().getDataAfter(); + final var config = change.getRootNode().dataAfter(); if (config != null) { update(change, config.getSpeakerEntityIdValue()); } else { @@ -102,9 +101,9 @@ final class PCEPStatefulPeerProposal extends AbstractRegistration implements PCE } @Override - public void onDataTreeChanged(final Collection> changes) { + public void onDataTreeChanged(final List> changes) { for (var change : changes) { - update(change, change.getRootNode().getDataAfter()); + update(change, change.getRootNode().dataAfter()); } } } diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyInstance.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyInstance.java index 9eceeb352e..b5a4801622 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyInstance.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyInstance.java @@ -10,15 +10,12 @@ package org.opendaylight.bgpcep.pcep.topology.provider; import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; -import com.google.common.collect.Iterables; import com.google.common.util.concurrent.ListenableFuture; -import java.util.Collection; import org.checkerframework.checker.lock.qual.GuardedBy; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.bgpcep.programming.spi.InstructionScheduler; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; +import org.opendaylight.mdsal.binding.api.DataListener; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; -import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; 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; @@ -32,7 +29,7 @@ import org.slf4j.LoggerFactory; * This class tracks the configuration content of a particular topology instance and propagates updates towards its * associated {@link PCEPTopologyProvider}. */ -final class PCEPTopologyInstance implements ClusteredDataTreeChangeListener { +final class PCEPTopologyInstance implements DataListener { private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyInstance.class); private final @NonNull TopologyKey topology; @@ -50,8 +47,8 @@ final class PCEPTopologyInstance implements ClusteredDataTreeChangeListener> changes) { + public synchronized void dataChangedTo(final Topology data) { if (reg == null) { // We have been shut down, do not process any more updates return; } - // We are only interested in the after-image - final var content = Iterables.getLast(changes).getRootNode().getDataAfter(); - if (content != null) { - LOG.trace("Updating topology {} configuration to {}", topologyId(), content); - provider.updateConfiguration(PCEPTopologyConfiguration.of(content)); + if (data != null) { + LOG.trace("Updating topology {} configuration to {}", topologyId(), data); + provider.updateConfiguration(PCEPTopologyConfiguration.of(data)); } else { LOG.info("Topology {} configuration disappeared, ignoring update in anticipation of shutdown", topologyId()); diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySingleton.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySingleton.java index 136439158d..9097cc5f6e 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySingleton.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologySingleton.java @@ -19,8 +19,8 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.lock.qual.Holding; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.bgpcep.programming.spi.InstructionScheduler; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.Empty; diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyTracker.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyTracker.java index 8b1920fb15..5a2dc1f459 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyTracker.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyTracker.java @@ -15,7 +15,7 @@ import io.netty.util.HashedWheelTimer; import io.netty.util.Timeout; import io.netty.util.Timer; import io.netty.util.TimerTask; -import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -27,13 +27,13 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.bgpcep.pcep.server.PceServerProvider; import org.opendaylight.bgpcep.programming.spi.InstructionSchedulerFactory; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; +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.binding.api.RpcProviderService; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.protocol.pcep.MessageRegistry; import org.opendaylight.protocol.pcep.PCEPDispatcher; import org.opendaylight.protocol.pcep.spi.PCEPExtensionConsumerContext; @@ -60,7 +60,7 @@ import org.slf4j.LoggerFactory; @Singleton @Component(service = { }) public final class PCEPTopologyTracker - implements PCEPTopologyProviderDependencies, ClusteredDataTreeChangeListener, AutoCloseable { + implements PCEPTopologyProviderDependencies, DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyTracker.class); // Services we are using @@ -131,7 +131,7 @@ public final class PCEPTopologyTracker statsProvider = new TopologyStatsProvider(timer); statsRpcs = new TopologyStatsRpc(dataBroker, rpcProviderRegistry); - reg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + reg = dataBroker.registerTreeChangeListener(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).child(TopologyTypes.class) .augmentation(TopologyTypes1.class).child(TopologyPcep.class).build()), this); LOG.info("PCEP Topology tracker initialized"); @@ -203,7 +203,7 @@ public final class PCEPTopologyTracker } @Override - public synchronized void onDataTreeChanged(final Collection> changes) { + public synchronized void onDataTreeChanged(final List> changes) { if (reg == null) { // Registration has been terminated, do not process any changes return; @@ -211,10 +211,10 @@ public final class PCEPTopologyTracker for (var change : changes) { final var root = change.getRootNode(); - switch (root.getModificationType()) { + switch (root.modificationType()) { case WRITE: // We only care if the topology has been newly introduced, not when its details have changed - if (root.getDataBefore() == null) { + if (root.dataBefore() == null) { createInstance(extractTopologyKey(change)); } break; @@ -257,7 +257,7 @@ public final class PCEPTopologyTracker } private static @NonNull TopologyKey extractTopologyKey(final DataTreeModification change) { - final var path = change.getRootPath().getRootIdentifier(); + final var path = change.getRootPath().path(); return verifyNotNull(path.firstKeyOf(Topology.class), "No topology key in %s", path); } } diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyNodeState.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyNodeState.java index 8260d236e2..7449e735a6 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyNodeState.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyNodeState.java @@ -22,9 +22,7 @@ import org.checkerframework.checker.lock.qual.Holding; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; -import org.opendaylight.mdsal.binding.api.Transaction; import org.opendaylight.mdsal.binding.api.TransactionChain; -import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -38,11 +36,12 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // This class is thread-safe -final class TopologyNodeState implements TransactionChainListener { +final class TopologyNodeState implements FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(TopologyNodeState.class); private final Map metadata = new HashMap<>(); @@ -59,7 +58,8 @@ final class TopologyNodeState implements TransactionChainListener { checkArgument(holdStateNanos >= 0); nodeId = topology.child(Node.class, new NodeKey(id)); this.holdStateNanos = holdStateNanos; - chain = broker.createMergingTransactionChain(this); + chain = broker.createMergingTransactionChain(); + chain.addCallback(this); } @NonNull KeyedInstanceIdentifier getNodeId() { @@ -147,16 +147,14 @@ final class TopologyNodeState implements TransactionChainListener { } @Override - public void onTransactionChainFailed(final TransactionChain pchain, final Transaction transaction, - final Throwable cause) { + public void onFailure(final Throwable cause) { // FIXME: flip internal state, so that the next attempt to update fails, triggering node reconnect - LOG.error("Unexpected transaction failure in node {} transaction {}", nodeId, transaction.getIdentifier(), - cause); + LOG.error("Unexpected transaction failure in node {}", nodeId, cause); close(); } @Override - public void onTransactionChainSuccessful(final TransactionChain pchain) { + public void onSuccess(final Empty result) { LOG.info("Node {} shutdown successfully", nodeId); } diff --git a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpc.java b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpc.java index c924f8749e..036e81585b 100644 --- a/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpc.java +++ b/pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpc.java @@ -8,7 +8,6 @@ package org.opendaylight.bgpcep.pcep.topology.provider; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.Collection; @@ -17,9 +16,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; import org.opendaylight.bgpcep.programming.spi.SuccessfulRpcResult; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataObjectModification; +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.binding.api.RpcProviderService; @@ -57,7 +55,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class TopologyStatsRpc implements ClusteredDataTreeChangeListener, AutoCloseable { +final class TopologyStatsRpc implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(TopologyStatsRpc.class); private final ConcurrentMap, PcepSessionState> sessionStateMap = @@ -67,24 +65,22 @@ final class TopologyStatsRpc implements ClusteredDataTreeChangeListener> changes) { + public void onDataTreeChanged(final List> changes) { changes.forEach(change -> { - final InstanceIdentifier iid = change.getRootPath().getRootIdentifier(); - final DataObjectModification mod = change.getRootNode(); - switch (mod.getModificationType()) { - case SUBTREE_MODIFIED: - case WRITE: - sessionStateMap.put(iid, mod.getDataAfter()); + final var iid = change.getRootPath().path(); + final var mod = change.getRootNode(); + switch (mod.modificationType()) { + case SUBTREE_MODIFIED, WRITE: + sessionStateMap.put(iid, mod.dataAfter()); break; case DELETE: sessionStateMap.remove(iid); diff --git a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposalTest.java b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposalTest.java index 8697e9cf9a..5e2e47c104 100644 --- a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposalTest.java +++ b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPStatefulPeerProposalTest.java @@ -23,6 +23,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.bgpcep.pcep.topology.provider.PCEPStatefulPeerProposal.LspDbVersionListener; @@ -49,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Uint64; @@ -66,11 +67,12 @@ public class PCEPStatefulPeerProposalTest { @Mock private DataBroker dataBroker; @Mock - private ListenerRegistration listenerReg; + private Registration listenerReg; @Mock private FluentFuture> listenableFutureMock; - + @Captor private ArgumentCaptor> captor; + private TlvsBuilder tlvsBuilder; @Before @@ -78,8 +80,7 @@ public class PCEPStatefulPeerProposalTest { tlvsBuilder = new TlvsBuilder().addAugmentation(new Tlvs1Builder() .setStateful(new StatefulBuilder().addAugmentation(new Stateful1Builder().build()).build()) .build()); - captor = ArgumentCaptor.forClass(DataTreeChangeListener.class); - doReturn(listenerReg).when(dataBroker).registerDataTreeChangeListener(any(), captor.capture()); + doReturn(listenerReg).when(dataBroker).registerTreeChangeListener(any(), captor.capture()); doNothing().when(listenerReg).close(); } @@ -94,12 +95,12 @@ public class PCEPStatefulPeerProposalTest { new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress()))); final var dbverRoot = mock(DataObjectModification.class); - doReturn(LSP_DB_VERSION).when(dbverRoot).getDataAfter(); + doReturn(LSP_DB_VERSION).when(dbverRoot).dataAfter(); final var dbverMod = mock(DataTreeModification.class); - doReturn(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath(); + doReturn(DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath(); doReturn(dbverRoot).when(dbverMod).getRootNode(); - for (DataTreeChangeListener listener : listeners) { + for (var listener : listeners) { if (listener instanceof LspDbVersionListener) { listener.onDataTreeChanged(List.of(dbverMod)); } @@ -121,20 +122,20 @@ public class PCEPStatefulPeerProposalTest { new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress()))); final var dbverRoot = mock(DataObjectModification.class); - doReturn(LSP_DB_VERSION).when(dbverRoot).getDataAfter(); + doReturn(LSP_DB_VERSION).when(dbverRoot).dataAfter(); final var dbverMod = mock(DataTreeModification.class); - doReturn(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath(); + doReturn(DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath(); doReturn(dbverRoot).when(dbverMod).getRootNode(); final var speakerRoot = mock(DataObjectModification.class); doReturn(new PcepNodeSyncConfigBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build()).when(speakerRoot) - .getDataAfter(); + .dataAfter(); final var speakerMod = mock(DataTreeModification.class); - doReturn(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, modPath)).when(speakerMod) + doReturn(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, modPath)).when(speakerMod) .getRootPath(); doReturn(speakerRoot).when(speakerMod).getRootNode(); - for (DataTreeChangeListener listener : listeners) { + for (var listener : listeners) { if (listener instanceof SpeakerIdListener) { listener.onDataTreeChanged(List.of(speakerMod)); } else if (listener instanceof LspDbVersionListener) { diff --git a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpcTest.java b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpcTest.java index e11cb016d3..1c2660cdf5 100644 --- a/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpcTest.java +++ b/pcep/topology/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/TopologyStatsRpcTest.java @@ -89,7 +89,7 @@ public class TopologyStatsRpcTest extends AbstractConcurrentDataBrokerTest { @Before public void setUp() throws Exception { - doReturn(rpcReg).when(rpcProviderService).registerRpcImplementations(any()); + doReturn(rpcReg).when(rpcProviderService).registerRpcImplementation(any()); doNothing().when(rpcReg).close(); rpcService = new TopologyStatsRpc(getDataBroker(), rpcProviderService); diff --git a/pcep/tunnel/tunnel-provider/pom.xml b/pcep/tunnel/tunnel-provider/pom.xml index e51335cbb4..6777bc6d6f 100644 --- a/pcep/tunnel/tunnel-provider/pom.xml +++ b/pcep/tunnel/tunnel-provider/pom.xml @@ -104,7 +104,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.yangtools diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/CreateTunnelInstructionExecutor.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/CreateTunnelInstructionExecutor.java index fa154b732f..fd2c3a935c 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/CreateTunnelInstructionExecutor.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/CreateTunnelInstructionExecutor.java @@ -20,7 +20,7 @@ import org.opendaylight.bgpcep.pcep.topology.spi.AbstractInstructionExecutor; import org.opendaylight.bgpcep.programming.topology.TopologyProgrammingUtil; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; 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.Ipv4AddressNoZone; @@ -65,11 +65,11 @@ final class CreateTunnelInstructionExecutor extends AbstractInstructionExecutor private final PcepCreateP2pTunnelInput p2pTunnelInput; CreateTunnelInstructionExecutor(final PcepCreateP2pTunnelInput p2pTunnelInput, final DataBroker dataProvider, - final RpcConsumerRegistry rpcConsumerRegistry) { + final RpcService rpcService) { super(p2pTunnelInput); this.p2pTunnelInput = p2pTunnelInput; this.dataProvider = dataProvider; - addLsp = rpcConsumerRegistry.getRpc(AddLsp.class); + addLsp = rpcService.getRpc(AddLsp.class); } private static void checkLinkIsnotExistent(final InstanceIdentifier tii, diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/DestroyTunnelInstructionExecutor.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/DestroyTunnelInstructionExecutor.java index db1c48f2d9..7d01c17606 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/DestroyTunnelInstructionExecutor.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/DestroyTunnelInstructionExecutor.java @@ -17,7 +17,7 @@ import org.opendaylight.bgpcep.programming.topology.TopologyProgrammingUtil; import org.opendaylight.bgpcep.programming.tunnel.TunnelProgrammingUtil; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.OperationResult; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.RemoveLsp; @@ -39,11 +39,11 @@ final class DestroyTunnelInstructionExecutor extends AbstractInstructionExecutor private final RemoveLsp removeLsp; DestroyTunnelInstructionExecutor(final PcepDestroyTunnelInput pcepDestroyTunnelInput, final DataBroker dataProvider, - final RpcConsumerRegistry rpcConsumerRegistry) { + final RpcService rpcService) { super(pcepDestroyTunnelInput); this.pcepDestroyTunnelInput = pcepDestroyTunnelInput; this.dataProvider = dataProvider; - removeLsp = rpcConsumerRegistry.getRpc(RemoveLsp.class); + removeLsp = rpcService.getRpc(RemoveLsp.class); } @Override diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListener.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListener.java index 052d62d035..267f4b0cb0 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListener.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListener.java @@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -20,9 +19,10 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; +import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; @@ -68,13 +68,13 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.igp.termination.point.attributes.termination.point.type.Ip; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.termination.point.attributes.igp.termination.point.attributes.termination.point.type.IpBuilder; import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.DataObjectStep; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.binding.util.BindingMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class NodeChangedListener implements ClusteredDataTreeChangeListener { +public final class NodeChangedListener implements DataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(NodeChangedListener.class); private final InstanceIdentifier target; private final DataBroker dataProvider; @@ -285,7 +285,7 @@ public final class NodeChangedListener implements ClusteredDataTreeChangeListene new TerminationPointKey(tp)).build(); } - private InstanceIdentifier nodeIdentifier(final NodeId node) { + private @NonNull InstanceIdentifier nodeIdentifier(final NodeId node) { return target.child(Node.class, new NodeKey(node)); } @@ -394,24 +394,23 @@ public final class NodeChangedListener implements ClusteredDataTreeChangeListene } @Override - public void onDataTreeChanged(final Collection> changes) { - final ReadWriteTransaction trans = dataProvider.newReadWriteTransaction(); + public void onDataTreeChanged(final List> changes) { + final var trans = dataProvider.newReadWriteTransaction(); - final Set> lsps = new HashSet<>(); - final Set> nodes = new HashSet<>(); + final var lsps = new HashSet>(); + final var nodes = new HashSet>(); - final Map, DataObject> original = new HashMap<>(); - final Map, DataObject> updated = new HashMap<>(); - final Map, DataObject> created = new HashMap<>(); + final var original = new HashMap, DataObject>(); + final var updated = new HashMap, DataObject>(); + final var created = new HashMap, DataObject>(); - for (final DataTreeModification change : changes) { - final InstanceIdentifier iid = change.getRootPath().getRootIdentifier(); - final DataObjectModification rootNode = change.getRootNode(); - handleChangedNode(rootNode, iid, lsps, nodes, original, updated, created); + for (final var change : changes) { + handleChangedNode(change.getRootNode(), change.getRootPath().path(), lsps, nodes, original, updated, + created); } // Now walk all nodes, check for removals/additions and cascade them to LSPs - for (final InstanceIdentifier iid : nodes) { + for (var iid : nodes) { enumerateLsps(iid, (Node) original.get(iid), lsps); enumerateLsps(iid, (Node) updated.get(iid), lsps); enumerateLsps(iid, (Node) created.get(iid), lsps); @@ -442,28 +441,26 @@ public final class NodeChangedListener implements ClusteredDataTreeChangeListene categorizeIdentifier(iid, lsps, nodes); // Get the subtrees - switch (changedNode.getModificationType()) { + switch (changedNode.modificationType()) { case DELETE: - original.put(iid, changedNode.getDataBefore()); + original.put(iid, changedNode.dataBefore()); break; case SUBTREE_MODIFIED: - original.put(iid, changedNode.getDataBefore()); - updated.put(iid, changedNode.getDataAfter()); + original.put(iid, changedNode.dataBefore()); + updated.put(iid, changedNode.dataAfter()); break; case WRITE: - created.put(iid, changedNode.getDataAfter()); + created.put(iid, changedNode.dataAfter()); break; default: - throw new IllegalArgumentException("Unhandled modification type " + changedNode.getModificationType()); + throw new IllegalArgumentException("Unhandled modification type " + changedNode.modificationType()); } - for (DataObjectModification child : changedNode.getModifiedChildren()) { - final List pathArguments = new ArrayList<>(); - for (PathArgument pathArgument : iid.getPathArguments()) { - pathArguments.add(pathArgument); - } - pathArguments.add(child.getIdentifier()); - final InstanceIdentifier childIID = InstanceIdentifier.unsafeOf(pathArguments); + for (var child : changedNode.modifiedChildren()) { + final var pathArguments = new ArrayList>(); + iid.getPathArguments().forEach(pathArguments::add); + pathArguments.add(child.step()); + final var childIID = InstanceIdentifier.unsafeOf(pathArguments); handleChangedNode(child, childIID, lsps, nodes, original, updated, created); } } diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelClusterSingletonService.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelClusterSingletonService.java index 51c9d251fc..43d148c8f1 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelClusterSingletonService.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelClusterSingletonService.java @@ -17,9 +17,8 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.bgpcep.programming.spi.InstructionScheduler; import org.opendaylight.bgpcep.topology.DefaultTopologyReference; import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; 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.TopologyId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; @@ -36,17 +35,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class PCEPTunnelClusterSingletonService implements ClusterSingletonService, AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(PCEPTunnelClusterSingletonService.class); + private final PCEPTunnelTopologyProvider ttp; private final TunnelProgramming tp; private final ServiceGroupIdentifier sgi; private final TopologyId tunnelTopologyId; - private final TunnelProviderDependencies dependencies; + @GuardedBy("this") private ServiceRegistration serviceRegistration; @GuardedBy("this") - private ClusterSingletonServiceRegistration pcepTunnelCssReg; + private Registration pcepTunnelCssReg; @GuardedBy("this") private Registration reg; @@ -55,7 +54,6 @@ public final class PCEPTunnelClusterSingletonService implements ClusterSingleton final InstanceIdentifier pcepTopology, final TopologyId tunnelTopologyId ) { - this.dependencies = requireNonNull(dependencies); this.tunnelTopologyId = requireNonNull(tunnelTopologyId); final TopologyId pcepTopologyId = pcepTopology.firstKeyOf(Topology.class).getTopologyId(); final BundleContext bundleContext = dependencies.getBundleContext(); @@ -94,13 +92,13 @@ public final class PCEPTunnelClusterSingletonService implements ClusterSingleton FrameworkUtil.asDictionary(Map.of( PCEPTunnelTopologyProvider.class.getName(), tunnelTopologyId.getValue()))); - LOG.info("PCEP Tunnel Cluster Singleton service {} registered", getIdentifier().getName()); + LOG.info("PCEP Tunnel Cluster Singleton service {} registered", getIdentifier().value()); pcepTunnelCssReg = dependencies.getCssp().registerClusterSingletonService(this); } @Override public synchronized void instantiateServiceInstance() { - LOG.info("Instantiate PCEP Tunnel Topology Provider Singleton Service {}", getIdentifier().getName()); + LOG.info("Instantiate PCEP Tunnel Topology Provider Singleton Service {}", getIdentifier().value()); reg = tp.register(InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(tunnelTopologyId)) @@ -110,8 +108,7 @@ public final class PCEPTunnelClusterSingletonService implements ClusterSingleton @Override public synchronized ListenableFuture closeServiceInstance() { - LOG.info("Close Service Instance PCEP Tunnel Topology Provider Singleton Service {}", - getIdentifier().getName()); + LOG.info("Close Service Instance PCEP Tunnel Topology Provider Singleton Service {}", getIdentifier().value()); reg.close(); tp.close(); ttp.close(); @@ -126,13 +123,13 @@ public final class PCEPTunnelClusterSingletonService implements ClusterSingleton @Override @SuppressWarnings("checkstyle:IllegalCatch") public synchronized void close() { - LOG.info("Close PCEP Tunnel Topology Provider Singleton Service {}", getIdentifier().getName()); + LOG.info("Close PCEP Tunnel Topology Provider Singleton Service {}", getIdentifier().value()); if (pcepTunnelCssReg != null) { try { pcepTunnelCssReg.close(); } catch (final Exception e) { - LOG.debug("Failed to close PCEP Tunnel Topology service {}", sgi.getName(), e); + LOG.debug("Failed to close PCEP Tunnel Topology service {}", sgi.value(), e); } pcepTunnelCssReg = null; } diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelTopologyProvider.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelTopologyProvider.java index 87085b41f8..ca2b149015 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelTopologyProvider.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/PCEPTunnelTopologyProvider.java @@ -22,7 +22,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.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.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypesBuilder; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +37,7 @@ public final class PCEPTunnelTopologyProvider extends DefaultTopologyReference i private final DataBroker dataBroker; private final TopologyId tunneltopologyId; @GuardedBy("this") - private ListenerRegistration reg; + private Registration reg; public PCEPTunnelTopologyProvider( final DataBroker dataBroker, @@ -48,15 +48,15 @@ public final class PCEPTunnelTopologyProvider extends DefaultTopologyReference i super(tunnelTopology); this.dataBroker = dataBroker; this.tunneltopologyId = tunneltopologyId; - this.ncl = new NodeChangedListener(dataBroker, pcepTopologyId, tunnelTopology); - this.src = pcepTopology.child(Node.class); - this.ref = new DefaultTopologyReference(tunnelTopology); + ncl = new NodeChangedListener(dataBroker, pcepTopologyId, tunnelTopology); + src = pcepTopology.child(Node.class); + ref = new DefaultTopologyReference(tunnelTopology); } synchronized void init() { - final WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction(); + final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); tx.mergeParentStructurePut(LogicalDatastoreType.OPERATIONAL, getTopologyReference().getInstanceIdentifier(), - new TopologyBuilder().setTopologyId(this.tunneltopologyId) + new TopologyBuilder().setTopologyId(tunneltopologyId) .setTopologyTypes(new TopologyTypesBuilder() .addAugmentation(new TopologyTypes1Builder() .setTopologyTunnelPcep( @@ -67,20 +67,19 @@ public final class PCEPTunnelTopologyProvider extends DefaultTopologyReference i } catch (final InterruptedException | ExecutionException e) { LOG.error("Failed to create Tunnel Topology root", e); } - this.reg = this.ncl.getDataProvider() - .registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, this.src), - this.ncl); + reg = ncl.getDataProvider() + .registerTreeChangeListener(DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, src), ncl); } public TopologyReference getTopologyReference() { - return this.ref; + return ref; } @Override public synchronized void close() { - if (this.reg != null) { - this.reg.close(); - this.reg = null; + if (reg != null) { + reg.close(); + reg = null; } } } diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDependencies.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDependencies.java index 66c625280e..8ca912d115 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDependencies.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDependencies.java @@ -10,15 +10,15 @@ package org.opendaylight.bgpcep.pcep.tunnel.provider; import static java.util.Objects.requireNonNull; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.binding.api.RpcProviderService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.binding.api.RpcService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.osgi.framework.BundleContext; final class TunnelProviderDependencies { private final DataBroker dataBroker; private final ClusterSingletonServiceProvider cssp; - private final RpcConsumerRegistry rpcConsumerRegistry; + private final RpcService rpcService; private final RpcProviderService rpcProviderRegistry; private final BundleContext bundleContext; @@ -26,7 +26,7 @@ final class TunnelProviderDependencies { final DataBroker dataBroker, final ClusterSingletonServiceProvider cssp, final RpcProviderService rpcProviderRegistry, - final RpcConsumerRegistry rpcConsumerRegistry, + final RpcService rpcService, final BundleContext bundleContext ) { @@ -34,26 +34,26 @@ final class TunnelProviderDependencies { this.cssp = requireNonNull(cssp); this.rpcProviderRegistry = requireNonNull(rpcProviderRegistry); this.bundleContext = requireNonNull(bundleContext); - this.rpcConsumerRegistry = requireNonNull(rpcConsumerRegistry); + this.rpcService = requireNonNull(rpcService); } DataBroker getDataBroker() { - return this.dataBroker; + return dataBroker; } ClusterSingletonServiceProvider getCssp() { - return this.cssp; + return cssp; } - RpcConsumerRegistry getRpcConsumerRegistry() { - return this.rpcConsumerRegistry; + RpcService getRpcConsumerRegistry() { + return rpcService; } RpcProviderService getRpcProviderRegistry() { - return this.rpcProviderRegistry; + return rpcProviderRegistry; } BundleContext getBundleContext() { - return this.bundleContext; + return bundleContext; } } diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDeployer.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDeployer.java index dbed0b12d0..19e56634d0 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDeployer.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProviderDeployer.java @@ -9,22 +9,19 @@ package org.opendaylight.bgpcep.pcep.tunnel.provider; import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.checkerframework.checker.lock.qual.GuardedBy; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataObjectModification; +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.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.binding.api.RpcProviderService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.binding.api.RpcService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.config.rev181109.PcepTunnelTopologyConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.tunnel.pcep.rev181109.TopologyTypes1; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; @@ -43,7 +40,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component(service = { }) -public final class TunnelProviderDeployer implements ClusteredDataTreeChangeListener, AutoCloseable { +public final class TunnelProviderDeployer implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(TunnelProviderDeployer.class); private static final long TIMEOUT_NS = TimeUnit.SECONDS.toNanos(5); @@ -55,13 +52,13 @@ public final class TunnelProviderDeployer implements ClusteredDataTreeChangeList @Activate public TunnelProviderDeployer(@Reference final DataBroker dataBroker, @Reference final RpcProviderService rpcProviderRegistry, - @Reference final RpcConsumerRegistry rpcConsumerRegistry, + @Reference final RpcService rpcService, @Reference final ClusterSingletonServiceProvider cssp, // FIXME: do not reference BundleContext in an alternative constructor final BundleContext bundleContext) { - dependencies = new TunnelProviderDependencies(dataBroker, cssp, rpcProviderRegistry, rpcConsumerRegistry, + dependencies = new TunnelProviderDependencies(dataBroker, cssp, rpcProviderRegistry, rpcService, bundleContext); - reg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(CONFIGURATION, + reg = dataBroker.registerTreeChangeListener(DataTreeIdentifier.of(CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).build()), this); LOG.info("Tunnel Provider Deployer created"); } @@ -88,27 +85,21 @@ public final class TunnelProviderDeployer implements ClusteredDataTreeChangeList } @Override - public synchronized void onDataTreeChanged(final Collection> changes) { - final List> topoChanges = changes.stream() - .map(DataTreeModification::getRootNode) - .collect(Collectors.toList()); - - topoChanges.stream().iterator().forEachRemaining(this::handleTopologyChange); - } - - private synchronized void handleTopologyChange(final DataObjectModification topo) { - switch (topo.getModificationType()) { - case SUBTREE_MODIFIED: - updateTunnelTopologyProvider(topo.getDataAfter()); - break; - case WRITE: - createTunnelTopologyProvider(topo.getDataAfter()); - break; - case DELETE: - removeTunnelTopologyProvider(topo.getDataBefore()); - break; - default: - } + public synchronized void onDataTreeChanged(final List> changes) { + changes.stream().map(DataTreeModification::getRootNode).forEach(topo -> { + switch (topo.modificationType()) { + case SUBTREE_MODIFIED: + updateTunnelTopologyProvider(topo.dataAfter()); + break; + case WRITE: + createTunnelTopologyProvider(topo.dataAfter()); + break; + case DELETE: + removeTunnelTopologyProvider(topo.dataBefore()); + break; + default: + } + }); } private static boolean filterPcepTopologies(final TopologyTypes topologyTypes) { diff --git a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/UpdateTunnelInstructionExecutor.java b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/UpdateTunnelInstructionExecutor.java index d633bc53cf..b2d719cb66 100644 --- a/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/UpdateTunnelInstructionExecutor.java +++ b/pcep/tunnel/tunnel-provider/src/main/java/org/opendaylight/bgpcep/pcep/tunnel/provider/UpdateTunnelInstructionExecutor.java @@ -18,7 +18,7 @@ import org.opendaylight.bgpcep.programming.topology.TopologyProgrammingUtil; import org.opendaylight.bgpcep.programming.tunnel.TunnelProgrammingUtil; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.AdministrativeStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Arguments3Builder; @@ -48,11 +48,11 @@ final class UpdateTunnelInstructionExecutor extends AbstractInstructionExecutor private final UpdateLsp updateLsp; UpdateTunnelInstructionExecutor(final PcepUpdateTunnelInput updateTunnelInput, final DataBroker dataProvider, - final RpcConsumerRegistry rpcConsumerRegistry) { + final RpcService rpcService) { super(updateTunnelInput); this.updateTunnelInput = updateTunnelInput; this.dataProvider = dataProvider; - updateLsp = rpcConsumerRegistry.getRpc(UpdateLsp.class); + updateLsp = rpcService.getRpc(UpdateLsp.class); } @Override diff --git a/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListenerTest.java b/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListenerTest.java index 0bca519830..6c40dd6f4c 100644 --- a/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListenerTest.java +++ b/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/NodeChangedListenerTest.java @@ -57,7 +57,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.node.attributes.SupportingNode; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.util.BindingMap; import org.opendaylight.yangtools.yang.common.Uint32; @@ -82,7 +82,7 @@ public class NodeChangedListenerTest extends AbstractConcurrentDataBrokerTest { private static final InstanceIdentifier TUNNEL_TOPO_IID = InstanceIdentifier .builder(NetworkTopology.class).child(Topology.class, new TopologyKey(TUNNEL_TOPOLOGY_ID)).build(); - private ListenerRegistration listenerRegistration; + private Registration listenerRegistration; @Before public void setUp() throws InterruptedException, ExecutionException { @@ -95,7 +95,7 @@ public class NodeChangedListenerTest extends AbstractConcurrentDataBrokerTest { wTx.commit().get(); final NodeChangedListener nodeListener = new NodeChangedListener(getDataBroker(), PCEP_TOPOLOGY_ID, TUNNEL_TOPO_IID); - this.listenerRegistration = getDataBroker().registerDataTreeChangeListener(DataTreeIdentifier.create( + listenerRegistration = getDataBroker().registerTreeChangeListener(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, PCEP_TOPO_IID.child(Node.class)), nodeListener); } @@ -197,7 +197,7 @@ public class NodeChangedListenerTest extends AbstractConcurrentDataBrokerTest { @After public void tearDown() { - this.listenerRegistration.close(); + listenerRegistration.close(); } private void createNode(final NodeId nodeId, final String ipv4Address, final String lspName, final Uint32 lspId, diff --git a/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProgrammingTest.java b/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProgrammingTest.java index 29155d79d4..84dcbf0abe 100644 --- a/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProgrammingTest.java +++ b/pcep/tunnel/tunnel-provider/src/test/java/org/opendaylight/bgpcep/pcep/tunnel/provider/TunnelProgrammingTest.java @@ -29,12 +29,12 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.bgpcep.programming.spi.Instruction; import org.opendaylight.bgpcep.programming.spi.InstructionScheduler; import org.opendaylight.bgpcep.programming.spi.SchedulerException; -import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.binding.api.RpcProviderService; +import org.opendaylight.mdsal.binding.api.RpcService; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; 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.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; @@ -130,7 +130,7 @@ public class TunnelProgrammingTest extends AbstractConcurrentDataBrokerTest { @Mock private RpcProviderService rpr; @Mock - private RpcConsumerRegistry rpcs; + private RpcService rpcs; @Mock private BundleContext bundleContext; diff --git a/programming/impl/pom.xml b/programming/impl/pom.xml index 0572fabb81..c4b92d1d6b 100644 --- a/programming/impl/pom.xml +++ b/programming/impl/pom.xml @@ -59,7 +59,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.yangtools diff --git a/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionScheduler.java b/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionScheduler.java index e826f2dc48..e328cc188a 100644 --- a/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionScheduler.java +++ b/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionScheduler.java @@ -42,10 +42,9 @@ import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstructionInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.CancelInstructionOutput; @@ -89,7 +88,7 @@ final class DefaultInstructionScheduler implements ClusterSingletonService, Inst private final Timer timer; private final String instructionId; private final ServiceGroupIdentifier sgi; - private final ClusterSingletonServiceRegistration csspReg; + private final Registration csspReg; private final RpcProviderService rpcProviderRegistry; @GuardedBy("this") private Registration reg; @@ -168,14 +167,14 @@ final class DefaultInstructionScheduler implements ClusterSingletonService, Inst this.timer = requireNonNull(timer); qid = KeyedInstanceIdentifier.builder(InstructionsQueue.class, new InstructionsQueueKey(this.instructionId)).build(); - sgi = ServiceGroupIdentifier.create(this.instructionId + "-service-group"); - LOG.info("Creating Programming Service {}.", sgi.getName()); + sgi = new ServiceGroupIdentifier(this.instructionId + "-service-group"); + LOG.info("Creating Programming Service {}.", sgi.value()); csspReg = cssp.registerClusterSingletonService(this); } @Override public synchronized void instantiateServiceInstance() { - LOG.info("Instruction Queue service {} instantiated", sgi.getName()); + LOG.info("Instruction Queue service {} instantiated", sgi.value()); reg = rpcProviderRegistry.registerRpcImplementations(ImmutableClassToInstanceMap.>builder() .put(CancelInstruction.class, this::cancelInstruction) .put(CleanInstructions.class, this::cleanInstructions) @@ -401,7 +400,7 @@ final class DefaultInstructionScheduler implements ClusterSingletonService, Inst private synchronized void tryScheduleInstruction(final InstructionImpl instruction) { final ListenableFuture> f = instruction.ready(); if (f != null) { - Futures.addCallback(f, new FutureCallback>() { + Futures.addCallback(f, new FutureCallback<>() { @Override public void onSuccess(final ExecutionResult
result) { tryScheduleDependants(instruction); @@ -413,12 +412,11 @@ final class DefaultInstructionScheduler implements ClusterSingletonService, Inst } }, MoreExecutors.directExecutor()); } - } @Override public synchronized FluentFuture closeServiceInstance() { - LOG.info("Closing Instruction Queue service {}", sgi.getName()); + LOG.info("Closing Instruction Queue service {}", sgi.value()); if (reg != null) { reg.close(); diff --git a/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionSchedulerFactory.java b/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionSchedulerFactory.java index e510444adf..8e2113bf42 100644 --- a/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionSchedulerFactory.java +++ b/programming/impl/src/main/java/org/opendaylight/bgpcep/programming/impl/DefaultInstructionSchedulerFactory.java @@ -23,7 +23,7 @@ import org.opendaylight.bgpcep.programming.spi.InstructionSchedulerFactory; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.RpcProviderService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; diff --git a/programming/impl/src/test/java/org/opendaylight/bgpcep/programming/impl/AbstractProgrammingTest.java b/programming/impl/src/test/java/org/opendaylight/bgpcep/programming/impl/AbstractProgrammingTest.java index 857b279abc..b82b0e4a00 100644 --- a/programming/impl/src/test/java/org/opendaylight/bgpcep/programming/impl/AbstractProgrammingTest.java +++ b/programming/impl/src/test/java/org/opendaylight/bgpcep/programming/impl/AbstractProgrammingTest.java @@ -16,9 +16,8 @@ import org.junit.Before; import org.mockito.Mock; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.yangtools.concepts.Registration; abstract class AbstractProgrammingTest extends AbstractConcurrentDataBrokerTest { @@ -27,7 +26,7 @@ abstract class AbstractProgrammingTest extends AbstractConcurrentDataBrokerTest @Mock ClusterSingletonServiceProvider cssp; @Mock - ClusterSingletonServiceRegistration singletonServiceRegistration; + Registration singletonServiceRegistration; @Mock private Registration registration; ClusterSingletonService singletonService; @@ -39,16 +38,16 @@ abstract class AbstractProgrammingTest extends AbstractConcurrentDataBrokerTest @Before public void setUp() throws Exception { doAnswer(invocationOnMock -> { - this.singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0]; - return this.singletonServiceRegistration; - }).when(this.cssp).registerClusterSingletonService(any(ClusterSingletonService.class)); + singletonService = invocationOnMock.getArgument(0); + return singletonServiceRegistration; + }).when(cssp).registerClusterSingletonService(any(ClusterSingletonService.class)); doAnswer(invocationOnMock -> { - this.singletonService.closeServiceInstance().get(); + singletonService.closeServiceInstance().get(); return null; - }).when(this.singletonServiceRegistration).close(); + }).when(singletonServiceRegistration).close(); - doReturn(this.registration).when(this.rpcRegistry).registerRpcImplementations(any()); + doReturn(registration).when(rpcRegistry).registerRpcImplementations(any()); - doNothing().when(this.registration).close(); + doNothing().when(registration).close(); } } diff --git a/programming/spi/pom.xml b/programming/spi/pom.xml index c45155b09f..2c1cac36d3 100644 --- a/programming/spi/pom.xml +++ b/programming/spi/pom.xml @@ -49,7 +49,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.yangtools diff --git a/programming/spi/src/main/java/org/opendaylight/bgpcep/programming/spi/InstructionScheduler.java b/programming/spi/src/main/java/org/opendaylight/bgpcep/programming/spi/InstructionScheduler.java index 9ca8facad3..3cdcd0f02a 100644 --- a/programming/spi/src/main/java/org/opendaylight/bgpcep/programming/spi/InstructionScheduler.java +++ b/programming/spi/src/main/java/org/opendaylight/bgpcep/programming/spi/InstructionScheduler.java @@ -9,7 +9,7 @@ package org.opendaylight.bgpcep.programming.spi; import com.google.common.util.concurrent.ListenableFuture; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.SubmitInstructionInput; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.concepts.Registration;