From b9ec0da5de634765a97034df88a1250d89fa12c4 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 5 May 2023 23:18:56 +0200 Subject: [PATCH] Add netconf.api.CapabilityURN We have NETCONF capability strings strewn all over the codebase, in various forms and at various layers. Centralize the definitions based on the current contents of the IANA registry (plus the EXI part, which is just proposed). Centralize the use of the constants, eliminating a number of XmlNetconfConstants, i.e. disconnecting code from the XML encoding to a certain extent. JIRA: NETCONF-1017 Change-Id: Id03708c24d48fd65547f294827d8c15d9d7dd6e7 Signed-off-by: Robert Varga --- .../impl/MountPointEndToEndTest.java | 8 +- .../AbstractNetconfSessionNegotiator.java | 3 +- .../AbstractNetconfSessionNegotiatorTest.java | 5 +- .../netconf/nettyutil/Netconf539Test.java | 6 +- .../test/tool/NetconfDeviceSimulator.java | 3 +- .../test/tool/config/Configuration.java | 17 +- .../netconf/client/mdsal/NetconfDevice.java | 19 +-- .../client/mdsal/NetconfStateSchemas.java | 5 +- .../mdsal/api/NetconfSessionPreferences.java | 12 +- .../mdsal/NetconfDeviceCommunicatorTest.java | 3 +- .../client/mdsal/NetconfDeviceTest.java | 41 ++--- .../mdsal/SchemalessNetconfDeviceTest.java | 10 +- .../spi/NetconfDataTreeServiceImplTest.java | 5 +- .../spi/NetconfDeviceDataBrokerTest.java | 14 +- .../mdsal/spi/NetconfDeviceSalFacadeTest.java | 6 +- .../MdsalNetconfOperationServiceFactory.java | 7 +- .../server/mdsal/monitoring/GetSchema.java | 9 +- .../netconf/api/CapabilityURN.java | 153 ++++++++++++++++++ .../netconf/api/xml/XmlNetconfConstants.java | 24 +-- ...NetconfClientSessionNegotiatorFactory.java | 19 ++- ...NetconfServerSessionNegotiatorFactory.java | 13 +- .../NetconfCapabilityMonitoringService.java | 14 +- .../netconf/server/ConcurrentClientsTest.java | 12 +- ...etconfCapabilityMonitoringServiceTest.java | 11 +- 24 files changed, 258 insertions(+), 161 deletions(-) create mode 100644 protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/CapabilityURN.java 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 62c8416555..38805920f7 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 @@ -97,7 +97,7 @@ import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvid 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.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.client.NetconfClientDispatcher; import org.opendaylight.netconf.client.mdsal.NetconfDeviceCapabilities; import org.opendaylight.netconf.client.mdsal.NetconfDeviceSchema; @@ -413,8 +413,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { final var masterSalFacade = masterSalFacadeFuture.get(5, TimeUnit.SECONDS); masterSalFacade.onDeviceConnected(new NetconfDeviceSchema(NetconfDeviceCapabilities.empty(), new EmptyMountPointContext(deviceSchemaContext)), - NetconfSessionPreferences.fromStrings( - List.of(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0)), + NetconfSessionPreferences.fromStrings(List.of(CapabilityURN.CANDIDATE)), new RemoteDeviceServices(deviceRpcService, null)); final var masterMountPoint = awaitMountPoint(masterMountPointService); @@ -490,8 +489,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest { final var masterSalFacade = masterSalFacadeFuture.get(5, TimeUnit.SECONDS); masterSalFacade.onDeviceConnected( new NetconfDeviceSchema(NetconfDeviceCapabilities.empty(), new EmptyMountPointContext(deviceSchemaContext)), - NetconfSessionPreferences.fromStrings(List.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0)), + NetconfSessionPreferences.fromStrings(List.of(CapabilityURN.CANDIDATE)), new RemoteDeviceServices(deviceRpcService, null)); verify(masterMountPointListener, timeout(5000)).onMountPointCreated(yangNodeInstanceId); diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiator.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiator.java index a67f7941ad..148d80ad5b 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiator.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiator.java @@ -27,6 +27,7 @@ import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.lock.qual.Holding; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfDocumentedException; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.NetconfSessionListener; @@ -324,7 +325,7 @@ public abstract class AbstractNetconfSessionNegotiator DEFAULT_BASE_CAPABILITIES_EXI = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0 - ); + CapabilityURN.BASE, + CapabilityURN.BASE_1_1, + CapabilityURN.EXI, + CapabilityURN.NOTIFICATION); public static final Set DEFAULT_BASE_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1 - ); + CapabilityURN.BASE, + CapabilityURN.BASE_1_1); public static final Set DEFAULT_YANG_RESOURCES = ImmutableSet.of( new YangResource("ietf-netconf-monitoring", "2010-10-04", 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 66396db04a..8b41bbff4a 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 @@ -23,7 +23,6 @@ import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -36,8 +35,8 @@ import java.util.stream.Collectors; import org.checkerframework.checker.lock.qual.GuardedBy; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfMessage; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas; import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory; import org.opendaylight.netconf.client.mdsal.api.NetconfDeviceSchemasResolver; @@ -414,15 +413,13 @@ public class NetconfDevice implements RemoteDevice { this.remoteSessionCapabilities = remoteSessionCapabilities; // If device supports notifications and does not contain necessary modules, add them automatically - if (remoteSessionCapabilities.containsNonModuleCapability( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0)) { - deviceSources.getRequiredSourcesQName().addAll( - Arrays.asList( - 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() - ) + 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()) ); } diff --git a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemas.java b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemas.java index bc531415b8..433442a50a 100644 --- a/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemas.java +++ b/plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemas.java @@ -114,8 +114,9 @@ public final class NetconfStateSchemas implements NetconfDeviceSchemas { @Override public Set getAvailableYangSchemasQNames() { - return getAvailableYangSchemas().stream().map(RemoteYangSchema::getQName) - .collect(ImmutableSet.toImmutableSet()); + return availableYangSchemas.stream() + .map(RemoteYangSchema::getQName) + .collect(ImmutableSet.toImmutableSet()); } /** 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 bf7300406b..22ce8bf07b 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 @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +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; @@ -150,21 +150,19 @@ public record NetconfSessionPreferences( } public boolean isRollbackSupported() { - return containsNonModuleCapability( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_ROLLBACK_ON_ERROR_1_0); + return containsNonModuleCapability(CapabilityURN.ROLLBACK_ON_ERROR); } public boolean isCandidateSupported() { - return containsNonModuleCapability(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0); + return containsNonModuleCapability(CapabilityURN.CANDIDATE); } public boolean isRunningWritable() { - return containsNonModuleCapability(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_WRITABLE_RUNNING_1_0); + return containsNonModuleCapability(CapabilityURN.WRITABLE_RUNNING); } public boolean isNotificationsSupported() { - return containsPartialNonModuleCapability( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0) + return containsPartialNonModuleCapability(CapabilityURN.NOTIFICATION) || containsModuleCapability(NetconfMessageTransformUtil.IETF_NETCONF_NOTIFICATIONS); } diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceCommunicatorTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceCommunicatorTest.java index 6c76665a29..a8a4cb3642 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceCommunicatorTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceCommunicatorTest.java @@ -53,6 +53,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockMakers; import org.mockito.junit.MockitoJUnitRunner; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.NetconfTerminationReason; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; @@ -142,7 +143,7 @@ public class NetconfDeviceCommunicatorTest { public void testOnSessionUp() { final var testCapability = "urn:opendaylight:params:xml:ns:test?module=test-module&revision=2014-06-02"; final var serverCapabilities = Set.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_ROLLBACK_ON_ERROR_1_0, + CapabilityURN.ROLLBACK_ON_ERROR, NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString(), testCapability); doReturn(serverCapabilities).when(spySession).getServerCapabilities(); 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 4ee1918456..99dff81d55 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 @@ -24,8 +24,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListeningExecutorService; @@ -45,8 +43,8 @@ import java.util.concurrent.Executors; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfMessage; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.client.mdsal.api.NetconfDeviceSchemasResolver; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; @@ -117,7 +115,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id, schemaContext) -> { - final Module first = Iterables.getFirst(SCHEMA_CONTEXT.getModules(), null); + final Module first = SCHEMA_CONTEXT.getModules().iterator().next(); final QName qName = QName.create(first.getQNameModule(), first.getName()); final NetconfStateSchemas.RemoteYangSchema source1 = new NetconfStateSchemas.RemoteYangSchema(qName); final NetconfStateSchemas.RemoteYangSchema source2 = @@ -137,8 +135,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .setBaseSchemas(BASE_SCHEMAS) .build(); // Monitoring supported - final NetconfSessionPreferences sessionCaps = - getSessionCaps(true, Lists.newArrayList(TEST_CAPABILITY, TEST_CAPABILITY2)); + final NetconfSessionPreferences sessionCaps = getSessionCaps(true, List.of(TEST_CAPABILITY, TEST_CAPABILITY2)); device.onRemoteSessionUp(sessionCaps, listener); verify(facade, timeout(5000)).onDeviceConnected(any(NetconfDeviceSchema.class), @@ -148,8 +145,6 @@ public class NetconfDeviceTest extends AbstractTestModelTest { @Test public void testNetconfDeviceFailFirstSchemaFailSecondEmpty() throws Exception { - final ArrayList capList = Lists.newArrayList(TEST_CAPABILITY); - final RemoteDeviceHandler facade = getFacade(); final NetconfDeviceCommunicator listener = getListener(); @@ -174,7 +169,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .build(); // Monitoring not supported - final NetconfSessionPreferences sessionCaps = getSessionCaps(false, capList); + final NetconfSessionPreferences sessionCaps = getSessionCaps(false, List.of(TEST_CAPABILITY)); device.onRemoteSessionUp(sessionCaps, listener); verify(facade, timeout(5000)).onDeviceDisconnected(); @@ -205,7 +200,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id, schemaContext) -> { - final Module first = Iterables.getFirst(SCHEMA_CONTEXT.getModules(), null); + final Module first = SCHEMA_CONTEXT.getModules().iterator().next(); final QName qName = QName.create(first.getQNameModule(), first.getName()); final NetconfStateSchemas.RemoteYangSchema source1 = new NetconfStateSchemas.RemoteYangSchema(qName); final NetconfStateSchemas.RemoteYangSchema source2 = @@ -271,8 +266,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .setBaseSchemas(BASE_SCHEMAS) .build(); - final NetconfSessionPreferences sessionCaps = getSessionCaps(true, - Lists.newArrayList(TEST_CAPABILITY)); + final NetconfSessionPreferences sessionCaps = getSessionCaps(true, List.of(TEST_CAPABILITY)); device.onRemoteSessionUp(sessionCaps, listener); device.onNotification(NOTIFICATION); @@ -305,7 +299,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .setBaseSchemas(BASE_SCHEMAS) .build(); final NetconfSessionPreferences sessionCaps = getSessionCaps(true, - Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); + List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); device.onRemoteSessionUp(sessionCaps, listener); verify(schemaContextProviderFactory, timeout(5000)).createEffectiveModelContext(anyCollection()); @@ -341,7 +335,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .setBaseSchemas(BASE_SCHEMAS) .build(); final NetconfSessionPreferences sessionCaps = getSessionCaps(true, - Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); + List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); //session up, start schema resolution device.onRemoteSessionUp(sessionCaps, listener); //session closed @@ -373,7 +367,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfDevice netconfSpy = spy(device); final NetconfSessionPreferences sessionCaps = getSessionCaps(true, - Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); + List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); final Map moduleBasedCaps = new HashMap<>(); moduleBasedCaps.putAll(sessionCaps.moduleBasedCaps()); moduleBasedCaps @@ -407,8 +401,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { .build(); final NetconfDevice netconfSpy = spy(device); - final NetconfSessionPreferences sessionCaps = getSessionCaps(false, - Lists.newArrayList(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0)); + final NetconfSessionPreferences sessionCaps = getSessionCaps(false, List.of(CapabilityURN.NOTIFICATION)); netconfSpy.onRemoteSessionUp(sessionCaps, listener); @@ -447,7 +440,7 @@ public class NetconfDeviceTest extends AbstractTestModelTest { final NetconfDevice netconfSpy = spy(device); final NetconfSessionPreferences sessionCaps = getSessionCaps(false, - Lists.newArrayList(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); + List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&revision=" + TEST_REVISION)); netconfSpy.onRemoteSessionUp(sessionCaps, listener); @@ -551,18 +544,14 @@ public class NetconfDeviceTest extends AbstractTestModelTest { public NetconfSessionPreferences getSessionCaps(final boolean addMonitor, final Collection additionalCapabilities) { - final ArrayList capabilities = Lists.newArrayList( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1); - + final var capabilities = new ArrayList(); + capabilities.add(CapabilityURN.BASE); + capabilities.add(CapabilityURN.BASE_1_1); if (addMonitor) { capabilities.add(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString()); } - capabilities.addAll(additionalCapabilities); - - return NetconfSessionPreferences.fromStrings( - capabilities); + return NetconfSessionPreferences.fromStrings(capabilities); } public NetconfDeviceCommunicator getListener() throws Exception { diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/SchemalessNetconfDeviceTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/SchemalessNetconfDeviceTest.java index 981d744f60..cc576af006 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/SchemalessNetconfDeviceTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/SchemalessNetconfDeviceTest.java @@ -15,13 +15,12 @@ import static org.mockito.Mockito.verify; import com.google.common.collect.Lists; import java.net.InetSocketAddress; -import java.util.ArrayList; import java.util.Collection; import org.junit.Test; import org.mockito.Mockito; import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfMessage; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceHandler; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; @@ -90,16 +89,11 @@ public class SchemalessNetconfDeviceTest extends AbstractBaseSchemasTest { private static NetconfSessionPreferences getSessionCaps(final boolean addMonitor, final Collection additionalCapabilities) { - final ArrayList capabilities = Lists.newArrayList( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1); - + final var capabilities = Lists.newArrayList(CapabilityURN.BASE, CapabilityURN.BASE_1_1); if (addMonitor) { capabilities.add(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING.getNamespace().toString()); } - capabilities.addAll(additionalCapabilities); - return NetconfSessionPreferences.fromStrings(capabilities); } } 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 7c5d812131..4eb1bc6a89 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 @@ -34,8 +34,8 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfMessage; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.client.mdsal.AbstractTestModelTest; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; @@ -158,8 +158,7 @@ public class NetconfDataTreeServiceImplTest extends AbstractTestModelTest { } private AbstractNetconfDataTreeService getNetconService() { - NetconfSessionPreferences prefs = NetconfSessionPreferences.fromStrings( - List.of(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0)); + NetconfSessionPreferences prefs = NetconfSessionPreferences.fromStrings(List.of(CapabilityURN.CANDIDATE)); final RemoteDeviceId id = new RemoteDeviceId("device-1", InetSocketAddress.createUnresolved("localhost", 17830)); return AbstractNetconfDataTreeService.of(id, new EmptyMountPointContext(SCHEMA_CONTEXT), rpcService, prefs, 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 69adf48c87..453d5cda8b 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 @@ -32,7 +32,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId; import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceServices.Rpcs; @@ -66,7 +66,7 @@ public class NetconfDeviceDataBrokerTest { @Before public void setUp() throws Exception { doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(rpcService).invokeNetconf(any(), any()); - dataBroker = getDataBroker(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0); + dataBroker = getDataBroker(CapabilityURN.CANDIDATE); } @Test @@ -85,21 +85,17 @@ public class NetconfDeviceDataBrokerTest { @Test public void testWritableRunningCandidateWriteTransaction() { - testWriteTransaction(WriteCandidateRunningTx.class, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_WRITABLE_RUNNING_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0); + testWriteTransaction(WriteCandidateRunningTx.class, CapabilityURN.WRITABLE_RUNNING, CapabilityURN.CANDIDATE); } @Test public void testCandidateWriteTransaction() { - testWriteTransaction(WriteCandidateTx.class, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0); + testWriteTransaction(WriteCandidateTx.class, CapabilityURN.CANDIDATE); } @Test public void testRunningWriteTransaction() { - testWriteTransaction(WriteRunningTx.class, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_WRITABLE_RUNNING_1_0); + testWriteTransaction(WriteRunningTx.class, CapabilityURN.WRITABLE_RUNNING); } @Test diff --git a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacadeTest.java b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacadeTest.java index 4c789c7b8c..be94009d25 100644 --- a/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacadeTest.java +++ b/plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacadeTest.java @@ -23,7 +23,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMNotification; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.client.mdsal.NetconfDeviceCapabilities; import org.opendaylight.netconf.client.mdsal.NetconfDeviceSchema; import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences; @@ -75,9 +75,7 @@ public class NetconfDeviceSalFacadeTest { public void testOnDeviceConnected() { final EffectiveModelContext schemaContext = mock(EffectiveModelContext.class); - final var netconfSessionPreferences = NetconfSessionPreferences.fromStrings( - List.of(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0)); - + final var netconfSessionPreferences = NetconfSessionPreferences.fromStrings(List.of(CapabilityURN.CANDIDATE)); final var deviceServices = new RemoteDeviceServices(mock(Rpcs.Normalized.class), null); deviceFacade.onDeviceConnected( new NetconfDeviceSchema(NetconfDeviceCapabilities.empty(), new EmptyMountPointContext(schemaContext)), 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 4217f56a9a..dba9d8a1e1 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 @@ -22,6 +22,7 @@ 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.netconf.api.CapabilityURN; import org.opendaylight.netconf.server.api.monitoring.BasicCapability; import org.opendaylight.netconf.server.api.monitoring.Capability; import org.opendaylight.netconf.server.api.monitoring.CapabilityListener; @@ -47,8 +48,7 @@ import org.slf4j.LoggerFactory; @Component(service = NetconfOperationServiceFactory.class, immediate = true, property = "type=mdsal-netconf-connector") public final class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationServiceFactory.class); - private static final BasicCapability VALIDATE_CAPABILITY = - new BasicCapability("urn:ietf:params:netconf:capability:validate:1.0"); + private static final BasicCapability VALIDATE_CAPABILITY = new BasicCapability(CapabilityURN.VALIDATE); private final DOMDataBroker dataBroker; private final DOMRpcService rpcService; @@ -98,7 +98,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati final var capabilities = new HashSet(); // Added by netconf-impl by default - // capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0")); + // capabilities.add(new BasicCapability(CapabilityURN.CANDIDATE)); // FIXME: rework in terms of ModuleEffectiveStatement for (var module : currentContext.getModules()) { @@ -149,6 +149,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati public Registration registerCapabilityListener(final CapabilityListener listener) { // Advertise validate capability only if DOMDataBroker provides DOMDataTransactionValidator if (dataBroker.getExtensions().get(DOMDataTransactionValidator.class) != null) { + // FIXME: support VALIDATE_1_1 as well! listener.onCapabilitiesChanged(Set.of(VALIDATE_CAPABILITY), Set.of()); } // Advertise namespaces of supported YANG models as NETCONF capabilities diff --git a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/monitoring/GetSchema.java b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/monitoring/GetSchema.java index 7a89296343..0805109426 100644 --- a/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/monitoring/GetSchema.java +++ b/plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/monitoring/GetSchema.java @@ -30,6 +30,9 @@ import org.w3c.dom.Element; public final class GetSchema extends AbstractSingletonNetconfOperation { private static final Logger LOG = LoggerFactory.getLogger(GetSchema.class); + public static final String URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING = + "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring"; + private static final String GET_SCHEMA = "get-schema"; private static final String IDENTIFIER = "identifier"; private static final String VERSION = "version"; @@ -48,7 +51,7 @@ public final class GetSchema extends AbstractSingletonNetconfOperation { @Override protected String getOperationNamespace() { - return XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING; + return URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING; } @Override @@ -68,7 +71,7 @@ public final class GetSchema extends AbstractSingletonNetconfOperation { } final var getSchemaResult = XmlUtil.createTextElement(document, XmlNetconfConstants.DATA_KEY, schema, - Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING)); + Optional.of(URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING)); LOG.trace("{} operation successful", GET_SCHEMA); return getSchemaResult; } @@ -79,7 +82,7 @@ public final class GetSchema extends AbstractSingletonNetconfOperation { GetSchemaEntry(final XmlElement getSchemaElement) throws DocumentedException { getSchemaElement.checkName(GET_SCHEMA); - getSchemaElement.checkNamespace(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING); + getSchemaElement.checkNamespace(URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING); final XmlElement identifierElement; try { diff --git a/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/CapabilityURN.java b/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/CapabilityURN.java new file mode 100644 index 0000000000..f78ad586a6 --- /dev/null +++ b/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/CapabilityURN.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.netconf.api; + +import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The contents of + * + * Network Configuration Protocol (NETCONF) Capability URNs IANA registry as well as any other capabilities we + * explicitly recognize. + * + *

+ * The basic concept of Capabilities is defined in + * RFC6241 section 8. While that section mentions + * capabilities are identified by URIs in general, the "identification" part is done through URNs, which are extended + * to URIs during negotiation by adding a query part where applicable. + */ +@NonNullByDefault +public final class CapabilityURN { + /** + * The base NETCONF capability, as defined in + * RFC4741, section 8.1. + * @deprecated This capability identifies legacy NETCONF devices and has been superseded by {@link #BASE_1_1}, just + * as RFC6241 obsoletes RFC4741. + */ + @Deprecated + public static final String BASE = "urn:ietf:params:netconf:base:1.0"; + /** + * The base NETCONF capability, as defined in + * RFC6241, section 8.1. + */ + public static final String BASE_1_1 = "urn:ietf:params:netconf:base:1.1"; + /** + * The Candidate Configuration Capability, as defined in + * RFC6241, section 8.3. + */ + public static final String CANDIDATE = "urn:ietf:params:netconf:capability:candidate:1.0"; + /** + * The Candidate Configuration Capability, as defined in + * RFC4741, section 8.3. + * @deprecated This capability is superseded by {@link #CONFIRMED_COMMIT_1_1}. + */ + @Deprecated + public static final String CONFIRMED_COMMIT = "urn:ietf:params:netconf:capability:confirmed-commit:1.0"; + /** + * The Rollback-on-Error Capability, as defined in + * RFC6241, section 8.4. + */ + public static final String CONFIRMED_COMMIT_1_1 = "urn:ietf:params:netconf:capability:confirmed-commit:1.1"; + /** + * The EXI Capability, as defined in + * + * draft-varga-netconf-exi-capability-01, section 3. Note this is an expired IETF draft capability and subject + * to change. + */ + @Beta + public static final String EXI = "urn:ietf:params:netconf:capability:exi:1.0"; + /** + * The Interleave Capability, as defined in + * RFC5277, section 6. + */ + public static final String INTERLEAVE = "urn:ietf:params:netconf:capability:interleave:1.0"; + /** + * The Validate Capability, as defined in + * RFC5277, section 3.1. + */ + public static final String NOTIFICATION = "urn:ietf:params:netconf:capability:notification:1.0"; + /** + * The Partial Locking Capability, as defined in + * RFC5715, section 2. + */ + public static final String PARTIAL_LOCK = "urn:ietf:params:netconf:capability:partial-lock:1.0"; + /** + * The Rollback-on-Error Capability, as defined in + * RFC6241, section 8.5. + */ + public static final String ROLLBACK_ON_ERROR = "urn:ietf:params:netconf:capability:rollback-on-error:1.0"; + /** + * The Distinct Startup Capability, as defined in + * RFC6241, section 8.7. + */ + public static final String STARTUP = "urn:ietf:params:netconf:capability:startup:1.0"; + /** + * The Time Capability, as defined in + * RFC7758, section 4. + */ + public static final String TIME = "urn:ietf:params:netconf:capability:time:1.0"; + /** + * The URL Capability, as defined in + * RFC6241, section 8.8. + */ + public static final String URL = "urn:ietf:params:netconf:capability:url:1.0"; + /** + * The Validate Capability, as defined in + * RFC4741, section 8.6. + * @deprecated This capability is superseded by {@link #VALIDATE_1_1}. + */ + @Deprecated + public static final String VALIDATE = "urn:ietf:params:netconf:capability:validate:1.0"; + /** + * The Validate Capability, as defined in + * RFC6241, section 8.6. + */ + public static final String VALIDATE_1_1 = "urn:ietf:params:netconf:capability:validate:1.1"; + /** + * The With-defaults Capability, as defined in + * RFC6243, section 4. + */ + public static final String WITH_DEFAULTS = "urn:ietf:params:netconf:capability:with-defaults:1.0"; + /** + * The With-defaults Capability, as augmented by + * RFC8526, section 3.1.1.2. + */ + public static final String WITH_OPERATIONAL_DEFAULTS = + "urn:ietf:params:netconf:capability:with-operational-defaults:1.0"; + /** + * The Writable-Running Capability, as defined in + * RFC6241, section 8.2. + */ + public static final String WRITABLE_RUNNING = "urn:ietf:params:netconf:capability:writable-running:1.0"; + /** + * The XPath Capability, as defined in + * RFC6241, section 8.9. + */ + public static final String XPATH = "urn:ietf:params:netconf:capability:xpath:1.0"; + /** + * The YANG Module Library Capability, as defined in + * RFC7950, section 5.6.4 and further + * specified by RFC7895. Note this applies to NETCONF endpoints + * which DO NOT support Network Management Datastore Architecture as specified by + * RFC8342. + */ + public static final String YANG_LIBRARY = "urn:ietf:params:netconf:capability:yang-library:1.0"; + /** + * The YANG Library Capability, as defined in + * RFC8526, section 2 and further specified + * by RFC8525. Note this applies to NETCONF endpoints + * which DO support Network Management Datastore Architecture as specified by + * RFC8342. + */ + public static final String YANG_LIBRARY_1_1 = "urn:ietf:params:netconf:capability:yang-library:1.1"; + + private CapabilityURN() { + // Hidden on purpose + } +} diff --git a/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlNetconfConstants.java b/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlNetconfConstants.java index 602917ef71..726d191341 100644 --- a/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlNetconfConstants.java +++ b/protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlNetconfConstants.java @@ -8,10 +8,6 @@ package org.opendaylight.netconf.api.xml; public final class XmlNetconfConstants { - private XmlNetconfConstants() { - - } - public static final String CAPABILITY = "capability"; public static final String CAPABILITIES = "capabilities"; public static final String COMMIT = "commit"; @@ -35,25 +31,11 @@ public final class XmlNetconfConstants { public static final String RPC_REPLY_KEY = "rpc-reply"; public static final String URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0 = "urn:ietf:params:xml:ns:netconf:base:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_BASE_1_0 = "urn:ietf:params:netconf:base:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_BASE_1_1 = "urn:ietf:params:netconf:base:1.1"; public static final String URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0 = "urn:ietf:params:xml:ns:netconf:exi:1.0"; public static final String URN_IETF_PARAMS_XML_NS_NETCONF_NOTIFICATION_1_0 = "urn:ietf:params:xml:ns:netconf:notification:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0 = - "urn:ietf:params:netconf:capability:notification:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_ROLLBACK_ON_ERROR_1_0 = - "urn:ietf:params:netconf:capability:rollback-on-error:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_WRITABLE_RUNNING_1_0 = - "urn:ietf:params:netconf:capability:writable-running:1.0"; - - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0 = - "urn:ietf:params:netconf:capability:exi:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0 = - "urn:ietf:params:netconf:capability:candidate:1.0"; - public static final String URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0 = - "urn:ietf:params:netconf:capability:url:1.0?scheme=file"; - public static final String URN_IETF_PARAMS_XML_NS_YANG_IETF_NETCONF_MONITORING = - "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring"; + private XmlNetconfConstants() { + // Hidden on purpose + } } diff --git a/protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java b/protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java index af1ef5fce0..d5fdc02cc9 100644 --- a/protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java +++ b/protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java @@ -16,10 +16,10 @@ import io.netty.util.concurrent.Promise; import java.util.Optional; import java.util.Set; import org.checkerframework.checker.index.qual.NonNegative; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfSessionListenerFactory; import org.opendaylight.netconf.api.messages.HelloMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator; import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory; import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; @@ -34,20 +34,19 @@ public class NetconfClientSessionNegotiatorFactory implements NetconfSessionNegotiatorFactory { public static final Set EXI_CLIENT_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0); + CapabilityURN.BASE, + CapabilityURN.BASE_1_1, + CapabilityURN.EXI); public static final Set LEGACY_EXI_CLIENT_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0); + CapabilityURN.BASE, + CapabilityURN.EXI); public static final Set DEFAULT_CLIENT_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1); + CapabilityURN.BASE, + CapabilityURN.BASE_1_1); - public static final Set LEGACY_FRAMING_CLIENT_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0); + public static final Set LEGACY_FRAMING_CLIENT_CAPABILITIES = ImmutableSet.of(CapabilityURN.BASE); private static final Logger LOG = LoggerFactory.getLogger(NetconfClientSessionNegotiatorFactory.class); private static final String START_EXI_MESSAGE_ID = "default-start-exi"; diff --git a/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/NetconfServerSessionNegotiatorFactory.java b/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/NetconfServerSessionNegotiatorFactory.java index c6bb6abd03..6a5fde3d18 100644 --- a/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/NetconfServerSessionNegotiatorFactory.java +++ b/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/NetconfServerSessionNegotiatorFactory.java @@ -17,9 +17,9 @@ import io.netty.util.concurrent.Promise; import java.net.SocketAddress; import java.util.Set; import org.checkerframework.checker.index.qual.NonNegative; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.NetconfSessionListenerFactory; import org.opendaylight.netconf.api.messages.HelloMessage; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.nettyutil.AbstractNetconfSessionNegotiator; import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory; import org.opendaylight.netconf.server.api.SessionIdProvider; @@ -35,11 +35,10 @@ public class NetconfServerSessionNegotiatorFactory implements NetconfSessionNegotiatorFactory { public static final Set DEFAULT_BASE_CAPABILITIES = ImmutableSet.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0 - ); + CapabilityURN.BASE, + CapabilityURN.BASE_1_1, + CapabilityURN.EXI, + CapabilityURN.NOTIFICATION); private final @NonNegative int maximumIncomingChunkSize; private final Timer timer; @@ -90,7 +89,7 @@ public class NetconfServerSessionNegotiatorFactory final ImmutableSet.Builder b = ImmutableSet.builder(); b.addAll(baseCapabilities); // Base 1.0 capability is supported by default - b.add(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0); + b.add(CapabilityURN.BASE); return b.build(); } diff --git a/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringService.java b/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringService.java index aab72b5953..5740a12287 100644 --- a/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringService.java +++ b/protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringService.java @@ -8,8 +8,6 @@ package org.opendaylight.netconf.server.osgi; import static com.google.common.base.Preconditions.checkState; -import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0; -import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0; import com.google.common.base.Function; import com.google.common.base.Throwables; @@ -22,6 +20,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Optional; import java.util.Set; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.server.api.monitoring.BasicCapability; import org.opendaylight.netconf.server.api.monitoring.Capability; import org.opendaylight.netconf.server.api.monitoring.CapabilityListener; @@ -48,10 +47,9 @@ import org.opendaylight.yangtools.yang.common.Empty; final class NetconfCapabilityMonitoringService implements CapabilityListener, AutoCloseable { private static final Schema.Location NETCONF_LOCATION = new Schema.Location(Schema.Location.Enumeration.NETCONF); private static final Set NETCONF_LOCATIONS = Set.of(NETCONF_LOCATION); - private static final BasicCapability CANDIDATE_CAPABILITY = - new BasicCapability(URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0); - private static final BasicCapability URL_CAPABILITY = - new BasicCapability(URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0); + private static final BasicCapability CANDIDATE_CAPABILITY = new BasicCapability(CapabilityURN.CANDIDATE); + // FIXME: hard-coded scheme here + private static final BasicCapability URL_CAPABILITY = new BasicCapability(CapabilityURN.URL + "?scheme=file"); private static final Function CAPABILITY_TO_URI = input -> new Uri(input.getCapabilityUri()); private final NetconfOperationServiceFactory netconfOperationProvider; @@ -180,9 +178,9 @@ final class NetconfCapabilityMonitoringService implements CapabilityListener, Au Set capabilities = new HashSet<>(caps); capabilities.add(CANDIDATE_CAPABILITY); capabilities.add(URL_CAPABILITY); - // TODO rollback on error not supported EditConfigXmlParser:100 + // FIXME: rollback on error not supported EditConfigXmlParser:100 // [RFC6241] 8.5. Rollback-on-Error Capability - // capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:rollback-on-error:1.0")); + // capabilities.add(new BasicCapability(CapabilityURN.ROLLBACK_ON_ERROR)); return capabilities; } diff --git a/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java b/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java index 9abef7580d..983bca0a2d 100644 --- a/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java +++ b/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java @@ -43,10 +43,10 @@ import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.client.NetconfClientDispatcher; import org.opendaylight.netconf.client.NetconfClientDispatcherImpl; @@ -218,17 +218,11 @@ public class ConcurrentClientsTest { } public static Set getOnlyExiServerCaps() { - return Set.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0 - ); + return Set.of(CapabilityURN.BASE, CapabilityURN.EXI); } public static Set getOnlyChunkServerCaps() { - return Set.of( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1 - ); + return Set.of(CapabilityURN.BASE, CapabilityURN.BASE_1_1); } public Runnable getInstanceOfClientRunnable() throws Exception { diff --git a/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringServiceTest.java b/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringServiceTest.java index e1bd48f3f7..ec3a8c1b92 100644 --- a/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringServiceTest.java +++ b/protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringServiceTest.java @@ -15,8 +15,6 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0; -import static org.opendaylight.netconf.api.xml.XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0; import java.util.HashSet; import java.util.List; @@ -28,6 +26,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.opendaylight.netconf.api.CapabilityURN; import org.opendaylight.netconf.server.api.monitoring.BasicCapability; import org.opendaylight.netconf.server.api.monitoring.Capability; import org.opendaylight.netconf.server.api.monitoring.NetconfMonitoringService; @@ -75,8 +74,8 @@ public class NetconfCapabilityMonitoringServiceTest { moduleCapability2 = new YangModuleCapability(TEST_MODULE_NAMESPACE.getValue(), TEST_MODULE_NAME, TEST_MODULE_REV2, TEST_MODULE_CONTENT2); - capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.0")); - capabilities.add(new BasicCapability("urn:ietf:params:netconf:base:1.1")); + capabilities.add(new BasicCapability(CapabilityURN.BASE)); + capabilities.add(new BasicCapability(CapabilityURN.BASE_1_1)); capabilities.add(new BasicCapability("urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&" + "revision=2010-09-24")); @@ -139,8 +138,8 @@ public class NetconfCapabilityMonitoringServiceTest { exp.add(new Uri(capability.getCapabilityUri())); } //candidate and url capabilities are added by monitoring service automatically - exp.add(new Uri(URN_IETF_PARAMS_NETCONF_CAPABILITY_CANDIDATE_1_0)); - exp.add(new Uri(URN_IETF_PARAMS_NETCONF_CAPABILITY_URL_1_0)); + exp.add(new Uri("urn:ietf:params:netconf:capability:candidate:1.0")); + exp.add(new Uri("urn:ietf:params:netconf:capability:url:1.0?scheme=file")); Capabilities expected = new CapabilitiesBuilder().setCapability(exp).build(); Capabilities actual = monitoringService.getCapabilities(); assertEquals(new HashSet<>(expected.getCapability()), new HashSet<>(actual.getCapability())); -- 2.36.6