From 15f04f0c8e40607757abe861123be2b4ec4ac55e Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 16 Jan 2024 13:24:13 +0100 Subject: [PATCH] Bump upstreams Adopt: - yangtools-13.0.1 - mdsal-13.0.0 - controller-9.0.0 - aaa-0.19.1 Change-Id: I690bf875372e058d96920e6470bfd63be74194bc Signed-off-by: Robert Varga --- .../mount/CallHomeMountSshAuthProvider.java | 29 +++--- .../tls/CallHomeMountTlsAuthProvider.java | 89 +++++++++---------- .../topology/impl/NetconfTopologyImpl.java | 14 +-- .../impl/NetconfTopologyImplTest.java | 10 +-- apps/netconf-topology-singleton/pom.xml | 4 +- .../singleton/impl/MasterSalFacade.java | 7 +- .../singleton/impl/NetconfNodeManager.java | 39 ++++---- .../impl/NetconfTopologyContext.java | 4 +- .../impl/NetconfTopologyManager.java | 46 +++++----- .../singleton/impl/ProxyDOMActionService.java | 8 -- .../singleton/impl/ProxyDOMDataBroker.java | 11 +-- .../singleton/impl/ProxyDOMRpcService.java | 4 +- .../impl/ProxyYangTextSourceProvider.java | 2 +- .../impl/actors/NetconfNodeActor.java | 51 ++++++----- .../impl/tx/ActorProxyTransactionFacade.java | 47 +++++----- .../impl/tx/FailedProxyTransactionFacade.java | 19 ++-- .../impl/tx/ProxyReadWriteTransaction.java | 19 ++-- .../impl/utils/NetconfTopologySetup.java | 2 +- .../impl/utils/NetconfTopologyUtils.java | 9 +- .../CreateInitialMasterActorData.java | 2 +- .../messages/RegisterMountPoint.java | 5 +- .../messages/YangTextSchemaSourceRequest.java | 6 +- .../impl/MountPointEndToEndTest.java | 63 +++++++------ .../singleton/impl/NetconfNodeActorTest.java | 33 +++---- .../impl/NetconfNodeManagerTest.java | 61 ++++++------- .../impl/NetconfTopologyManagerTest.java | 72 +++++++-------- .../impl/ProxyDOMDataBrokerTest.java | 9 +- apps/netconf-topology/pom.xml | 4 + ...ClientConfigurationBuilderFactoryImpl.java | 29 +++++- .../spi/NetconfDeviceTopologyAdapter.java | 21 +++-- .../topology/spi/NetconfNodeHandler.java | 14 +-- .../spi/NetconfTopologyRPCProvider.java | 14 ++- .../spi/NetconfDeviceTopologyAdapterTest.java | 15 ++-- .../spi/NetconfTopologyRPCProviderTest.java | 17 ++-- .../yanglib/writer/YangLibraryWriter.java | 16 ++-- .../yanglib/writer/YangLibraryWriterTest.java | 5 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 6 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 8 +- .../src/main/feature/feature.xml | 4 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 12 +-- .../src/main/feature/feature.xml | 2 +- .../src/main/feature/feature.xml | 4 +- .../odl-yanglib/src/main/feature/feature.xml | 2 +- karaf/pom.xml | 2 +- .../test/perf/MountedDeviceListener.java | 11 ++- .../test/tool/MdsalOperationProvider.java | 29 +++--- .../test/tool/NetconfDeviceSimulator.java | 31 +++---- .../netconf/test/tool/PayloadCreator.java | 4 +- .../tool/schemacache/SchemaSourceCache.java | 17 ++-- .../yanglib/impl/YangLibProvider.java | 20 ++--- .../yanglib/impl/YangLibProviderTest.java | 18 ++-- parent/pom.xml | 6 +- plugins/netconf-client-mdsal/pom.xml | 5 ++ .../mdsal/CachedYangTextSchemaSource.java | 41 +++++---- .../client/mdsal/DeviceMountPointContext.java | 16 ++-- .../netconf/client/mdsal/DeviceSources.java | 10 +-- .../client/mdsal/DeviceSourcesResolver.java | 2 +- .../client/mdsal/LibraryModulesSchemas.java | 2 +- .../mdsal/LibrarySchemaSourceProvider.java | 10 +-- .../mdsal/MonitoringSchemaSourceProvider.java | 10 +-- .../netconf/client/mdsal/NetconfDevice.java | 29 +++--- .../NetconfStateSchemasResolverImpl.java | 4 +- .../client/mdsal/api/NetconfRpcService.java | 8 +- .../mdsal/api/NetconfSessionPreferences.java | 4 +- .../mdsal/api/SchemalessRpcService.java | 9 +- .../impl/BaseRpcSchemalessTransformer.java | 17 ++-- .../netconf/client/mdsal/impl/BaseSchema.java | 12 ++- .../mdsal/impl/DefaultBaseNetconfSchemas.java | 24 ++--- .../mdsal/impl/DefaultCredentialProvider.java | 18 ++-- .../impl/DefaultSchemaResourceManager.java | 8 +- .../DefaultSslHandlerFactoryProvider.java | 33 ++++--- .../client/mdsal/impl/NetconfBaseOps.java | 2 +- .../impl/NetconfMessageTransformUtil.java | 10 +-- .../mdsal/impl/NetconfMessageTransformer.java | 30 +++---- .../impl/NetconfRpcStructureTransformer.java | 14 +-- .../mdsal/impl/NetconfSalKeystoreRpcs.java | 40 ++++++--- .../mdsal/impl/RpcStructureTransformer.java | 6 +- .../impl/SchemalessMessageTransformer.java | 21 ++--- .../SchemalessRpcStructureTransformer.java | 2 +- .../client/mdsal/spi/AbstractTxChain.java | 34 ++++--- .../client/mdsal/spi/AbstractWriteTx.java | 20 +++-- .../client/mdsal/spi/FieldsAwareTxChain.java | 7 +- .../client/mdsal/spi/KeepaliveSalFacade.java | 6 +- .../mdsal/spi/NetconfDeviceDOMRpcService.java | 9 +- .../mdsal/spi/NetconfDeviceDataBroker.java | 17 ++-- .../client/mdsal/spi/NetconfDeviceMount.java | 2 +- .../spi/NetconfDeviceNotificationService.java | 30 +++---- .../mdsal/spi/NetconfDeviceSalFacade.java | 2 +- .../netconf/client/mdsal/spi/ReadWriteTx.java | 11 ++- .../netconf/client/mdsal/spi/TxChain.java | 5 +- .../mdsal/LibraryModulesSchemasTest.java | 2 +- .../LibrarySchemaYangSourceProviderTest.java | 2 +- .../MonitoringSchemaSourceProviderTest.java | 8 +- .../client/mdsal/NetconfDeviceTest.java | 61 +++++++------ .../client/mdsal/NetconfStateSchemasTest.java | 24 ++--- .../DefaultSslHandlerFactoryProviderTest.java | 30 +++---- .../impl/NetconfMessageTransformerTest.java | 8 +- ...SchemalessRpcStructureTransformerTest.java | 2 +- .../client/mdsal/spi/MountInstanceTest.java | 4 +- .../spi/NetconfDataTreeServiceImplTest.java | 4 +- .../spi/NetconfDeviceDataBrokerTest.java | 7 +- .../NetconfDeviceNotificationServiceTest.java | 6 +- .../mdsal/spi/NetconfDeviceRpcTest.java | 4 +- .../client/mdsal/spi/ReadWriteTxTest.java | 2 +- .../netconf/client/mdsal/spi/TxChainTest.java | 32 +++---- .../common/mdsal/ProxyMountPointContext.java | 4 +- .../common/mdsal/NormalizedDataUtilTest.java | 4 +- .../dom/api/NetconfDataTreeService.java | 9 +- .../NetconfDOMDataBrokerFieldsExtension.java | 9 +- .../server/mdsal/CurrentSchemaContext.java | 25 +++--- .../mdsal/DOMDataTransactionValidator.java | 7 +- .../MdsalNetconfOperationServiceFactory.java | 24 +++-- .../server/mdsal/TransactionProvider.java | 2 +- .../CapabilityChangeNotificationProducer.java | 25 +++--- .../NotificationsTransformUtil.java | 8 +- .../SessionNotificationProducer.java | 23 +++-- .../YangLibraryNotificationProducer.java | 27 +++--- ...angLibraryNotificationProducerRFC8525.java | 27 +++--- ...abilityChangeNotificationProducerTest.java | 12 +-- .../SessionNotificationProducerTest.java | 14 +-- .../YangLibraryNotificationProducerTest.java | 26 ++---- ...ibraryNotificationProducerTestRFC8525.java | 20 ++--- .../AbstractNetconfOperationTest.java | 4 +- .../server/mdsal/operations/Bug8084.java | 17 ++-- .../mdsal/operations/RuntimeRpcTest.java | 39 ++++---- .../mdsal/operations/SchemaServiceStub.java | 25 ++---- .../server/mdsal/operations/ValidateTest.java | 10 +-- .../nb/rfc8040/databind/XmlChildBody.java | 4 +- .../JsonNormalizedNodeBodyWriter.java | 2 +- .../RestconfDocumentedExceptionMapper.java | 2 +- .../transactions/MdsalRestconfStrategy.java | 8 +- .../transactions/NetconfRestconfStrategy.java | 6 +- .../rests/transactions/RestconfStrategy.java | 29 +++--- .../restconf/server/api/DatabindContext.java | 4 +- .../server/mdsal/CapabilitiesWriter.java | 29 +++--- .../server/mdsal/MdsalRestconfServer.java | 39 ++++---- .../CreateDataChangeEventSubscriptionRpc.java | 6 +- .../streams/dtcl/DataTreeChangeSource.java | 6 +- .../dtcl/JSONDataTreeCandidateFormatter.java | 4 +- .../dtcl/JSONDataTreeCandidateSerializer.java | 2 +- .../dtcl/XMLDataTreeCandidateSerializer.java | 2 +- .../notif/AbstractNotificationSource.java | 9 +- .../notif/JSONNotificationFormatter.java | 4 +- .../spi/ApiPathInstanceIdentifierCodec.java | 25 ++++-- .../nb/jaxrs/AbstractRestconfTest.java | 2 +- .../restconf/nb/jaxrs/Netconf799Test.java | 4 +- .../nb/jaxrs/RestconfDataDeleteTest.java | 2 +- .../nb/jaxrs/RestconfDataGetTest.java | 2 +- .../nb/jaxrs/RestconfDataPutTest.java | 4 +- .../nb/jaxrs/RestconfModulesGetTest.java | 6 +- .../nb/jaxrs/RestconfOperationsGetTest.java | 4 +- .../nb/jaxrs/RestconfOperationsPostTest.java | 4 +- .../jaxrs/RestconfSchemaServiceMountTest.java | 18 ++-- .../nb/jaxrs/RestconfSchemaServiceTest.java | 20 +++-- .../databind/AbstractPatchBodyTest.java | 3 +- .../rfc8040/databind/XmlResourceBodyTest.java | 2 +- .../MdsalRestconfStrategyTest.java | 6 +- .../NetconfRestconfStrategyTest.java | 8 +- .../streams/DataTreeChangeStreamTest.java | 4 +- .../rfc8040/streams/WebSocketFactoryTest.java | 4 +- .../test/incubate/InMemoryMdsalModule.java | 27 ++---- .../dtcl/CreateNotificationStreamRpcTest.java | 12 +-- .../restconf/openapi/impl/PathsStream.java | 3 +- .../openapi/model/PropertyEntity.java | 4 +- .../mountpoints/MountPointOpenApi.java | 6 +- transport/transport-ssh/pom.xml | 5 ++ 176 files changed, 1189 insertions(+), 1225 deletions(-) diff --git a/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/CallHomeMountSshAuthProvider.java b/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/CallHomeMountSshAuthProvider.java index 6563021906..c1df4d4def 100644 --- a/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/CallHomeMountSshAuthProvider.java +++ b/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/CallHomeMountSshAuthProvider.java @@ -7,13 +7,12 @@ */ package org.opendaylight.netconf.callhome.mount; -import com.google.common.collect.Iterables; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.security.GeneralSecurityException; import java.security.PublicKey; -import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -21,8 +20,6 @@ import javax.inject.Inject; import javax.inject.Singleton; 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.DataObjectModification.ModificationType; import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; @@ -64,7 +61,7 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid public CallHomeMountSshAuthProvider(final @Reference DataBroker broker, final @Reference CallHomeMountStatusReporter statusReporter) { configReg = broker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NetconfCallhomeServer.class).child(Global.class)), globalConfig); @@ -72,10 +69,10 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid InstanceIdentifier.create(NetconfCallhomeServer.class).child(AllowedDevices.class).child(Device.class); deviceReg = broker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, allowedDeviceWildcard), + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, allowedDeviceWildcard), deviceConfig); deviceOpReg = broker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, allowedDeviceWildcard), + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, allowedDeviceWildcard), deviceOp); this.statusReporter = statusReporter; @@ -144,18 +141,18 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid private abstract static class AbstractDeviceListener implements DataTreeChangeListener { @Override - public final void onDataTreeChanged(final Collection> mods) { - for (DataTreeModification dataTreeModification : mods) { - final DataObjectModification deviceMod = dataTreeModification.getRootNode(); - final ModificationType modType = deviceMod.getModificationType(); + public final void onDataTreeChanged(final List> mods) { + for (var dataTreeModification : mods) { + final var deviceMod = dataTreeModification.getRootNode(); + final var modType = deviceMod.modificationType(); switch (modType) { case DELETE: - deleteDevice(deviceMod.getDataBefore()); + deleteDevice(deviceMod.dataBefore()); break; case SUBTREE_MODIFIED: case WRITE: - deleteDevice(deviceMod.getDataBefore()); - writeDevice(deviceMod.getDataAfter()); + deleteDevice(deviceMod.dataBefore()); + writeDevice(deviceMod.dataAfter()); break; default: throw new IllegalStateException("Unhandled modification type " + modType); @@ -262,9 +259,9 @@ public final class CallHomeMountSshAuthProvider implements CallHomeSshAuthProvid private volatile Global current = null; @Override - public void onDataTreeChanged(final Collection> mods) { + public void onDataTreeChanged(final List> mods) { if (!mods.isEmpty()) { - current = Iterables.getLast(mods).getRootNode().getDataAfter(); + current = mods.get(mods.size() - 1).getRootNode().dataAfter(); } } diff --git a/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/tls/CallHomeMountTlsAuthProvider.java b/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/tls/CallHomeMountTlsAuthProvider.java index 5a136d96c8..843c0d9060 100644 --- a/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/tls/CallHomeMountTlsAuthProvider.java +++ b/apps/callhome-provider/src/main/java/org/opendaylight/netconf/callhome/mount/tls/CallHomeMountTlsAuthProvider.java @@ -18,7 +18,7 @@ import java.security.PublicKey; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.util.Base64; -import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -27,10 +27,9 @@ import java.util.stream.Collectors; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; +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; @@ -70,13 +69,13 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid public CallHomeMountTlsAuthProvider( final @Reference SslHandlerFactoryProvider sslHandlerFactoryProvider, final @Reference DataBroker dataBroker) { - this.sslHandlerFactory = sslHandlerFactoryProvider.getSslHandlerFactory(null); - allowedDevicesReg = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + sslHandlerFactory = sslHandlerFactoryProvider.getSslHandlerFactory(null); + allowedDevicesReg = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NetconfCallhomeServer.class).child(AllowedDevices.class).child(Device.class)), new AllowedDevicesMonitor()); - certificatesReg = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), + certificatesReg = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), new CertificatesMonitor()); } @@ -105,12 +104,15 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid // In real world scenario it is not possible to have multiple certificates with the same private/public key, // but in theory/synthetic tests it is practically possible to generate multiple certificates from a single // private key. In such case it's not possible to pin certificate to particular device. - if (deviceNames.size() > 1) { - LOG.error("Unable to find device by provided certificate. Possible reason: one certificate configured " - + "with multiple devices/names or multiple certificates contain same public key"); - return null; - } - return deviceNames.isEmpty() ? null : deviceNames.get(0); + return switch (deviceNames.size()) { + case 0 -> null; + case 1 -> deviceNames.get(0); + default -> { + LOG.error("Unable to find device by provided certificate. Possible reason: one certificate configured " + + "with multiple devices/names or multiple certificates contain same public key"); + yield null; + } + }; } @Override @@ -118,28 +120,27 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid return sslHandlerFactory.createSslHandler(Set.copyOf(deviceToPrivateKey.values())); } - private final class CertificatesMonitor implements ClusteredDataTreeChangeListener { + private final class CertificatesMonitor implements DataTreeChangeListener { @Override - public void onDataTreeChanged(@NonNull final Collection> changes) { - changes.stream().map(DataTreeModification::getRootNode) - .flatMap(v -> v.getModifiedChildren().stream()) - .filter(v -> v.getDataType().equals(TrustedCertificate.class)) + public void onDataTreeChanged(final List> changes) { + changes.stream() + .map(DataTreeModification::getRootNode) + .flatMap(v -> v.modifiedChildren().stream()) + .filter(v -> v.dataType().equals(TrustedCertificate.class)) .map(v -> (DataObjectModification) v) .forEach(this::updateCertificate); } private void updateCertificate(final DataObjectModification change) { - switch (change.getModificationType()) { - case DELETE: - deleteCertificate(change.getDataBefore()); - break; - case SUBTREE_MODIFIED: - case WRITE: - deleteCertificate(change.getDataBefore()); - writeCertificate(change.getDataAfter()); - break; - default: - break; + switch (change.modificationType()) { + case DELETE -> deleteCertificate(change.dataBefore()); + case SUBTREE_MODIFIED, WRITE -> { + deleteCertificate(change.dataBefore()); + writeCertificate(change.dataAfter()); + } + default -> { + // Should never happen + } } } @@ -171,22 +172,20 @@ public final class CallHomeMountTlsAuthProvider implements CallHomeTlsAuthProvid } } - private final class AllowedDevicesMonitor implements ClusteredDataTreeChangeListener { + private final class AllowedDevicesMonitor implements DataTreeChangeListener { @Override - public void onDataTreeChanged(final Collection> mods) { - for (final DataTreeModification dataTreeModification : mods) { - final DataObjectModification deviceMod = dataTreeModification.getRootNode(); - switch (deviceMod.getModificationType()) { - case DELETE: - deleteDevice(deviceMod.getDataBefore()); - break; - case SUBTREE_MODIFIED: - case WRITE: - deleteDevice(deviceMod.getDataBefore()); - writeDevice(deviceMod.getDataAfter()); - break; - default: - break; + public void onDataTreeChanged(final List> mods) { + for (var dataTreeModification : mods) { + final var deviceMod = dataTreeModification.getRootNode(); + switch (deviceMod.modificationType()) { + case DELETE -> deleteDevice(deviceMod.dataBefore()); + case SUBTREE_MODIFIED, WRITE -> { + deleteDevice(deviceMod.dataBefore()); + writeDevice(deviceMod.dataAfter()); + } + default -> { + // Should never happen + } } } } diff --git a/apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java b/apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java index 736a2766c7..4883042ba3 100644 --- a/apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java +++ b/apps/netconf-topology-impl/src/main/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImpl.java @@ -8,7 +8,7 @@ package org.opendaylight.netconf.topology.impl; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import java.util.Collection; +import java.util.List; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; @@ -92,7 +92,7 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology mountPointService, builderFactory, deviceActionFactory, baseSchemas); LOG.debug("Registering datastore listener"); - dtclReg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create( + dtclReg = dataBroker.registerLegacyTreeChangeListener(DataTreeIdentifier.of( LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(NetworkTopology.class) .child(Topology.class, new TopologyKey(new TopologyId(topologyId))) .child(Node.class) @@ -119,15 +119,15 @@ public class NetconfTopologyImpl extends AbstractNetconfTopology } @Override - public void onDataTreeChanged(final Collection> changes) { + public void onDataTreeChanged(final List> changes) { for (var change : changes) { final var rootNode = change.getRootNode(); - final var modType = rootNode.getModificationType(); + final var modType = rootNode.modificationType(); switch (modType) { - case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.getDataAfter()); - case WRITE -> ensureNode("created", rootNode.getDataAfter()); + case SUBTREE_MODIFIED -> ensureNode("updated", rootNode.dataAfter()); + case WRITE -> ensureNode("created", rootNode.dataAfter()); case DELETE -> { - final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().getRootIdentifier()).getNodeId(); + final var nodeId = InstanceIdentifier.keyOf(change.getRootPath().path()).getNodeId(); LOG.debug("Config for node {} deleted", nodeId); deleteNode(nodeId); } diff --git a/apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java b/apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java index 117efbc217..d9bff3595e 100644 --- a/apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java +++ b/apps/netconf-topology-impl/src/test/java/org/opendaylight/netconf/topology/impl/NetconfTopologyImplTest.java @@ -123,10 +123,10 @@ class NetconfTopologyImplTest { .build()) .build(); - doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).getModificationType(); - doReturn(node).when(objMod).getDataAfter(); + doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).modificationType(); + doReturn(node).when(objMod).dataAfter(); - doReturn(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + doReturn(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, TOPOLOGY_PATH.child(Node.class, key))).when(treeMod).getRootPath(); final var changes = List.of(treeMod); @@ -134,11 +134,11 @@ class NetconfTopologyImplTest { spyTopology.onDataTreeChanged(changes); verify(spyTopology).ensureNode(node); - doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).getModificationType(); + doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).modificationType(); spyTopology.onDataTreeChanged(changes); verify(spyTopology).deleteNode(key.getNodeId()); - doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).getModificationType(); + doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).modificationType(); spyTopology.onDataTreeChanged(changes); // one in previous creating and deleting node and one in updating diff --git a/apps/netconf-topology-singleton/pom.xml b/apps/netconf-topology-singleton/pom.xml index 62d8d5e00e..1fdaca1447 100644 --- a/apps/netconf-topology-singleton/pom.xml +++ b/apps/netconf-topology-singleton/pom.xml @@ -56,7 +56,7 @@ org.opendaylight.mdsal - mdsal-singleton-common-api + mdsal-singleton-api org.opendaylight.mdsal.model @@ -78,7 +78,7 @@ org.opendaylight.mdsal - mdsal-singleton-dom-impl + mdsal-singleton-impl test diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/MasterSalFacade.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/MasterSalFacade.java index c942f98928..dd1c09187c 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/MasterSalFacade.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/MasterSalFacade.java @@ -35,7 +35,7 @@ import org.opendaylight.netconf.topology.singleton.messages.CreateInitialMasterA import org.opendaylight.netconf.topology.spi.NetconfDeviceTopologyAdapter; import org.opendaylight.netconf.topology.spi.NetconfNodeUtils; import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -154,8 +154,7 @@ class MasterSalFacade implements RemoteDeviceHandler, AutoCloseable { actorResponseWaitTime); final NetconfDataTreeService proxyNetconfService = new ProxyNetconfDataTreeService(id, masterActorRef, actorSystem.dispatcher(), actorResponseWaitTime); - mount.onDeviceConnected(mountContext.getEffectiveModelContext(), deviceServices, - proxyDataBroker, proxyNetconfService); + mount.onDeviceConnected(mountContext.modelContext(), deviceServices, proxyDataBroker, proxyNetconfService); } protected DOMDataBroker newDeviceDataBroker(final MountPointContext mountContext, @@ -170,7 +169,7 @@ class MasterSalFacade implements RemoteDeviceHandler, AutoCloseable { private Future sendInitialDataToActor() { final List sourceIdentifiers = List.copyOf(SchemaContextUtil.getConstituentModuleIdentifiers( - currentSchema.mountContext().getEffectiveModelContext())); + currentSchema.mountContext().modelContext())); LOG.debug("{}: Sending CreateInitialMasterActorData with sourceIdentifiers {} to {}", id, sourceIdentifiers, masterActorRef); diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java index 04fbd3204e..d22952a014 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManager.java @@ -14,11 +14,11 @@ import akka.dispatch.OnComplete; import akka.pattern.AskTimeoutException; import akka.pattern.Patterns; import akka.util.Timeout; -import java.util.Collection; +import java.util.List; import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.lock.qual.Holding; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; 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.common.api.LogicalDatastoreType; @@ -35,7 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; 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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,14 +44,14 @@ import org.slf4j.LoggerFactory; * Managing and reacting on data tree changes in specific netconf node when master writes status to the operational * data store (e.g. handling lifecycle of slave mount point). */ -class NetconfNodeManager implements ClusteredDataTreeChangeListener, AutoCloseable { +class NetconfNodeManager implements DataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeManager.class); private final Timeout actorResponseWaitTime; private final DOMMountPointService mountPointService; private volatile NetconfTopologySetup setup; - private volatile ListenerRegistration dataChangeListenerRegistration; + private volatile Registration dataChangeListenerRegistration; private volatile RemoteDeviceId id; @GuardedBy("this") @@ -72,23 +72,22 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener, AutoC } @Override - public void onDataTreeChanged(final Collection> changes) { - for (final DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.getIdentifier()); - switch (rootNode.getModificationType()) { + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var rootNode = change.getRootNode(); + final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.step()); + switch (rootNode.modificationType()) { case SUBTREE_MODIFIED: - LOG.debug("{}: Operational state for node {} - subtree modified from {} to {}", - id, nodeId, rootNode.getDataBefore(), rootNode.getDataAfter()); + LOG.debug("{}: Operational state for node {} - subtree modified from {} to {}", id, nodeId, + rootNode.dataBefore(), rootNode.dataAfter()); handleSlaveMountPoint(rootNode); break; case WRITE: - if (rootNode.getDataBefore() != null) { - LOG.debug("{}: Operational state for node {} updated from {} to {}", - id, nodeId, rootNode.getDataBefore(), rootNode.getDataAfter()); + if (rootNode.dataBefore() != null) { + LOG.debug("{}: Operational state for node {} updated from {} to {}", id, nodeId, + rootNode.dataBefore(), rootNode.dataAfter()); } else { - LOG.debug("{}: Operational state for node {} created: {}", - id, nodeId, rootNode.getDataAfter()); + LOG.debug("{}: Operational state for node {} created: {}", id, nodeId, rootNode.dataAfter()); } handleSlaveMountPoint(rootNode); break; @@ -136,8 +135,8 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener, AutoC void registerDataTreeChangeListener(final String topologyId, final NodeKey key) { final InstanceIdentifier path = NetconfTopologyUtils.createTopologyNodeListPath(key, topologyId); LOG.debug("{}: Registering data tree change listener on path {}", id, path); - dataChangeListenerRegistration = setup.getDataBroker().registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, path), this); + dataChangeListenerRegistration = setup.getDataBroker().registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, path), this); } private synchronized void handleSlaveMountPoint(final DataObjectModification rootNode) { @@ -146,7 +145,7 @@ class NetconfNodeManager implements ClusteredDataTreeChangeListener, AutoC } @SuppressWarnings("ConstantConditions") - final NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class); + final NetconfNode netconfNodeAfter = rootNode.dataAfter().augmentation(NetconfNode.class); if (ConnectionStatus.Connected == netconfNodeAfter.getConnectionStatus()) { lastUpdateCount++; diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java index 7cab45ee66..bc6c73e763 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java @@ -14,8 +14,8 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.ListenableFuture; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMMountPointService; -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.netconf.client.mdsal.api.DeviceActionFactory; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager; diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java index 85eac7f715..4b3a259839 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java @@ -16,7 +16,7 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.time.Duration; -import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.PreDestroy; @@ -24,9 +24,8 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.aaa.encrypt.AAAEncryptionService; import org.opendaylight.controller.cluster.ActorSystemProvider; -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; @@ -34,9 +33,8 @@ 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.DOMMountPointService; -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.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.netconf.client.NetconfClientFactory; import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas; import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory; @@ -57,7 +55,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.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.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Uint16; import org.osgi.service.component.annotations.Activate; @@ -74,7 +72,7 @@ import org.slf4j.LoggerFactory; @Component(service = { }, configurationPid = "org.opendaylight.netconf.topology.singleton") @Designate(ocd = NetconfTopologyManager.Configuration.class) // Non-final for testing -public class NetconfTopologyManager implements ClusteredDataTreeChangeListener, AutoCloseable { +public class NetconfTopologyManager implements DataTreeChangeListener, AutoCloseable { @ObjectClassDefinition public @interface Configuration { @AttributeDefinition(min = "1", description = "Name of the Network Topology instance to manage") @@ -89,8 +87,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener, NetconfTopologyContext> contexts = new ConcurrentHashMap<>(); - private final Map, ClusterSingletonServiceRegistration> - clusterRegistrations = new ConcurrentHashMap<>(); + private final Map, Registration> clusterRegistrations = new ConcurrentHashMap<>(); private final BaseNetconfSchemas baseSchemas; private final DataBroker dataBroker; @@ -106,7 +103,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener dataChangeListenerRegistration; + private Registration dataChangeListenerRegistration; private NetconfTopologyRPCProvider rpcProvider; @Activate @@ -173,23 +170,23 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener> changes) { - for (final DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final InstanceIdentifier dataModifIdent = change.getRootPath().getRootIdentifier(); - final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.getIdentifier()); - switch (rootNode.getModificationType()) { + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var rootNode = change.getRootNode(); + final var dataModifIdent = change.getRootPath().path(); + final NodeId nodeId = NetconfTopologyUtils.getNodeId(rootNode.step()); + switch (rootNode.modificationType()) { case SUBTREE_MODIFIED: LOG.debug("Config for node {} updated", nodeId); - refreshNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter()); + refreshNetconfDeviceContext(dataModifIdent, rootNode.dataAfter()); break; case WRITE: if (contexts.containsKey(dataModifIdent)) { LOG.debug("RemoteDevice{{}} was already configured, reconfiguring node...", nodeId); - refreshNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter()); + refreshNetconfDeviceContext(dataModifIdent, rootNode.dataAfter()); } else { LOG.debug("Config for node {} created", nodeId); - startNetconfDeviceContext(dataModifIdent, rootNode.getDataAfter()); + startNetconfDeviceContext(dataModifIdent, rootNode.dataAfter()); } break; case DELETE: @@ -218,8 +215,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener registerDataTreeChangeListener() { + private Registration registerDataTreeChangeListener() { final WriteTransaction wtx = dataBroker.newWriteOnlyTransaction(); // FIXME: how does this play out with lifecycle? In a cluster, someone needs to ensure this call happens, but // also we need to to make sure config -> oper is properly synchronized. Non-clustered case relies on @@ -311,7 +307,7 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener getExtensions() { - return ImmutableClassToInstanceMap.of(); - } } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBroker.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBroker.java index 1ab77571c7..437832ad7b 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBroker.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBroker.java @@ -10,14 +10,10 @@ package org.opendaylight.netconf.topology.singleton.impl; import akka.actor.ActorRef; import akka.pattern.Patterns; import akka.util.Timeout; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ImmutableClassToInstanceMap; -import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; 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.dom.spi.PingPongMergingDOMDataBroker; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; import org.opendaylight.netconf.topology.singleton.impl.tx.ProxyReadTransaction; @@ -73,12 +69,7 @@ public class ProxyDOMDataBroker implements PingPongMergingDOMDataBroker { } @Override - public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) { + public DOMTransactionChain createTransactionChain() { throw new UnsupportedOperationException(id + ": Transaction chains not supported for netconf mount point"); } - - @Override - public ClassToInstanceMap getExtensions() { - return ImmutableClassToInstanceMap.of(); - } } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMRpcService.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMRpcService.java index d527704e2a..7b5b5ab348 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMRpcService.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMRpcService.java @@ -27,7 +27,7 @@ import org.opendaylight.netconf.topology.singleton.messages.SchemaPathMessage; import org.opendaylight.netconf.topology.singleton.messages.rpc.InvokeRpcMessage; import org.opendaylight.netconf.topology.singleton.messages.rpc.InvokeRpcMessageReply; import org.opendaylight.netconf.topology.singleton.messages.transactions.EmptyResultResponse; -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.RpcError; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -98,7 +98,7 @@ public class ProxyDOMRpcService implements DOMRpcService { } @Override - public ListenerRegistration registerRpcListener(final T listener) { + public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) { // NOOP, only proxy throw new UnsupportedOperationException("RegisterRpcListener: DOMRpc service not working in cluster."); } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyYangTextSourceProvider.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyYangTextSourceProvider.java index 4bb45457a8..c5e6418ed5 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyYangTextSourceProvider.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/ProxyYangTextSourceProvider.java @@ -16,7 +16,7 @@ import java.util.Set; import org.opendaylight.controller.cluster.schema.provider.RemoteYangTextSourceProvider; import org.opendaylight.controller.cluster.schema.provider.impl.YangTextSchemaSourceSerializationProxy; import org.opendaylight.netconf.topology.singleton.messages.YangTextSchemaSourceRequest; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; import scala.concurrent.ExecutionContext; import scala.concurrent.Future; diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java index 1cf783775f..906799fae0 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/NetconfNodeActor.java @@ -66,17 +66,17 @@ import org.opendaylight.netconf.topology.singleton.messages.transactions.EmptyRe import org.opendaylight.netconf.topology.singleton.messages.transactions.NewReadTransactionRequest; import org.opendaylight.netconf.topology.singleton.messages.transactions.NewReadWriteTransactionRequest; import org.opendaylight.netconf.topology.singleton.messages.transactions.NewWriteTransactionRequest; +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.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory; import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; public class NetconfNodeActor extends AbstractUntypedActor { @@ -96,7 +96,7 @@ public class NetconfNodeActor extends AbstractUntypedActor { private NetconfDataTreeService netconfService; //readTxActor can be shared private ActorRef readTxActor; - private List> registeredSchemas; + private List registeredSchemas; public static Props props(final NetconfTopologySetup setup, final RemoteDeviceId id, final Timeout actorResponseWaitTime, final DOMMountPointService mountPointService) { @@ -213,24 +213,24 @@ public class NetconfNodeActor extends AbstractUntypedActor { } private void sendYangTextSchemaSourceProxy(final SourceIdentifier sourceIdentifier, final ActorRef sender) { - final var schemaSourceFuture = schemaRepository.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class); - Futures.addCallback(schemaSourceFuture, new FutureCallback<>() { - @Override - public void onSuccess(final YangTextSchemaSource yangTextSchemaSource) { - try { - LOG.debug("{}: getSchemaSource for {} succeeded", id, sourceIdentifier); - sender.tell(new YangTextSchemaSourceSerializationProxy(yangTextSchemaSource), getSelf()); - } catch (IOException e) { - sender.tell(new Failure(e), getSelf()); + Futures.addCallback(schemaRepository.getSchemaSource(sourceIdentifier, YangTextSource.class), + new FutureCallback<>() { + @Override + public void onSuccess(final YangTextSource yangTextSchemaSource) { + try { + LOG.debug("{}: getSchemaSource for {} succeeded", id, sourceIdentifier); + sender.tell(new YangTextSchemaSourceSerializationProxy(yangTextSchemaSource), getSelf()); + } catch (IOException e) { + sender.tell(new Failure(e), getSelf()); + } } - } - @Override - public void onFailure(final Throwable throwable) { - LOG.debug("{}: getSchemaSource for {} failed", id, sourceIdentifier, throwable); - sender.tell(new Failure(throwable), getSelf()); - } - }, MoreExecutors.directExecutor()); + @Override + public void onFailure(final Throwable throwable) { + LOG.debug("{}: getSchemaSource for {} failed", id, sourceIdentifier, throwable); + sender.tell(new Failure(throwable), getSelf()); + } + }, MoreExecutors.directExecutor()); } private void invokeSlaveRpc(final QName qname, final NormalizedNodeMessage normalizedNodeMessage, @@ -320,7 +320,7 @@ public class NetconfNodeActor extends AbstractUntypedActor { registeredSchemas = sourceIdentifiers.stream() .map(sourceId -> schemaRegistry.registerSchemaSource(remoteProvider, PotentialSchemaSource.create(sourceId, - YangTextSchemaSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue()))) + YangTextSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue()))) .collect(Collectors.toList()); return schemaRepository.createEffectiveModelContextFactory(); @@ -328,8 +328,7 @@ public class NetconfNodeActor extends AbstractUntypedActor { private void resolveSchemaContext(final EffectiveModelContextFactory schemaContextFactory, final SlaveSalFacade localSlaveSalManager, final ActorRef masterReference, final int tries) { - final ListenableFuture schemaContextFuture = - schemaContextFactory.createEffectiveModelContext(sourceIdentifiers); + final var schemaContextFuture = schemaContextFactory.createEffectiveModelContext(sourceIdentifiers); Futures.addCallback(schemaContextFuture, new FutureCallback<>() { @Override public void onSuccess(final EffectiveModelContext result) { @@ -337,8 +336,8 @@ public class NetconfNodeActor extends AbstractUntypedActor { // Make sure the slaveSalManager instance hasn't changed since we initiated the schema context // resolution. if (slaveSalManager == localSlaveSalManager) { - LOG.info("{}: Schema context resolved: {} - registering slave mount point", - id, result.getModules()); + LOG.info("{}: Schema context resolved: {} - registering slave mount point", id, + result.getModules()); final var actorSystem = setup.getActorSystem(); final var rpcProxy = new ProxyDOMRpcService(actorSystem, masterReference, id, actorResponseWaitTime); @@ -374,7 +373,7 @@ public class NetconfNodeActor extends AbstractUntypedActor { private void closeSchemaSourceRegistrations() { if (registeredSchemas != null) { - registeredSchemas.forEach(SchemaSourceRegistration::close); + registeredSchemas.forEach(Registration::close); registeredSchemas = null; } } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ActorProxyTransactionFacade.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ActorProxyTransactionFacade.java index d393a7121e..50660b443f 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ActorProxyTransactionFacade.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ActorProxyTransactionFacade.java @@ -16,6 +16,7 @@ import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.SettableFuture; import java.util.Objects; import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.ReadFailedException; @@ -36,7 +37,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.ExecutionContext; -import scala.concurrent.Future; /** * ProxyTransactionFacade implementation that interfaces with an actor. @@ -46,6 +46,8 @@ import scala.concurrent.Future; class ActorProxyTransactionFacade implements ProxyTransactionFacade { private static final Logger LOG = LoggerFactory.getLogger(ActorProxyTransactionFacade.class); + private final SettableFuture settableFuture = SettableFuture.create(); + private final @NonNull FluentFuture fluentFuture = FluentFuture.from(settableFuture); private final ActorRef masterTxActor; private final RemoteDeviceId id; private final ExecutionContext executionContext; @@ -64,13 +66,16 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { return id; } + @Override + public FluentFuture completionFuture() { + return fluentFuture; + } + @Override public boolean cancel() { LOG.debug("{}: Cancel via actor {}", id, masterTxActor); - final Future future = Patterns.ask(masterTxActor, new CancelRequest(), askTimeout); - - future.onComplete(new OnComplete<>() { + Patterns.ask(masterTxActor, new CancelRequest(), askTimeout).onComplete(new OnComplete<>() { @Override public void onComplete(final Throwable failure, final Object response) { if (failure != null) { @@ -90,10 +95,8 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { final YangInstanceIdentifier path) { LOG.debug("{}: Read {} {} via actor {}", id, store, path, masterTxActor); - final Future future = Patterns.ask(masterTxActor, new ReadRequest(store, path), askTimeout); - - final SettableFuture> settableFuture = SettableFuture.create(); - future.onComplete(new OnComplete<>() { + final var future = SettableFuture.>create(); + Patterns.ask(masterTxActor, new ReadRequest(store, path), askTimeout).onComplete(new OnComplete<>() { @Override public void onComplete(final Throwable failure, final Object response) { if (failure != null) { @@ -101,9 +104,9 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { final Throwable processedFailure = processFailure(failure); if (processedFailure instanceof ReadFailedException) { - settableFuture.setException(processedFailure); + future.setException(processedFailure); } else { - settableFuture.setException(new ReadFailedException("Read of store " + store + " path " + path + future.setException(new ReadFailedException("Read of store " + store + " path " + path + " failed", processedFailure)); } return; @@ -112,27 +115,26 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { LOG.debug("{}: Read {} {} succeeded: {}", id, store, path, response); if (response instanceof EmptyReadResponse) { - settableFuture.set(Optional.empty()); + future.set(Optional.empty()); return; } if (response instanceof NormalizedNodeMessage data) { - settableFuture.set(Optional.of(data.getNode())); + future.set(Optional.of(data.getNode())); } } }, executionContext); - return FluentFuture.from(settableFuture); + return FluentFuture.from(future); } @Override public FluentFuture exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) { LOG.debug("{}: Exists {} {} via actor {}", id, store, path, masterTxActor); - final Future future = Patterns.ask(masterTxActor, new ExistsRequest(store, path), askTimeout); + final var future = SettableFuture.create(); - final SettableFuture settableFuture = SettableFuture.create(); - future.onComplete(new OnComplete<>() { + Patterns.ask(masterTxActor, new ExistsRequest(store, path), askTimeout).onComplete(new OnComplete<>() { @Override public void onComplete(final Throwable failure, final Object response) { if (failure != null) { @@ -140,9 +142,9 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { final Throwable processedFailure = processFailure(failure); if (processedFailure instanceof ReadFailedException) { - settableFuture.setException(processedFailure); + future.setException(processedFailure); } else { - settableFuture.setException(new ReadFailedException("Exists of store " + store + " path " + path + future.setException(new ReadFailedException("Exists of store " + store + " path " + path + " failed", processedFailure)); } return; @@ -150,11 +152,11 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { LOG.debug("{}: Exists {} {} succeeded: {}", id, store, path, response); - settableFuture.set((Boolean) response); + future.set((Boolean) response); } }, executionContext); - return FluentFuture.from(settableFuture); + return FluentFuture.from(future); } @Override @@ -179,10 +181,7 @@ class ActorProxyTransactionFacade implements ProxyTransactionFacade { public FluentFuture commit() { LOG.debug("{}: Commit via actor {}", id, masterTxActor); - final Future future = Patterns.ask(masterTxActor, new SubmitRequest(), askTimeout); - - final SettableFuture settableFuture = SettableFuture.create(); - future.onComplete(new OnComplete<>() { + Patterns.ask(masterTxActor, new SubmitRequest(), askTimeout).onComplete(new OnComplete<>() { @Override public void onComplete(final Throwable failure, final Object response) { if (failure != null) { diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/FailedProxyTransactionFacade.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/FailedProxyTransactionFacade.java index 4050acecaa..9b2e47866a 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/FailedProxyTransactionFacade.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/FailedProxyTransactionFacade.java @@ -30,12 +30,16 @@ import org.slf4j.LoggerFactory; class FailedProxyTransactionFacade implements ProxyTransactionFacade { private static final Logger LOG = LoggerFactory.getLogger(FailedProxyTransactionFacade.class); + private final @NonNull FluentFuture completionFuture; private final RemoteDeviceId id; private final Throwable failure; FailedProxyTransactionFacade(final RemoteDeviceId id, final Throwable failure) { this.id = Objects.requireNonNull(id); this.failure = Objects.requireNonNull(failure); + completionFuture = FluentFutures.immediateFailedFluentFuture( + failure instanceof TransactionCommitFailedException commitFailed ? commitFailed + : new TransactionCommitFailedException("commit", failure)); } @Override @@ -43,6 +47,11 @@ class FailedProxyTransactionFacade implements ProxyTransactionFacade { return id; } + @Override + public FluentFuture completionFuture() { + return completionFuture; + } + @Override public boolean cancel() { return true; @@ -80,14 +89,8 @@ class FailedProxyTransactionFacade implements ProxyTransactionFacade { } @Override - public @NonNull FluentFuture commit() { + public FluentFuture commit() { LOG.debug("{}: Commit - failure", id, failure); - final TransactionCommitFailedException txCommitEx; - if (failure instanceof TransactionCommitFailedException) { - txCommitEx = (TransactionCommitFailedException) failure; - } else { - txCommitEx = new TransactionCommitFailedException("commit", failure); - } - return FluentFutures.immediateFailedFluentFuture(txCommitEx); + return completionFuture; } } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransaction.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransaction.java index 8fb5fdf132..71b114f341 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransaction.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/tx/ProxyReadWriteTransaction.java @@ -40,11 +40,12 @@ import scala.concurrent.Future; public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransaction { private static final Logger LOG = LoggerFactory.getLogger(ProxyReadWriteTransaction.class); - private final RemoteDeviceId id; - private final AtomicBoolean opened = new AtomicBoolean(true); - @GuardedBy("queuedTxOperations") private final List> queuedTxOperations = new ArrayList<>(); + private final SettableFuture settableFuture = SettableFuture.create(); + private final @NonNull FluentFuture completionFuture = FluentFuture.from(settableFuture); + private final AtomicBoolean opened = new AtomicBoolean(true); + private final RemoteDeviceId id; private volatile ProxyTransactionFacade transactionFacade; @@ -70,6 +71,11 @@ public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransactio }, executionContext); } + @Override + public FluentFuture completionFuture() { + return completionFuture; + } + @Override public boolean cancel() { if (!opened.compareAndSet(true, false)) { @@ -122,13 +128,12 @@ public class ProxyReadWriteTransaction implements DOMDataTreeReadWriteTransactio } @Override - public @NonNull FluentFuture commit() { + public FluentFuture commit() { Preconditions.checkState(opened.compareAndSet(true, false), "%s: Transaction is already closed", id); LOG.debug("{}: Commit", id); - final SettableFuture returnFuture = SettableFuture.create(); - processTransactionOperation(facade -> returnFuture.setFuture(facade.commit())); - return FluentFuture.from(returnFuture); + processTransactionOperation(facade -> settableFuture.setFuture(facade.commit())); + return completionFuture; } @Override diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologySetup.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologySetup.java index e44ad70a96..59cf563d08 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologySetup.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologySetup.java @@ -13,7 +13,7 @@ import akka.actor.ActorSystem; import java.time.Duration; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; import org.opendaylight.netconf.client.NetconfClientFactory; import org.opendaylight.netconf.client.mdsal.NetconfDevice; import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas; diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java index 1e7157a0aa..3794a80df9 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java @@ -17,9 +17,9 @@ 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.yang.binding.DataObjectStep; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.binding.KeyStep; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.ErrorSeverity; @@ -49,9 +49,8 @@ public final class NetconfTopologyUtils { return masterAddress.replace("//", "") + "_" + name; } - public static @NonNull NodeId getNodeId(final PathArgument pathArgument) { - if (pathArgument instanceof IdentifiableItem identifiableItem - && identifiableItem.getKey() instanceof NodeKey nodeKey) { + public static @NonNull NodeId getNodeId(final DataObjectStep pathArgument) { + if (pathArgument instanceof KeyStep identifiableItem && identifiableItem.key() instanceof NodeKey nodeKey) { return nodeKey.getNodeId(); } throw new IllegalStateException("Unable to create NodeId from: " + pathArgument); diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/CreateInitialMasterActorData.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/CreateInitialMasterActorData.java index a17f24877c..f242046baa 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/CreateInitialMasterActorData.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/CreateInitialMasterActorData.java @@ -11,7 +11,7 @@ import java.util.List; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; /** * Master sends this message to the own actor to set necessary parameters. diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RegisterMountPoint.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RegisterMountPoint.java index c47d2c4dfe..e2a72b44f6 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RegisterMountPoint.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/RegisterMountPoint.java @@ -5,14 +5,13 @@ * 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.netconf.topology.singleton.messages; import akka.actor.ActorRef; import java.io.Serial; import java.io.Serializable; import java.util.List; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; /** * Master sends the message to slave with necessary parameters for creating slave mount point. @@ -24,7 +23,7 @@ public class RegisterMountPoint implements Serializable { private final List allSourceIdentifiers; private final ActorRef masterActorRef; - public RegisterMountPoint(final List allSourceIdentifiers, ActorRef masterActorRef) { + public RegisterMountPoint(final List allSourceIdentifiers, final ActorRef masterActorRef) { this.allSourceIdentifiers = allSourceIdentifiers; this.masterActorRef = masterActorRef; } diff --git a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/YangTextSchemaSourceRequest.java b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/YangTextSchemaSourceRequest.java index a3f3dabc13..23d2b90721 100644 --- a/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/YangTextSchemaSourceRequest.java +++ b/apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/messages/YangTextSchemaSourceRequest.java @@ -5,19 +5,17 @@ * 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.netconf.topology.singleton.messages; -import java.io.Serial; import java.io.Serializable; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; /** * Slave sends message to master when tries to resolve schema with particular sourceIdentifier (proxy call). * Master responds with resolved schema source. */ public class YangTextSchemaSourceRequest implements Serializable { - @Serial + @java.io.Serial private static final long serialVersionUID = 1L; private final SourceIdentifier sourceIdentifier; diff --git a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java index 8cc00f1e92..56745ed61e 100644 --- a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java +++ b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java @@ -28,6 +28,7 @@ import akka.util.Timeout; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; 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 com.google.common.util.concurrent.SettableFuture; @@ -52,14 +53,10 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.aaa.encrypt.AAAEncryptionService; import org.opendaylight.mdsal.binding.api.DataBroker; -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.ReadTransaction; 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.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; @@ -82,10 +79,10 @@ import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl; import org.opendaylight.mdsal.dom.broker.DOMRpcRouter; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService; -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.dom.impl.DOMClusterSingletonServiceProviderImpl; +import org.opendaylight.mdsal.eos.dom.simple.SimpleDOMEntityOwnershipService; +import org.opendaylight.mdsal.singleton.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; +import org.opendaylight.mdsal.singleton.impl.EOSClusterSingletonServiceProvider; import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.client.NetconfClientFactory; import org.opendaylight.netconf.client.mdsal.NetconfDeviceCapabilities; @@ -135,6 +132,7 @@ 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.binding.YangModuleInfo; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; @@ -154,9 +152,10 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -200,7 +199,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { private final DOMMountPointService masterMountPointService = new DOMMountPointServiceImpl(); private Rpcs.Normalized deviceRpcService; - private DOMClusterSingletonServiceProviderImpl masterClusterSingletonServiceProvider; + private EOSClusterSingletonServiceProvider masterClusterSingletonServiceProvider; private DataBroker masterDataBroker; private DOMDataBroker deviceDOMDataBroker; private ActorSystem masterSystem; @@ -211,7 +210,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { @Mock private ClusterSingletonServiceProvider mockSlaveClusterSingletonServiceProvider; @Mock - private ClusterSingletonServiceRegistration mockSlaveClusterSingletonServiceReg; + private Registration mockSlaveClusterSingletonServiceReg; @Mock private DOMMountPointListener slaveMountPointListener; private final DOMMountPointService slaveMountPointService = new DOMMountPointServiceImpl(); @@ -247,15 +246,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { deviceSchemaContext = BindingRuntimeHelpers.createEffectiveModel(Top.class); - final var router = new DOMRpcRouter(FixedDOMSchemaService.of(deviceSchemaContext)); + final var router = new DOMRpcRouter(new FixedDOMSchemaService(deviceSchemaContext)); putTopRpcSchemaPath = findRpcDefinition("put-top").getQName(); getTopRpcSchemaPath = findRpcDefinition("get-top").getQName(); - router.getRpcProviderService().registerRpcImplementation(topRpcImplementation, + router.rpcProviderService().registerRpcImplementation(topRpcImplementation, DOMRpcIdentifier.create(putTopRpcSchemaPath), DOMRpcIdentifier.create(getTopRpcSchemaPath)); - final var rpcService = router.getRpcService(); + final var rpcService = router.rpcService(); deviceRpcService = () -> rpcService; builderFactory = new NetconfClientConfigurationBuilderFactoryImpl(mockEncryptionService, credentialProvider, @@ -293,16 +292,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { masterSystem = ActorSystem.create(ACTOR_SYSTEM_NAME, ConfigFactory.load().getConfig("Master")); - masterClusterSingletonServiceProvider = new DOMClusterSingletonServiceProviderImpl(); - masterClusterSingletonServiceProvider.initializeProvider(); + masterClusterSingletonServiceProvider = new EOSClusterSingletonServiceProvider( + new SimpleDOMEntityOwnershipService()); final var resources = resourceManager.getSchemaResources(TEST_DEFAULT_SUBDIR, "test"); resources.getSchemaRegistry().registerSchemaSource( - id -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(id, - topModuleInfo.getYangTextCharSource())), + id -> Futures.immediateFuture(new DelegatedYangTextSource(id, topModuleInfo.getYangTextCharSource())), PotentialSchemaSource.create(new SourceIdentifier(TOP_MODULE_NAME, topModuleInfo.getName().getRevision().map(Revision::toString).orElse(null)), - YangTextSchemaSource.class, 1)); + YangTextSource.class, 1)); masterNetconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, masterDataBroker, masterClusterSingletonServiceProvider, mockTimer, schemaAssembler, masterSystem, @@ -358,15 +356,15 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { verifyTopologyNodesCreated(slaveDataBroker); - slaveTxChain = slaveDataBroker.createTransactionChain(new TransactionChainListener() { + slaveTxChain = slaveDataBroker.createTransactionChain(); + slaveTxChain.addCallback(new FutureCallback() { @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { + public void onSuccess(final Empty result) { // No-op } @Override - public void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, - final Throwable cause) { + public void onFailure(final Throwable cause) { LOG.error("Slave transaction chain failed", cause); } }); @@ -418,16 +416,16 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { // Since the master and slave use separate DataBrokers we need to copy the master's oper node to the slave. // This is essentially what happens in a clustered environment but we'll use a DTCL here. - masterDataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, NODE_INSTANCE_ID), changes -> { + masterDataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, NODE_INSTANCE_ID), changes -> { final WriteTransaction slaveTx = slaveTxChain.newWriteOnlyTransaction(); - for (DataTreeModification dataTreeModification : changes) { - DataObjectModification rootNode = dataTreeModification.getRootNode(); - InstanceIdentifier path = dataTreeModification.getRootPath().getRootIdentifier(); - switch (rootNode.getModificationType()) { + for (var dataTreeModification : changes) { + var rootNode = dataTreeModification.getRootNode(); + var path = dataTreeModification.getRootPath().path(); + switch (rootNode.modificationType()) { case WRITE: case SUBTREE_MODIFIED: - slaveTx.merge(LogicalDatastoreType.OPERATIONAL, path, rootNode.getDataAfter()); + slaveTx.merge(LogicalDatastoreType.OPERATIONAL, path, rootNode.dataAfter()); break; case DELETE: slaveTx.delete(LogicalDatastoreType.OPERATIONAL, path); @@ -697,9 +695,10 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { return getMountPointService(mountPoint, DOMActionService.class); } + @SuppressWarnings({ "rawtypes", "unchecked" }) private static T getMountPointService(final DOMMountPoint mountPoint, final Class serviceClass) { - return mountPoint.getService(serviceClass).orElseThrow(); + return (T) mountPoint.getService((Class) serviceClass).orElseThrow(); } private DOMMountPoint awaitMountPoint(final DOMMountPointService mountPointService) { diff --git a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeActorTest.java b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeActorTest.java index 53104ca035..5db53a0019 100644 --- a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeActorTest.java +++ b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeActorTest.java @@ -100,6 +100,7 @@ import org.opendaylight.netconf.topology.singleton.messages.RefreshSetupMasterAc import org.opendaylight.netconf.topology.singleton.messages.RegisterMountPoint; import org.opendaylight.netconf.topology.singleton.messages.UnregisterSlaveMountPoint; import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.util.concurrent.FluentFutures; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; @@ -112,16 +113,16 @@ import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository; import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository; import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer; import scala.concurrent.Await; @@ -158,9 +159,9 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { @Mock private NetconfDataTreeService netconfService; @Mock - private SchemaSourceRegistration mockSchemaSourceReg1; + private Registration mockSchemaSourceReg1; @Mock - private SchemaSourceRegistration mockSchemaSourceReg2; + private Registration mockSchemaSourceReg2; @Mock private SchemaSourceRegistry mockRegistry; @Mock @@ -280,7 +281,7 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { doReturn(mockSchemaSourceReg1).when(mockRegistry).registerSchemaSource(any(), withSourceId(SOURCE_IDENTIFIER1)); - final SchemaSourceRegistration newMockSchemaSourceReg = mock(SchemaSourceRegistration.class); + final var newMockSchemaSourceReg = mock(Registration.class); final EffectiveModelContextFactory newMockSchemaContextFactory = mock(EffectiveModelContextFactory.class); doReturn(Futures.immediateFuture(mockSchemaContext)) @@ -345,7 +346,8 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { // Test unrecoverable failure. - doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock"))) + doReturn(Futures.immediateFailedFuture( + new SchemaResolutionException("mock", new SourceIdentifier("foo"), null))) .when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection()); slaveRef.tell(new RegisterMountPoint(ImmutableList.of(SOURCE_IDENTIFIER1, SOURCE_IDENTIFIER2), @@ -364,7 +366,7 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { reset(mockSchemaSourceReg1, mockSchemaSourceReg2); - doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock", + doReturn(Futures.immediateFailedFuture(new SchemaResolutionException("mock", new SourceIdentifier("foo"), new AskTimeoutException("timeout")))) .doReturn(Futures.immediateFuture(mockSchemaContext)) .when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection()); @@ -396,7 +398,8 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { slaveRef.tell(new RegisterMountPoint(ImmutableList.of(SOURCE_IDENTIFIER1, SOURCE_IDENTIFIER2), masterRef), testKit.getRef()); - future.setException(new SchemaResolutionException("mock", new AskTimeoutException("timeout"))); + future.setException(new SchemaResolutionException("mock", new SourceIdentifier("foo"), + new AskTimeoutException("timeout"))); }).start(); return future; }).when(mockSchemaContextFactory).createEffectiveModelContext(anyCollection()); @@ -443,21 +446,21 @@ public class NetconfNodeActorTest extends AbstractBaseSchemasTest { final ProxyYangTextSourceProvider proxyYangProvider = new ProxyYangTextSourceProvider(masterRef, system.dispatcher(), TIMEOUT); - final YangTextSchemaSource yangTextSchemaSource = YangTextSchemaSource.delegateForCharSource(sourceIdentifier, - CharSource.wrap("YANG")); + final YangTextSource yangTextSchemaSource = new DelegatedYangTextSource(sourceIdentifier, + CharSource.wrap("YANG")); // Test success. - final SchemaSourceRegistration schemaSourceReg = masterSchemaRepository - .registerSchemaSource(id -> Futures.immediateFuture(yangTextSchemaSource), - PotentialSchemaSource.create(sourceIdentifier, YangTextSchemaSource.class, 1)); + final var schemaSourceReg = masterSchemaRepository.registerSchemaSource( + id -> Futures.immediateFuture(yangTextSchemaSource), + PotentialSchemaSource.create(sourceIdentifier, YangTextSource.class, 1)); final Future resolvedSchemaFuture = proxyYangProvider.getYangTextSchemaSource(sourceIdentifier); final YangTextSchemaSourceSerializationProxy success = Await.result(resolvedSchemaFuture, TIMEOUT.duration()); - assertEquals(sourceIdentifier, success.getRepresentation().getIdentifier()); + assertEquals(sourceIdentifier, success.getRepresentation().sourceId()); assertEquals("YANG", success.getRepresentation().read()); // Test missing source failure. diff --git a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManagerTest.java b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManagerTest.java index a13e81be80..92ac0b78de 100644 --- a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManagerTest.java +++ b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfNodeManagerTest.java @@ -83,14 +83,15 @@ 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.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; 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.ObjectRegistration; +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.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository; import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer; @@ -153,9 +154,9 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { SOURCE_IDENTIFIERS.stream().map( sourceId -> masterSchemaRepository.registerSchemaSource( - id -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(id, + id -> Futures.immediateFuture(new DelegatedYangTextSource(id, CharSource.wrap(yangTemplate.replaceAll("ID", id.name().getLocalName())))), - PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class, 1))) + PotentialSchemaSource.create(sourceId, YangTextSource.class, 1))) .collect(Collectors.toList()); NetconfTopologySetup masterSetup = NetconfTopologySetup.builder() @@ -199,8 +200,8 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { public void testSlaveMountPointRegistration() throws InterruptedException, ExecutionException, TimeoutException { initializeMaster(); - ListenerRegistration mockListenerReg = mock(ListenerRegistration.class); - doReturn(mockListenerReg).when(mockDataBroker).registerDataTreeChangeListener(any(), any()); + Registration mockListenerReg = mock(Registration.class); + doReturn(mockListenerReg).when(mockDataBroker).registerTreeChangeListener(any(), any()); final NodeId nodeId = new NodeId("device"); final NodeKey nodeKey = new NodeKey(nodeId); @@ -209,7 +210,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { nodeKey, topologyId); netconfNodeManager.registerDataTreeChangeListener(topologyId, nodeKey); - verify(mockDataBroker).registerDataTreeChangeListener(any(), eq(netconfNodeManager)); + verify(mockDataBroker).registerTreeChangeListener(any(), eq(netconfNodeManager)); // Invoke onDataTreeChanged with a NetconfNode WRITE to simulate the master writing the operational state to // Connected. Expect the slave mount point created and registered. @@ -218,12 +219,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { final Node node = new NodeBuilder().setNodeId(nodeId).addAugmentation(netconfNode).build(); DataObjectModification mockDataObjModification = mock(DataObjectModification.class); - doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).getIdentifier(); - doReturn(WRITE).when(mockDataObjModification).getModificationType(); - doReturn(node).when(mockDataObjModification).getDataAfter(); + doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).step(); + doReturn(WRITE).when(mockDataObjModification).modificationType(); + doReturn(node).when(mockDataObjModification).dataAfter(); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointBuilder, timeout(5000)).register(); @@ -234,10 +235,10 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { // Notify that the NetconfNode operational state was deleted. Expect the slave mount point closed. - doReturn(DELETE).when(mockDataObjModification).getModificationType(); + doReturn(DELETE).when(mockDataObjModification).modificationType(); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointReg, timeout(5000)).close(); @@ -246,12 +247,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { setupMountPointMocks(); - doReturn(WRITE).when(mockDataObjModification).getModificationType(); - doReturn(null).when(mockDataObjModification).getDataBefore(); - doReturn(node).when(mockDataObjModification).getDataAfter(); + doReturn(WRITE).when(mockDataObjModification).modificationType(); + doReturn(null).when(mockDataObjModification).dataBefore(); + doReturn(node).when(mockDataObjModification).dataAfter(); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointBuilder, timeout(5000)).register(); @@ -261,10 +262,10 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { setupMountPointMocks(); - doReturn(node).when(mockDataObjModification).getDataBefore(); + doReturn(node).when(mockDataObjModification).dataBefore(); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointReg, timeout(5000)).close(); @@ -282,12 +283,12 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { .build()) .build(); - doReturn(SUBTREE_MODIFIED).when(mockDataObjModification).getModificationType(); - doReturn(node).when(mockDataObjModification).getDataBefore(); - doReturn(updatedNode).when(mockDataObjModification).getDataAfter(); + doReturn(SUBTREE_MODIFIED).when(mockDataObjModification).modificationType(); + doReturn(node).when(mockDataObjModification).dataBefore(); + doReturn(updatedNode).when(mockDataObjModification).dataAfter(); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointReg, timeout(5000)).close(); @@ -310,14 +311,14 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { final Node node = new NodeBuilder().setNodeId(nodeId).addAugmentation(netconfNode).build(); DataObjectModification mockDataObjModification = mock(DataObjectModification.class); - doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).getIdentifier(); - doReturn(WRITE).when(mockDataObjModification).getModificationType(); - doReturn(node).when(mockDataObjModification).getDataAfter(); + doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).step(); + doReturn(WRITE).when(mockDataObjModification).modificationType(); + doReturn(node).when(mockDataObjModification).dataAfter(); // First try the registration where the perceived master hasn't been initialized as the master. netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); verify(mockMountPointBuilder, after(1000).never()).register(); @@ -332,7 +333,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { yangTextSchemaSourceRequestFuture); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); yangTextSchemaSourceRequestFuture.get(5, TimeUnit.SECONDS); @@ -348,7 +349,7 @@ public class NetconfNodeManagerTest extends AbstractBaseSchemasTest { askForMasterMountPointFuture); netconfNodeManager.onDataTreeChanged(List.of( - new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create( + new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.of( LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification))); askForMasterMountPointFuture.get(5, TimeUnit.SECONDS); diff --git a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java index 64a36ce299..9928f1dd8f 100644 --- a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java +++ b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java @@ -51,9 +51,8 @@ import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTest; import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMMountPointService; -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.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.api.ServiceGroupIdentifier; import org.opendaylight.netconf.client.NetconfClientFactory; import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory; import org.opendaylight.netconf.client.mdsal.impl.DefaultSchemaResourceManager; @@ -73,9 +72,9 @@ 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.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; 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.binding.KeyStep; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory; @@ -90,7 +89,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { @Mock private ClusterSingletonServiceProvider clusterSingletonServiceProvider; @Mock - private ListenerRegistration mockListenerReg; + private Registration mockListenerReg; @Mock private Registration mockRpcReg; @Mock @@ -133,7 +132,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { dataBroker = spy(dataBrokerTest.getDataBroker()); doNothing().when(mockListenerReg).close(); - doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any()); + doReturn(mockListenerReg).when(dataBroker).registerTreeChangeListener(any(), any()); doReturn(mockRpcReg).when(rpcProviderService).registerRpcImplementations(any()); netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, clusterSingletonServiceProvider, @@ -167,8 +166,8 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { // verify registration is called with right parameters - verify(dataBroker).registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, NetconfTopologyUtils + verify(dataBroker).registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, NetconfTopologyUtils .createTopologyListPath(TOPOLOGY_ID).child(Node.class)), netconfTopologyManager); netconfTopologyManager.close(); @@ -198,10 +197,10 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { final Node node1 = new NodeBuilder().setNodeId(nodeId1).addAugmentation(netconfNode1).build(); final DataObjectModification dataObjectModification1 = mock(DataObjectModification.class); - doReturn(WRITE).when(dataObjectModification1).getModificationType(); - doReturn(node1).when(dataObjectModification1).getDataAfter(); - doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId1))) - .when(dataObjectModification1).getIdentifier(); + doReturn(WRITE).when(dataObjectModification1).modificationType(); + doReturn(node1).when(dataObjectModification1).dataAfter(); + doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId1))) + .when(dataObjectModification1).step(); final NetconfNode netconfNode2 = new NetconfNodeBuilder() .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1")))) @@ -211,10 +210,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { final Node node2 = new NodeBuilder().setNodeId(nodeId2).addAugmentation(netconfNode2).build(); final DataObjectModification dataObjectModification2 = mock(DataObjectModification.class); - doReturn(WRITE).when(dataObjectModification2).getModificationType(); - doReturn(node2).when(dataObjectModification2).getDataAfter(); - doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId2))) - .when(dataObjectModification2).getIdentifier(); + doReturn(WRITE).when(dataObjectModification2).modificationType(); + doReturn(node2).when(dataObjectModification2).dataAfter(); + doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId2))).when(dataObjectModification2).step(); final NetconfTopologyContext mockContext1 = mock(NetconfTopologyContext.class); mockContextMap.put(nodeInstanceId1, setup -> { @@ -230,8 +228,8 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { return mockContext2; }); - ClusterSingletonServiceRegistration mockClusterRegistration1 = mock(ClusterSingletonServiceRegistration.class); - ClusterSingletonServiceRegistration mockClusterRegistration2 = mock(ClusterSingletonServiceRegistration.class); + final var mockClusterRegistration1 = mock(Registration.class); + final var mockClusterRegistration2 = mock(Registration.class); doReturn(mockClusterRegistration1).when(clusterSingletonServiceProvider) .registerClusterSingletonService(mockContext1); @@ -239,9 +237,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { .registerClusterSingletonService(mockContext2); netconfTopologyManager.onDataTreeChanged(List.of( - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId1), dataObjectModification1), - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId2), dataObjectModification2))); verify(clusterSingletonServiceProvider).registerClusterSingletonService(mockContext1); @@ -254,19 +252,19 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { .setPort(new PortNumber(Uint16.valueOf(33333))).build(); final Node updatedNode1 = new NodeBuilder().setNodeId(nodeId1).addAugmentation(updatedNetconfNode1).build(); - doReturn(WRITE).when(dataObjectModification1).getModificationType(); - doReturn(updatedNode1).when(dataObjectModification1).getDataAfter(); + doReturn(WRITE).when(dataObjectModification1).modificationType(); + doReturn(updatedNode1).when(dataObjectModification1).dataAfter(); - doReturn(SUBTREE_MODIFIED).when(dataObjectModification2).getModificationType(); - doReturn(node2).when(dataObjectModification2).getDataAfter(); + doReturn(SUBTREE_MODIFIED).when(dataObjectModification2).modificationType(); + doReturn(node2).when(dataObjectModification2).dataAfter(); doNothing().when(mockContext1).refresh(any()); doNothing().when(mockContext2).refresh(any()); netconfTopologyManager.onDataTreeChanged(List.of( - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId1), dataObjectModification1), - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId2), dataObjectModification2))); ArgumentCaptor mockContext1Setup = ArgumentCaptor.forClass(NetconfTopologySetup.class); @@ -278,10 +276,10 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { verifyNoMoreInteractions(clusterSingletonServiceProvider); // Notify of Node 1 deleted. - doReturn(DELETE).when(dataObjectModification1).getModificationType(); + doReturn(DELETE).when(dataObjectModification1).modificationType(); netconfTopologyManager.onDataTreeChanged(List.of( - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId1), dataObjectModification1))); verify(mockClusterRegistration1).close(); @@ -292,14 +290,13 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { reset(clusterSingletonServiceProvider); final NetconfTopologyContext newMockContext1 = mock(NetconfTopologyContext.class); - final ClusterSingletonServiceRegistration newMockClusterRegistration1 = - mock(ClusterSingletonServiceRegistration.class); + final var newMockClusterRegistration1 = mock(Registration.class); doThrow(new RuntimeException("mock error")).doReturn(newMockClusterRegistration1) .when(clusterSingletonServiceProvider).registerClusterSingletonService(newMockContext1); - doReturn(WRITE).when(dataObjectModification1).getModificationType(); - doReturn(node1).when(dataObjectModification1).getDataAfter(); + doReturn(WRITE).when(dataObjectModification1).modificationType(); + doReturn(node1).when(dataObjectModification1).dataAfter(); mockContextMap.put(nodeInstanceId1, setup -> { assertEquals(node1, setup.getNode()); @@ -308,7 +305,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { }); netconfTopologyManager.onDataTreeChanged(List.of( - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId1), dataObjectModification1))); verify(clusterSingletonServiceProvider, times(2)).registerClusterSingletonService(newMockContext1); @@ -345,10 +342,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { .build(); final DataObjectModification dataObjectModification = mock(DataObjectModification.class); - doReturn(WRITE).when(dataObjectModification).getModificationType(); - doReturn(node).when(dataObjectModification).getDataAfter(); - doReturn(InstanceIdentifier.IdentifiableItem.of(Node.class, new NodeKey(nodeId))) - .when(dataObjectModification).getIdentifier(); + doReturn(WRITE).when(dataObjectModification).modificationType(); + doReturn(node).when(dataObjectModification).dataAfter(); + doReturn(new KeyStep<>(Node.class, new NodeKey(nodeId))).when(dataObjectModification).step(); final NetconfTopologyContext mockContext = mock(NetconfTopologyContext.class); mockContextMap.put(nodeInstanceId, setup -> mockContext); @@ -357,7 +353,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest { .registerClusterSingletonService(mockContext); netconfTopologyManager.onDataTreeChanged(List.of( - new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, + new CustomTreeModification(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, nodeInstanceId), dataObjectModification))); verify(clusterSingletonServiceProvider, times(3)).registerClusterSingletonService(mockContext); diff --git a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBrokerTest.java b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBrokerTest.java index df2550d9af..afa2a7757f 100644 --- a/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBrokerTest.java +++ b/apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/ProxyDOMDataBrokerTest.java @@ -8,7 +8,7 @@ package org.opendaylight.netconf.topology.singleton.impl; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertThrows; import akka.actor.ActorSystem; import akka.actor.Status.Success; @@ -16,6 +16,7 @@ import akka.testkit.TestProbe; import akka.testkit.javadsl.TestKit; import akka.util.Timeout; import java.net.InetSocketAddress; +import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.AfterClass; import org.junit.Test; @@ -87,13 +88,13 @@ public class ProxyDOMDataBrokerTest { masterActor.expectMsgClass(ReadRequest.class); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testCreateTransactionChain() { - proxy.createTransactionChain(null); + assertThrows(UnsupportedOperationException.class, proxy::createTransactionChain); } @Test public void testGetSupportedExtensions() { - assertTrue(proxy.getExtensions().isEmpty()); + assertEquals(List.of(), proxy.supportedExtensions()); } } diff --git a/apps/netconf-topology/pom.xml b/apps/netconf-topology/pom.xml index f48a6394f9..af6c65ecfc 100644 --- a/apps/netconf-topology/pom.xml +++ b/apps/netconf-topology/pom.xml @@ -20,6 +20,10 @@ javax.inject true + + org.bouncycastle + bcpkix-jdk18on + org.opendaylight.aaa aaa-encrypt-service diff --git a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfClientConfigurationBuilderFactoryImpl.java b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfClientConfigurationBuilderFactoryImpl.java index ad5c935f44..1e9ef1e57f 100644 --- a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfClientConfigurationBuilderFactoryImpl.java +++ b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfClientConfigurationBuilderFactoryImpl.java @@ -13,6 +13,8 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import java.io.IOException; import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.Provider; import java.security.Security; @@ -119,8 +121,16 @@ public final class NetconfClientConfigurationBuilderFactoryImpl implements Netco } else if (credentials instanceof LoginPw loginPw) { final var loginPassword = loginPw.getLoginPassword(); final var username = loginPassword.getUsername(); - final var password = Base64.getEncoder().encodeToString(loginPassword.getPassword()); - sshParamsBuilder.setClientIdentity(loginPasswordIdentity(username, encryptionService.decrypt(password))); + + final byte[] plainBytes; + try { + plainBytes = encryptionService.decrypt(loginPassword.getPassword()); + } catch (GeneralSecurityException e) { + throw new IllegalStateException("Failed to decrypt password", e); + } + + sshParamsBuilder.setClientIdentity(loginPasswordIdentity(username, + new String(plainBytes, StandardCharsets.UTF_8))); } else if (credentials instanceof KeyAuth keyAuth) { final var keyBased = keyAuth.getKeyBased(); sshParamsBuilder.setClientIdentity(new ClientIdentityBuilder().setUsername(keyBased.getUsername()).build()); @@ -156,13 +166,24 @@ public final class NetconfClientConfigurationBuilderFactoryImpl implements Netco } final var passPhrase = Strings.isNullOrEmpty(dsKeypair.getPassphrase()) ? "" : dsKeypair.getPassphrase(); try { - return decodePrivateKey(encryptionService.decrypt(dsKeypair.getPrivateKey()), - encryptionService.decrypt(passPhrase)); + return decodePrivateKey(decryptString(dsKeypair.getPrivateKey()), decryptString(passPhrase)); } catch (IOException e) { throw new IllegalStateException("Could not decode private key with keyId=" + keyId, e); } } + private String decryptString(final String encrypted) { + final byte[] cryptobytes = Base64.getDecoder().decode(encrypted); + final byte[] clearbytes; + try { + clearbytes = encryptionService.decrypt(cryptobytes); + } catch (GeneralSecurityException e) { + throw new IllegalStateException("Failed to decrypt", e); + } + return new String(clearbytes, StandardCharsets.UTF_8); + } + + @VisibleForTesting static KeyPair decodePrivateKey(final String privateKey, final String passphrase) throws IOException { try (var keyReader = new PEMParser(new StringReader(privateKey.replace("\\n", "\n")))) { diff --git a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapter.java b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapter.java index 771ef72f00..9a10add288 100644 --- a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapter.java +++ b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapter.java @@ -17,9 +17,7 @@ import com.google.common.util.concurrent.SettableFuture; 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.WriteTransaction; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -48,7 +46,7 @@ import org.opendaylight.yangtools.yang.common.Uint16; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class NetconfDeviceTopologyAdapter implements TransactionChainListener { +public final class NetconfDeviceTopologyAdapter implements FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceTopologyAdapter.class); private final @NonNull KeyedInstanceIdentifier topologyPath; @@ -65,7 +63,8 @@ public final class NetconfDeviceTopologyAdapter implements TransactionChainListe this.dataBroker = requireNonNull(dataBroker); this.topologyPath = requireNonNull(topologyPath); this.id = requireNonNull(id); - txChain = dataBroker.createMergingTransactionChain(this); + txChain = dataBroker.createMergingTransactionChain(); + txChain.addCallback(this); final var tx = txChain.newWriteOnlyTransaction(); LOG.trace("{}: Init device state transaction {} putting if absent operational data started.", id, @@ -186,25 +185,25 @@ public final class NetconfDeviceTopologyAdapter implements TransactionChainListe } @Override - public synchronized void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, - final Throwable cause) { - LOG.warn("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause); + public synchronized void onFailure(final Throwable cause) { + LOG.warn("{}: transaction chain FAILED!", id, cause); if (closeFuture != null) { closeFuture.setException(cause); return; } // FIXME: move this up once we have MDSAL-838 fixed - chain.close(); + txChain.close(); - txChain = dataBroker.createMergingTransactionChain(this); + txChain = dataBroker.createMergingTransactionChain(); LOG.info("{}: TransactionChain reset to {}", id, txChain); + txChain.addCallback(this); // FIXME: restart last update } @Override - public synchronized void onTransactionChainSuccessful(final TransactionChain chain) { - LOG.trace("{}: TransactionChain({}) SUCCESSFUL", id, chain); + public synchronized void onSuccess(final Empty result) { + LOG.trace("{}: transaction chain SUCCESSFUL", id); closeFuture.set(Empty.value()); } diff --git a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeHandler.java b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeHandler.java index 9084c4a158..d3962ac22d 100644 --- a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeHandler.java +++ b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeHandler.java @@ -49,9 +49,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yangtools.concepts.AbstractRegistration; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,7 +106,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeHandler.class); - private final @NonNull List> yanglibRegistrations; + private final @NonNull List yanglibRegistrations; private final @NonNull NetconfClientFactory clientFactory; private final @NonNull NetconfClientConfiguration clientConfig; private final @NonNull NetconfDeviceCommunicator communicator; @@ -259,7 +259,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re communicator.close(); delegate.close(); - yanglibRegistrations.forEach(SchemaSourceRegistration::close); + yanglibRegistrations.forEach(Registration::close); } @Override @@ -337,13 +337,13 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re } } - private static List> registerDeviceSchemaSources(final RemoteDeviceId remoteDeviceId, + private static List registerDeviceSchemaSources(final RemoteDeviceId remoteDeviceId, final NetconfNode node, final SchemaResourcesDTO resources) { final var yangLibrary = node.getYangLibrary(); if (yangLibrary != null) { final Uri uri = yangLibrary.getYangLibraryUrl(); if (uri != null) { - final var registrations = new ArrayList>(); + final var registrations = new ArrayList(); final var yangLibURL = uri.getValue(); final var schemaRegistry = resources.getSchemaRegistry(); @@ -357,7 +357,7 @@ public final class NetconfNodeHandler extends AbstractRegistration implements Re for (var entry : schemas.getAvailableModels().entrySet()) { registrations.add(schemaRegistry.registerSchemaSource(new LibrarySchemaSourceProvider( remoteDeviceId, schemas.getAvailableModels()), - PotentialSchemaSource.create(entry.getKey(), YangTextSchemaSource.class, + PotentialSchemaSource.create(entry.getKey(), YangTextSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue()))); } return List.copyOf(registrations); diff --git a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProvider.java b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProvider.java index 75458b19eb..a750dd115d 100644 --- a/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProvider.java +++ b/apps/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProvider.java @@ -15,7 +15,8 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; -import java.util.Base64; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.aaa.encrypt.AAAEncryptionService; import org.opendaylight.mdsal.binding.api.DataBroker; @@ -119,7 +120,6 @@ public final class NetconfTopologyRPCProvider implements AutoCloseable { final SettableFuture> rpcFuture = SettableFuture.create(); wtx.commit().addCallback(new FutureCallback() { - @Override public void onSuccess(final CommitInfo result) { LOG.info("delete-device RPC: Removed netconf node successfully."); @@ -147,10 +147,18 @@ public final class NetconfTopologyRPCProvider implements AutoCloseable { private Credentials translate(final RpcCredentials credentialsRpc) { if (credentialsRpc instanceof LoginPw loginPw) { final var loginPassword = loginPw.getLoginPassword(); + final byte[] cipherBytes; + + try { + cipherBytes = encryptionService.encrypt(loginPassword.getPassword().getBytes(StandardCharsets.UTF_8)); + } catch (GeneralSecurityException e) { + throw new IllegalArgumentException("Failed to encrypt password", e); + } + return new LoginPwBuilder() .setLoginPassword(new LoginPasswordBuilder() .setUsername(loginPassword.getUsername()) - .setPassword(Base64.getDecoder().decode(encryptionService.encrypt(loginPassword.getPassword()))) + .setPassword(cipherBytes) .build()) .build(); } else if (credentialsRpc instanceof LoginPwUnencrypted loginPwUnencrypted) { diff --git a/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapterTest.java b/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapterTest.java index 2b00def167..08b604e248 100644 --- a/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapterTest.java +++ b/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfDeviceTopologyAdapterTest.java @@ -17,6 +17,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import java.net.InetSocketAddress; import java.util.concurrent.ExecutionException; @@ -29,7 +30,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.api.DataBroker; 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; @@ -61,7 +61,7 @@ public class NetconfDeviceTopologyAdapterTest { @Mock private WriteTransaction mockTx; @Captor - private ArgumentCaptor listeners; + private ArgumentCaptor> listeners; private NetconfDeviceTopologyAdapter adapter; @@ -74,7 +74,8 @@ public class NetconfDeviceTopologyAdapterTest { doReturn("test transaction").when(mockTx).getIdentifier(); doReturn(CommitInfo.emptyFluentFuture()).when(mockTx).commit(); - doReturn(mockChain).when(mockBroker).createMergingTransactionChain(listeners.capture()); + doReturn(mockChain).when(mockBroker).createMergingTransactionChain(); + doNothing().when(mockChain).addCallback(listeners.capture()); adapter = new NetconfDeviceTopologyAdapter(mockBroker, TEST_TOPOLOGY_ID, id); } @@ -82,8 +83,8 @@ public class NetconfDeviceTopologyAdapterTest { public void replaceChainIfFailed() { doNothing().when(mockChain).close(); doReturn("mockChain").when(mockChain).toString(); - adapter.onTransactionChainFailed(mockChain, mockTx, new Exception("chain failed")); - verify(mockBroker, times(2)).createMergingTransactionChain(any()); + adapter.onFailure(new Exception("chain failed")); + verify(mockBroker, times(2)).createMergingTransactionChain(); } @Test @@ -131,7 +132,7 @@ public class NetconfDeviceTopologyAdapterTest { assertSame(future, adapter.shutdown()); // future completes - listeners.getValue().onTransactionChainSuccessful(mockChain); + listeners.getValue().onSuccess(Empty.value()); assertSame(Empty.value(), Futures.getDone(future)); } @@ -155,7 +156,7 @@ public class NetconfDeviceTopologyAdapterTest { // future completes final var cause = new Throwable(); - listeners.getValue().onTransactionChainFailed(mockChain, mockTx, cause); + listeners.getValue().onFailure(cause); final var ex = assertThrows(ExecutionException.class, () -> Futures.getDone(future)); assertSame(cause, ex.getCause()); } diff --git a/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProviderTest.java b/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProviderTest.java index 7931b653e8..de7db95e4c 100644 --- a/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProviderTest.java +++ b/apps/netconf-topology/src/test/java/org/opendaylight/netconf/topology/spi/NetconfTopologyRPCProviderTest.java @@ -7,12 +7,13 @@ */ package org.opendaylight.netconf.topology.spi; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; -import java.util.Base64; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -59,22 +60,18 @@ public class NetconfTopologyRPCProviderTest { private NetconfTopologyRPCProvider rpcProvider; @Before - public void setUp() { - doReturn(ENC_PWD).when(encryptionService).encrypt(TEST_PWD); + public void setUp() throws Exception { + doReturn(ENC_PWD.getBytes()).when(encryptionService).encrypt(TEST_PWD.getBytes()); doReturn(rpcReg).when(rpcProviderService).registerRpcImplementations(any()); rpcProvider = new NetconfTopologyRPCProvider(rpcProviderService, dataBroker, encryptionService, TOPOLOGY_ID); } @Test public void testEncryptPassword() { + final var encryptedPwNode = rpcProvider.encryptPassword(getInput(true)); + final var loginPw = assertInstanceOf(LoginPw.class, encryptedPwNode.getCredentials()); - final NetconfNode encryptedPwNode = rpcProvider.encryptPassword(getInput(true)); - - final Credentials credentials = encryptedPwNode.getCredentials(); - assertTrue(credentials instanceof LoginPw); - final LoginPw loginPw = (LoginPw) credentials; - - assertEquals(ENC_PWD, Base64.getEncoder().encodeToString(loginPw.getLoginPassword().getPassword())); + assertArrayEquals(ENC_PWD.getBytes(), loginPw.getLoginPassword().getPassword()); } @Test diff --git a/apps/yanglib-mdsal-writer/src/main/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriter.java b/apps/yanglib-mdsal-writer/src/main/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriter.java index 773e0371f6..0436dca8f6 100644 --- a/apps/yanglib-mdsal-writer/src/main/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriter.java +++ b/apps/yanglib-mdsal-writer/src/main/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriter.java @@ -9,6 +9,7 @@ package org.opendaylight.netconf.yanglib.writer; import static java.util.Objects.requireNonNull; +import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.ExecutionException; @@ -26,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -43,10 +43,9 @@ import org.slf4j.LoggerFactory; * state to operational data store. */ @Singleton -@Component(immediate = true, configurationPid = "org.opendaylight.netconf.yanglib") +@Component(service = { }, configurationPid = "org.opendaylight.netconf.yanglib") @Designate(ocd = YangLibraryWriter.Configuration.class) -public final class YangLibraryWriter implements EffectiveModelContextListener, AutoCloseable { - +public final class YangLibraryWriter implements AutoCloseable { @ObjectClassDefinition public @interface Configuration { @AttributeDefinition(description = "Enables legacy content to be written") @@ -72,10 +71,10 @@ public final class YangLibraryWriter implements EffectiveModelContextListener, A @Inject @Activate public YangLibraryWriter(final @Reference DOMSchemaService schemaService, - final @Reference DataBroker dataBroker, final Configuration configuration) { + final @Reference DataBroker dataBroker, final Configuration configuration) { this.dataBroker = requireNonNull(dataBroker); - this.writeLegacy = configuration.write$_$legacy(); - reg = schemaService.registerSchemaContextListener(this); + writeLegacy = configuration.write$_$legacy(); + reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated); } @Deactivate @@ -114,8 +113,7 @@ public final class YangLibraryWriter implements EffectiveModelContextListener, A future.get(); } - @Override - public void onModelContextUpdated(final EffectiveModelContext context) { + @VisibleForTesting void onModelContextUpdated(final EffectiveModelContext context) { if (context.findModule(YangLibrary.QNAME.getModule()).isPresent()) { updateYangLibrary(context); } else { diff --git a/apps/yanglib-mdsal-writer/src/test/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriterTest.java b/apps/yanglib-mdsal-writer/src/test/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriterTest.java index 2e4112fccf..e1b013439e 100644 --- a/apps/yanglib-mdsal-writer/src/test/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriterTest.java +++ b/apps/yanglib-mdsal-writer/src/test/java/org/opendaylight/netconf/yanglib/writer/YangLibraryWriterTest.java @@ -57,10 +57,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSetBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.SchemaBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier; -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.model.api.EffectiveModelContextListener; @ExtendWith(MockitoExtension.class) class YangLibraryWriterTest { @@ -82,7 +81,7 @@ class YangLibraryWriterTest { @Mock private WriteTransaction writeTransaction; @Mock - private ListenerRegistration registration; + private Registration registration; @Mock private YangLibraryWriter.Configuration config; @Captor diff --git a/features/odl-aaa-netconf-plugin/src/main/feature/feature.xml b/features/odl-aaa-netconf-plugin/src/main/feature/feature.xml index 3b0f8a4b59..c766ecba36 100644 --- a/features/odl-aaa-netconf-plugin/src/main/feature/feature.xml +++ b/features/odl-aaa-netconf-plugin/src/main/feature/feature.xml @@ -7,6 +7,6 @@ --> - odl-aaa-shiro + odl-aaa-shiro diff --git a/features/odl-netconf-api/src/main/feature/feature.xml b/features/odl-netconf-api/src/main/feature/feature.xml index 496c9002d7..1ce22d9279 100644 --- a/features/odl-netconf-api/src/main/feature/feature.xml +++ b/features/odl-netconf-api/src/main/feature/feature.xml @@ -9,6 +9,6 @@ odl-netty-4 - odl-mdsal-model-rfc8525 + odl-mdsal-model-rfc8525 diff --git a/features/odl-netconf-connector/src/main/feature/feature.xml b/features/odl-netconf-connector/src/main/feature/feature.xml index 25836d6db5..4f64bcae5b 100644 --- a/features/odl-netconf-connector/src/main/feature/feature.xml +++ b/features/odl-netconf-connector/src/main/feature/feature.xml @@ -8,8 +8,8 @@ --> - odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal - odl-mdsal-broker - odl-aaa-encryption-service + odl-mdsal-model-draft-clemm-netmod-yang-network-topo-01-minimal + odl-mdsal-broker + odl-aaa-encryption-service diff --git a/features/odl-netconf-model-rfc5277/src/main/feature/feature.xml b/features/odl-netconf-model-rfc5277/src/main/feature/feature.xml index 3bf3acf699..c19cb30ae7 100644 --- a/features/odl-netconf-model-rfc5277/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc5277/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc6991 diff --git a/features/odl-netconf-model-rfc6022/src/main/feature/feature.xml b/features/odl-netconf-model-rfc6022/src/main/feature/feature.xml index d1e0bad692..0bbe4b9aa9 100644 --- a/features/odl-netconf-model-rfc6022/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc6022/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc6991 diff --git a/features/odl-netconf-model-rfc6241/src/main/feature/feature.xml b/features/odl-netconf-model-rfc6241/src/main/feature/feature.xml index 6af212fd2d..fe136e1c1a 100644 --- a/features/odl-netconf-model-rfc6241/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc6241/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc6991 diff --git a/features/odl-netconf-model-rfc8040/src/main/feature/feature.xml b/features/odl-netconf-model-rfc8040/src/main/feature/feature.xml index d083b39d46..5fb7da631a 100644 --- a/features/odl-netconf-model-rfc8040/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc8040/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc6991 diff --git a/features/odl-netconf-model-rfc8341/src/main/feature/feature.xml b/features/odl-netconf-model-rfc8341/src/main/feature/feature.xml index 37e0626c9f..4e002ee1fb 100644 --- a/features/odl-netconf-model-rfc8341/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc8341/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc6991 + odl-mdsal-model-rfc6991 diff --git a/features/odl-netconf-model-rfc8526/src/main/feature/feature.xml b/features/odl-netconf-model-rfc8526/src/main/feature/feature.xml index 4dd9b2915a..cf4571675f 100644 --- a/features/odl-netconf-model-rfc8526/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc8526/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc8342 + odl-mdsal-model-rfc8342 diff --git a/features/odl-netconf-model-rfc8639/src/main/feature/feature.xml b/features/odl-netconf-model-rfc8639/src/main/feature/feature.xml index 9fdffe4621..8192bac86c 100644 --- a/features/odl-netconf-model-rfc8639/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc8639/src/main/feature/feature.xml @@ -8,9 +8,9 @@ --> - odl-mdsal-model-rfc8040 - odl-mdsal-model-rfc8343 - odl-mdsal-model-rfc8528 - odl-mdsal-model-rfc8529 + odl-mdsal-model-rfc8040 + odl-mdsal-model-rfc8343 + odl-mdsal-model-rfc8528 + odl-mdsal-model-rfc8529 diff --git a/features/odl-netconf-model-rfc8641/src/main/feature/feature.xml b/features/odl-netconf-model-rfc8641/src/main/feature/feature.xml index 3fc1d58273..2844cc49a5 100644 --- a/features/odl-netconf-model-rfc8641/src/main/feature/feature.xml +++ b/features/odl-netconf-model-rfc8641/src/main/feature/feature.xml @@ -8,7 +8,7 @@ --> - odl-mdsal-model-rfc8072 - odl-mdsal-model-rfc8342 + odl-mdsal-model-rfc8072 + odl-mdsal-model-rfc8342 diff --git a/features/odl-netconf-transport-api/src/main/feature/feature.xml b/features/odl-netconf-transport-api/src/main/feature/feature.xml index aa63f407ce..895b663d6e 100644 --- a/features/odl-netconf-transport-api/src/main/feature/feature.xml +++ b/features/odl-netconf-transport-api/src/main/feature/feature.xml @@ -9,6 +9,6 @@ odl-netty-4 - odl-yangtools-common + odl-yangtools-common diff --git a/features/odl-netconf-util/src/main/feature/feature.xml b/features/odl-netconf-util/src/main/feature/feature.xml index bb732998b7..0bcc93f8b3 100644 --- a/features/odl-netconf-util/src/main/feature/feature.xml +++ b/features/odl-netconf-util/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-yangtools-codec + odl-yangtools-codec diff --git a/features/odl-restconf-common/src/main/feature/feature.xml b/features/odl-restconf-common/src/main/feature/feature.xml index 3400499527..4b078b5a09 100644 --- a/features/odl-restconf-common/src/main/feature/feature.xml +++ b/features/odl-restconf-common/src/main/feature/feature.xml @@ -9,11 +9,11 @@ odl-karaf-feat-jetty - odl-yangtools-export - odl-mdsal-model-rfc8040 - odl-mdsal-model-rfc8072 - odl-mdsal-model-rfc8525 - odl-mdsal-broker - odl-aaa-shiro + odl-yangtools-export + odl-mdsal-model-rfc8040 + odl-mdsal-model-rfc8072 + odl-mdsal-model-rfc8525 + odl-mdsal-broker + odl-aaa-shiro diff --git a/features/odl-restconf-nb/src/main/feature/feature.xml b/features/odl-restconf-nb/src/main/feature/feature.xml index 622ce6a682..a5b97e76dc 100644 --- a/features/odl-restconf-nb/src/main/feature/feature.xml +++ b/features/odl-restconf-nb/src/main/feature/feature.xml @@ -8,6 +8,6 @@ --> - odl-mdsal-model-rfc8072 + odl-mdsal-model-rfc8072 diff --git a/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml b/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml index 49a66f7f07..36bd7f2ba0 100644 --- a/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml +++ b/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml @@ -8,7 +8,7 @@ --> - odl-mdsal-model-rfc8525 - odl-mdsal-broker + odl-mdsal-model-rfc8525 + odl-mdsal-broker diff --git a/features/odl-yanglib/src/main/feature/feature.xml b/features/odl-yanglib/src/main/feature/feature.xml index 5f8a7c2798..74b1f561bf 100644 --- a/features/odl-yanglib/src/main/feature/feature.xml +++ b/features/odl-yanglib/src/main/feature/feature.xml @@ -9,6 +9,6 @@ odl-karaf-feat-jetty - odl-mdsal-model-rfc8525 + odl-mdsal-model-rfc8525 diff --git a/karaf/pom.xml b/karaf/pom.xml index d7c6c8a71b..6b73eb4965 100644 --- a/karaf/pom.xml +++ b/karaf/pom.xml @@ -31,7 +31,7 @@ org.opendaylight.controller controller-artifacts - 8.0.4 + 9.0.0 pom import diff --git a/netconf/tools/netconf-test-perf/src/main/java/org/opendaylight/netconf/test/perf/MountedDeviceListener.java b/netconf/tools/netconf-test-perf/src/main/java/org/opendaylight/netconf/test/perf/MountedDeviceListener.java index 01e5e503d8..d25c4cba36 100644 --- a/netconf/tools/netconf-test-perf/src/main/java/org/opendaylight/netconf/test/perf/MountedDeviceListener.java +++ b/netconf/tools/netconf-test-perf/src/main/java/org/opendaylight/netconf/test/perf/MountedDeviceListener.java @@ -13,7 +13,6 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.annotation.PreDestroy; @@ -33,7 +32,7 @@ import org.opendaylight.yang.gen.v1.org.opendaylight.coretutorials.ncmount.examp import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +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.api.schema.ContainerNode; @@ -54,10 +53,10 @@ public final class MountedDeviceListener implements DOMMountPointListener { private static final QName CREATE_SUBSCRIPTION_QNAME = QName.create(CreateSubscriptionInput.QNAME, "create-subscription"); - private final ConcurrentMap> listeners = new ConcurrentHashMap<>(); + private final ConcurrentMap listeners = new ConcurrentHashMap<>(); private final DOMMountPointService mountPointService; private final BindingNormalizedNodeSerializer serializer; - private final ListenerRegistration reg; + private final Registration reg; @Inject @Activate @@ -72,7 +71,7 @@ public final class MountedDeviceListener implements DOMMountPointListener { @Deactivate public void stop() { reg.close(); - final Iterator> it = listeners.values().iterator(); + final var it = listeners.values().iterator(); while (it.hasNext()) { it.next().close(); it.remove(); @@ -91,7 +90,7 @@ public final class MountedDeviceListener implements DOMMountPointListener { @Override public void onMountPointRemoved(final YangInstanceIdentifier path) { - final ListenerRegistration listener = listeners.remove(path); + final var listener = listeners.remove(path); if (listener != null) { listener.close(); } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java index f8cc723b90..81d396a37a 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java @@ -16,10 +16,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import java.util.function.Consumer; 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.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker; import org.opendaylight.mdsal.dom.spi.store.DOMStore; import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStoreFactory; @@ -43,8 +45,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.Yang; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema; -import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.util.concurrent.SpecialExecutors; import org.opendaylight.yangtools.yang.common.QName; @@ -60,9 +60,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBui import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,12 +68,12 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { private final Set caps; private final EffectiveModelContext schemaContext; - private final SchemaSourceProvider sourceProvider; + private final YangTextSourceExtension sourceProvider; MdsalOperationProvider(final SessionIdProvider idProvider, final Set caps, final EffectiveModelContext schemaContext, - final SchemaSourceProvider sourceProvider) { + final YangTextSourceExtension sourceProvider) { this.caps = caps; this.schemaContext = schemaContext; this.sourceProvider = sourceProvider; @@ -104,11 +101,10 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { private final Set caps; private final DOMSchemaService schemaService; private final DOMDataBroker dataBroker; - private final SchemaSourceProvider sourceProvider; + private final YangTextSourceExtension sourceProvider; MdsalOperationService(final SessionIdType currentSessionId, final EffectiveModelContext schemaContext, - final Set caps, - final SchemaSourceProvider sourceProvider) { + final Set caps, final YangTextSourceExtension sourceProvider) { this.currentSessionId = requireNonNull(currentSessionId); this.schemaContext = schemaContext; this.caps = caps; @@ -116,7 +112,6 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { schemaService = createSchemaService(); dataBroker = createDataStore(schemaService, currentSessionId); - } @Override @@ -219,14 +214,10 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { } @Override - public ListenerRegistration registerSchemaContextListener( - final EffectiveModelContextListener listener) { - listener.onModelContextUpdated(getGlobalContext()); - return new AbstractListenerRegistration<>(listener) { - @Override - protected void removeRegistration() { - // No-op - } + public Registration registerSchemaContextListener(final Consumer listener) { + listener.accept(getGlobalContext()); + return () -> { + // No-op }; } }; diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java index 1e2a200293..80af56ea9f 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.stream.IntStream; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.TransportConstants; import org.opendaylight.netconf.common.impl.DefaultNetconfTimer; @@ -62,13 +63,13 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleLike; import org.opendaylight.yangtools.yang.model.api.Submodule; -import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceListener; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; +import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource; import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository; import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer; import org.slf4j.Logger; @@ -93,7 +94,7 @@ public class NetconfDeviceSimulator implements Closeable { } private ServerTransportInitializer createTransportInitializer(final Set capabilities, - final SchemaSourceProvider sourceProvider) { + final YangTextSourceExtension sourceProvider) { final var transformedCapabilities = new HashSet<>(Collections2.transform(capabilities, input -> { if (sendFakeSchema) { sendFakeSchema = false; @@ -115,7 +116,7 @@ public class NetconfDeviceSimulator implements Closeable { } private NetconfOperationServiceFactory createOperationServiceFactory( - final SchemaSourceProvider sourceProvider, + final YangTextSourceExtension sourceProvider, final Set transformedCapabilities, final NetconfMonitoringService monitoringService1, final SessionIdProvider idProvider) { final AggregatedNetconfOperationServiceFactory aggregatedNetconfOperationServiceFactory = @@ -166,7 +167,7 @@ public class NetconfDeviceSimulator implements Closeable { final var schemaRepo = new SharedSchemaRepository("netconf-simulator"); final var capabilities = parseSchemasToModuleCapabilities(schemaRepo); final var transportInitializer = createTransportInitializer(capabilities, - sourceIdentifier -> schemaRepo.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class)); + sourceIdentifier -> schemaRepo.getSchemaSource(sourceIdentifier, YangTextSource.class)); final var ipAddress = getIpAddress(configuration); final var startingPort = getStartingPort(configuration); @@ -232,7 +233,7 @@ public class NetconfDeviceSimulator implements Closeable { consumer.registerSchemaSourceListener(TextToIRTransformer.create(consumer, consumer)); consumer.registerSchemaSourceListener(new SchemaSourceListener() { @Override - public void schemaSourceEncountered(final SchemaSourceRepresentation schemaSourceRepresentation) { + public void schemaSourceEncountered(final SourceRepresentation schemaSourceRepresentation) { } @@ -251,13 +252,13 @@ public class NetconfDeviceSimulator implements Closeable { if (configuration.getSchemasDir() != null) { LOG.info("Loading models from directory."); - final FilesystemSchemaSourceCache cache = new FilesystemSchemaSourceCache<>( - consumer, YangTextSchemaSource.class, configuration.getSchemasDir()); + final FilesystemSchemaSourceCache cache = new FilesystemSchemaSourceCache<>( + consumer, YangTextSource.class, configuration.getSchemasDir()); consumer.registerSchemaSourceListener(cache); } else if (configuration.getModels() != null) { LOG.info("Loading models from classpath."); - final SchemaSourceCache cache = new SchemaSourceCache<>( - consumer, YangTextSchemaSource.class, configuration.getModels()); + final SchemaSourceCache cache = new SchemaSourceCache<>( + consumer, YangTextSource.class, configuration.getModels()); consumer.registerSchemaSourceListener(cache); } else { LOG.info("Custom module loading skipped."); @@ -296,7 +297,7 @@ public class NetconfDeviceSimulator implements Closeable { final String moduleContent; try { - moduleContent = consumer.getSchemaSource(sourceId, YangTextSchemaSource.class).get().read(); + moduleContent = consumer.getSchemaSource(sourceId, YangTextSource.class).get().read(); } catch (ExecutionException | InterruptedException | IOException e) { throw new IllegalStateException( "Cannot retrieve schema source for module " + sourceId + " from schema repository", e); @@ -308,8 +309,8 @@ public class NetconfDeviceSimulator implements Closeable { private static void registerSource(final SharedSchemaRepository consumer, final String resource, final SourceIdentifier sourceId) { consumer.registerSchemaSource(sourceIdentifier -> Futures.immediateFuture( - YangTextSchemaSource.forResource(NetconfDeviceSimulator.class, resource)), - PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class, + new URLYangTextSource(NetconfDeviceSimulator.class.getResource(resource))), + PotentialSchemaSource.create(sourceId, YangTextSource.class, PotentialSchemaSource.Costs.IMMEDIATE.getValue())); } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/PayloadCreator.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/PayloadCreator.java index 70e3744366..65087d74d5 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/PayloadCreator.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/PayloadCreator.java @@ -14,11 +14,11 @@ import java.util.List; import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.Credentials; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.login.pw.unencrypted.LoginPasswordUnencrypted; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.$YangModuleInfoImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeFields; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.svc.v1.urn.opendaylight.netconf.node.topology.rev231121.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; @@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory; final class PayloadCreator { private static final Logger LOG = LoggerFactory.getLogger(PayloadCreator.class); private static final EffectiveModelContext NETWORK_TOPOLOGY_SCHEMA_CONTEXT = - BindingRuntimeHelpers.createEffectiveModel(List.of($YangModuleInfoImpl.getInstance())); + BindingRuntimeHelpers.createEffectiveModel(List.of(YangModuleInfoImpl.getInstance())); private static final JSONCodecFactory NETWORK_TOPOLOGY_JSON_CODEC_FACTORY = JSONCodecFactorySupplier.RFC7951.getShared(NETWORK_TOPOLOGY_SCHEMA_CONTEXT); diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/schemacache/SchemaSourceCache.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/schemacache/SchemaSourceCache.java index f475872e34..8ddc2ddcbc 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/schemacache/SchemaSourceCache.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/schemacache/SchemaSourceCache.java @@ -17,21 +17,20 @@ import java.util.stream.Collectors; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; -import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.AbstractSchemaSourceCache; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Costs; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Cache implementation that stores schemas in form of files under provided folder. */ -public final class SchemaSourceCache extends AbstractSchemaSourceCache { - +public final class SchemaSourceCache extends AbstractSchemaSourceCache { private static final Logger LOG = LoggerFactory.getLogger(SchemaSourceCache.class); private final Class representation; @@ -98,17 +97,17 @@ public final class SchemaSourceCache exten public synchronized ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { final YangModuleInfo yangModuleInfo = cachedSchemas.get(sourceIdentifier); if (yangModuleInfo != null) { - final YangTextSchemaSource yangTextSchemaSource = YangTextSchemaSource.delegateForCharSource( - sourceIdentifier, yangModuleInfo.getYangTextCharSource()); + final var yangTextSchemaSource = new DelegatedYangTextSource(sourceIdentifier, + yangModuleInfo.getYangTextCharSource()); return Futures.immediateFuture(representation.cast(yangTextSchemaSource)); } LOG.debug("Source {} not found in cache", sourceIdentifier); - return Futures.immediateFailedFuture(new MissingSchemaSourceException("Source not found", sourceIdentifier)); + return Futures.immediateFailedFuture(new MissingSchemaSourceException(sourceIdentifier, "Source not found")); } @Override protected synchronized void offer(final T source) { - LOG.trace("Source {} offered to cache", source.getIdentifier()); + LOG.trace("Source {} offered to cache", source.sourceId()); } } diff --git a/netconf/yanglib/src/main/java/org/opendaylight/yanglib/impl/YangLibProvider.java b/netconf/yanglib/src/main/java/org/opendaylight/yanglib/impl/YangLibProvider.java index c7b29d4b62..cb8c0f4ddd 100644 --- a/netconf/yanglib/src/main/java/org/opendaylight/yanglib/impl/YangLibProvider.java +++ b/netconf/yanglib/src/main/java/org/opendaylight/yanglib/impl/YangLibProvider.java @@ -39,15 +39,15 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.ModuleKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier; import org.opendaylight.yanglib.api.YangLibService; +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.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; -import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaListenerRegistration; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceListener; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository; @@ -91,14 +91,13 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen private static final Logger LOG = LoggerFactory.getLogger(YangLibProvider.class); private static final Predicate> YANG_SCHEMA_SOURCE = - input -> YangTextSchemaSource.class.isAssignableFrom(input.getRepresentation()); + input -> YangTextSource.class.isAssignableFrom(input.getRepresentation()); private final DataBroker dataBroker; private final String bindingAddress; private final Uint32 bindingPort; private final SharedSchemaRepository schemaRepository; - - private final SchemaListenerRegistration schemaListenerRegistration; + private final Registration schemaListenerRegistration; @Inject @Activate @@ -126,8 +125,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen checkArgument(cacheFolderFile.isDirectory(), "cache-folder %s is not a directory", cacheFolderFile); schemaRepository = new SharedSchemaRepository("yang-library", parserFactory); - final var cache = new FilesystemSchemaSourceCache<>(schemaRepository, YangTextSchemaSource.class, - cacheFolderFile); + final var cache = new FilesystemSchemaSourceCache<>(schemaRepository, YangTextSource.class, cacheFolderFile); schemaRepository.registerSchemaSourceListener(cache); schemaListenerRegistration = schemaRepository.registerSchemaSourceListener(this); @@ -143,7 +141,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen } @Override - public void schemaSourceEncountered(final SchemaSourceRepresentation source) { + public void schemaSourceEncountered(final SourceRepresentation source) { // NOOP } @@ -226,7 +224,7 @@ public final class YangLibProvider implements YangLibService, SchemaSourceListen private String getYangModel(final String name, final String revision) { final var sourceId = new SourceIdentifier(name, revision); - final var yangTextSchemaFuture = schemaRepository.getSchemaSource(sourceId, YangTextSchemaSource.class); + final var yangTextSchemaFuture = schemaRepository.getSchemaSource(sourceId, YangTextSource.class); try { final var yangTextSchemaSource = yangTextSchemaFuture.get(); return yangTextSchemaSource.read(); diff --git a/netconf/yanglib/src/test/java/org/opendaylight/yanglib/impl/YangLibProviderTest.java b/netconf/yanglib/src/test/java/org/opendaylight/yanglib/impl/YangLibProviderTest.java index 3dd93cc318..4f0cc40c42 100644 --- a/netconf/yanglib/src/test/java/org/opendaylight/yanglib/impl/YangLibProviderTest.java +++ b/netconf/yanglib/src/test/java/org/opendaylight/yanglib/impl/YangLibProviderTest.java @@ -38,12 +38,12 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types. import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.util.BindingMap; import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangIRSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.api.YinSchemaSourceRepresentation; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; +import org.opendaylight.yangtools.yang.model.api.source.YinSourceRepresentation; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Costs; +import org.opendaylight.yangtools.yang.model.spi.source.YangIRSource; import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory; @RunWith(MockitoJUnitRunner.StrictStubs.class) @@ -101,9 +101,9 @@ public class YangLibProviderTest { // test list of non yang schema sources registered yangLibProvider.schemaSourceRegistered(List.of( PotentialSchemaSource.create(new SourceIdentifier("yin-source-representation"), - YinSchemaSourceRepresentation.class, Costs.IMMEDIATE.getValue()), + YinSourceRepresentation.class, Costs.IMMEDIATE.getValue()), PotentialSchemaSource.create(new SourceIdentifier("asts-schema-source"), - YangIRSchemaSource.class, Costs.IMMEDIATE.getValue()))); + YangIRSource.class, Costs.IMMEDIATE.getValue()))); // expected behavior is to do nothing verifyNoMoreInteractions(dataBroker, writeTransaction); @@ -116,7 +116,7 @@ public class YangLibProviderTest { // try to unregister YANG source with revision final var schemaSourceWithRevision = PotentialSchemaSource.create( new SourceIdentifier("unregistered-yang-with-revision", "2016-04-28"), - YangTextSchemaSource.class, Costs.LOCAL_IO.getValue()); + YangTextSource.class, Costs.LOCAL_IO.getValue()); yangLibProvider.schemaSourceUnregistered(schemaSourceWithRevision); // source is unregistered @@ -135,7 +135,7 @@ public class YangLibProviderTest { // try to unregister YANG source without revision final var schemaSourceWithoutRevision = PotentialSchemaSource.create( - new SourceIdentifier("unregistered-yang-schema-without-revision"), YangTextSchemaSource.class, + new SourceIdentifier("unregistered-yang-schema-without-revision"), YangTextSource.class, Costs.LOCAL_IO.getValue()); yangLibProvider.schemaSourceUnregistered(schemaSourceWithoutRevision); @@ -155,7 +155,7 @@ public class YangLibProviderTest { // try to unregister non-YANG source final var nonYangSources = PotentialSchemaSource.create(new SourceIdentifier("yin-source-representation"), - YinSchemaSourceRepresentation.class, Costs.IMMEDIATE.getValue()); + YinSourceRepresentation.class, Costs.IMMEDIATE.getValue()); yangLibProvider.schemaSourceUnregistered(nonYangSources); // expected behaviour is to do nothing if non yang based source is unregistered diff --git a/parent/pom.xml b/parent/pom.xml index c6ef1dfc1b..be60c06816 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -11,7 +11,7 @@ org.opendaylight.mdsal binding-parent - 12.0.4 + 13.0.0 @@ -32,14 +32,14 @@ org.opendaylight.aaa aaa-artifacts - 0.18.4 + 0.19.1 pom import org.opendaylight.controller bundle-parent - 8.0.4 + 9.0.0 pom import diff --git a/plugins/netconf-client-mdsal/pom.xml b/plugins/netconf-client-mdsal/pom.xml index 126613d5d4..19207ecc20 100644 --- a/plugins/netconf-client-mdsal/pom.xml +++ b/plugins/netconf-client-mdsal/pom.xml @@ -19,6 +19,11 @@ bundle + + com.github.spotbugs + spotbugs-annotations + true + com.google.code.gson gson diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/CachedYangTextSchemaSource.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/CachedYangTextSchemaSource.java index 1e222233d0..76b9c7e872 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/CachedYangTextSchemaSource.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/CachedYangTextSchemaSource.java @@ -12,39 +12,46 @@ import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; import java.io.Reader; import java.io.StringReader; -import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; /** - * A {@link YangTextSchemaSource} cached from a remote service. + * A {@link YangTextSource} cached from a remote service. */ -public final class CachedYangTextSchemaSource extends YangTextSchemaSource { - private final RemoteDeviceId id; - private final String schemaString; - private final String symbolicName; +// FIXME: subclass StringYangTextSource and cleanup addToStringAttributes() +public final class CachedYangTextSchemaSource extends YangTextSource { + private final @NonNull SourceIdentifier sourceId; + private final @NonNull RemoteDeviceId id; + private final @NonNull String symbolicName; + private final @NonNull String schemaString; - public CachedYangTextSchemaSource(final RemoteDeviceId id, final SourceIdentifier sourceIdentifier, + public CachedYangTextSchemaSource(final RemoteDeviceId id, final SourceIdentifier sourceId, final String symbolicName, final String schemaString) { - super(sourceIdentifier); - this.symbolicName = requireNonNull(symbolicName); this.id = requireNonNull(id); + this.sourceId = requireNonNull(sourceId); + this.symbolicName = requireNonNull(symbolicName); this.schemaString = requireNonNull(schemaString); } @Override - protected MoreObjects.ToStringHelper addToStringAttributes(final MoreObjects.ToStringHelper toStringHelper) { - return toStringHelper.add("device", id); + public Reader openStream() { + return new StringReader(schemaString); } @Override - public Reader openStream() { - return new StringReader(schemaString); + public SourceIdentifier sourceId() { + return sourceId; + } + + @Override + public String symbolicName() { + return symbolicName; } @Override - public Optional getSymbolicName() { - return Optional.of(symbolicName); + protected MoreObjects.ToStringHelper addToStringAttributes(final MoreObjects.ToStringHelper toStringHelper) { + return toStringHelper.add("device", id); } } \ No newline at end of file diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceMountPointContext.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceMountPointContext.java index 8024bfff9e..4b3678ee33 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceMountPointContext.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceMountPointContext.java @@ -32,13 +32,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext; import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // TODO: this should really come from rfc8528-data-util -final class DeviceMountPointContext extends AbstractEffectiveModelContextProvider implements Immutable, - MountPointContext { +final class DeviceMountPointContext implements Immutable, MountPointContext { private static final Logger LOG = LoggerFactory.getLogger(DeviceMountPointContext.class); private static final NodeIdentifier MOUNT_POINT = NodeIdentifier.create( QName.create(SchemaMountConstants.RFC8528_MODULE, "mount-point").intern()); @@ -58,10 +56,11 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide QName.create(SchemaMountConstants.RFC8528_MODULE, "parent-reference").intern()); private final ImmutableMap mountPoints; + private final @NonNull EffectiveModelContext modelContext; - private DeviceMountPointContext(final EffectiveModelContext schemaContext, + private DeviceMountPointContext(final EffectiveModelContext modelContext, final Map mountPoints) { - super(schemaContext); + this.modelContext = requireNonNull(modelContext); this.mountPoints = ImmutableMap.copyOf(mountPoints); } @@ -72,7 +71,7 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide return emptyContext; } - final EffectiveModelContext schemaContext = emptyContext.getEffectiveModelContext(); + final EffectiveModelContext schemaContext = emptyContext.modelContext(); final DataContainerChild mountPoint = optMountPoint.orElseThrow(); checkArgument(mountPoint instanceof MapNode, "mount-point list %s is not a MapNode", mountPoint); @@ -113,6 +112,11 @@ final class DeviceMountPointContext extends AbstractEffectiveModelContextProvide return new DeviceMountPointContext(schemaContext, mountPoints); } + @Override + public EffectiveModelContext modelContext() { + return modelContext; + } + @Override public Optional findMountPoint(@NonNull final MountPointLabel label) { return Optional.ofNullable(mountPoints.get(requireNonNull(label))); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSources.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSources.java index b2269870fd..d7d2d54a80 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSources.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSources.java @@ -15,8 +15,8 @@ import java.util.stream.Collectors; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Revision; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; @@ -27,10 +27,10 @@ import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; final class DeviceSources { private final Set requiredSources; private final Set providedSources; - private final SchemaSourceProvider sourceProvider; + private final SchemaSourceProvider sourceProvider; DeviceSources(final Set requiredSources, final Set providedSources, - final SchemaSourceProvider sourceProvider) { + final SchemaSourceProvider sourceProvider) { this.requiredSources = requireNonNull(requiredSources); this.providedSources = requireNonNull(providedSources); this.sourceProvider = requireNonNull(sourceProvider); @@ -52,7 +52,7 @@ final class DeviceSources { return providedSources.stream() .map(DeviceSources::toSourceId) .map(sourceId -> schemaRegistry.registerSchemaSource(sourceProvider, - PotentialSchemaSource.create(sourceId, YangTextSchemaSource.class, + PotentialSchemaSource.create(sourceId, YangTextSource.class, PotentialSchemaSource.Costs.REMOTE_IO.getValue()))) .collect(Collectors.toUnmodifiableList()); } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSourcesResolver.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSourcesResolver.java index 57b5050978..98521c1bb1 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSourcesResolver.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/DeviceSourcesResolver.java @@ -45,7 +45,7 @@ final class DeviceSourcesResolver implements Callable { @Override public DeviceSources call() { final var availableSchemas = stateSchemasResolver.resolve(deviceRpc, remoteSessionCapabilities, id, - baseSchema.getEffectiveModelContext()); + baseSchema.modelContext()); LOG.debug("{}: Schemas exposed by ietf-netconf-monitoring: {}", id, availableSchemas.getAvailableYangSchemasQNames()); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemas.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemas.java index abe1626465..091e2ab63e 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemas.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemas.java @@ -71,7 +71,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference; import org.slf4j.Logger; diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaSourceProvider.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaSourceProvider.java index 165261de70..34305f2f9e 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaSourceProvider.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaSourceProvider.java @@ -18,9 +18,9 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Map; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory; * Provides YANG schema sources from YANG library. The set of available sources is pre-determined when this provider * is created, but each source is acquired on demand. */ -public final class LibrarySchemaSourceProvider implements SchemaSourceProvider { +public final class LibrarySchemaSourceProvider implements SchemaSourceProvider { private static final Logger LOG = LoggerFactory.getLogger(LibrarySchemaSourceProvider.class); private final ImmutableMap availableSources; @@ -41,7 +41,7 @@ public final class LibrarySchemaSourceProvider implements SchemaSourceProvider getSource(final SourceIdentifier sourceIdentifier) { + public ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { final var url = availableSources.get(requireNonNull(sourceIdentifier)); checkArgument(url != null); @@ -50,7 +50,7 @@ public final class LibrarySchemaSourceProvider implements SchemaSourceProvider { +public final class MonitoringSchemaSourceProvider implements SchemaSourceProvider { private static final Logger LOG = LoggerFactory.getLogger(MonitoringSchemaSourceProvider.class); private static final NodeIdentifier FORMAT_PATHARG = NodeIdentifier.create(QName.create(GetSchema.QNAME, "format").intern()); @@ -90,7 +90,7 @@ public final class MonitoringSchemaSourceProvider implements SchemaSourceProvide } @Override - public ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { + public ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { final String moduleName = sourceIdentifier.name().getLocalName(); final Optional revision = Optional.ofNullable(sourceIdentifier.revision()).map(Revision::toString); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java index d349afd2f3..1e3ca9148b 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java @@ -68,13 +68,14 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository; import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -142,7 +143,7 @@ public class NetconfDevice implements RemoteDevice { LOG.debug("{}: Session to remote device established with {}", id, remoteSessionCapabilities); final BaseSchema baseSchema = resolveBaseSchema(remoteSessionCapabilities.isNotificationsSupported()); - final NetconfDeviceRpc initRpc = new NetconfDeviceRpc(baseSchema.getEffectiveModelContext(), listener, + final NetconfDeviceRpc initRpc = new NetconfDeviceRpc(baseSchema.modelContext(), listener, new NetconfMessageTransformer(baseSchema.getMountPointContext(), false, baseSchema)); final var sourceResolverFuture = Futures.submit(new DeviceSourcesResolver(id, baseSchema, initRpc, remoteSessionCapabilities, stateSchemasResolver), processingExecutor); @@ -288,7 +289,7 @@ public class NetconfDevice implements RemoteDevice { final NetconfDeviceRpc deviceRpc = new NetconfDeviceRpc(schemaContext, listener, new NetconfMessageTransformer(emptyContext, false, baseSchema)); - return Futures.transform(deviceRpc.domRpcService().invokeRpc(Get.QNAME, Builders.containerBuilder() + return Futures.transform(deviceRpc.domRpcService().invokeRpc(Get.QNAME, ImmutableNodes.newContainerBuilder() .withNodeIdentifier(NETCONF_GET_NODEID) .withChild(NetconfMessageTransformUtil.toFilterStructure(RFC8528_SCHEMA_MOUNTS, schemaContext)) .build()), rpcResult -> processSchemaMounts(rpcResult, emptyContext), MoreExecutors.directExecutor()); @@ -325,7 +326,7 @@ public class NetconfDevice implements RemoteDevice { protected NetconfDeviceRpc getDeviceSpecificRpc(final MountPointContext result, final RemoteDeviceCommunicator listener, final BaseSchema schema) { - return new NetconfDeviceRpc(result.getEffectiveModelContext(), listener, + return new NetconfDeviceRpc(result.modelContext(), listener, new NetconfMessageTransformer(result, true, schema)); } @@ -413,10 +414,10 @@ public class NetconfDevice implements RemoteDevice { if (remoteSessionCapabilities.containsNonModuleCapability(CapabilityURN.NOTIFICATION)) { // FIXME: mutable collection modification! deviceSources.getRequiredSourcesQName().addAll(List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance().getName(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 - .$YangModuleInfoImpl.getInstance().getName()) + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance().getName(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 + .YangModuleInfoImpl.getInstance().getName()) ); } @@ -492,7 +493,7 @@ public class NetconfDevice implements RemoteDevice { private List filterMissingSources(final Collection origSources) { return origSources.parallelStream().filter(sourceIdentifier -> { try { - schemaRepository.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class).get(); + schemaRepository.getSchemaSource(sourceIdentifier, YangTextSource.class).get(); return false; } catch (InterruptedException | ExecutionException e) { return true; @@ -509,7 +510,7 @@ public class NetconfDevice implements RemoteDevice { private List handleMissingSchemaSourceException( final MissingSchemaSourceException exception) { // In case source missing, try without it - final SourceIdentifier missingSource = exception.getSourceId(); + final SourceIdentifier missingSource = exception.sourceId(); LOG.warn("{}: Unable to build schema context, missing source {}, will reattempt without it", id, missingSource); LOG.debug("{}: Unable to build schema context, missing source {}, will reattempt without it", @@ -526,16 +527,16 @@ public class NetconfDevice implements RemoteDevice { // In case resolution error, try only with resolved sources // There are two options why schema resolution exception occurred : unsatisfied imports or flawed model // FIXME Do we really have assurance that these two cases cannot happen at once? - if (resolutionException.getFailedSource() != null) { + final var failedSourceId = resolutionException.sourceId(); + if (failedSourceId != null) { // flawed model - exclude it - final SourceIdentifier failedSourceId = resolutionException.getFailedSource(); LOG.warn("{}: Unable to build schema context, failed to resolve source {}, will reattempt without it", id, failedSourceId); LOG.warn("{}: Unable to build schema context, failed to resolve source {}, will reattempt without it", id, failedSourceId, resolutionException); addUnresolvedCapabilities(getQNameFromSourceIdentifiers(List.of(failedSourceId)), UnavailableCapability.FailureReason.UnableToResolve); - return stripUnavailableSource(resolutionException.getFailedSource()); + return stripUnavailableSource(failedSourceId); } // unsatisfied imports addUnresolvedCapabilities( diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasResolverImpl.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasResolverImpl.java index 481a78408c..cc953c703c 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasResolverImpl.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasResolverImpl.java @@ -12,7 +12,7 @@ import org.opendaylight.netconf.client.mdsal.api.NetconfDeviceSchemasResolver; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; import org.opendaylight.netconf.client.mdsal.spi.NetconfDeviceRpc; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.$YangModuleInfoImpl; +import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; @@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; * Default implementation resolving schemas QNames from netconf-state or from modules-state. */ public final class NetconfStateSchemasResolverImpl implements NetconfDeviceSchemasResolver { - private static final QName RFC8525_YANG_LIBRARY_CAPABILITY = $YangModuleInfoImpl.getInstance().getName(); + private static final QName RFC8525_YANG_LIBRARY_CAPABILITY = YangModuleInfoImpl.getInstance().getName(); private static final QName RFC7895_YANG_LIBRARY_CAPABILITY = RFC8525_YANG_LIBRARY_CAPABILITY .bindTo(QNameModule.create(RFC8525_YANG_LIBRARY_CAPABILITY.getNamespace(), Revision.of("2016-06-21"))).intern(); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfRpcService.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfRpcService.java index 67b1e30f4e..3a9d683cc6 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfRpcService.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfRpcService.java @@ -9,11 +9,9 @@ package org.opendaylight.netconf.client.mdsal.api; import com.google.common.util.concurrent.ListenableFuture; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.dom.api.DOMExtensibleService; import org.opendaylight.mdsal.dom.api.DOMRpcException; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.api.DOMService; -import org.opendaylight.mdsal.dom.api.DOMServiceExtension; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.CancelCommit; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.CloseSession; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Commit; @@ -36,7 +34,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; * A {@link DOMService} capturing the ability to invoke NETCONF RPCs through * {@link #invokeNetconf(QName, ContainerNode)}. */ -public interface NetconfRpcService extends DOMExtensibleService { +public interface NetconfRpcService extends DOMService { /** * Invoke a well-known RPC. This method is guaranteed to support the following RPCs: *
    @@ -52,7 +50,7 @@ public interface NetconfRpcService extends DOMExtensibleService * *

    - * The support for other RPCs is advertized through {@link #getExtensions()}. + * The support for other RPCs is advertized through {@link #supportedExtensions()}. * * @param type QName of the RPC to be invoked * @param input Input arguments, null if the RPC does not take any. @@ -65,7 +63,7 @@ public interface NetconfRpcService extends DOMExtensibleService { + enum Extension implements DOMService.Extension { /** * This device supports * Candidate Configuration Capability. diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java index 807a925c7b..9ee6745392 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java @@ -26,8 +26,8 @@ import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.client.NetconfClientSession; import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.$YangModuleInfoImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability.CapabilityOrigin; +import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.slf4j.Logger; @@ -164,7 +164,7 @@ public record NetconfSessionPreferences( public boolean isNotificationsSupported() { return containsPartialNonModuleCapability(CapabilityURN.NOTIFICATION) - || containsModuleCapability($YangModuleInfoImpl.getInstance().getName()); + || containsModuleCapability(YangModuleInfoImpl.getInstance().getName()); } public boolean isMonitoringSupported() { diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/SchemalessRpcService.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/SchemalessRpcService.java index dad79dd4c2..f28fe4d54d 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/SchemalessRpcService.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/SchemalessRpcService.java @@ -11,6 +11,7 @@ import com.google.common.annotations.Beta; import com.google.common.util.concurrent.ListenableFuture; import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMService; import org.opendaylight.yangtools.yang.common.QName; @@ -18,7 +19,13 @@ import org.opendaylight.yangtools.yang.common.QName; * A {@link DOMService} exposing RPC invocation model based either {@code ContainerNode} or {@code AnyxmlNode}. */ @Beta -public interface SchemalessRpcService extends DOMService { +public interface SchemalessRpcService extends DOMService { + /** + * Marker interface for an extension to {@link DOMRpcService}. + */ + interface Extension extends DOMService.Extension { + // Marker interface + } @NonNull ListenableFuture invokeRpc(@NonNull QName type, @NonNull DOMSource payload); } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseRpcSchemalessTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseRpcSchemalessTransformer.java index 231cc1ba80..17ba164267 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseRpcSchemalessTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/BaseRpcSchemalessTransformer.java @@ -25,9 +25,8 @@ import org.opendaylight.netconf.client.mdsal.api.RpcTransformer; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; @@ -45,7 +44,7 @@ public class BaseRpcSchemalessTransformer implements RpcTransformer mappedRpcs; private final @NonNull MountPointContext mountContext; @@ -26,6 +25,10 @@ public final class BaseSchema implements EffectiveModelContextProvider, Immutabl mappedRpcs = Maps.uniqueIndex(context.getOperations(), RpcDefinition::getQName); } + public @NonNull EffectiveModelContext modelContext() { + return mountContext.modelContext(); + } + @NonNull ImmutableMap getMappedRpcs() { return mappedRpcs; } @@ -33,9 +36,4 @@ public final class BaseSchema implements EffectiveModelContextProvider, Immutabl public @NonNull MountPointContext getMountPointContext() { return mountContext; } - - @Override - public @NonNull EffectiveModelContext getEffectiveModelContext() { - return mountContext.getEffectiveModelContext(); - } } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultBaseNetconfSchemas.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultBaseNetconfSchemas.java index 3f7bde9b8d..64d85572ea 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultBaseNetconfSchemas.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultBaseNetconfSchemas.java @@ -36,18 +36,18 @@ public record DefaultBaseNetconfSchemas(BaseSchema baseSchema, BaseSchema baseSc public DefaultBaseNetconfSchemas(@Reference final YangParserFactory parserFactory) throws YangParserException { this( new BaseSchema(BindingRuntimeHelpers.createEffectiveModel(parserFactory, List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601 - .$YangModuleInfoImpl.getInstance(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004 - .$YangModuleInfoImpl.getInstance()))), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601 + .YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004 + .YangModuleInfoImpl.getInstance()))), new BaseSchema(BindingRuntimeHelpers.createEffectiveModel(parserFactory, List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601 - .$YangModuleInfoImpl.getInstance(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004 - .$YangModuleInfoImpl.getInstance(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206 - .$YangModuleInfoImpl.getInstance())))); + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601 + .YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004 + .YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206 + .YangModuleInfoImpl.getInstance())))); } } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultCredentialProvider.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultCredentialProvider.java index ff3d96e642..b188ab6f52 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultCredentialProvider.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultCredentialProvider.java @@ -7,17 +7,14 @@ */ package org.opendaylight.netconf.client.mdsal.impl; -import com.google.common.collect.Iterables; -import java.util.Collection; import java.util.Map; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; 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.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.netconf.client.mdsal.api.CredentialProvider; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore; @@ -34,8 +31,7 @@ import org.slf4j.LoggerFactory; @Singleton @Component(service = CredentialProvider.class) -public final class DefaultCredentialProvider - implements CredentialProvider, ClusteredDataTreeChangeListener, AutoCloseable { +public final class DefaultCredentialProvider implements CredentialProvider, DataListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DefaultCredentialProvider.class); private final @NonNull Registration reg; @@ -45,9 +41,8 @@ public final class DefaultCredentialProvider @Inject @Activate public DefaultCredentialProvider(@Reference final DataBroker dataBroker) { - reg = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), - this); + reg = dataBroker.registerDataListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), this); } @Deactivate @@ -63,9 +58,8 @@ public final class DefaultCredentialProvider } @Override - public void onDataTreeChanged(final Collection> changes) { - final var keystore = Iterables.getLast(changes).getRootNode().getDataAfter(); - final var newCredentials = keystore != null ? keystore.nonnullKeyCredential() + public void dataChangedTo(final Keystore data) { + final var newCredentials = data != null ? data.nonnullKeyCredential() : Map.of(); LOG.debug("Updating to {} credentials", newCredentials.size()); credentials = newCredentials; diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSchemaResourceManager.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSchemaResourceManager.java index 07bd2713db..0d59f0edfb 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSchemaResourceManager.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSchemaResourceManager.java @@ -21,11 +21,11 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.netconf.client.mdsal.NetconfDevice.SchemaResourcesDTO; import org.opendaylight.netconf.client.mdsal.NetconfStateSchemasResolverImpl; import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactoryConfiguration; -import org.opendaylight.yangtools.yang.model.repo.api.YangIRSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.fs.FilesystemSchemaSourceCache; import org.opendaylight.yangtools.yang.model.repo.spi.SoftSchemaSourceCache; +import org.opendaylight.yangtools.yang.model.spi.source.YangIRSource; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository; import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer; @@ -113,13 +113,13 @@ public final class DefaultSchemaResourceManager implements SchemaResourceManager // for a consistent set of modules, as it skips the need to re-parse the text sources multiple times. It also // helps establishing different sets of contexts, as they can share this pre-made cache. repository.registerSchemaSourceListener( - new SoftSchemaSourceCache<>(repository, YangIRSchemaSource.class)); + new SoftSchemaSourceCache<>(repository, YangIRSource.class)); // Attach the filesystem cache, providing persistence capability, so that restarts do not require us to // re-populate the cache. This also acts as a side-load capability, as anything pre-populated into that // directory will not be fetched from the device. repository.registerSchemaSourceListener(new FilesystemSchemaSourceCache<>(repository, - YangTextSchemaSource.class, new File(rootDirectory + File.separator + subdir))); + YangTextSource.class, new File(rootDirectory + File.separator + subdir))); return new SchemaResourcesDTO(repository, repository, repository.createEffectiveModelContextFactory(SchemaContextFactoryConfiguration.getDefault()), diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProvider.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProvider.java index 8d418a9e7c..165e5ab710 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProvider.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProvider.java @@ -23,17 +23,17 @@ import java.security.cert.X509Certificate; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; -import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; +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; @@ -56,7 +56,7 @@ import org.slf4j.LoggerFactory; @Singleton @Component(service = SslHandlerFactoryProvider.class) public final class DefaultSslHandlerFactoryProvider - implements SslHandlerFactoryProvider, ClusteredDataTreeChangeListener, AutoCloseable { + implements SslHandlerFactoryProvider, DataTreeChangeListener, AutoCloseable { /** * Internal state, updated atomically. */ @@ -136,9 +136,8 @@ public final class DefaultSslHandlerFactoryProvider @Inject @Activate public DefaultSslHandlerFactoryProvider(@Reference final DataBroker dataBroker) { - reg = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), - this); + reg = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Keystore.class)), this); } @Deactivate @@ -232,7 +231,7 @@ public final class DefaultSslHandlerFactoryProvider } @Override - public void onDataTreeChanged(final Collection> changes) { + public void onDataTreeChanged(final List> changes) { LOG.debug("Starting update with {} changes", changes.size()); final var builder = state.newBuilder(); onDataTreeChanged(builder, changes); @@ -241,15 +240,15 @@ public final class DefaultSslHandlerFactoryProvider } private static void onDataTreeChanged(final StateBuilder builder, - final Collection> changes) { + final List> changes) { for (var change : changes) { LOG.debug("Processing change {}", change); final var rootNode = change.getRootNode(); - for (var changedChild : rootNode.getModifiedChildren()) { - if (changedChild.getDataType().equals(PrivateKey.class)) { + for (var changedChild : rootNode.modifiedChildren()) { + if (changedChild.dataType().equals(PrivateKey.class)) { onPrivateKeyChanged(builder.privateKeys, (DataObjectModification)changedChild); - } else if (changedChild.getDataType().equals(TrustedCertificate.class)) { + } else if (changedChild.dataType().equals(TrustedCertificate.class)) { onTrustedCertificateChanged(builder.trustedCertificates, (DataObjectModification)changedChild); } @@ -259,14 +258,14 @@ public final class DefaultSslHandlerFactoryProvider private static void onPrivateKeyChanged(final HashMap privateKeys, final DataObjectModification objectModification) { - switch (objectModification.getModificationType()) { + switch (objectModification.modificationType()) { case SUBTREE_MODIFIED: case WRITE: - final var privateKey = objectModification.getDataAfter(); + final var privateKey = objectModification.dataAfter(); privateKeys.put(privateKey.getName(), privateKey); break; case DELETE: - privateKeys.remove(objectModification.getDataBefore().getName()); + privateKeys.remove(objectModification.dataBefore().getName()); break; default: break; @@ -275,14 +274,14 @@ public final class DefaultSslHandlerFactoryProvider private static void onTrustedCertificateChanged(final HashMap trustedCertificates, final DataObjectModification objectModification) { - switch (objectModification.getModificationType()) { + switch (objectModification.modificationType()) { case SUBTREE_MODIFIED: case WRITE: - final var trustedCertificate = objectModification.getDataAfter(); + final var trustedCertificate = objectModification.dataAfter(); trustedCertificates.put(trustedCertificate.getName(), trustedCertificate); break; case DELETE: - trustedCertificates.remove(objectModification.getDataBefore().getName()); + trustedCertificates.remove(objectModification.dataBefore().getName()); break; default: break; diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfBaseOps.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfBaseOps.java index abba6ceb8e..1d0483adc2 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfBaseOps.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfBaseOps.java @@ -283,7 +283,7 @@ public final class NetconfBaseOps { return addCallback(requireNonNull(callback), rpc.invokeNetconf(Get.QNAME, nonEmptyFilter(filterPath) .map(path -> NetconfMessageTransformUtil.wrap(NETCONF_GET_NODEID, - toFilterStructure(path, mountContext.getEffectiveModelContext()))) + toFilterStructure(path, mountContext.modelContext()))) .orElse(NetconfMessageTransformUtil.GET_RPC_CONTENT))); } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformUtil.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformUtil.java index bc7011282c..5e61f2f88d 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformUtil.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformUtil.java @@ -8,7 +8,7 @@ package org.opendaylight.netconf.client.mdsal.impl; import static java.util.Objects.requireNonNull; -import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.$YangModuleInfoImpl.qnameOf; +import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.YangModuleInfoImpl.qnameOf; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -248,9 +248,9 @@ public final class NetconfMessageTransformUtil { * @param lastChildOverride Optional of {@code NormalizedNode} data on which action will be invoked * @return {@link DOMSourceAnyxmlNode} containing edit-config structure */ - public static DOMSourceAnyxmlNode createEditConfigAnyxml( - final EffectiveModelContext ctx, final YangInstanceIdentifier dataPath, - final Optional operation, final Optional lastChildOverride) { + public static AnyxmlNode createEditConfigAnyxml(final EffectiveModelContext ctx, + final YangInstanceIdentifier dataPath, final Optional operation, + final Optional lastChildOverride) { if (dataPath.isEmpty()) { final var override = lastChildOverride.orElseThrow(() -> new IllegalArgumentException( "Data has to be present when creating structure for top level element")); @@ -387,7 +387,7 @@ public final class NetconfMessageTransformUtil { final Element actionNS = document.createElementNS(YangConstants.RFC6020_YANG_NAMESPACE_STRING, "action"); final DataSchemaContext rootSchemaContextNode = dataSchemaContextTree.getRoot(); final Element actionData = prepareActionData(rootSchemaContextNode, actionNS, - domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document); + domDataTreeIdentifier.path().getPathArguments().iterator(), document); final Element specificActionElement = document.createElementNS(action.getNamespace().toString(), action.getLocalName()); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformer.java index 85d3779d2e..51476e82c1 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformer.java @@ -30,7 +30,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Deque; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -122,14 +121,14 @@ public class NetconfMessageTransformer counter = new MessageCounter(); this.mountContext = requireNonNull(mountContext); - final EffectiveModelContext schemaContext = mountContext.getEffectiveModelContext(); - contextTree = DataSchemaContextTree.from(schemaContext); + final EffectiveModelContext modelContext = mountContext.modelContext(); + contextTree = DataSchemaContextTree.from(modelContext); - mappedRpcs = Maps.uniqueIndex(schemaContext.getOperations(), SchemaNode::getQName); - actions = getActions(schemaContext); + mappedRpcs = Maps.uniqueIndex(modelContext.getOperations(), SchemaNode::getQName); + actions = getActions(modelContext); // RFC6020 normal notifications - mappedNotifications = Multimaps.index(schemaContext.getNotifications(), + mappedNotifications = Multimaps.index(modelContext.getNotifications(), node -> node.getQName().withoutRevision()); this.baseSchema = baseSchema; this.strictParsing = strictParsing; @@ -201,8 +200,7 @@ public class NetconfMessageTransformer try { final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); final XmlParserStream xmlParser = XmlParserStream.create(writer, mountContext, - SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), notificationPath).toInference(), - strictParsing); + SchemaInferenceStack.of(mountContext.modelContext(), notificationPath).toInference(), strictParsing); xmlParser.traverse(new DOMSource(element)); } catch (XMLStreamException | IOException | UnsupportedOperationException e) { throw new IllegalArgumentException(String.format("Failed to parse notification %s", element), e); @@ -212,8 +210,8 @@ public class NetconfMessageTransformer private Optional findNestedNotification(final NetconfMessage message, final Element element) { - final Iterator modules = mountContext.getEffectiveModelContext() - .findModules(XMLNamespace.of(element.getNamespaceURI())).iterator(); + final var modules = mountContext.modelContext().findModules(XMLNamespace.of(element.getNamespaceURI())) + .iterator(); if (!modules.hasNext()) { throw new IllegalArgumentException( "Unable to parse notification " + message + ", cannot find top level module"); @@ -257,7 +255,7 @@ public class NetconfMessageTransformer schemaBuilder.add(schemaNode.getQName()); return new NestedNotificationInfo(Absolute.of(schemaBuilder), - new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, instanceBuilder.build()), xmlNode); + DOMDataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, instanceBuilder.build()), xmlNode); } throw new IllegalStateException("No notification found"); } @@ -354,9 +352,8 @@ public class NetconfMessageTransformer // If the schema context for netconf device does not contain model for base netconf operations, // use default pre build context with just the base model // This way operations like lock/unlock are supported even if the source for base model was not provided - final EffectiveModelContext ctx = needToUseBaseCtx ? baseSchema.getEffectiveModelContext() - : mountContext.getEffectiveModelContext(); - NetconfMessageTransformUtil.writeNormalizedOperationInput(payload, result, Absolute.of(rpc), ctx); + final var modelContext = needToUseBaseCtx ? baseSchema.modelContext() : mountContext.modelContext(); + NetconfMessageTransformUtil.writeNormalizedOperationInput(payload, result, Absolute.of(rpc), modelContext); } catch (final XMLStreamException | IOException | IllegalStateException e) { throw new IllegalStateException("Unable to serialize input of " + rpc, e); } @@ -386,7 +383,7 @@ public class NetconfMessageTransformer domDataTreeIdentifier, counter, actionDef.getQName()); try { NetconfMessageTransformUtil.writeNormalizedOperationInput((ContainerNode) payload, result, action, - mountContext.getEffectiveModelContext()); + mountContext.modelContext()); } catch (final XMLStreamException | IOException | IllegalStateException e) { throw new IllegalStateException("Unable to serialize input of " + action, e); } @@ -469,8 +466,7 @@ public class NetconfMessageTransformer .add(operOutput.getQName()) .build()); // FIXME: we should have a cached inference here, or XMLParserStream should accept Absolute instead - final var inference = SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), outputPath) - .toInference(); + final var inference = SchemaInferenceStack.of(mountContext.modelContext(), outputPath).toInference(); final NormalizationResultHolder resultHolder = new NormalizationResultHolder(); final Element element = message.getDocument().getDocumentElement(); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfRpcStructureTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfRpcStructureTransformer.java index 8048f72226..2b0b26d5b5 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfRpcStructureTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfRpcStructureTransformer.java @@ -12,6 +12,7 @@ import java.net.URISyntaxException; import java.util.List; import java.util.Optional; import javax.xml.stream.XMLStreamException; +import javax.xml.transform.dom.DOMSource; import org.opendaylight.netconf.api.EffectiveOperation; import org.opendaylight.netconf.common.mdsal.NormalizedDataUtil; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -57,23 +58,22 @@ class NetconfRpcStructureTransformer implements RpcStructureTransformer { } @Override - public DOMSourceAnyxmlNode createEditConfigStructure(final Optional data, - final YangInstanceIdentifier dataPath, - final Optional operation) { + public AnyxmlNode createEditConfigStructure(final Optional data, + final YangInstanceIdentifier dataPath, final Optional operation) { // FIXME: propagate MountPointContext - return NetconfMessageTransformUtil.createEditConfigAnyxml(mountContext.getEffectiveModelContext(), dataPath, - operation, data); + return NetconfMessageTransformUtil.createEditConfigAnyxml(mountContext.modelContext(), dataPath, operation, + data); } @Override public AnyxmlNode toFilterStructure(final YangInstanceIdentifier path) { // FIXME: propagate MountPointContext - return NetconfMessageTransformUtil.toFilterStructure(path, mountContext.getEffectiveModelContext()); + return NetconfMessageTransformUtil.toFilterStructure(path, mountContext.modelContext()); } @Override public AnyxmlNode toFilterStructure(final List fieldsFilters) { // FIXME: propagate MountPointContext - return NetconfMessageTransformUtil.toFilterStructure(fieldsFilters, mountContext.getEffectiveModelContext()); + return NetconfMessageTransformUtil.toFilterStructure(fieldsFilters, mountContext.modelContext()); } } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfSalKeystoreRpcs.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfSalKeystoreRpcs.java index 4f4cb6db78..691a319ec2 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfSalKeystoreRpcs.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/NetconfSalKeystoreRpcs.java @@ -12,11 +12,14 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; -import java.util.List; -import java.util.stream.Collectors; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Base64; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; @@ -26,6 +29,7 @@ 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.dom.api.DefaultDOMRpcException; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntryInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddKeystoreEntryOutput; @@ -141,21 +145,26 @@ public final class NetconfSalKeystoreRpcs implements AutoCloseable { private ListenableFuture> addKeystoreEntry(final AddKeystoreEntryInput input) { LOG.debug("Adding keypairs: {}", input); - final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); - final List keypairs = input.nonnullKeyCredential().values().stream() - .map(keypair -> new KeyCredentialBuilder(keypair) - .setPrivateKey(encryptionService.encrypt(keypair.getPrivateKey())) - .setPassphrase(encryptionService.encrypt(keypair.getPassphrase())) - .build()) - .collect(Collectors.toList()); - - for (KeyCredential keypair : keypairs) { + final var plain = input.nonnullKeyCredential(); + final var encrypted = new ArrayList(plain.size()); + for (var credential : plain.values()) { + try { + encrypted.add(new KeyCredentialBuilder(credential) + .setPrivateKey(encryptString(credential.getPrivateKey())) + .setPassphrase(encryptString(credential.getPassphrase())) + .build()); + } catch (GeneralSecurityException e) { + return Futures.immediateFailedFuture(new DefaultDOMRpcException("Failed to decrypt " + credential, e)); + } + } + + final var writeTransaction = dataBroker.newWriteOnlyTransaction(); + for (var keypair : encrypted) { writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, KEYSTORE_IID.child(KeyCredential.class, keypair.key()), keypair); } - final SettableFuture> rpcResult = SettableFuture.create(); - + final var rpcResult = SettableFuture.>create(); writeTransaction.commit().addCallback(new FutureCallback() { @Override public void onSuccess(final CommitInfo result) { @@ -169,10 +178,13 @@ public final class NetconfSalKeystoreRpcs implements AutoCloseable { rpcResult.setException(throwable); } }, MoreExecutors.directExecutor()); - return rpcResult; } + private String encryptString(final String plain) throws GeneralSecurityException { + return Base64.getEncoder().encodeToString(encryptionService.encrypt(plain.getBytes(StandardCharsets.UTF_8))); + } + @VisibleForTesting ListenableFuture> addTrustedCertificate( final AddTrustedCertificateInput input) { diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/RpcStructureTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/RpcStructureTransformer.java index deccbc51d4..f1de13a3ef 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/RpcStructureTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/RpcStructureTransformer.java @@ -9,10 +9,10 @@ package org.opendaylight.netconf.client.mdsal.impl; import java.util.List; import java.util.Optional; +import javax.xml.transform.dom.DOMSource; import org.opendaylight.netconf.api.EffectiveOperation; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode; -import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -29,8 +29,8 @@ interface RpcStructureTransformer { * @param operation operation * @return config structure */ - DOMSourceAnyxmlNode createEditConfigStructure(Optional data, YangInstanceIdentifier dataPath, - Optional operation); + AnyxmlNode createEditConfigStructure(Optional data, YangInstanceIdentifier dataPath, + Optional operation); /** * Transforms path to filter structure. diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessMessageTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessMessageTransformer.java index 332f500272..b5aae3bdd2 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessMessageTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessMessageTransformer.java @@ -7,21 +7,16 @@ */ package org.opendaylight.netconf.client.mdsal.impl; -import java.time.Instant; -import java.util.Map; import javax.xml.transform.dom.DOMSource; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.netconf.api.messages.NetconfMessage; import org.opendaylight.netconf.api.xml.MissingNameSpaceException; -import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.client.mdsal.api.NotificationTransformer; import org.opendaylight.netconf.client.mdsal.api.RpcTransformer; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -44,7 +39,7 @@ public class SchemalessMessageTransformer implements NotificationTransformer, Rp @Override public DOMNotification toNotification(final NetconfMessage message) { - final Map.Entry stripped = NetconfMessageTransformUtil.stripNotification(message); + final var stripped = NetconfMessageTransformUtil.stripNotification(message); final QName notificationNoRev; try { notificationNoRev = @@ -54,17 +49,13 @@ public class SchemalessMessageTransformer implements NotificationTransformer, Rp + message + ", cannot find namespace", e); } - final DOMSourceAnyxmlNode notificationPayload = Builders.anyXmlBuilder() + return new NetconfMessageTransformer.NetconfDeviceNotification(Builders.containerBuilder() + .withNodeIdentifier(SCHEMALESS_NOTIFICATION_PAYLOAD) + .withChild(Builders.anyXmlBuilder() .withNodeIdentifier(new NodeIdentifier(notificationNoRev)) .withValue(new DOMSource(stripped.getValue().getDomElement())) - .build(); - - final ContainerNode notificationBody = Builders.containerBuilder() - .withNodeIdentifier(SCHEMALESS_NOTIFICATION_PAYLOAD) - .withChild(notificationPayload) - .build(); - - return new NetconfMessageTransformer.NetconfDeviceNotification(notificationBody, stripped.getKey()); + .build()) + .build(), stripped.getKey()); } @Override diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformer.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformer.java index 85b028ae8d..8ad942e2b5 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformer.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformer.java @@ -75,7 +75,7 @@ class SchemalessRpcStructureTransformer implements RpcStructureTransformer { * @return config structure */ @Override - public DOMSourceAnyxmlNode createEditConfigStructure(final Optional data, + public AnyxmlNode createEditConfigStructure(final Optional data, final YangInstanceIdentifier dataPath, final Optional operation) { final var dataValue = data.orElseThrow(); if (!(dataValue instanceof DOMSourceAnyxmlNode anxmlData)) { diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractTxChain.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractTxChain.java index 9f27d14112..ed2bc0adca 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractTxChain.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractTxChain.java @@ -8,27 +8,29 @@ package org.opendaylight.netconf.client.mdsal.spi; import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; import java.util.HashMap; import java.util.Map; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.common.Empty; /** * {@link DOMTransactionChain} implementation for Netconf connector. */ abstract class AbstractTxChain implements DOMTransactionChain, TxListener { - /** - * Submitted transactions that haven't completed yet. - */ + // Submitted transactions that haven't completed yet. private final Map pendingTransactions = new HashMap<>(); + private final @NonNull SettableFuture future = SettableFuture.create(); final DOMDataBroker dataBroker; - final DOMTransactionChainListener listener; /** * Transaction created by this chain that hasn't been submitted or cancelled yet. @@ -37,17 +39,23 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener { private boolean closed = false; private boolean successful = true; - AbstractTxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener) { - this.dataBroker = dataBroker; - this.listener = listener; + AbstractTxChain(final DOMDataBroker dataBroker) { + this.dataBroker = requireNonNull(dataBroker); + } + + @Override + public final ListenableFuture future() { + return future; } @Override public final synchronized AbstractWriteTx newWriteOnlyTransaction() { checkOperationPermitted(); - final DOMDataTreeWriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); - checkState(writeTransaction instanceof AbstractWriteTx); - final AbstractWriteTx pendingWriteTx = (AbstractWriteTx) writeTransaction; + + final var writeTransaction = dataBroker.newWriteOnlyTransaction(); + if (!(writeTransaction instanceof AbstractWriteTx pendingWriteTx)) { + throw new IllegalStateException("Unexpected transaction " + writeTransaction); + } pendingTransactions.put(pendingWriteTx, pendingWriteTx.addListener(this)); currentTransaction = pendingWriteTx; return pendingWriteTx; @@ -74,7 +82,7 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener { if (currentTransaction != null) { currentTransaction.cancel(); } - listener.onTransactionChainFailed(this, transaction, cause); + future.setException(cause); } @Override @@ -104,7 +112,7 @@ abstract class AbstractTxChain implements DOMTransactionChain, TxListener { private void notifyChainListenerSuccess() { if (closed && pendingTransactions.isEmpty() && successful) { - listener.onTransactionChainSuccessful(this); + future.set(Empty.value()); } } } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractWriteTx.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractWriteTx.java index 8d1fca0063..b727db9f76 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractWriteTx.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/AbstractWriteTx.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; @@ -52,6 +53,9 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { final boolean rollbackSupport; final List> resultsFutures = new ArrayList<>(); private final List listeners = new CopyOnWriteArrayList<>(); + private final SettableFuture resultFuture = SettableFuture.create(); + private final @NonNull FluentFuture completionFuture = FluentFuture.from(resultFuture); + // Allow commit to be called only once volatile boolean finished = false; final boolean isLockAllowed; @@ -76,6 +80,11 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { abstract void cleanup(); + @Override + public final FluentFuture completionFuture() { + return completionFuture; + } + @Override public synchronized boolean cancel() { if (isFinished()) { @@ -145,8 +154,7 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { @Override // Non-final for testing public FluentFuture commit() { - final SettableFuture resultFuture = SettableFuture.create(); - Futures.addCallback(commitConfiguration(), new FutureCallback>() { + Futures.addCallback(commitConfiguration(), new FutureCallback<>() { @Override public void onSuccess(final RpcResult result) { if (!result.isSuccessful()) { @@ -166,15 +174,15 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { } }, MoreExecutors.directExecutor()); - return FluentFuture.from(resultFuture); + return completionFuture; } final ListenableFuture> commitConfiguration() { listeners.forEach(listener -> listener.onTransactionSubmitted(this)); checkNotFinished(); finished = true; - final ListenableFuture> result = performCommit(); - Futures.addCallback(result, new FutureCallback>() { + final var result = performCommit(); + Futures.addCallback(result, new FutureCallback<>() { @Override public void onSuccess(final RpcResult rpcResult) { if (rpcResult.isSuccessful()) { @@ -210,7 +218,7 @@ abstract class AbstractWriteTx implements DOMDataTreeWriteTransaction { final ListenableFuture> resultsToTxStatus() { final var transformed = SettableFuture.>create(); - Futures.addCallback(Futures.allAsList(resultsFutures), new FutureCallback>() { + Futures.addCallback(Futures.allAsList(resultsFutures), new FutureCallback<>() { @Override public void onSuccess(final List domRpcResults) { if (!transformed.isDone()) { diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/FieldsAwareTxChain.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/FieldsAwareTxChain.java index af0c36fb75..05f998792f 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/FieldsAwareTxChain.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/FieldsAwareTxChain.java @@ -10,7 +10,6 @@ package org.opendaylight.netconf.client.mdsal.spi; import static java.util.Objects.requireNonNull; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.netconf.dom.api.tx.NetconfDOMDataBrokerFieldsExtension; import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadTransaction; import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadWriteTransaction; @@ -19,9 +18,9 @@ import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsTransactionChain; public final class FieldsAwareTxChain extends AbstractTxChain implements NetconfDOMFieldsTransactionChain { private final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension; - FieldsAwareTxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener, - final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension) { - super(dataBroker, listener); + FieldsAwareTxChain(final DOMDataBroker dataBroker, + final NetconfDOMDataBrokerFieldsExtension dataBrokerFieldsExtension) { + super(dataBroker); this.dataBrokerFieldsExtension = requireNonNull(dataBrokerFieldsExtension); } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/KeepaliveSalFacade.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/KeepaliveSalFacade.java index 8517cbf70a..5ba3b42bc9 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/KeepaliveSalFacade.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/KeepaliveSalFacade.java @@ -40,7 +40,7 @@ import org.opendaylight.netconf.client.mdsal.api.SchemalessRpcService; import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil; import org.opendaylight.netconf.common.NetconfTimer; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.slf4j.Logger; @@ -394,12 +394,10 @@ public final class KeepaliveSalFacade implements RemoteDeviceHandler { } @Override - public ListenerRegistration registerRpcListener( - final T rpcListener) { + public Registration registerRpcListener(final DOMRpcAvailabilityListener rpcListener) { // There is no real communication with the device (yet), hence no recordActivity() or anything return delegate.registerRpcListener(rpcListener); } - } /** diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDOMRpcService.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDOMRpcService.java index 3ef69252f7..569fe91a33 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDOMRpcService.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDOMRpcService.java @@ -24,8 +24,7 @@ import org.opendaylight.mdsal.dom.api.DefaultDOMRpcException; import org.opendaylight.netconf.api.messages.NetconfMessage; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceCommunicator; import org.opendaylight.netconf.client.mdsal.api.RpcTransformer; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.concepts.NoOpListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -71,9 +70,11 @@ record NetconfDeviceDOMRpcService( } @Override - public ListenerRegistration registerRpcListener(final T listener) { + public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) { listener.onRpcAvailable(Collections2.transform(modelContext.getOperations(), input -> DOMRpcIdentifier.create(input.getQName()))); - return NoOpListenerRegistration.of(listener); + return () -> { + // No-op + }; } } \ No newline at end of file diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBroker.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBroker.java index 4bebd93230..dc8ee56cfd 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBroker.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBroker.java @@ -9,14 +9,11 @@ package org.opendaylight.netconf.client.mdsal.spi; import static com.google.common.base.Preconditions.checkArgument; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ImmutableClassToInstanceMap; -import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; +import java.util.List; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; 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.dom.spi.PingPongMergingDOMDataBroker; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; @@ -76,13 +73,13 @@ public final class NetconfDeviceDataBroker implements PingPongMergingDOMDataBrok } @Override - public DOMTransactionChain createTransactionChain(final DOMTransactionChainListener listener) { - return new TxChain(this, listener); + public DOMTransactionChain createTransactionChain() { + return new TxChain(this); } @Override - public ClassToInstanceMap getExtensions() { - return ImmutableClassToInstanceMap.of(NetconfDOMDataBrokerFieldsExtension.class, fieldsExtension); + public List supportedExtensions() { + return List.of(fieldsExtension); } private final class NetconfDOMDataBrokerFieldsExtensionImpl implements NetconfDOMDataBrokerFieldsExtension { @@ -97,8 +94,8 @@ public final class NetconfDeviceDataBroker implements PingPongMergingDOMDataBrok } @Override - public NetconfDOMFieldsTransactionChain createTransactionChain(final DOMTransactionChainListener listener) { - return new FieldsAwareTxChain(NetconfDeviceDataBroker.this, listener, this); + public NetconfDOMFieldsTransactionChain createTransactionChain() { + return new FieldsAwareTxChain(NetconfDeviceDataBroker.this, this); } } } \ No newline at end of file diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceMount.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceMount.java index 0be46207c1..895c8d5231 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceMount.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceMount.java @@ -64,7 +64,7 @@ public class NetconfDeviceMount implements AutoCloseable { checkState(topologyRegistration == null, "Already initialized"); final var mountBuilder = mountService.createMountPoint(mountPath); - mountBuilder.addService(DOMSchemaService.class, FixedDOMSchemaService.of(() -> initialCtx)); + mountBuilder.addService(DOMSchemaService.class, new FixedDOMSchemaService(initialCtx)); final var rpcs = services.rpcs(); mountBuilder.addService(NetconfRpcService.class, rpcs); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationService.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationService.java index 63dbc30d2c..2ea1a4d956 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationService.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationService.java @@ -20,9 +20,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.mdsal.dom.api.DOMNotificationListener; import org.opendaylight.mdsal.dom.api.DOMNotificationService; -import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.AbstractRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.slf4j.Logger; @@ -48,16 +46,13 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe } @Override - public ListenerRegistration registerNotificationListener(final T listener, + public Registration registerNotificationListener(final DOMNotificationListener listener, final Collection types) { final var lsnr = requireNonNull(listener); final var typesArray = types.stream().map(Objects::requireNonNull).distinct().toArray(Absolute[]::new); return switch (typesArray.length) { - case 0 -> new AbstractListenerRegistration<>(lsnr) { - @Override - protected void removeRegistration() { - // No-op - } + case 0 -> () -> { + // No-op }; case 1 -> registerOne(lsnr, typesArray[0]); default -> registerMultiple(lsnr, typesArray); @@ -65,8 +60,7 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe } @Override - public ListenerRegistration registerNotificationListener(final T listener, - final Absolute... types) { + public Registration registerNotificationListener(final DOMNotificationListener listener, final Absolute... types) { return registerNotificationListener(listener, Arrays.asList(types)); } @@ -90,30 +84,30 @@ public final class NetconfDeviceNotificationService implements DOMNotificationSe return listeners.size(); } - private synchronized @NonNull ListenerRegistration registerOne( - final @NonNull T listener, final Absolute type) { + private synchronized @NonNull Registration registerOne(final @NonNull DOMNotificationListener listener, + final Absolute type) { listeners.put(type, listener); - return new AbstractListenerRegistration<>(listener) { + return new AbstractRegistration() { @Override protected void removeRegistration() { synchronized (NetconfDeviceNotificationService.this) { - listeners.remove(type, getInstance()); + listeners.remove(type, listener); } } }; } - private synchronized @NonNull ListenerRegistration registerMultiple( - final @NonNull T listener, final Absolute[] types) { + private synchronized @NonNull Registration registerMultiple(final @NonNull DOMNotificationListener listener, + final Absolute[] types) { for (var type : types) { listeners.put(type, listener); } - return new AbstractListenerRegistration<>(listener) { + return new AbstractRegistration() { @Override protected void removeRegistration() { synchronized (NetconfDeviceNotificationService.this) { for (var type : types) { - listeners.remove(type, getInstance()); + listeners.remove(type, listener); } } } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacade.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacade.java index 0aa9d0a56e..994e8c1ea6 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacade.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacade.java @@ -45,7 +45,7 @@ public class NetconfDeviceSalFacade implements RemoteDeviceHandler, AutoCloseabl public synchronized void onDeviceConnected(final NetconfDeviceSchema deviceSchema, final NetconfSessionPreferences sessionPreferences, final RemoteDeviceServices services) { final var mountContext = deviceSchema.mountContext(); - final var modelContext = mountContext.getEffectiveModelContext(); + final var modelContext = mountContext.modelContext(); final var deviceRpc = services.rpcs(); diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTx.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTx.java index ab88d04da9..6e38296a16 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTx.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTx.java @@ -7,6 +7,8 @@ */ package org.opendaylight.netconf.client.mdsal.spi; +import static java.util.Objects.requireNonNull; + import com.google.common.util.concurrent.FluentFuture; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; @@ -23,8 +25,13 @@ class ReadWriteTx implements DOMDataTreeRe final T delegateReadTx; ReadWriteTx(final T delegateReadTx, final DOMDataTreeWriteTransaction delegateWriteTx) { - this.delegateReadTx = delegateReadTx; - this.delegateWriteTx = delegateWriteTx; + this.delegateReadTx = requireNonNull(delegateReadTx); + this.delegateWriteTx = requireNonNull(delegateWriteTx); + } + + @Override + public final FluentFuture completionFuture() { + return delegateWriteTx.completionFuture(); } @Override diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/TxChain.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/TxChain.java index 0b47742d7d..d24ad3d3cb 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/TxChain.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/spi/TxChain.java @@ -11,14 +11,13 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; /** * {@link DOMTransactionChain} implementation for Netconf connector. */ final class TxChain extends AbstractTxChain { - TxChain(final DOMDataBroker dataBroker, final DOMTransactionChainListener listener) { - super(dataBroker, listener); + TxChain(final DOMDataBroker dataBroker) { + super(dataBroker); } @Override diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemasTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemasTest.java index 5b38d74511..6fd0f539aa 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemasTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibraryModulesSchemasTest.java @@ -13,7 +13,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import org.junit.Test; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; public class LibraryModulesSchemasTest { diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaYangSourceProviderTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaYangSourceProviderTest.java index 77d889a68d..8651fc0626 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaYangSourceProviderTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/LibrarySchemaYangSourceProviderTest.java @@ -20,8 +20,8 @@ import java.util.concurrent.ExecutionException; import org.junit.Before; import org.junit.Test; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; public class LibrarySchemaYangSourceProviderTest { private SourceIdentifier workingSid; diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProviderTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProviderTest.java index f029d8d0cb..3b0f632a6d 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProviderTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/MonitoringSchemaSourceProviderTest.java @@ -34,8 +34,8 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -59,8 +59,8 @@ public class MonitoringSchemaSourceProviderTest { @Test public void testGetSource() throws Exception { final SourceIdentifier identifier = new SourceIdentifier("test", "2016-02-08"); - final YangTextSchemaSource source = provider.getSource(identifier).get(); - assertEquals(identifier, source.getIdentifier()); + final YangTextSource source = provider.getSource(identifier).get(); + assertEquals(identifier, source.sourceId()); verify(service).invokeRpc(GetSchema.QNAME, MonitoringSchemaSourceProvider.createGetSchemaRequest("test", Optional.of("2016-02-08"))); } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java index 7fdb6a819d..a95eed54b7 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.MoreExecutors; @@ -56,16 +55,16 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability.CapabilityOrigin; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.repo.api.EffectiveModelContextFactory; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaRepository; import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; @RunWith(MockitoJUnitRunner.StrictStubs.class) @@ -123,7 +122,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { return new NetconfStateSchemas(Sets.newHashSet(source1, source2)); }; - doReturn(mock(SchemaSourceRegistration.class)).when(schemaRegistry).registerSchemaSource(any(), any()); + doReturn(mock(Registration.class)).when(schemaRegistry).registerSchemaSource(any(), any()); final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = new NetconfDevice .SchemaResourcesDTO(schemaRegistry, schemaRepository, schemaFactory, stateSchemasResolver); @@ -154,7 +153,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { // Make fallback attempt to fail due to empty resolved sources final SchemaResolutionException schemaResolutionException = new SchemaResolutionException("fail first", - List.of(), ImmutableMultimap.of()); + new SourceIdentifier("test-module", "2013-07-22"), new Throwable()); doReturn(Futures.immediateFailedFuture(schemaResolutionException)) .when(schemaFactory).createEffectiveModelContext(anyCollection()); @@ -191,11 +190,11 @@ public class NetconfDeviceTest extends AbstractTestModelTest { // Make fallback attempt to fail due to empty resolved sources final MissingSchemaSourceException schemaResolutionException = - new MissingSchemaSourceException("fail first", TEST_SID); + new MissingSchemaSourceException(TEST_SID, "fail first"); doReturn(Futures.immediateFailedFuture(schemaResolutionException)) - .when(schemaRepository).getSchemaSource(eq(TEST_SID), eq(YangTextSchemaSource.class)); + .when(schemaRepository).getSchemaSource(eq(TEST_SID), eq(YangTextSource.class)); doAnswer(invocation -> { - if (((Collection) invocation.getArguments()[0]).size() == 2) { + if (invocation.getArgument(0, Collection.class).size() == 2) { return Futures.immediateFailedFuture(schemaResolutionException); } else { return Futures.immediateFuture(SCHEMA_CONTEXT); @@ -212,7 +211,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { return new NetconfStateSchemas(Sets.newHashSet(source1, source2)); }; - doReturn(mock(SchemaSourceRegistration.class)).when(schemaRegistry).registerSchemaSource(any(), any()); + doReturn(mock(Registration.class)).when(schemaRegistry).registerSchemaSource(any(), any()); final NetconfDevice.SchemaResourcesDTO schemaResourcesDTO = new NetconfDevice .SchemaResourcesDTO(schemaRegistry, schemaRepository, schemaFactory, stateSchemasResolver); @@ -236,9 +235,9 @@ public class NetconfDeviceTest extends AbstractTestModelTest { private static SchemaRepository getSchemaRepository() { final SchemaRepository mock = mock(SchemaRepository.class); - final YangTextSchemaSource mockRep = mock(YangTextSchemaSource.class); + final YangTextSource mockRep = mock(YangTextSource.class); doReturn(Futures.immediateFuture(mockRep)) - .when(mock).getSchemaSource(any(SourceIdentifier.class), eq(YangTextSchemaSource.class)); + .when(mock).getSchemaSource(any(SourceIdentifier.class), eq(YangTextSource.class)); return mock; } @@ -441,10 +440,10 @@ public class NetconfDeviceTest extends AbstractTestModelTest { any(RemoteDeviceServices.class)); List notificationModulesName = List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance().getName().toString(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 - .$YangModuleInfoImpl.getInstance().getName().toString()); + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance().getName().toString(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 + .YangModuleInfoImpl.getInstance().getName().toString()); final Set resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities(); @@ -481,10 +480,10 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfDeviceCapabilities netconfDeviceCaps = argument.getValue().capabilities(); List notificationModulesName = List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance().getName().toString(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 - .$YangModuleInfoImpl.getInstance().getName().toString()); + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance().getName().toString(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 + .YangModuleInfoImpl.getInstance().getName().toString()); assertFalse(netconfDeviceCaps.resolvedCapabilities().stream() .anyMatch(entry -> notificationModulesName.contains(entry.getCapability()))); @@ -509,27 +508,27 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfSessionPreferences sessionCaps = getSessionCaps(false, List.of()); - final Map moduleBasedCaps = new HashMap<>(); - moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance().getName(), + final var moduleBasedCaps = new HashMap(); + moduleBasedCaps.put(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance().getName(), CapabilityOrigin.DeviceAdvertised); - moduleBasedCaps.put(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 - .$YangModuleInfoImpl.getInstance().getName(), + moduleBasedCaps.put(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 + .YangModuleInfoImpl.getInstance().getName(), CapabilityOrigin.DeviceAdvertised); netconfSpy.onRemoteSessionUp(sessionCaps.replaceModuleCaps(moduleBasedCaps), listener); - final ArgumentCaptor argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class); + final var argument = ArgumentCaptor.forClass(NetconfDeviceSchema.class); verify(facade, timeout(5000)).onDeviceConnected(argument.capture(), any(NetconfSessionPreferences.class), any(RemoteDeviceServices.class)); final Set resolvedCapabilities = argument.getValue().capabilities().resolvedCapabilities(); - List notificationModulesName = List.of( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 - .$YangModuleInfoImpl.getInstance().getName().toString(), - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 - .$YangModuleInfoImpl.getInstance().getName().toString()); + final var notificationModulesName = List.of( + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714 + .YangModuleInfoImpl.getInstance().getName().toString(), + org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715 + .YangModuleInfoImpl.getInstance().getName().toString()); assertEquals(2, resolvedCapabilities.size()); assertTrue(resolvedCapabilities.stream().anyMatch(entry -> notificationModulesName diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasTest.java index f1aadbc286..67f5eb97d3 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemasTest.java @@ -51,9 +51,9 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder; +import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.slf4j.Logger; @@ -74,16 +74,16 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { @Mock private DOMRpcService rpc; - private EffectiveModelContext schemaContext; + private EffectiveModelContext modelContext; @Before public void setUp() throws Exception { - schemaContext = BASE_SCHEMAS.baseSchemaWithNotifications().getEffectiveModelContext(); + modelContext = BASE_SCHEMAS.baseSchemaWithNotifications().modelContext(); final var resultHolder = new NormalizationResultHolder(); final var writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); final var xmlParser = XmlParserStream.create(writer, - SchemaInferenceStack.ofDataTreePath(schemaContext, NetconfState.QNAME, Schemas.QNAME).toInference(), false); + SchemaInferenceStack.ofDataTreePath(modelContext, NetconfState.QNAME, Schemas.QNAME).toInference(), false); xmlParser.parse(UntrustedXML.createXMLStreamReader(getClass().getResourceAsStream( "/netconf-state.schemas.payload.xml"))); @@ -104,21 +104,21 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { @Ignore @Test public void testCreate2() throws Exception { - final ContainerNode netconfState = Builders.containerBuilder() + final ContainerNode netconfState = ImmutableNodes.newContainerBuilder() .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NetconfState.QNAME)) .withChild(compositeNodeSchemas) .build(); - final ContainerNode data = Builders.containerBuilder() + final ContainerNode data = ImmutableNodes.newContainerBuilder() .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_DATA_NODEID) .withChild(netconfState) .build(); - final ContainerNode rpcReply = Builders.containerBuilder() + final ContainerNode rpcReply = ImmutableNodes.newContainerBuilder() .withNodeIdentifier(new YangInstanceIdentifier .NodeIdentifier(NetconfMessageTransformUtil.NETCONF_RPC_REPLY_QNAME)) .withChild(data) .build(); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult(rpcReply))).when(rpc).invokeRpc(eq(Get.QNAME), any()); - final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext); + final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext); final Set availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames(); assertEquals(numberOfLegalSchemas, availableYangSchemasQNames.size()); @@ -129,7 +129,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { @Test public void testCreateMonitoringNotSupported() throws Exception { final var caps = NetconfSessionPreferences.fromStrings(Set.of()); - final var stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId, schemaContext); + final var stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId, modelContext); assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames()); } @@ -137,7 +137,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { public void testCreateFail() throws Exception { when(rpc.invokeRpc(eq(Get.QNAME), any())).thenReturn( Futures.immediateFailedFuture(new DOMRpcImplementationNotAvailableException("not available"))); - final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext); + final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext); assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames()); } @@ -146,7 +146,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { final RpcError rpcError = RpcResultBuilder.newError(ErrorType.RPC, new ErrorTag("fail"), "fail"); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult(rpcError))).when(rpc) .invokeRpc(eq(Get.QNAME), any()); - final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext); + final var stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext); assertEquals(Set.of(), stateSchemas.getAvailableYangSchemasQNames()); } @@ -158,7 +158,7 @@ public class NetconfStateSchemasTest extends AbstractBaseSchemasTest { try { when(interruptedFuture.get()).thenThrow(new InterruptedException("interrupted")); doReturn(interruptedFuture).when(rpc).invokeRpc(eq(Get.QNAME), any()); - NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext); + NetconfStateSchemas.create(rpc, CAPS, deviceId, modelContext); } catch (final InterruptedException | ExecutionException e) { LOG.info("Operation failed.", e); } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProviderTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProviderTest.java index 1db8fa459f..aabe79a730 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProviderTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/DefaultSslHandlerFactoryProviderTest.java @@ -35,7 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017. import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificate; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateKey; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -53,12 +53,12 @@ public class DefaultSslHandlerFactoryProviderTest { @Mock private DataBroker dataBroker; @Mock - private ListenerRegistration listenerRegistration; + private Registration listenerRegistration; @Before public void setUp() { doReturn(listenerRegistration).when(dataBroker) - .registerDataTreeChangeListener(any(DataTreeIdentifier.class), any(DefaultSslHandlerFactoryProvider.class)); + .registerTreeChangeListener(any(DataTreeIdentifier.class), any(DefaultSslHandlerFactoryProvider.class)); } @Test @@ -76,13 +76,13 @@ public class DefaultSslHandlerFactoryProviderTest { doReturn(keystoreObjectModification).when(dataTreeModification).getRootNode(); DataObjectModification childObjectModification = mock(DataObjectModification.class); - doReturn(List.of(childObjectModification)).when(keystoreObjectModification).getModifiedChildren(); - doReturn(PrivateKey.class).when(childObjectModification).getDataType(); + doReturn(List.of(childObjectModification)).when(keystoreObjectModification).modifiedChildren(); + doReturn(PrivateKey.class).when(childObjectModification).dataType(); - doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification).getModificationType(); + doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification).modificationType(); final var privateKey = getPrivateKey(); - doReturn(privateKey).when(childObjectModification).getDataAfter(); + doReturn(privateKey).when(childObjectModification).dataAfter(); final var keystoreAdapter = new DefaultSslHandlerFactoryProvider(dataBroker); keystoreAdapter.onDataTreeChanged(List.of(dataTreeModification)); @@ -100,13 +100,13 @@ public class DefaultSslHandlerFactoryProviderTest { doReturn(keystoreObjectModification1).when(dataTreeModification1).getRootNode(); DataObjectModification childObjectModification1 = mock(DataObjectModification.class); - doReturn(List.of(childObjectModification1)).when(keystoreObjectModification1).getModifiedChildren(); - doReturn(PrivateKey.class).when(childObjectModification1).getDataType(); + doReturn(List.of(childObjectModification1)).when(keystoreObjectModification1).modifiedChildren(); + doReturn(PrivateKey.class).when(childObjectModification1).dataType(); - doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification1).getModificationType(); + doReturn(DataObjectModification.ModificationType.WRITE).when(childObjectModification1).modificationType(); final var privateKey = getPrivateKey(); - doReturn(privateKey).when(childObjectModification1).getDataAfter(); + doReturn(privateKey).when(childObjectModification1).dataAfter(); // Prepare TrustedCertificate configuration DataTreeModification dataTreeModification2 = mock(DataTreeModification.class); @@ -114,14 +114,14 @@ public class DefaultSslHandlerFactoryProviderTest { doReturn(keystoreObjectModification2).when(dataTreeModification2).getRootNode(); DataObjectModification childObjectModification2 = mock(DataObjectModification.class); - doReturn(List.of(childObjectModification2)).when(keystoreObjectModification2).getModifiedChildren(); - doReturn(TrustedCertificate.class).when(childObjectModification2).getDataType(); + doReturn(List.of(childObjectModification2)).when(keystoreObjectModification2).modifiedChildren(); + doReturn(TrustedCertificate.class).when(childObjectModification2).dataType(); doReturn(DataObjectModification.ModificationType.WRITE) - .when(childObjectModification2).getModificationType(); + .when(childObjectModification2).modificationType(); final var trustedCertificate = geTrustedCertificate(); - doReturn(trustedCertificate).when(childObjectModification2).getDataAfter(); + doReturn(trustedCertificate).when(childObjectModification2).dataAfter(); // Apply configurations final var keystoreAdapter = new DefaultSslHandlerFactoryProvider(dataBroker); diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java index 59f61e842e..df1398fcb5 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java @@ -46,7 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditConfig; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Lock; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.get.config.output.Data; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscription; @@ -164,7 +164,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest { @BeforeClass public static void beforeClass() { PARTIAL_SCHEMA = BindingRuntimeHelpers.createEffectiveModel(NetconfState.class); - SCHEMA = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfState.class, + SCHEMA = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfState.class, NetconfConfigChange.class); ACTION_SCHEMA = YangParserTestUtils.parseYangResources(NetconfMessageTransformerTest.class, "/schemas/example-server-farm.yang","/schemas/example-server-farm-2.yang", @@ -421,7 +421,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest { .node(NetconfState.QNAME).node(Schemas.QNAME).node(Schema.QNAME) .nodeWithKey(Schema.QNAME, keys).build(); final var editConfigStructure = - createEditConfigStructure(BASE_SCHEMAS.baseSchemaWithNotifications().getEffectiveModelContext(), id, + createEditConfigStructure(BASE_SCHEMAS.baseSchemaWithNotifications().modelContext(), id, Optional.empty(), Optional.ofNullable(schemaNode)); final var target = NetconfBaseOps.getTargetNode(NETCONF_CANDIDATE_NODEID); @@ -1173,7 +1173,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest { YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().append(nodeIdentifiers).build(); DOMDataTreeIdentifier domDataTreeIdentifier = - new DOMDataTreeIdentifier(org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION, + DOMDataTreeIdentifier.of(org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION, yangInstanceIdentifier); return domDataTreeIdentifier; } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformerTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformerTest.java index 1b9ffa76be..a2ceb77bcc 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformerTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/SchemalessRpcStructureTransformerTest.java @@ -95,7 +95,7 @@ public class SchemalessRpcStructureTransformerTest { @Test public void testCreateEditConfigStructure() throws Exception { - DOMSourceAnyxmlNode data = Builders.anyXmlBuilder() + final var data = Builders.anyXmlBuilder() .withNodeIdentifier(createNodeId(path.getLastPathArgument().getNodeType().getLocalName())) .withValue(source) .build(); diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/MountInstanceTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/MountInstanceTest.java index 1b08d398d6..e590e80a80 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/MountInstanceTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/MountInstanceTest.java @@ -31,7 +31,7 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices.Rpcs; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; @@ -61,7 +61,7 @@ public class MountInstanceTest { @BeforeClass public static void suiteSetUp() throws Exception { - SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class); + SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class); } @Before diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java index d992e472f7..7153f05f5d 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java @@ -40,7 +40,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditConfig; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Lock; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Unlock; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; @@ -61,7 +61,7 @@ public class NetconfDataTreeServiceImplTest extends AbstractTestModelTest { public void setUp() { doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(rpcService).invokeNetconf(any(), any()); netconService = getNetconService(); - final var model = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfState.class); + final var model = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfState.class); netconfMessageTransformer = new NetconfMessageTransformer(MountPointContext.of(model), true, BASE_SCHEMAS.baseSchema()); } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java index b66e3560c6..e2aadcf9ca 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java @@ -39,7 +39,7 @@ import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadTransaction; import org.opendaylight.netconf.dom.api.tx.NetconfDOMFieldsReadWriteTransaction; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Get; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.GetConfig; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netconf.monitoring.rev220718.NetconfTcp; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext; @@ -55,7 +55,7 @@ public class NetconfDeviceDataBrokerTest { @BeforeClass public static void beforeClass() { - SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class, NetconfTcp.class); + SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class, NetconfTcp.class); } @AfterClass @@ -100,8 +100,7 @@ public class NetconfDeviceDataBrokerTest { @Test public void testDOMFieldsExtensions() { - final NetconfDOMDataBrokerFieldsExtension fieldsExtension = dataBroker.getExtensions().getInstance( - NetconfDOMDataBrokerFieldsExtension.class); + final var fieldsExtension = dataBroker.extension(NetconfDOMDataBrokerFieldsExtension.class); assertNotNull(fieldsExtension); // read-only transaction diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationServiceTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationServiceTest.java index 2d3fc9b6a5..3bf3973165 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationServiceTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceNotificationServiceTest.java @@ -7,7 +7,6 @@ */ package org.opendaylight.netconf.client.mdsal.spi; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -20,7 +19,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.mdsal.dom.api.DOMNotificationListener; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; @@ -39,7 +38,7 @@ class NetconfDeviceNotificationServiceTest { private DOMNotification notification2; private final NetconfDeviceNotificationService service = new NetconfDeviceNotificationService(); - private ListenerRegistration registration; + private Registration registration; @BeforeEach void beforeEach() throws Exception { @@ -65,7 +64,6 @@ class NetconfDeviceNotificationServiceTest { @Test void testCloseRegistration() throws Exception { service.publishNotification(notification2); - assertEquals(listener2, registration.getInstance()); registration.close(); service.publishNotification(notification2); verify(listener2, times(1)).onNotification(notification2); diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceRpcTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceRpcTest.java index 1d319e8bf5..70d1e8ce71 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceRpcTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceRpcTest.java @@ -39,7 +39,7 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceCommunicator; import org.opendaylight.netconf.client.mdsal.api.RpcTransformer; import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformUtil; import org.opendaylight.netconf.client.mdsal.impl.NetconfMessageTransformer; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; @@ -68,7 +68,7 @@ public class NetconfDeviceRpcTest extends AbstractBaseSchemasTest { @BeforeClass public static void beforeClass() { - SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfService.class); + SCHEMA_CONTEXT = BindingRuntimeHelpers.createEffectiveModel(IetfNetconfData.class); } @AfterClass diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTxTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTxTest.java index 82f1336358..9e7a0bf3ed 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTxTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/ReadWriteTxTest.java @@ -78,7 +78,7 @@ public class ReadWriteTxTest { @Test public void getIdentifier() throws Exception { - final ReadWriteTx tx2 = new ReadWriteTx<>(null, null); + final ReadWriteTx tx2 = new ReadWriteTx<>(delegateReadTx, delegateWriteTx); assertNotEquals(tx.getIdentifier(), tx2.getIdentifier()); } } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/TxChainTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/TxChainTest.java index 3fd48f69c1..0bb132992a 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/TxChainTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/TxChainTest.java @@ -13,6 +13,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.google.common.util.concurrent.FutureCallback; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,15 +25,15 @@ import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.common.Empty; @RunWith(MockitoJUnitRunner.StrictStubs.class) public class TxChainTest { @Mock private DOMDataBroker broker; @Mock - private DOMTransactionChainListener listener; + private FutureCallback listener; @Mock private DOMDataTreeReadTransaction readOnlyTx; @Mock @@ -59,7 +60,8 @@ public class TxChainTest { when(writeOnlyTx1.addListener(any())).thenReturn(registration1); when(writeOnlyTx2.addListener(any())).thenReturn(registration2); when(writeOnlyTx3.addListener(any())).thenReturn(registration3); - chain = new TxChain(broker, listener); + chain = new TxChain(broker); + chain.addCallback(listener); } @Test @@ -107,7 +109,7 @@ public class TxChainTest { @Test public void testCloseAfterFinished() { chain.close(); - verify(listener).onTransactionChainSuccessful(chain); + verify(listener).onSuccess(Empty.value()); assertThrows(DOMTransactionChainClosedException.class, chain::newReadOnlyTransaction); } @@ -119,7 +121,7 @@ public class TxChainTest { final TransactionCommitFailedException cause = new TransactionCommitFailedException("fail"); captor.getValue().onTransactionFailed(writeOnlyTx1, cause); verify(registration1).close(); - verify(listener).onTransactionChainFailed(chain, writeOnlyTx1, cause); + verify(listener).onFailure(cause); } @Test @@ -130,7 +132,7 @@ public class TxChainTest { writeTx.commit(); captor.getValue().onTransactionSuccessful(writeOnlyTx1); verify(registration1).close(); - verify(listener).onTransactionChainSuccessful(chain); + verify(listener).onSuccess(Empty.value()); } @Test @@ -146,7 +148,7 @@ public class TxChainTest { public void testMultiplePendingTransactions() { //create 1st tx final AbstractWriteTx writeTx1 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor1 = ArgumentCaptor.forClass(TxListener.class); + final var captor1 = ArgumentCaptor.forClass(TxListener.class); verify(writeOnlyTx1).addListener(captor1.capture()); //submit 1st tx writeTx1.commit(); @@ -154,7 +156,7 @@ public class TxChainTest { //create 2nd tx final AbstractWriteTx writeTx2 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor2 = ArgumentCaptor.forClass(TxListener.class); + final var captor2 = ArgumentCaptor.forClass(TxListener.class); verify(writeTx2).addListener(captor2.capture()); //submit 2nd tx writeTx2.commit(); @@ -162,7 +164,7 @@ public class TxChainTest { //create 3rd tx final AbstractWriteTx writeTx3 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor3 = ArgumentCaptor.forClass(TxListener.class); + final var captor3 = ArgumentCaptor.forClass(TxListener.class); verify(writeTx3).addListener(captor3.capture()); //cancel 3rd tx writeTx3.cancel(); @@ -178,14 +180,14 @@ public class TxChainTest { verify(registration1).close(); verify(registration2).close(); verify(registration3).close(); - verify(listener).onTransactionChainSuccessful(chain); + verify(listener).onSuccess(Empty.value()); } @Test public void testMultiplePendingTransactionsFail() { //create 1st tx final AbstractWriteTx writeTx1 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor1 = ArgumentCaptor.forClass(TxListener.class); + final var captor1 = ArgumentCaptor.forClass(TxListener.class); verify(writeOnlyTx1).addListener(captor1.capture()); //submit 1st tx writeTx1.commit(); @@ -193,7 +195,7 @@ public class TxChainTest { //create 2nd tx final AbstractWriteTx writeTx2 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor2 = ArgumentCaptor.forClass(TxListener.class); + final var captor2 = ArgumentCaptor.forClass(TxListener.class); verify(writeTx2).addListener(captor2.capture()); //submit 2nd tx writeTx2.commit(); @@ -201,7 +203,7 @@ public class TxChainTest { //create 3rd tx final AbstractWriteTx writeTx3 = chain.newWriteOnlyTransaction(); - final ArgumentCaptor captor3 = ArgumentCaptor.forClass(TxListener.class); + final var captor3 = ArgumentCaptor.forClass(TxListener.class); verify(writeTx3).addListener(captor3.capture()); chain.close(); @@ -218,8 +220,8 @@ public class TxChainTest { verify(registration1).close(); verify(registration2).close(); verify(registration3).close(); - verify(listener).onTransactionChainFailed(chain, writeOnlyTx1, cause1); + verify(listener).onFailure(cause1); // 1 transaction failed, onTransactionChainSuccessful must not be called - verify(listener, never()).onTransactionChainSuccessful(chain); + verify(listener, never()).onSuccess(any()); } } diff --git a/plugins/netconf-common-mdsal/src/main/java/org/opendaylight/netconf/common/mdsal/ProxyMountPointContext.java b/plugins/netconf-common-mdsal/src/main/java/org/opendaylight/netconf/common/mdsal/ProxyMountPointContext.java index e41231ba77..f066144953 100644 --- a/plugins/netconf-common-mdsal/src/main/java/org/opendaylight/netconf/common/mdsal/ProxyMountPointContext.java +++ b/plugins/netconf-common-mdsal/src/main/java/org/opendaylight/netconf/common/mdsal/ProxyMountPointContext.java @@ -33,8 +33,8 @@ final class ProxyMountPointContext implements Delegator, Moun } @Override - public EffectiveModelContext getEffectiveModelContext() { - return new ProxyEffectiveModelContext(delegate.getEffectiveModelContext()); + public EffectiveModelContext modelContext() { + return new ProxyEffectiveModelContext(delegate.modelContext()); } @Override diff --git a/plugins/netconf-common-mdsal/src/test/java/org/opendaylight/netconf/common/mdsal/NormalizedDataUtilTest.java b/plugins/netconf-common-mdsal/src/test/java/org/opendaylight/netconf/common/mdsal/NormalizedDataUtilTest.java index a5e33ef82c..9008e06e31 100644 --- a/plugins/netconf-common-mdsal/src/test/java/org/opendaylight/netconf/common/mdsal/NormalizedDataUtilTest.java +++ b/plugins/netconf-common-mdsal/src/test/java/org/opendaylight/netconf/common/mdsal/NormalizedDataUtilTest.java @@ -14,10 +14,10 @@ import javax.xml.transform.dom.DOMResult; import org.junit.Test; import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.netconf.api.xml.XmlUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.$YangModuleInfoImpl; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session; +import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -31,7 +31,7 @@ import org.xmlunit.diff.ElementSelectors; public class NormalizedDataUtilTest { @Test public void testWriteNormalizedNode() throws Exception { - final var context = BindingRuntimeHelpers.createEffectiveModel(List.of($YangModuleInfoImpl.getInstance())); + final var context = BindingRuntimeHelpers.createEffectiveModel(List.of(YangModuleInfoImpl.getInstance())); final var result = new DOMResult(XmlUtil.newDocument()); NormalizedDataUtil.writeNormalizedNode(Builders.containerBuilder() .withNodeIdentifier(new NodeIdentifier(Sessions.QNAME)) diff --git a/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/NetconfDataTreeService.java b/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/NetconfDataTreeService.java index 5bad78aa2a..defedda832 100644 --- a/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/NetconfDataTreeService.java +++ b/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/NetconfDataTreeService.java @@ -25,7 +25,14 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; * The {@code } operation is extended according its attributes (merge, replace, create, delete, remove), as * per RFC6241. */ -public interface NetconfDataTreeService extends DOMService { +public interface NetconfDataTreeService extends DOMService { + /** + * Type capture of a {@link DOMService.Extension} applicable to {@link NetconfDataTreeService} implementations. + */ + interface Extension extends DOMService.Extension { + // Marker interface + } + /** * Return device identifier. * diff --git a/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/tx/NetconfDOMDataBrokerFieldsExtension.java b/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/tx/NetconfDOMDataBrokerFieldsExtension.java index 846e5f0c48..76e6a816ad 100644 --- a/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/tx/NetconfDOMDataBrokerFieldsExtension.java +++ b/plugins/netconf-dom-api/src/main/java/org/opendaylight/netconf/dom/api/tx/NetconfDOMDataBrokerFieldsExtension.java @@ -8,13 +8,12 @@ package org.opendaylight.netconf.dom.api.tx; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.Extension; /** * DOM data broker extension with an option to read only selected fields under parent data node. */ -public interface NetconfDOMDataBrokerFieldsExtension extends DOMDataBrokerExtension { +public interface NetconfDOMDataBrokerFieldsExtension extends Extension { /** * Create a new read-only transaction with an option to read only selected fields from target data node. * @@ -32,9 +31,7 @@ public interface NetconfDOMDataBrokerFieldsExtension extends DOMDataBrokerExtens /** * Create a new transaction chain with an option to read only selected fields from target data node. * - * @param listener Transaction chain event listener. * @return A new transaction chain. - * @throws NullPointerException if {@code listener} is null */ - @NonNull NetconfDOMFieldsTransactionChain createTransactionChain(DOMTransactionChainListener listener); + @NonNull NetconfDOMFieldsTransactionChain createTransactionChain(); } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/CurrentSchemaContext.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/CurrentSchemaContext.java index 7bb366c124..00922910e8 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/CurrentSchemaContext.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/CurrentSchemaContext.java @@ -15,31 +15,29 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.netconf.server.api.monitoring.CapabilityListener; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; // Non-final for mocking @SuppressWarnings("checkstyle:FinalClass") -public class CurrentSchemaContext implements EffectiveModelContextListener, AutoCloseable { +public class CurrentSchemaContext implements AutoCloseable { private final AtomicReference currentContext = new AtomicReference<>(); private final Set listeners = Collections.synchronizedSet(new HashSet<>()); - private final SchemaSourceProvider rootSchemaSourceProvider; + private final YangTextSourceExtension yangTextSourceExtension; private Registration schemaContextListenerListenerRegistration; - private CurrentSchemaContext(final SchemaSourceProvider rootSchemaSourceProvider) { - this.rootSchemaSourceProvider = rootSchemaSourceProvider; + private CurrentSchemaContext(final YangTextSourceExtension yangTextSourceExtension) { + this.yangTextSourceExtension = yangTextSourceExtension; } // keep spotbugs from complaining about overridable method in constructor public static CurrentSchemaContext create(final DOMSchemaService schemaService, - final SchemaSourceProvider rootSchemaSourceProvider) { - var context = new CurrentSchemaContext(rootSchemaSourceProvider); - final Registration registration = schemaService.registerSchemaContextListener(context); + final YangTextSourceExtension yangTextSourceExtension) { + var context = new CurrentSchemaContext(yangTextSourceExtension); + final var registration = schemaService.registerSchemaContextListener(context::onModelContextUpdated); context.setRegistration(registration); return context; } @@ -54,12 +52,11 @@ public class CurrentSchemaContext implements EffectiveModelContextListener, Auto return ret; } - @Override - public void onModelContextUpdated(final EffectiveModelContext schemaContext) { + private void onModelContextUpdated(final EffectiveModelContext schemaContext) { currentContext.set(schemaContext); // FIXME is notifying all the listeners from this callback wise ? final var addedCaps = MdsalNetconfOperationServiceFactory.transformCapabilities(schemaContext, - rootSchemaSourceProvider); + yangTextSourceExtension); for (var listener : listeners) { listener.onCapabilitiesChanged(addedCaps, Set.of()); } @@ -74,7 +71,7 @@ public class CurrentSchemaContext implements EffectiveModelContextListener, Auto public Registration registerCapabilityListener(final CapabilityListener listener) { listener.onCapabilitiesChanged(MdsalNetconfOperationServiceFactory.transformCapabilities(currentContext.get(), - rootSchemaSourceProvider), Set.of()); + yangTextSourceExtension), Set.of()); listeners.add(listener); return () -> listeners.remove(listener); } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/DOMDataTransactionValidator.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/DOMDataTransactionValidator.java index e7cfca5165..bda397a5b7 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/DOMDataTransactionValidator.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/DOMDataTransactionValidator.java @@ -11,21 +11,20 @@ import com.google.common.annotations.Beta; import com.google.common.util.concurrent.FluentFuture; import java.io.Serial; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; +import org.opendaylight.mdsal.dom.api.DOMDataBroker.Extension; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; -import org.opendaylight.mdsal.dom.api.DOMServiceExtension; import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.OperationFailedException; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; /** - * A {@link DOMServiceExtension} which allows users to provide Validate capability for {@link DOMDataBroker}. + * A {@link DOMDataBroker} {@link Extension} which allows users to provide Validate capability. * *

    See RFC4741 section 8.6 for details. */ @Beta -public interface DOMDataTransactionValidator extends DOMDataBrokerExtension { +public interface DOMDataTransactionValidator extends Extension { /** * Validates state of the data tree associated with the provided {@link DOMDataTreeWriteTransaction}. * diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java index 75bcf3ed80..2347901618 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java @@ -17,7 +17,7 @@ import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.server.api.monitoring.BasicCapability; import org.opendaylight.netconf.server.api.monitoring.Capability; @@ -31,9 +31,7 @@ import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.ModuleLike; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -50,7 +48,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati private final DOMRpcService rpcService; private final CurrentSchemaContext currentSchemaContext; - private final SchemaSourceProvider rootSchemaSourceProviderDependency; + private final YangTextSourceExtension yangTextSourceExtension; private final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener; @Activate @@ -62,10 +60,8 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati this.rpcService = requireNonNull(rpcService); this.netconfOperationServiceFactoryListener = requireNonNull(netconfOperationServiceFactoryListener); - rootSchemaSourceProviderDependency = schemaService.getExtensions() - .getInstance(DOMYangTextSourceProvider.class); - currentSchemaContext = CurrentSchemaContext.create(requireNonNull(schemaService), - rootSchemaSourceProviderDependency); + yangTextSourceExtension = schemaService.extension(YangTextSourceExtension.class); + currentSchemaContext = CurrentSchemaContext.create(requireNonNull(schemaService), yangTextSourceExtension); netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this); } @@ -84,12 +80,12 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati @Override public Set getCapabilities() { // FIXME: cache returned set - return transformCapabilities(currentSchemaContext.getCurrentContext(), rootSchemaSourceProviderDependency); + return transformCapabilities(currentSchemaContext.getCurrentContext(), yangTextSourceExtension); } // FIXME: ImmutableSet static Set transformCapabilities(final EffectiveModelContext currentContext, - final SchemaSourceProvider rootSchemaSourceProviderDependency) { + final YangTextSourceExtension rootSchemaSourceProviderDependency) { final var capabilities = new HashSet(); // Added by netconf-impl by default @@ -107,7 +103,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati } private static Optional moduleToCapability(final ModuleLike module, - final SchemaSourceProvider rootSchemaSourceProviderDependency) { + final YangTextSourceExtension yangTextSourceExtension) { final String moduleNamespace = module.getNamespace().toString(); final String moduleName = module.getName(); final String revision = module.getRevision().map(Revision::toString).orElse(null); @@ -115,7 +111,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati String source; try { - source = rootSchemaSourceProviderDependency.getSource(moduleSourceIdentifier).get().read(); + source = yangTextSourceExtension.getYangTexttSource(moduleSourceIdentifier).get().read(); } catch (ExecutionException | InterruptedException | IOException e) { LOG.warn("Ignoring source for module {}. Unable to read content", moduleSourceIdentifier, e); source = null; @@ -133,7 +129,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati @Override public Registration registerCapabilityListener(final CapabilityListener listener) { // Advertise validate capability only if DOMDataBroker provides DOMDataTransactionValidator - if (dataBroker.getExtensions().get(DOMDataTransactionValidator.class) != null) { + if (dataBroker.extension(DOMDataTransactionValidator.class) != null) { // FIXME: support VALIDATE_1_1 as well! listener.onCapabilitiesChanged(Set.of(VALIDATE_CAPABILITY), Set.of()); } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/TransactionProvider.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/TransactionProvider.java index 11bfb7b2a5..2ea038e2b5 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/TransactionProvider.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/TransactionProvider.java @@ -37,7 +37,7 @@ public final class TransactionProvider implements AutoCloseable { public TransactionProvider(final DOMDataBroker dataBroker, final SessionIdType sessionId) { this.dataBroker = dataBroker; this.sessionId = sessionId; - transactionValidator = dataBroker.getExtensions().getInstance(DOMDataTransactionValidator.class); + transactionValidator = dataBroker.extension(DOMDataTransactionValidator.class); } @Override diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducer.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducer.java index 92e0f34419..b0211e473f 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducer.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducer.java @@ -9,10 +9,9 @@ package org.opendaylight.netconf.server.mdsal.notifications; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -import java.util.Collection; +import java.util.List; import java.util.Set; 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; @@ -25,7 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChangeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.ChangedByBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.changed.by.server.or.user.ServerBuilder; -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.osgi.service.component.annotations.Activate; @@ -43,15 +42,15 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang private static final Logger LOG = LoggerFactory.getLogger(CapabilityChangeNotificationProducer.class); private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration; - private final ListenerRegistration capabilityChangeListenerRegistration; + private final Registration capabilityChangeListenerRegistration; @Activate public CapabilityChangeNotificationProducer( @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, @Reference final DataBroker dataBroker) { baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher(); - capabilityChangeListenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, + capabilityChangeListenerRegistration = dataBroker.registerTreeChangeListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetconfState.class).child(Capabilities.class).build()), this); } @@ -67,14 +66,14 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final DataObjectModification.ModificationType modificationType = rootNode.getModificationType(); + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var rootNode = change.getRootNode(); + final var modificationType = rootNode.modificationType(); switch (modificationType) { case WRITE: { - final Capabilities dataAfter = rootNode.getDataAfter(); - final Capabilities dataBefore = rootNode.getDataBefore(); + final Capabilities dataAfter = rootNode.dataAfter(); + final Capabilities dataBefore = rootNode.dataBefore(); final Set before = dataBefore != null ? ImmutableSet.copyOf(dataBefore.getCapability()) : Set.of(); final Set after = dataAfter != null ? ImmutableSet.copyOf(dataAfter.getCapability()) @@ -85,7 +84,7 @@ public final class CapabilityChangeNotificationProducer implements DataTreeChang break; } case DELETE: { - final Capabilities dataBeforeDelete = rootNode.getDataBefore(); + final Capabilities dataBeforeDelete = rootNode.dataBefore(); if (dataBeforeDelete != null) { final Set removed = ImmutableSet.copyOf(dataBeforeDelete.getCapability()); publishNotification(Set.of(), removed); diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/NotificationsTransformUtil.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/NotificationsTransformUtil.java index 3df435c9c6..1d45d31fc4 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/NotificationsTransformUtil.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/NotificationsTransformUtil.java @@ -33,15 +33,15 @@ import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.w3c.dom.Document; final class NotificationsTransformUtil { - private final EffectiveModelContext schemaContext; + private final EffectiveModelContext modelContext; private final BindingNormalizedNodeSerializer serializer; NotificationsTransformUtil(final YangParserFactory parserFactory, final BindingRuntimeGenerator generator, final BindingDOMCodecFactory codecFactory) throws YangParserException { final var ctx = BindingRuntimeHelpers.createRuntimeContext(parserFactory, generator, Netconf.class, NetconfConfigChange.class, YangLibraryChange.class, YangLibraryUpdate.class); - schemaContext = ctx.getEffectiveModelContext(); - verify(schemaContext.getOperations().stream() + modelContext = ctx.modelContext(); + verify(modelContext.getOperations().stream() .filter(input -> input.getQName().getLocalName().equals(CreateSubscription.CREATE_SUBSCRIPTION)) .findFirst() .isPresent()); @@ -56,7 +56,7 @@ final class NotificationsTransformUtil { final var containerNode = serializer.toNormalizedNodeNotification(notification); final var result = new DOMResult(XmlUtil.newDocument()); try { - NormalizedDataUtil.writeNormalizedNode(containerNode, result, schemaContext, path); + NormalizedDataUtil.writeNormalizedNode(containerNode, result, modelContext, path); } catch (final XMLStreamException | IOException e) { throw new IllegalStateException("Unable to serialize " + notification, e); } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducer.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducer.java index 7165729ff7..f2081ecfaa 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducer.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducer.java @@ -7,9 +7,8 @@ */ package org.opendaylight.netconf.server.mdsal.notifications; -import java.util.Collection; +import java.util.List; 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; @@ -22,7 +21,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder; -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; @@ -39,7 +38,7 @@ public final class SessionNotificationProducer implements DataTreeChangeListener private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class); private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration; - private final ListenerRegistration sessionListenerRegistration; + private final Registration sessionListenerRegistration; @Activate public SessionNotificationProducer( @@ -47,7 +46,7 @@ public final class SessionNotificationProducer implements DataTreeChangeListener @Reference final DataBroker dataBroker) { baseNotificationPublisherRegistration = notifManager.registerBaseNotificationPublisher(); sessionListenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(NetconfState.class).child(Sessions.class).child(Session.class).build()), this); } @@ -64,19 +63,19 @@ public final class SessionNotificationProducer implements DataTreeChangeListener } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - final DataObjectModification rootNode = change.getRootNode(); - final DataObjectModification.ModificationType modificationType = rootNode.getModificationType(); + public void onDataTreeChanged(final List> changes) { + for (var change : changes) { + final var rootNode = change.getRootNode(); + final var modificationType = rootNode.modificationType(); switch (modificationType) { case WRITE: - final Session created = rootNode.getDataAfter(); - if (created != null && rootNode.getDataBefore() == null) { + final Session created = rootNode.dataAfter(); + if (created != null && rootNode.dataBefore() == null) { publishStartedSession(created); } break; case DELETE: - final Session removed = rootNode.getDataBefore(); + final Session removed = rootNode.dataBefore(); if (removed != null) { publishEndedSession(removed); } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducer.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducer.java index 35b1e5fc33..198acf82e7 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducer.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducer.java @@ -7,17 +7,15 @@ */ package org.opendaylight.netconf.server.mdsal.notifications; -import java.util.Collection; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; +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.netconf.server.api.notifications.NetconfNotificationCollector; import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChangeBuilder; -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; @@ -33,8 +31,8 @@ import org.osgi.service.component.annotations.Reference; */ @Component(service = { }) @Deprecated(forRemoval = true) -public final class YangLibraryNotificationProducer implements DataTreeChangeListener, AutoCloseable { - private final ListenerRegistration yangLibraryChangeListenerRegistration; +public final class YangLibraryNotificationProducer implements DataListener, AutoCloseable { + private final Registration yangLibraryChangeListenerRegistration; private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration; @Activate @@ -42,8 +40,8 @@ public final class YangLibraryNotificationProducer implements DataTreeChangeList @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, @Reference final DataBroker dataBroker) { yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher(); - yangLibraryChangeListenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ModulesState.class)), + yangLibraryChangeListenerRegistration = dataBroker.registerDataListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ModulesState.class)), this); } @@ -59,14 +57,11 @@ public final class YangLibraryNotificationProducer implements DataTreeChangeList } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - final ModulesState dataAfter = change.getRootNode().getDataAfter(); - if (dataAfter != null) { - yangLibraryPublisherRegistration.onYangLibraryChange(new YangLibraryChangeBuilder() - .setModuleSetId(dataAfter.getModuleSetId()) - .build()); - } + public void dataChangedTo(final ModulesState data) { + if (data != null) { + yangLibraryPublisherRegistration.onYangLibraryChange(new YangLibraryChangeBuilder() + .setModuleSetId(data.getModuleSetId()) + .build()); } } } diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerRFC8525.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerRFC8525.java index ee61c9a940..2125c86239 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerRFC8525.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerRFC8525.java @@ -7,17 +7,15 @@ */ package org.opendaylight.netconf.server.mdsal.notifications; -import java.util.Collection; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; +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.netconf.server.api.notifications.NetconfNotificationCollector; import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdateBuilder; -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; @@ -31,8 +29,8 @@ import org.osgi.service.component.annotations.Reference; */ @Component(service = { }) public final class YangLibraryNotificationProducerRFC8525 - implements DataTreeChangeListener, AutoCloseable { - private final ListenerRegistration yangLibraryChangeListenerRegistration; + implements DataListener, AutoCloseable { + private final Registration yangLibraryChangeListenerRegistration; private final YangLibraryPublisherRegistration yangLibraryPublisherRegistration; @Activate @@ -40,8 +38,8 @@ public final class YangLibraryNotificationProducerRFC8525 @Reference(target = "(type=netconf-notification-manager)") final NetconfNotificationCollector notifManager, @Reference final DataBroker dataBroker) { yangLibraryPublisherRegistration = notifManager.registerYangLibraryPublisher(); - yangLibraryChangeListenerRegistration = dataBroker.registerDataTreeChangeListener( - DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(YangLibrary.class)), + yangLibraryChangeListenerRegistration = dataBroker.registerDataListener( + DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(YangLibrary.class)), this); } @@ -57,14 +55,11 @@ public final class YangLibraryNotificationProducerRFC8525 } @Override - public void onDataTreeChanged(final Collection> changes) { - for (DataTreeModification change : changes) { - final YangLibrary dataAfter = change.getRootNode().getDataAfter(); - if (dataAfter != null) { - yangLibraryPublisherRegistration.onYangLibraryUpdate(new YangLibraryUpdateBuilder() - .setContentId(dataAfter.getContentId()) - .build()); - } + public void dataChangedTo(final YangLibrary data) { + if (data != null) { + yangLibraryPublisherRegistration.onYangLibraryUpdate(new YangLibraryUpdateBuilder() + .setContentId(data.getContentId()) + .build()); } } } diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducerTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducerTest.java index b21813e7a9..4ce0757f96 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducerTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/CapabilityChangeNotificationProducerTest.java @@ -37,7 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChangeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.ChangedByBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.changed.by.server.or.user.ServerBuilder; -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.common.Empty; @@ -47,7 +47,7 @@ public class CapabilityChangeNotificationProducerTest { @Mock private BaseNotificationPublisherRegistration baseNotificationPublisherRegistration; @Mock - private ListenerRegistration listenerRegistration; + private Registration listenerRegistration; @Mock private NetconfNotificationCollector netconfNotificationCollector; @Mock @@ -57,7 +57,7 @@ public class CapabilityChangeNotificationProducerTest { @Before public void setUp() { - doReturn(listenerRegistration).when(dataBroker).registerDataTreeChangeListener(any(DataTreeIdentifier.class), + doReturn(listenerRegistration).when(dataBroker).registerTreeChangeListener(any(DataTreeIdentifier.class), any(DataTreeChangeListener.class)); doNothing().when(baseNotificationPublisherRegistration).onCapabilityChanged(any(NetconfCapabilityChange.class)); @@ -109,10 +109,10 @@ public class CapabilityChangeNotificationProducerTest { final NetconfCapabilityChange expectedChange) { final DataTreeModification treeChange2 = mock(DataTreeModification.class); final DataObjectModification objectChange2 = mock(DataObjectModification.class); - doReturn(modificationType).when(objectChange2).getModificationType(); + doReturn(modificationType).when(objectChange2).modificationType(); doReturn(objectChange2).when(treeChange2).getRootNode(); - doReturn(originalCapabilities).when(objectChange2).getDataBefore(); - doReturn(updatedCapabilities).when(objectChange2).getDataAfter(); + doReturn(originalCapabilities).when(objectChange2).dataBefore(); + doReturn(updatedCapabilities).when(objectChange2).dataAfter(); capabilityChangeNotificationProducer.onDataTreeChanged(List.of(treeChange2)); verify(baseNotificationPublisherRegistration).onCapabilityChanged(expectedChange); } diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducerTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducerTest.java index aa639b0f32..8b273e951f 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducerTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/SessionNotificationProducerTest.java @@ -89,9 +89,9 @@ public class SessionNotificationProducerTest { final DataObjectModification changeObject = mock(DataObjectModification.class); final Session sessionBefore = createSessionWithInRpcCount(Uint32.ONE, Uint32.ZERO); final Session sessionAfter = createSessionWithInRpcCount(Uint32.ONE, Uint32.ONE); - doReturn(sessionBefore).when(changeObject).getDataBefore(); - doReturn(sessionAfter).when(changeObject).getDataAfter(); - doReturn(ModificationType.WRITE).when(changeObject).getModificationType(); + doReturn(sessionBefore).when(changeObject).dataBefore(); + doReturn(sessionAfter).when(changeObject).dataAfter(); + doReturn(ModificationType.WRITE).when(changeObject).modificationType(); doReturn(changeObject).when(treeChange).getRootNode(); publisher.onDataTreeChanged(List.of(treeChange)); //session didn't start, only stats changed. No notification should be produced @@ -132,16 +132,16 @@ public class SessionNotificationProducerTest { final DataObjectModification changeObject = mock(DataObjectModification.class); switch (type) { case WRITE: - doReturn(null).when(changeObject).getDataBefore(); - doReturn(session).when(changeObject).getDataAfter(); + doReturn(null).when(changeObject).dataBefore(); + doReturn(session).when(changeObject).dataAfter(); break; case DELETE: - doReturn(session).when(changeObject).getDataBefore(); + doReturn(session).when(changeObject).dataBefore(); break; default: LOG.debug("Received intentionally unhandled type: {}.", type); } - doReturn(type).when(changeObject).getModificationType(); + doReturn(type).when(changeObject).modificationType(); doReturn(changeObject).when(treeChange).getRootNode(); return treeChange; } diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTest.java index b85183d0df..ba06046520 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTest.java @@ -10,26 +10,20 @@ package org.opendaylight.netconf.server.mdsal.notifications; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataObjectModification; -import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.netconf.server.api.notifications.NetconfNotificationCollector; import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesStateBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChange; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryChangeBuilder; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; @RunWith(MockitoJUnitRunner.StrictStubs.class) public class YangLibraryNotificationProducerTest { @@ -40,7 +34,7 @@ public class YangLibraryNotificationProducerTest { @Mock private DataBroker dataBroker; @Mock - private ListenerRegistration registration; + private Registration registration; private YangLibraryNotificationProducer yangLibraryNotificationProducer; @@ -49,25 +43,19 @@ public class YangLibraryNotificationProducerTest { doNothing().when(yangLibraryPublisherRegistration).onYangLibraryChange(any(YangLibraryChange.class)); doReturn(yangLibraryPublisherRegistration).when(netconfNotificationCollector) .registerYangLibraryPublisher(); - doReturn(registration).when(dataBroker).registerDataTreeChangeListener(any(), any()); + doReturn(registration).when(dataBroker).registerDataListener(any(), any()); - yangLibraryNotificationProducer = new YangLibraryNotificationProducer(netconfNotificationCollector, - dataBroker); + yangLibraryNotificationProducer = new YangLibraryNotificationProducer(netconfNotificationCollector, dataBroker); } @Test public void testOnDataTreeChanged() { final String moduleSetId = "1"; - ModulesState modulesStateAfter = new ModulesStateBuilder().setModuleSetId(moduleSetId).build(); + final var modulesStateAfter = new ModulesStateBuilder().setModuleSetId(moduleSetId).build(); - final DataTreeModification treeChange = mock(DataTreeModification.class); - final DataObjectModification objectChange = mock(DataObjectModification.class); - doReturn(objectChange).when(treeChange).getRootNode(); - doReturn(modulesStateAfter).when(objectChange).getDataAfter(); - - YangLibraryChange yangLibraryChange = new YangLibraryChangeBuilder().setModuleSetId(moduleSetId).build(); - yangLibraryNotificationProducer.onDataTreeChanged(List.of(treeChange)); + yangLibraryNotificationProducer.dataChangedTo(modulesStateAfter); + final var yangLibraryChange = new YangLibraryChangeBuilder().setModuleSetId(moduleSetId).build(); verify(yangLibraryPublisherRegistration).onYangLibraryChange(yangLibraryChange); } } \ No newline at end of file diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTestRFC8525.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTestRFC8525.java index 2bb2efd19d..d7adab0eca 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTestRFC8525.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/notifications/YangLibraryNotificationProducerTestRFC8525.java @@ -10,25 +10,20 @@ package org.opendaylight.netconf.server.mdsal.notifications; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.DataObjectModification; -import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.netconf.server.api.notifications.NetconfNotificationCollector; import org.opendaylight.netconf.server.api.notifications.YangLibraryPublisherRegistration; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdate; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryUpdateBuilder; +import org.opendaylight.yangtools.concepts.Registration; @RunWith(MockitoJUnitRunner.StrictStubs.class) public class YangLibraryNotificationProducerTestRFC8525 { @@ -38,13 +33,16 @@ public class YangLibraryNotificationProducerTestRFC8525 { private NetconfNotificationCollector netconfNotificationCollector; @Mock private DataBroker dataBroker; + @Mock + private Registration registration; private YangLibraryNotificationProducerRFC8525 yangLibraryNotificationProducer; @Before public void setUp() { - doNothing().when(yangLibraryPublisherRegistration).onYangLibraryUpdate(any(YangLibraryUpdate.class)); + doNothing().when(yangLibraryPublisherRegistration).onYangLibraryUpdate(any()); doReturn(yangLibraryPublisherRegistration).when(netconfNotificationCollector).registerYangLibraryPublisher(); + doReturn(registration).when(dataBroker).registerDataListener(any(), any()); yangLibraryNotificationProducer = new YangLibraryNotificationProducerRFC8525(netconfNotificationCollector, dataBroker); @@ -53,16 +51,10 @@ public class YangLibraryNotificationProducerTestRFC8525 { @Test public void testOnDataTreeChanged() { final String contentId = "1"; - YangLibrary yangLibraryAfter = new YangLibraryBuilder().setContentId(contentId).build(); - final DataTreeModification treeChange = mock(DataTreeModification.class); - final DataObjectModification objectChange = mock(DataObjectModification.class); - doReturn(objectChange).when(treeChange).getRootNode(); - doReturn(yangLibraryAfter).when(objectChange).getDataAfter(); + yangLibraryNotificationProducer.dataChangedTo(new YangLibraryBuilder().setContentId(contentId).build()); YangLibraryUpdate yangLibraryUpdate = new YangLibraryUpdateBuilder().setContentId(contentId).build(); - yangLibraryNotificationProducer.onDataTreeChanged(List.of(treeChange)); - verify(yangLibraryPublisherRegistration).onYangLibraryUpdate(yangLibraryUpdate); } } \ No newline at end of file diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/AbstractNetconfOperationTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/AbstractNetconfOperationTest.java index 44a96cf8f7..c6b59d34db 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/AbstractNetconfOperationTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/AbstractNetconfOperationTest.java @@ -50,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re import org.opendaylight.yangtools.util.concurrent.SpecialExecutors; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -92,7 +92,7 @@ public abstract class AbstractNetconfOperationTest { final DOMStore configStore = InMemoryDOMDataStoreFactory.create("DOM-CFG", schemaService); currentSchemaContext = CurrentSchemaContext.create(schemaService, - sourceIdentifier -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(sourceIdentifier, + sourceIdentifier -> Futures.immediateFuture(new DelegatedYangTextSource(sourceIdentifier, CharSource.wrap("module test")))); final var datastores = new EnumMap(LogicalDatastoreType.class); diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/Bug8084.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/Bug8084.java index d3c9b684ab..015991d2b8 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/Bug8084.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/Bug8084.java @@ -12,13 +12,16 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import com.google.common.collect.ImmutableMap; -import java.math.BigDecimal; -import java.math.BigInteger; import org.junit.Test; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.server.mdsal.CurrentSchemaContext; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; +import org.opendaylight.yangtools.yang.common.Uint8; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; @@ -55,12 +58,12 @@ public class Bug8084 { .put(QName.create(BASE, "id3"), Short.valueOf("-30000")) .put(QName.create(BASE, "id4"), Integer.valueOf("-2000000000")) .put(QName.create(BASE, "id5"), Long.valueOf("-2000000000000000")) - .put(QName.create(BASE, "id6"), Short.valueOf("9")) - .put(QName.create(BASE, "id7"), Integer.valueOf("30000")) - .put(QName.create(BASE, "id8"), Long.valueOf("2000000000")) - .put(QName.create(BASE, "id9"), BigInteger.valueOf(Long.parseLong("2000000000000000"))) + .put(QName.create(BASE, "id6"), Uint8.valueOf(9)) + .put(QName.create(BASE, "id7"), Uint16.valueOf(30000)) + .put(QName.create(BASE, "id8"), Uint32.valueOf(2000000000)) + .put(QName.create(BASE, "id9"), Uint64.valueOf(2000000000000000L)) .put(QName.create(BASE, "id10"), true) - .put(QName.create(BASE, "id11"), BigDecimal.valueOf(128.55)) + .put(QName.create(BASE, "id11"), Decimal64.valueOf("128.55")) .put(id12, idExpected) .put(QName.create(BASE, "id13"), QName.create("urn:opendaylight:mdsal:mapping:test", "2015-02-26", "foo")) diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/RuntimeRpcTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/RuntimeRpcTest.java index 501b005138..77fc83c5c9 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/RuntimeRpcTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/RuntimeRpcTest.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.Serial; import java.util.Collection; import java.util.List; +import java.util.function.Consumer; import javax.xml.parsers.ParserConfigurationException; import org.custommonkey.xmlunit.DetailedDiff; import org.custommonkey.xmlunit.Diff; @@ -40,6 +41,7 @@ import org.opendaylight.mdsal.dom.api.DOMRpcException; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.xml.XmlUtil; @@ -48,8 +50,7 @@ import org.opendaylight.netconf.server.api.operations.NetconfOperationChainedExe import org.opendaylight.netconf.server.mdsal.CurrentSchemaContext; import org.opendaylight.netconf.test.util.XmlFileLoader; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.concepts.NoOpListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.ErrorSeverity; import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; @@ -61,12 +62,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,8 +94,8 @@ public class RuntimeRpcTest { } @Override - public ListenerRegistration registerRpcListener(final T listener) { - return NoOpListenerRegistration.of(listener); + public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) { + return () -> { }; } }; @@ -110,8 +109,8 @@ public class RuntimeRpcTest { } @Override - public ListenerRegistration registerRpcListener(final T listener) { - return NoOpListenerRegistration.of(listener); + public Registration registerRpcListener(final DOMRpcAvailabilityListener listener) { + return () -> { }; } }; @@ -132,8 +131,8 @@ public class RuntimeRpcTest { } @Override - public ListenerRegistration registerRpcListener(final T lsnr) { - return NoOpListenerRegistration.of(lsnr); + public Registration registerRpcListener(final DOMRpcAvailabilityListener lsnr) { + return () -> { }; } }; @@ -143,11 +142,11 @@ public class RuntimeRpcTest { @Mock private DOMSchemaService schemaService; @Mock - private EffectiveModelContextListener listener; + private Consumer listener; @Mock - private ListenerRegistration registration; + private Registration registration; @Mock - private SchemaSourceProvider sourceProvider; + private YangTextSourceExtension sourceProvider; @BeforeClass public static void beforeClass() { @@ -163,16 +162,16 @@ public class RuntimeRpcTest { public void setUp() throws Exception { doNothing().when(registration).close(); doAnswer(invocationOnMock -> { - ((EffectiveModelContextListener) invocationOnMock.getArguments()[0]).onModelContextUpdated(SCHEMA_CONTEXT); + ((Consumer) invocationOnMock.getArgument(0)).accept(SCHEMA_CONTEXT); return registration; - }).when(schemaService).registerSchemaContextListener(any(EffectiveModelContextListener.class)); + }).when(schemaService).registerSchemaContextListener(any()); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreAttributeOrder(true); - doAnswer(invocationOnMock -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource( - (SourceIdentifier) invocationOnMock.getArguments()[0], CharSource.wrap("module test")))) - .when(sourceProvider).getSource(any(SourceIdentifier.class)); + doAnswer(invocationOnMock -> Futures.immediateFuture(new DelegatedYangTextSource( + invocationOnMock.getArgument(0, SourceIdentifier.class), CharSource.wrap("module test")))) + .when(sourceProvider).getYangTexttSource(any(SourceIdentifier.class)); currentSchemaContext = CurrentSchemaContext.create(schemaService, sourceProvider); } diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/SchemaServiceStub.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/SchemaServiceStub.java index 7124ad10d2..013c846e0b 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/SchemaServiceStub.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/SchemaServiceStub.java @@ -9,14 +9,10 @@ package org.opendaylight.netconf.server.mdsal.operations; import static java.util.Objects.requireNonNull; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ImmutableClassToInstanceMap; +import java.util.function.Consumer; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension; -import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; final class SchemaServiceStub implements DOMSchemaService { private final EffectiveModelContext schemaContext; @@ -31,19 +27,10 @@ final class SchemaServiceStub implements DOMSchemaService { } @Override - public ListenerRegistration registerSchemaContextListener( - final EffectiveModelContextListener listener) { - listener.onModelContextUpdated(schemaContext); - return new AbstractListenerRegistration<>(listener) { - @Override - protected void removeRegistration() { - // No-op - } + public Registration registerSchemaContextListener(final Consumer listener) { + listener.accept(schemaContext); + return () -> { + // No-op }; } - - @Override - public ClassToInstanceMap getExtensions() { - return ImmutableClassToInstanceMap.of(); - } } diff --git a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/ValidateTest.java b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/ValidateTest.java index 1d43adcdfc..4ebfc6d61d 100644 --- a/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/ValidateTest.java +++ b/plugins/netconf-server-mdsal/src/test/java/org/opendaylight/netconf/server/mdsal/operations/ValidateTest.java @@ -18,11 +18,12 @@ import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOp import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOperationTest.executeOperation; import static org.opendaylight.netconf.server.mdsal.operations.AbstractNetconfOperationTest.verifyResponse; -import com.google.common.collect.ImmutableClassToInstanceMap; +import java.util.List; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.dom.api.DOMDataBroker; @@ -45,7 +46,7 @@ public class ValidateTest { private DOMDataTransactionValidator failingValidator; @Mock private DOMDataTreeReadWriteTransaction readWriteTx; - @Mock + @Mock(answer = Answers.CALLS_REAL_METHODS) private DOMDataBroker dataBroker; @Before @@ -114,12 +115,11 @@ public class ValidateTest { } private void whenValidatorIsNotDefined() { - doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions(); + doReturn(List.of()).when(dataBroker).supportedExtensions(); } private void whenUsingValidator(final DOMDataTransactionValidator validator) { - doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator)) - .when(dataBroker).getExtensions(); + doReturn(List.of(validator)).when(dataBroker).supportedExtensions(); } private TransactionProvider initCandidateTransaction() { diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlChildBody.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlChildBody.java index 4c843d1c10..00455db3cd 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlChildBody.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlChildBody.java @@ -65,7 +65,7 @@ public final class XmlChildBody extends ChildBody { final DataSchemaNode parentNode; if (pathInference.isEmpty()) { - parentNode = pathInference.getEffectiveModelContext(); + parentNode = pathInference.modelContext(); } else { final var hackStack = pathInference.toSchemaInferenceStack(); final var hackStmt = hackStack.currentStatement(); @@ -79,7 +79,7 @@ public final class XmlChildBody extends ChildBody { var schemaNode = parentNode; final String docRootElm = doc.getDocumentElement().getLocalName(); final XMLNamespace docRootNamespace = XMLNamespace.of(doc.getDocumentElement().getNamespaceURI()); - final var context = pathInference.getEffectiveModelContext(); + final var context = pathInference.modelContext(); final var it = context.findModuleStatements(docRootNamespace).iterator(); checkState(it.hasNext(), "Failed to find module for %s", docRootNamespace); final var qname = QName.create(it.next().localQNameModule(), docRootElm); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java index d47dafd0a7..c00fe2f994 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java @@ -87,7 +87,7 @@ public final class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBo final JsonWriter jsonWriter, final QueryParameters writerParameters, final @Nullable XMLNamespace initialNamespace) { // TODO: Performance: Cache JSON Codec factory and schema context - final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(inference.getEffectiveModelContext()); + final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(inference.modelContext()); return ParameterAwareNormalizedNodeWriter.forStreamWriter( JSONNormalizedNodeStreamWriter.createNestedWriter(codecs, inference, initialNamespace, jsonWriter), writerParameters.depth(), writerParameters.fields()); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/errors/RestconfDocumentedExceptionMapper.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/errors/RestconfDocumentedExceptionMapper.java index 73e5962ae2..77e8b06ec8 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/errors/RestconfDocumentedExceptionMapper.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/errors/RestconfDocumentedExceptionMapper.java @@ -8,7 +8,7 @@ package org.opendaylight.restconf.nb.rfc8040.jersey.providers.errors; import static java.util.Objects.requireNonNull; -import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.$YangModuleInfoImpl.qnameOf; +import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.YangModuleInfoImpl.qnameOf; import com.google.common.annotations.VisibleForTesting; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java index 286e91f032..df4ce46582 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java @@ -23,8 +23,8 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; import org.opendaylight.restconf.common.errors.SettableRestconfFuture; @@ -53,7 +53,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy { public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker, final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService, - final @Nullable DOMYangTextSourceProvider sourceProvider, + final @Nullable YangTextSourceExtension sourceProvider, final @Nullable DOMMountPointService mountPointService, final ImmutableMap localRpcs) { super(databind, localRpcs, rpcService, actionService, sourceProvider, mountPointService); @@ -62,7 +62,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy { public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker, final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService, - final @Nullable DOMYangTextSourceProvider sourceProvider, + final @Nullable YangTextSourceExtension sourceProvider, final @Nullable DOMMountPointService mountPointService) { this(databind, dataBroker, rpcService, actionService, sourceProvider, mountPointService, ImmutableMap.of()); } @@ -116,7 +116,7 @@ public final class MdsalRestconfStrategy extends RestconfStrategy { final var inference = path.inference(); final var fields = params.fields(); final var translatedFields = fields == null ? null - : WriterFieldsTranslator.translate(inference.getEffectiveModelContext(), path.schema(), fields); + : WriterFieldsTranslator.translate(inference.modelContext(), path.schema(), fields); return completeDataGET(inference, QueryParameters.of(params, translatedFields), readData(params.content(), path.instance(), params.withDefaults()), null); } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java index 0ac402ac7f..cd7186d231 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java @@ -25,8 +25,8 @@ import org.opendaylight.mdsal.common.api.ReadFailedException; import org.opendaylight.mdsal.dom.api.DOMActionService; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.restconf.api.query.ContentParam; import org.opendaylight.restconf.api.query.WithDefaultsParam; @@ -53,7 +53,7 @@ public final class NetconfRestconfStrategy extends RestconfStrategy { public NetconfRestconfStrategy(final DatabindContext databind, final NetconfDataTreeService netconfService, final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService, - final @Nullable DOMYangTextSourceProvider sourceProvider, + final @Nullable YangTextSourceExtension sourceProvider, final @Nullable DOMMountPointService mountPointService) { super(databind, ImmutableMap.of(), rpcService, actionService, sourceProvider, mountPointService); this.netconfService = requireNonNull(netconfService); @@ -89,7 +89,7 @@ public final class NetconfRestconfStrategy extends RestconfStrategy { if (fields != null) { final List tmp; try { - tmp = NetconfFieldsTranslator.translate(inference.getEffectiveModelContext(), path.schema(), fields); + tmp = NetconfFieldsTranslator.translate(inference.modelContext(), path.schema(), fields); } catch (RestconfDocumentedException e) { return RestconfFuture.failed(e); } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java index 98b767bd7b..803906f0c9 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java @@ -49,8 +49,8 @@ import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.restconf.api.ApiPath; @@ -136,13 +136,13 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; +import org.opendaylight.yangtools.yang.model.api.source.YinTextSource; import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement; -import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.api.YinTextSchemaSource; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference; import org.slf4j.Logger; @@ -188,14 +188,14 @@ public abstract class RestconfStrategy { private final @NonNull ImmutableMap localRpcs; private final @NonNull ApiPathNormalizer pathNormalizer; private final @NonNull DatabindContext databind; - private final DOMYangTextSourceProvider sourceProvider; + private final YangTextSourceExtension sourceProvider; private final DOMMountPointService mountPointService; private final DOMActionService actionService; private final DOMRpcService rpcService; RestconfStrategy(final DatabindContext databind, final ImmutableMap localRpcs, final @Nullable DOMRpcService rpcService, final @Nullable DOMActionService actionService, - final DOMYangTextSourceProvider sourceProvider, final @Nullable DOMMountPointService mountPointService) { + final YangTextSourceExtension sourceProvider, final @Nullable DOMMountPointService mountPointService) { this.databind = requireNonNull(databind); this.localRpcs = requireNonNull(localRpcs); this.rpcService = rpcService; @@ -251,7 +251,7 @@ public abstract class RestconfStrategy { final var rpcService = mountPoint.getService(DOMRpcService.class).orElse(null); final var actionService = mountPoint.getService(DOMActionService.class).orElse(null); final var sourceProvider = mountPoint.getService(DOMSchemaService.class) - .flatMap(schema -> Optional.ofNullable(schema.getExtensions().getInstance(DOMYangTextSourceProvider.class))) + .flatMap(schema -> Optional.ofNullable(schema.extension(YangTextSourceExtension.class))) .orElse(null); final var netconfService = mountPoint.getService(NetconfDataTreeService.class); @@ -1262,8 +1262,7 @@ public abstract class RestconfStrategy { return RestconfFuture.failed(e); } - return RestconfFuture.of( - new OperationsGetResult.Leaf(rpc.inference().getEffectiveModelContext(), rpc.rpc().argument())); + return RestconfFuture.of(new OperationsGetResult.Leaf(rpc.inference().modelContext(), rpc.rpc().argument())); } public @NonNull RestconfFuture operationsPOST(final URI restconfURI, final ApiPath apiPath, @@ -1326,14 +1325,14 @@ public abstract class RestconfStrategy { } public @NonNull RestconfFuture resolveSource(final SourceIdentifier source, - final Class representation) { + final Class representation) { final var src = requireNonNull(source); - if (YangTextSchemaSource.class.isAssignableFrom(representation)) { + if (YangTextSource.class.isAssignableFrom(representation)) { if (sourceProvider != null) { final var ret = new SettableRestconfFuture(); - Futures.addCallback(sourceProvider.getSource(src), new FutureCallback() { + Futures.addCallback(sourceProvider.getYangTexttSource(src), new FutureCallback<>() { @Override - public void onSuccess(final YangTextSchemaSource result) { + public void onSuccess(final YangTextSource result) { ret.set(result); } @@ -1348,7 +1347,7 @@ public abstract class RestconfStrategy { } return exportSource(modelContext(), src, YangCharSource::new, YangCharSource::new); } - if (YinTextSchemaSource.class.isAssignableFrom(representation)) { + if (YinTextSource.class.isAssignableFrom(representation)) { return exportSource(modelContext(), src, YinCharSource.OfModule::new, YinCharSource.OfSubmodule::new); } return RestconfFuture.failed(new RestconfDocumentedException( diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/DatabindContext.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/DatabindContext.java index befe466df6..3bb8035687 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/DatabindContext.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/DatabindContext.java @@ -64,7 +64,7 @@ public final class DatabindContext { } public @NonNull EffectiveModelContext modelContext() { - return mountContext.getEffectiveModelContext(); + return mountContext.modelContext(); } public @NonNull DataSchemaContextTree schemaTree() { @@ -84,7 +84,7 @@ public final class DatabindContext { } private @NonNull JSONCodecFactory createJsonCodecs() { - final var created = JSONCodecFactorySupplier.RFC7951.getShared(mountContext.getEffectiveModelContext()); + final var created = JSONCodecFactorySupplier.RFC7951.getShared(mountContext.modelContext()); final var witness = (JSONCodecFactory) JSON_CODECS.compareAndExchangeRelease(this, null, created); return witness != null ? witness : created; } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/CapabilitiesWriter.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/CapabilitiesWriter.java index be041f7619..a38c2e7212 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/CapabilitiesWriter.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/CapabilitiesWriter.java @@ -8,7 +8,7 @@ package org.opendaylight.restconf.server.mdsal; import static java.util.Objects.requireNonNull; -import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.$YangModuleInfoImpl.qnameOf; +import static org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.YangModuleInfoImpl.qnameOf; import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.FutureCallback; @@ -21,10 +21,8 @@ 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.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.restconf.api.query.AbstractReplayParam; import org.opendaylight.restconf.api.query.ChangedLeafNodesOnlyParam; import org.opendaylight.restconf.api.query.ChildNodesOnlyParam; @@ -38,12 +36,12 @@ import org.opendaylight.restconf.api.query.WithDefaultsParam; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities; import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -56,8 +54,7 @@ import org.slf4j.LoggerFactory; */ @Singleton @Component(service = { }) -public final class CapabilitiesWriter - implements AutoCloseable, EffectiveModelContextListener, DOMTransactionChainListener { +public final class CapabilitiesWriter implements AutoCloseable, FutureCallback { private static final Logger LOG = LoggerFactory.getLogger(CapabilitiesWriter.class); @VisibleForTesting @@ -78,7 +75,7 @@ public final class CapabilitiesWriter public CapabilitiesWriter(@Reference final DOMDataBroker dataBroker, @Reference final DOMSchemaService schemaService) { this.dataBroker = requireNonNull(dataBroker); - reg = schemaService.registerSchemaContextListener(this); + reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated); } @PreDestroy @@ -97,20 +94,18 @@ public final class CapabilitiesWriter } @Override - public synchronized void onTransactionChainFailed(final DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { + public synchronized void onFailure(final Throwable cause) { LOG.warn("Transaction chain failed, updates may not have been propagated", cause); txChain = null; } @Override - public synchronized void onTransactionChainSuccessful(final DOMTransactionChain chain) { + public synchronized void onSuccess(final Empty result) { LOG.debug("Transaction chain closed successfully"); txChain = null; } - @Override - public synchronized void onModelContextUpdated(final EffectiveModelContext newModelContext) { + private synchronized void onModelContextUpdated(final EffectiveModelContext newModelContext) { if (reg != null) { LOG.debug("Ignoring model context update"); return; @@ -132,7 +127,8 @@ public final class CapabilitiesWriter LOG.debug("Removing ietf-restconf-monitoring state"); if (txChain == null) { - txChain = dataBroker.createMergingTransactionChain(this); + txChain = dataBroker.createMergingTransactionChain(); + txChain.addCallback(this); } final var tx = txChain.newWriteOnlyTransaction(); @@ -159,7 +155,8 @@ public final class CapabilitiesWriter LOG.debug("Updating state of ietf-restconf-monitoring"); if (txChain == null) { - txChain = dataBroker.createMergingTransactionChain(this); + txChain = dataBroker.createMergingTransactionChain(); + txChain.addCallback(this); } final var tx = txChain.newWriteOnlyTransaction(); @@ -194,7 +191,7 @@ public final class CapabilitiesWriter */ @VisibleForTesting static @NonNull LeafSetNode mapCapabilities() { - return Builders.leafSetBuilder() + return ImmutableNodes.newSystemLeafSetBuilder() .withNodeIdentifier(CAPABILITY) .withChildValue(DepthParam.capabilityUri().toString()) .withChildValue(FieldsParam.capabilityUri().toString()) diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java index edfe86e53d..719e13081f 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java @@ -30,7 +30,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.restconf.api.ApiPath; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; @@ -68,11 +68,10 @@ import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.common.YangNames; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; -import org.opendaylight.yangtools.yang.model.repo.api.YinTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; +import org.opendaylight.yangtools.yang.model.api.source.YinTextSource; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -86,8 +85,7 @@ import org.slf4j.LoggerFactory; */ @Singleton @Component(service = { RestconfServer.class, DatabindProvider.class }) -public final class MdsalRestconfServer - implements RestconfServer, DatabindProvider, EffectiveModelContextListener, AutoCloseable { +public final class MdsalRestconfServer implements RestconfServer, DatabindProvider, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(MdsalRestconfServer.class); private static final QName YANG_LIBRARY_VERSION = QName.create(Restconf.QNAME, "yang-library-version").intern(); private static final VarHandle LOCAL_STRATEGY; @@ -106,7 +104,7 @@ public final class MdsalRestconfServer private final @NonNull DOMDataBroker dataBroker; private final @Nullable DOMRpcService rpcService; private final @Nullable DOMActionService actionService; - private final @Nullable DOMYangTextSourceProvider sourceProvider; + private final @Nullable YangTextSourceExtension sourceProvider; private final Registration reg; @@ -126,10 +124,10 @@ public final class MdsalRestconfServer this.actionService = requireNonNull(actionService); this.mountPointService = requireNonNull(mountPointService); this.localRpcs = Maps.uniqueIndex(localRpcs, RpcImplementation::qname); - sourceProvider = schemaService.getExtensions().getInstance(DOMYangTextSourceProvider.class); + sourceProvider = schemaService.extension(YangTextSourceExtension.class); localStrategy = createLocalStrategy(schemaService.getGlobalContext()); - reg = schemaService.registerSchemaContextListener(this); + reg = schemaService.registerSchemaContextListener(this::onModelContextUpdated); } public MdsalRestconfServer(final DOMSchemaService schemaService, final DOMDataBroker dataBroker, @@ -143,8 +141,7 @@ public final class MdsalRestconfServer return localStrategy().databind(); } - @Override - public void onModelContextUpdated(final EffectiveModelContext newModelContext) { + private void onModelContextUpdated(final EffectiveModelContext newModelContext) { final var local = localStrategy(); if (!newModelContext.equals(local.modelContext())) { LOCAL_STRATEGY.setRelease(this, createLocalStrategy(newModelContext)); @@ -263,33 +260,33 @@ public final class MdsalRestconfServer @Override public RestconfFuture modulesYangGET(final String fileName, final String revision) { - return modulesGET(fileName, revision, YangTextSchemaSource.class); + return modulesGET(fileName, revision, YangTextSource.class); } @Override public RestconfFuture modulesYangGET(final ApiPath mountPath, final String fileName, final String revision) { - return modulesGET(mountPath, fileName, revision, YangTextSchemaSource.class); + return modulesGET(mountPath, fileName, revision, YangTextSource.class); } @Override public RestconfFuture modulesYinGET(final String fileName, final String revision) { - return modulesGET(fileName, revision, YinTextSchemaSource.class); + return modulesGET(fileName, revision, YinTextSource.class); } @Override public RestconfFuture modulesYinGET(final ApiPath mountPath, final String fileName, final String revision) { - return modulesGET(mountPath, fileName, revision, YinTextSchemaSource.class); + return modulesGET(mountPath, fileName, revision, YinTextSource.class); } private @NonNull RestconfFuture modulesGET(final String fileName, final String revision, - final Class representation) { + final Class representation) { return modulesGET(localStrategy(), fileName, revision, representation); } private @NonNull RestconfFuture modulesGET(final ApiPath mountPath, final String fileName, - final String revision, final Class representation) { + final String revision, final Class representation) { final var mountOffset = mountPath.indexOf("yang-ext", "mount"); if (mountOffset != mountPath.steps().size() - 1) { return RestconfFuture.failed(new RestconfDocumentedException("Mount path has to end with yang-ext:mount")); @@ -307,7 +304,7 @@ public final class MdsalRestconfServer private static @NonNull RestconfFuture modulesGET(final RestconfStrategy strategy, final String moduleName, final String revisionStr, - final Class representation) { + final Class representation) { if (moduleName == null) { return RestconfFuture.failed(new RestconfDocumentedException("Module name must be supplied", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE)); @@ -379,7 +376,7 @@ public final class MdsalRestconfServer return RestconfFuture.failed(new RestconfDocumentedException("RESTCONF is not available")); } return RestconfFuture.of(new NormalizedNodePayload(stack.toInference(), - ImmutableNodes.leafNode(YANG_LIBRARY_VERSION, stack.getEffectiveModelContext() + ImmutableNodes.leafNode(YANG_LIBRARY_VERSION, stack.modelContext() .findModuleStatements("ietf-yang-library").iterator().next().localQNameModule().getRevision() .map(Revision::toString).orElse("")))); } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java index 5493fc1685..1aeb27090c 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java @@ -15,7 +15,7 @@ import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNull; 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.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; import org.opendaylight.restconf.nb.rfc8040.utils.parser.YangInstanceIdentifierSerializer; @@ -55,7 +55,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio NodeIdentifier.create(CreateDataChangeEventSubscriptionOutput.QNAME); private final DatabindProvider databindProvider; - private final DOMDataTreeChangeService changeService; + private final DataTreeChangeExtension changeService; private final RestconfStream.Registry streamRegistry; @Inject @@ -64,7 +64,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio @Reference final DatabindProvider databindProvider, @Reference final DOMDataBroker dataBroker) { super(CreateDataChangeEventSubscription.QNAME); this.databindProvider = requireNonNull(databindProvider); - changeService = dataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class); + changeService = dataBroker.extension(DataTreeChangeExtension.class); if (changeService == null) { throw new UnsupportedOperationException("DOMDataBroker does not support the DOMDataTreeChangeService"); } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/DataTreeChangeSource.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/DataTreeChangeSource.java index dfa696eae9..584aa9dc0e 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/DataTreeChangeSource.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/DataTreeChangeSource.java @@ -17,7 +17,7 @@ import java.util.List; 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.DOMDataTreeIdentifier; import org.opendaylight.restconf.server.spi.DatabindProvider; import org.opendaylight.restconf.server.spi.RestconfStream; @@ -37,12 +37,12 @@ public final class DataTreeChangeSource extends Source> EncodingName.RFC8040_JSON, JSONDataTreeCandidateFormatter.FACTORY, EncodingName.RFC8040_XML, XMLDataTreeCandidateFormatter.FACTORY); - private final @NonNull DOMDataTreeChangeService changeService; + private final @NonNull DataTreeChangeExtension changeService; private final @NonNull DatabindProvider databindProvider; private final @NonNull LogicalDatastoreType datastore; private final @NonNull YangInstanceIdentifier path; - public DataTreeChangeSource(final DatabindProvider databindProvider, final DOMDataTreeChangeService changeService, + public DataTreeChangeSource(final DatabindProvider databindProvider, final DataTreeChangeExtension changeService, final LogicalDatastoreType datastore, final YangInstanceIdentifier path) { super(ENCODINGS); this.databindProvider = requireNonNull(databindProvider); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateFormatter.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateFormatter.java index 489979bc63..a1e66a998a 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateFormatter.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateFormatter.java @@ -15,16 +15,16 @@ import java.util.List; import javax.xml.xpath.XPathExpressionException; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.restconf.server.spi.TextParameters; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.$YangModuleInfoImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.DataChangedNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.data.changed.notification.DataChangeEvent; +import org.opendaylight.yang.svc.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; final class JSONDataTreeCandidateFormatter extends DataTreeCandidateFormatter { private static final @NonNull String DATA_CHANGED_EVENT_NAME = DataChangeEvent.QNAME.getLocalName(); private static final @NonNull String DATA_CHANGED_NOTIFICATION_NAME = - $YangModuleInfoImpl.getInstance().getName().getLocalName() + ":" + DataChangedNotification.QNAME.getLocalName(); + YangModuleInfoImpl.getInstance().getName().getLocalName() + ":" + DataChangedNotification.QNAME.getLocalName(); private static final JSONDataTreeCandidateFormatter EMPTY = new JSONDataTreeCandidateFormatter(TextParameters.EMPTY); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateSerializer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateSerializer.java index c494ad8649..adeac10aaf 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateSerializer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/JSONDataTreeCandidateSerializer.java @@ -44,7 +44,7 @@ final class JSONDataTreeCandidateSerializer extends DataTreeCandidateSerializer< final var modificationType = candidate.modificationType(); if (modificationType != ModificationType.UNMODIFIED) { - final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(parent.getEffectiveModelContext()); + final var codecs = JSONCodecFactorySupplier.RFC7951.getShared(parent.modelContext()); try (var writer = createNestedWriter(codecs, DATA_CHANGE_EVENT, SAL_REMOTE_NS, jsonWriter)) { writer.startLeafNode(PATH_NID); writer.scalarValue(YangInstanceIdentifier.of(dataPath)); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/XMLDataTreeCandidateSerializer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/XMLDataTreeCandidateSerializer.java index 7e14708f09..2476f0de74 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/XMLDataTreeCandidateSerializer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/XMLDataTreeCandidateSerializer.java @@ -41,7 +41,7 @@ final class XMLDataTreeCandidateSerializer extends DataTreeCandidateSerializer { protected static final class Listener implements DOMNotificationListener { private final Sink sink; - private final EffectiveModelContextProvider modelContext; + private final Supplier modelContext; - public Listener(final Sink sink, final EffectiveModelContextProvider modelContext) { + public Listener(final Sink sink, final Supplier modelContext) { this.sink = requireNonNull(sink); this.modelContext = requireNonNull(modelContext); } @Override public void onNotification(final DOMNotification notification) { - sink.publish(modelContext.getEffectiveModelContext(), notification, + sink.publish(modelContext.get(), notification, notification instanceof DOMEvent domEvent ? domEvent.getEventInstant() : Instant.now()); } } diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/JSONNotificationFormatter.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/JSONNotificationFormatter.java index e62fda8b8a..12001395a2 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/JSONNotificationFormatter.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/JSONNotificationFormatter.java @@ -16,14 +16,14 @@ import javax.xml.xpath.XPathExpressionException; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.restconf.server.spi.TextParameters; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.$YangModuleInfoImpl; +import org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.YangModuleInfoImpl; import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier; import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; final class JSONNotificationFormatter extends NotificationFormatter { private static final @NonNull String NOTIFICATION_NAME = - $YangModuleInfoImpl.getInstance().getName().getLocalName() + ":notification"; + YangModuleInfoImpl.getInstance().getName().getLocalName() + ":notification"; @VisibleForTesting static final JSONNotificationFormatter EMPTY = new JSONNotificationFormatter(TextParameters.EMPTY); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathInstanceIdentifierCodec.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathInstanceIdentifierCodec.java index 9bde6cb53b..3bb26a499f 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathInstanceIdentifierCodec.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathInstanceIdentifierCodec.java @@ -11,12 +11,15 @@ import static java.util.Objects.requireNonNull; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.restconf.server.api.DatabindContext; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.XMLNamespace; -import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringInstanceIdentifierCodec; +import org.opendaylight.yangtools.yang.data.util.AbstractStringInstanceIdentifierCodec; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; +import org.opendaylight.yangtools.yang.model.util.LeafrefResolver; -final class ApiPathInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec { +final class ApiPathInstanceIdentifierCodec extends AbstractStringInstanceIdentifierCodec { private final @NonNull DatabindContext databind; ApiPathInstanceIdentifierCodec(final DatabindContext databind) { @@ -29,12 +32,22 @@ final class ApiPathInstanceIdentifierCodec extends AbstractModuleStringInstanceI } @Override - protected Module moduleForPrefix(final String prefix) { - return databind.modelContext().findModules(prefix).stream().findFirst().orElse(null); + protected QNameModule moduleForPrefix(final String prefix) { + return databind.modelContext().findModuleStatements(prefix).stream().findFirst() + .map(ModuleEffectiveStatement::localQNameModule) + .orElse(null); } @Override protected String prefixForNamespace(final XMLNamespace namespace) { - return databind.modelContext().findModule(namespace).stream().findFirst().map(Module::getName).orElse(null); + return databind.modelContext().findModuleStatements(namespace).stream().findFirst() + .map(module -> module.argument().getLocalName()) + .orElse(null); + } + + @Override + protected Object deserializeKeyValue(final DataSchemaNode schemaNode, final LeafrefResolver resolver, + final String value) { + throw new UnsupportedOperationException("FIXME: implement this method"); } } diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/AbstractRestconfTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/AbstractRestconfTest.java index b54bd85b09..8323c2780f 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/AbstractRestconfTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/AbstractRestconfTest.java @@ -63,7 +63,7 @@ abstract class AbstractRestconfTest extends AbstractJukeboxTest { @BeforeEach final void setupRestconf() { - restconf = new JaxRsRestconf(new MdsalRestconfServer(FixedDOMSchemaService.of(modelContext()), dataBroker, + restconf = new JaxRsRestconf(new MdsalRestconfServer(new FixedDOMSchemaService(modelContext()), dataBroker, rpcService, actionService, mountPointService)); } diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/Netconf799Test.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/Netconf799Test.java index 9de4e5566d..d7ae761338 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/Netconf799Test.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/Netconf799Test.java @@ -63,8 +63,8 @@ class Netconf799Test extends AbstractInstanceIdentifierTest { Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(OUTPUT_QNAME)).build()))) .when(actionService).invokeAction(eq(Absolute.of(CONT_QNAME, CONT1_QNAME, RESET_QNAME)), any(), any()); - final var restconf = new JaxRsRestconf(new MdsalRestconfServer(FixedDOMSchemaService.of(IID_SCHEMA), dataBroker, - rpcService, actionService, mountPointService)); + final var restconf = new JaxRsRestconf(new MdsalRestconfServer(new FixedDOMSchemaService(IID_SCHEMA), + dataBroker, rpcService, actionService, mountPointService)); doReturn(new MultivaluedHashMap<>()).when(uriInfo).getQueryParameters(); doReturn(true).when(asyncResponse).resume(captor.capture()); restconf.postDataJSON(ApiPath.parse("instance-identifier-module:cont/cont1/reset"), diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataDeleteTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataDeleteTest.java index 1091df5486..84a075d11d 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataDeleteTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataDeleteTest.java @@ -72,7 +72,7 @@ class RestconfDataDeleteTest extends AbstractRestconfTest { @Test public void testDeleteDataMountPoint() { doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class)); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataGetTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataGetTest.java index b6a9d7fc5f..bb86fb5d56 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataGetTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataGetTest.java @@ -116,7 +116,7 @@ class RestconfDataGetTest extends AbstractRestconfTest { doReturn(Optional.of(mountPoint)).when(mountPointService) .getMountPoint(any(YangInstanceIdentifier.class)); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPutTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPutTest.java index 49269eb778..5f6f8987fa 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPutTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfDataPutTest.java @@ -76,8 +76,8 @@ class RestconfDataPutTest extends AbstractRestconfTest { doReturn(immediateTrueFluentFuture()).when(readTx).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID); doNothing().when(rwTx).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX); doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any()); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) - .getService(DOMSchemaService.class); + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) + .getService(DOMSchemaService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfModulesGetTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfModulesGetTest.java index 8fec02ba8c..65112273d2 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfModulesGetTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfModulesGetTest.java @@ -26,7 +26,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService; import org.opendaylight.netconf.dom.api.NetconfDataTreeService; import org.opendaylight.restconf.api.ApiPath; @@ -54,7 +54,7 @@ class RestconfModulesGetTest extends AbstractRestconfTest { QName.create("mount:point", "2016-06-02", "point-number")); @Mock - private DOMYangTextSourceProvider sourceProvider; + private YangTextSourceExtension sourceProvider; @Mock private DOMSchemaService schemaService; @@ -174,7 +174,7 @@ class RestconfModulesGetTest extends AbstractRestconfTest { } private void mockMountPoint() { - doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT_ON_MOUNT_POINT))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT_ON_MOUNT_POINT))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(MOUNT_IID); doReturn(Optional.of(mountPointService)).when(mountPoint).getService(DOMMountPointService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsGetTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsGetTest.java index 6fbf06e6a3..5d04242bb8 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsGetTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsGetTest.java @@ -53,7 +53,7 @@ class RestconfOperationsGetTest extends AbstractRestconfTest { """; private static final EffectiveModelContext MODEL_CONTEXT = BindingRuntimeHelpers.createRuntimeContext( - Module1Data.class, Module2Data.class, NetworkTopology.class).getEffectiveModelContext(); + Module1Data.class, Module2Data.class, NetworkTopology.class).modelContext(); @Override EffectiveModelContext modelContext() { @@ -71,7 +71,7 @@ class RestconfOperationsGetTest extends AbstractRestconfTest { } private void mockMountPoint() { - doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsPostTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsPostTest.java index 222c3c73b5..a8ab07a82f 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsPostTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfOperationsPostTest.java @@ -131,7 +131,7 @@ class RestconfOperationsPostTest extends AbstractRestconfTest { @Test void invokeRpcViaMountPointTest() throws Exception { - doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); @@ -158,7 +158,7 @@ class RestconfOperationsPostTest extends AbstractRestconfTest { @Test void invokeRpcMissingMountPointServiceTest() { - doReturn(Optional.of(FixedDOMSchemaService.of(MODEL_CONTEXT))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(MODEL_CONTEXT))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceMountTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceMountTest.java index d5d2501f81..a99c000ab6 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceMountTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceMountTest.java @@ -8,13 +8,15 @@ package org.opendaylight.restconf.nb.jaxrs; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doReturn; import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertEntity; import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertError; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.io.CharStreams; import java.io.Reader; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,7 +26,7 @@ import org.opendaylight.mdsal.dom.api.DOMActionService; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl; import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService; import org.opendaylight.restconf.api.ApiPath; @@ -35,7 +37,7 @@ import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; /** @@ -59,7 +61,7 @@ public class RestconfSchemaServiceMountTest { @Mock private DOMSchemaService schemaService; @Mock - private DOMYangTextSourceProvider sourceProvider; + private YangTextSourceExtension sourceProvider; @Mock private DOMDataBroker dataBroker; @Mock @@ -67,7 +69,7 @@ public class RestconfSchemaServiceMountTest { @Mock private DOMRpcService rpcService; @Mock - private YangTextSchemaSource yangSource; + private YangTextSource yangSource; @Mock private Reader yangReader; @@ -80,15 +82,15 @@ public class RestconfSchemaServiceMountTest { // create and register mount points mountPointService .createMountPoint(YangInstanceIdentifier.of(QName.create("mount:point:1", "2016-01-01", "cont"))) - .addService(DOMSchemaService.class, FixedDOMSchemaService.of(SCHEMA_CONTEXT_BEHIND_MOUNT_POINT)) + .addService(DOMSchemaService.class, new FixedDOMSchemaService(SCHEMA_CONTEXT_BEHIND_MOUNT_POINT)) .addService(DOMDataBroker.class, dataBroker) .register(); mountPointService .createMountPoint(YangInstanceIdentifier.of(QName.create("mount:point:2", "2016-01-01", "cont"))) .register(); - doReturn(ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, sourceProvider)).when(schemaService) - .getExtensions(); + doCallRealMethod().when(schemaService).extension(any()); + doReturn(List.of(sourceProvider)).when(schemaService).supportedExtensions(); doReturn(SCHEMA_CONTEXT_WITH_MOUNT_POINTS).when(schemaService).getGlobalContext(); restconf = new JaxRsRestconf(new MdsalRestconfServer(schemaService, dataBroker, rpcService, actionService, diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceTest.java index 24ed46264f..822f5ec60a 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/jaxrs/RestconfSchemaServiceTest.java @@ -9,13 +9,15 @@ package org.opendaylight.restconf.nb.jaxrs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doReturn; import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertEntity; import static org.opendaylight.restconf.nb.jaxrs.AbstractRestconfTest.assertError; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.Futures; import java.io.Reader; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -26,14 +28,14 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.api.DOMSchemaService.YangTextSourceExtension; import org.opendaylight.restconf.server.mdsal.MdsalRestconfServer; import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; /** @@ -48,7 +50,7 @@ public class RestconfSchemaServiceTest { @Mock private DOMSchemaService schemaService; @Mock - private DOMYangTextSourceProvider sourceProvider; + private YangTextSourceExtension sourceProvider; @Mock private DOMDataBroker dataBroker; @Mock @@ -58,7 +60,7 @@ public class RestconfSchemaServiceTest { @Mock private DOMMountPointService mountPointService; @Mock - private YangTextSchemaSource yangSource; + private YangTextSource yangSource; @Mock private Reader yangReader; @@ -68,8 +70,8 @@ public class RestconfSchemaServiceTest { @Before public void setup() throws Exception { doReturn(SCHEMA_CONTEXT).when(schemaService).getGlobalContext(); - doReturn(ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, sourceProvider)).when(schemaService) - .getExtensions(); + doCallRealMethod().when(schemaService).extension(any()); + doReturn(List.of(sourceProvider)).when(schemaService).supportedExtensions(); restconf = new JaxRsRestconf(new MdsalRestconfServer(schemaService, dataBroker, rpcService, actionService, mountPointService)); @@ -81,7 +83,7 @@ public class RestconfSchemaServiceTest { @Test public void getSchemaTest() throws Exception { doReturn(Futures.immediateFuture(yangSource)).when(sourceProvider) - .getSource(new SourceIdentifier("module1", Revision.of("2014-01-01"))); + .getYangTexttSource(new SourceIdentifier("module1", Revision.of("2014-01-01"))); doReturn(yangReader).when(yangSource).openStream(); assertSame(yangReader, assertEntity(Reader.class, 200, diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java index 55fbe8ab2f..80e9b03dc1 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java @@ -56,7 +56,8 @@ abstract class AbstractPatchBodyTest extends AbstractInstanceIdentifierTest { @Before public final void before() { doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class)); - doReturn(Optional.of(FixedDOMSchemaService.of(IID_SCHEMA))).when(mountPoint).getService(DOMSchemaService.class); + doReturn(Optional.of(new FixedDOMSchemaService(IID_SCHEMA))).when(mountPoint) + .getService(DOMSchemaService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMRpcService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlResourceBodyTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlResourceBodyTest.java index 90645614cf..9c84e36e44 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlResourceBodyTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlResourceBodyTest.java @@ -42,7 +42,7 @@ class XmlResourceBodyTest extends AbstractResourceBodyTest { private void mockMount() { doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(any(YangInstanceIdentifier.class)); - doReturn(Optional.of(FixedDOMSchemaService.of(IID_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(IID_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java index ebadf4bf48..d0a4e9f95d 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java @@ -427,7 +427,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes doReturn(Optional.empty()).when(mountPoint).getService(NetconfDataTreeService.class); doReturn(Optional.of(dataBroker)).when(mountPoint).getService(DOMDataBroker.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); @@ -443,7 +443,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes public void testGetRestconfStrategyMountNetconfService() throws Exception { doReturn(Optional.of(netconfService)).when(mountPoint).getService(NetconfDataTreeService.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); @@ -463,7 +463,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes doReturn(Optional.empty()).when(mountPoint).getService(DOMMountPointService.class); doReturn(Optional.empty()).when(mountPoint).getService(DOMActionService.class); doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class); - doReturn(Optional.of(FixedDOMSchemaService.of(JUKEBOX_SCHEMA))).when(mountPoint) + doReturn(Optional.of(new FixedDOMSchemaService(JUKEBOX_SCHEMA))).when(mountPoint) .getService(DOMSchemaService.class); doReturn(Optional.of(mountPoint)).when(mountPointService).getMountPoint(YangInstanceIdentifier.of()); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java index 5dd4c6a381..973fe9e525 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java @@ -36,8 +36,8 @@ import org.opendaylight.yangtools.yang.common.ErrorSeverity; import org.opendaylight.yangtools.yang.common.ErrorTag; import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.w3c.dom.DOMException; @RunWith(MockitoJUnitRunner.StrictStubs.class) @@ -143,7 +143,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT @Test public void testPutReplaceContainerData() { - doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService) + doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService) .getConfig(JUKEBOX_IID); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit(); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService) @@ -169,7 +169,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT @Test public void testPutReplaceLeafData() { - doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService) + doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService) .getConfig(GAP_IID); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit(); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService) @@ -195,7 +195,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT @Test public void testPutReplaceListData() { - doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService) + doReturn(immediateFluentFuture(Optional.of(mock(ContainerNode.class)))).when(netconfService) .getConfig(JUKEBOX_IID); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit(); doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService) diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/DataTreeChangeStreamTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/DataTreeChangeStreamTest.java index 398f0cf73f..3303fedbea 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/DataTreeChangeStreamTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/DataTreeChangeStreamTest.java @@ -30,7 +30,7 @@ import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest; 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.restconf.api.query.ChangedLeafNodesOnlyParam; import org.opendaylight.restconf.api.query.ChildNodesOnlyParam; import org.opendaylight.restconf.api.query.LeafNodesOnlyParam; @@ -231,7 +231,7 @@ public class DataTreeChangeStreamTest extends AbstractConcurrentDataBrokerTest { final boolean changedLeafNodesOnly, final boolean childNodesOnly) throws Exception { final var stream = streamRegistry.createStream(URI.create("baseURI"), new DataTreeChangeSource(databindProvider, - domDataBroker.getExtensions().getInstance(DOMDataTreeChangeService.class), + domDataBroker.extension(DataTreeChangeExtension.class), LogicalDatastoreType.CONFIGURATION, path), "test") .getOrThrow(); final var handler = new TestHandler(); diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java index 89b63b5f27..3987253f29 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/WebSocketFactoryTest.java @@ -23,7 +23,7 @@ import org.mockito.junit.jupiter.MockitoExtension; 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.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMNotificationService; @@ -49,7 +49,7 @@ class WebSocketFactoryTest extends AbstractNotificationListenerTest { @Mock private DOMDataTreeWriteTransaction tx; @Mock - private DOMDataTreeChangeService changeService; + private DataTreeChangeExtension changeService; @Mock private DatabindProvider databindProvider; @Mock diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/test/incubate/InMemoryMdsalModule.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/test/incubate/InMemoryMdsalModule.java index 9477411bd0..157177e65d 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/test/incubate/InMemoryMdsalModule.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/test/incubate/InMemoryMdsalModule.java @@ -24,8 +24,6 @@ import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl; import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter; import org.opendaylight.mdsal.dom.broker.DOMRpcRouter; -import org.opendaylight.mdsal.dom.spi.DOMNotificationSubscriptionListenerRegistry; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; /** * Copy paste from org.opendaylight.controller.sal.restconf.impl.test.incubate.InMemoryMdsalModule. @@ -44,7 +42,7 @@ public class InMemoryMdsalModule extends AbstractModule { }; dataBrokerTest.setup(); - domNotificationRouter = DOMNotificationRouter.create(NOTIFICATION_SERVICE_QUEUE_DEPTH); + domNotificationRouter = new DOMNotificationRouter(NOTIFICATION_SERVICE_QUEUE_DEPTH); } @Override @@ -72,16 +70,6 @@ public class InMemoryMdsalModule extends AbstractModule { return dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService(); } - @Provides - @Singleton EffectiveModelContextProvider getSchemaContextProvider() { - DOMSchemaService schemaService = dataBrokerTest.getDataBrokerTestCustomizer().getSchemaService(); - if (schemaService instanceof EffectiveModelContextProvider) { - return (EffectiveModelContextProvider) schemaService; - } - throw new IllegalStateException( - "The schema service isn't a SchemaContextProvider, it's a " + schemaService.getClass()); - } - @Provides @Singleton DOMMountPointService getDOMMountPoint() { return new DOMMountPointServiceImpl(); @@ -89,28 +77,23 @@ public class InMemoryMdsalModule extends AbstractModule { @Provides @Singleton DOMNotificationService getDOMNotificationService() { - return domNotificationRouter; + return domNotificationRouter.notificationService(); } @Provides @Singleton DOMNotificationPublishService getDOMNotificationPublishService() { - return domNotificationRouter; - } - - @Provides - @Singleton DOMNotificationSubscriptionListenerRegistry getDOMNotificationSubscriptionListenerRegistry() { - return domNotificationRouter; + return domNotificationRouter.notificationPublishService(); } @Provides @Singleton DOMRpcService getDOMRpcService(final DOMSchemaService schemaService) { - return new DOMRpcRouter(schemaService).getRpcService(); + return new DOMRpcRouter(schemaService).rpcService(); } @Provides @Singleton DOMActionService getDOMActionService(final DOMSchemaService schemaService) { - return new DOMRpcRouter(schemaService).getActionService(); + return new DOMRpcRouter(schemaService).actionService(); } @PreDestroy diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateNotificationStreamRpcTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateNotificationStreamRpcTest.java index a974f683a6..4a6281d77a 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateNotificationStreamRpcTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateNotificationStreamRpcTest.java @@ -13,12 +13,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; -import com.google.common.collect.ImmutableClassToInstanceMap; import java.net.URI; +import java.util.List; import java.util.UUID; import org.eclipse.jdt.annotation.Nullable; import org.junit.jupiter.api.BeforeEach; @@ -31,7 +33,7 @@ import org.mockito.junit.jupiter.MockitoExtension; 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.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.server.api.DatabindContext; @@ -67,7 +69,7 @@ class CreateNotificationStreamRpcTest { @Mock private DOMDataBroker dataBroker; @Mock - private DOMDataTreeChangeService treeChange; + private DataTreeChangeExtension treeChange; @Mock private DOMDataTreeWriteTransaction tx; @Captor @@ -83,8 +85,8 @@ class CreateNotificationStreamRpcTest { public void before() { databindProvider = () -> DatabindContext.ofModel(SCHEMA_CTX); - doReturn(ImmutableClassToInstanceMap.of(DOMDataTreeChangeService.class, treeChange)) - .when(dataBroker).getExtensions(); + doReturn(List.of(treeChange)).when(dataBroker).supportedExtensions(); + doCallRealMethod().when(dataBroker).extension(any()); rpc = new CreateDataChangeEventSubscriptionRpc(new MdsalRestconfStreamRegistry(dataBroker), databindProvider, dataBroker); } diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java index 514f992fdf..2c72fc672e 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java @@ -23,7 +23,6 @@ import java.util.Collection; import java.util.Deque; import java.util.List; import java.util.stream.Collectors; -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter; import org.opendaylight.restconf.openapi.model.DeleteEntity; import org.opendaylight.restconf.openapi.model.GetEntity; @@ -98,7 +97,7 @@ public final class PathsStream extends InputStream { } @Override - public int read(final byte @NonNull [] array, final int off, final int len) throws IOException { + public int read(final byte[] array, final int off, final int len) throws IOException { return super.read(array, off, len); } diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PropertyEntity.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PropertyEntity.java index 735bafd56a..bb9a21fc29 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PropertyEntity.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PropertyEntity.java @@ -408,7 +408,7 @@ public class PropertyEntity { } else if (leafTypeDef instanceof EnumTypeDefinition enumType) { jsonType = processEnumType(enumType, def); } else if (leafTypeDef instanceof IdentityrefTypeDefinition identityrefType) { - jsonType = processIdentityRefType(identityrefType, stack.getEffectiveModelContext(), def); + jsonType = processIdentityRefType(identityrefType, stack.modelContext(), def); } else if (leafTypeDef instanceof StringTypeDefinition stringType) { jsonType = processStringType(stringType, schemaNode.getQName().getLocalName(), def); } else if (leafTypeDef instanceof UnionTypeDefinition unionType) { @@ -427,7 +427,7 @@ public class PropertyEntity { jsonType = processNumberType(rangeRestrictedType, def); } else if (leafTypeDef instanceof InstanceIdentifierTypeDefinition instanceIdentifierType) { jsonType = processInstanceIdentifierType(instanceIdentifierType, schemaNode, - stack.getEffectiveModelContext(), def); + stack.modelContext(), def); } else { jsonType = STRING_TYPE; } diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/mountpoints/MountPointOpenApi.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/mountpoints/MountPointOpenApi.java index d1c2375678..3c5b7ad5e0 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/mountpoints/MountPointOpenApi.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/mountpoints/MountPointOpenApi.java @@ -28,7 +28,7 @@ import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator; import org.opendaylight.restconf.openapi.impl.OpenApiInputStream; -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.Revision; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -58,7 +58,7 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable { private final AtomicLong idKey = new AtomicLong(0); - private ListenerRegistration registration; + private Registration registration; public MountPointOpenApi(final DOMSchemaService globalSchema, final DOMMountPointService mountService, final BaseYangOpenApiGenerator openApiGenerator) { @@ -190,7 +190,7 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable { .values().getElement().toString(); } - private OpenApiInputStream generateDataStoreOpenApi(EffectiveModelContext modelContext, + private OpenApiInputStream generateDataStoreOpenApi(final EffectiveModelContext modelContext, final UriInfo uriInfo, final String urlPrefix, final String deviceName) throws IOException { final var schema = openApiGenerator.createSchemaFromUriInfo(uriInfo); final var host = openApiGenerator.createHostFromUriInfo(uriInfo); diff --git a/transport/transport-ssh/pom.xml b/transport/transport-ssh/pom.xml index 63e5b23f23..1f84f2d2d9 100644 --- a/transport/transport-ssh/pom.xml +++ b/transport/transport-ssh/pom.xml @@ -31,6 +31,11 @@ commons-codec 1.15 + + com.github.spotbugs + spotbugs-annotations + true + com.google.errorprone error_prone_annotations -- 2.36.6