Add netconf.api.CapabilityURN 48/105848/7
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 5 May 2023 21:18:56 +0000 (23:18 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 6 May 2023 10:31:50 +0000 (12:31 +0200)
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 <robert.varga@pantheon.tech>
24 files changed:
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java
netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiator.java
netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionNegotiatorTest.java
netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/Netconf539Test.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java
netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/config/Configuration.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfDevice.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/NetconfStateSchemas.java
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/api/NetconfSessionPreferences.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceCommunicatorTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/NetconfDeviceTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/SchemalessNetconfDeviceTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDataTreeServiceImplTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceDataBrokerTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/spi/NetconfDeviceSalFacadeTest.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/MdsalNetconfOperationServiceFactory.java
plugins/netconf-server-mdsal/src/main/java/org/opendaylight/netconf/server/mdsal/monitoring/GetSchema.java
protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/CapabilityURN.java [new file with mode: 0644]
protocol/netconf-api/src/main/java/org/opendaylight/netconf/api/xml/XmlNetconfConstants.java
protocol/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java
protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/NetconfServerSessionNegotiatorFactory.java
protocol/netconf-server/src/main/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringService.java
protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/ConcurrentClientsTest.java
protocol/netconf-server/src/test/java/org/opendaylight/netconf/server/osgi/NetconfCapabilityMonitoringServiceTest.java

index 62c84165555ceed0fee9dff786667848e9e6d07e..38805920f7592504fdb134652cb958a1cee1b547 100644 (file)
@@ -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);
index a67f7941ad7ee8633408280cdd81ab436f086441..148d80ad5bca69c5e3fefcefad423408f644cd4b 100644 (file)
@@ -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<S extends AbstractNetconf
             XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0,
             XmlNetconfConstants.CAPABILITY);
         for (int i = 0; i < nList.getLength(); i++) {
-            if (nList.item(i).getTextContent().contains(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1)) {
+            if (nList.item(i).getTextContent().contains(CapabilityURN.BASE_1_1)) {
                 return true;
             }
         }
index 2ce28966ef88672b63c7c2c4afc6bbfb6bccf2d3..b6870c3f636c65890145f2d18df26a6deda80b35 100644 (file)
@@ -47,10 +47,10 @@ 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.api.NetconfSessionListener;
 import org.opendaylight.netconf.api.messages.FramingMechanism;
 import org.opendaylight.netconf.api.messages.HelloMessage;
-import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
 import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.nettyutil.handler.ChunkedFramingMechanismEncoder;
 import org.opendaylight.netconf.nettyutil.handler.EOMFramingMechanismEncoder;
@@ -88,8 +88,7 @@ public class AbstractNetconfSessionNegotiatorTest {
                 FramingMechanismHandlerFactory.createHandler(FramingMechanism.EOM));
         channel.pipeline().addLast(NETCONF_MESSAGE_AGGREGATOR, new NetconfEOMAggregator());
         hello = HelloMessage.createClientHello(Set.of(), Optional.empty());
-        helloBase11 = HelloMessage.createClientHello(Set.of(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1),
-            Optional.empty());
+        helloBase11 = HelloMessage.createClientHello(Set.of(CapabilityURN.BASE_1_1), Optional.empty());
         doReturn(promise).when(promise).setFailure(any());
         negotiator = new TestSessionNegotiator(helloBase11, promise, channel, timer, listener, 100L);
     }
index 791d3c8a6a8b9daec5fc82f8bef015bb16210e4d..cd593030ac5d9353d046bcee2f6029c65a5d19f3 100644 (file)
@@ -23,10 +23,10 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.api.NetconfSessionListener;
 import org.opendaylight.netconf.api.messages.FramingMechanism;
 import org.opendaylight.netconf.api.messages.HelloMessage;
-import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
 import org.opendaylight.netconf.nettyutil.handler.ChunkedFramingMechanismEncoder;
 import org.opendaylight.netconf.nettyutil.handler.FramingMechanismHandlerFactory;
 import org.opendaylight.netconf.nettyutil.handler.NetconfChunkAggregator;
@@ -55,8 +55,8 @@ public class Netconf539Test {
         channel.pipeline().addLast(NETCONF_MESSAGE_FRAME_ENCODER,
             FramingMechanismHandlerFactory.createHandler(FramingMechanism.EOM));
         channel.pipeline().addLast(NETCONF_MESSAGE_AGGREGATOR, new NetconfEOMAggregator());
-        final HelloMessage serverHello = HelloMessage.createClientHello(
-            Set.of(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1), Optional.empty());
+        final HelloMessage serverHello = HelloMessage.createClientHello(Set.of(CapabilityURN.BASE_1_1),
+            Optional.empty());
         negotiator = new TestSessionNegotiator(serverHello, promise, channel, new HashedWheelTimer(), listener, 100L);
     }
 
index ef6397e6825cbcd3676b220d0ba4a68e67722c57..e1cc67b3d403e6a591778b543680dd99626d159c 100644 (file)
@@ -34,6 +34,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.northbound.ssh.SshProxyServer;
 import org.opendaylight.netconf.northbound.ssh.SshProxyServerConfiguration;
 import org.opendaylight.netconf.northbound.ssh.SshProxyServerConfigurationBuilder;
@@ -108,7 +109,7 @@ public class NetconfDeviceSimulator implements Closeable {
                 return input;
             }
         }));
-        transformedCapabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
+        transformedCapabilities.add(new BasicCapability(CapabilityURN.CANDIDATE));
         final NetconfMonitoringService monitoringService1 = new DummyMonitoringService(transformedCapabilities);
         final SessionIdProvider idProvider = new DefaultSessionIdProvider();
 
index 765ec49fa83450160f6c3124bd741b1ae57347d6..1001466a5a41b1d062dc0752497186f5431cc523 100644 (file)
@@ -11,7 +11,7 @@ import com.google.common.collect.ImmutableSet;
 import java.io.File;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.netconf.api.CapabilityURN;
 import org.opendaylight.netconf.auth.AuthProvider;
 import org.opendaylight.netconf.shaded.sshd.server.auth.pubkey.PublickeyAuthenticator;
 import org.opendaylight.netconf.test.tool.operations.OperationsCreator;
@@ -22,20 +22,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class Configuration {
-
     private static final Logger LOG = LoggerFactory.getLogger(Configuration.class);
 
     public static final Set<String> 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<String> 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<YangResource> DEFAULT_YANG_RESOURCES = ImmutableSet.of(
             new YangResource("ietf-netconf-monitoring", "2010-10-04",
index 66396db04aac38ebc1da03bf89181556e3d2a41a..8b41bbff4a2ca2986c1c796888bc0bf49b2946e2 100644 (file)
@@ -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<NetconfDeviceCommunicator> {
             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())
                 );
             }
 
index bc531415b83fb307ff8b1f0a0b848d639277b84e..433442a50a47c0bf3bf83da3eb16ff51bd03d7cc 100644 (file)
@@ -114,8 +114,9 @@ public final class NetconfStateSchemas implements NetconfDeviceSchemas {
 
     @Override
     public Set<QName> getAvailableYangSchemasQNames() {
-        return getAvailableYangSchemas().stream().map(RemoteYangSchema::getQName)
-                .collect(ImmutableSet.toImmutableSet());
+        return availableYangSchemas.stream()
+            .map(RemoteYangSchema::getQName)
+            .collect(ImmutableSet.toImmutableSet());
     }
 
     /**
index bf7300406b1082d3adc6103845e8168c7d44eca6..22ce8bf07b1f5f112ac0eb0470665d9254ae3e12 100644 (file)
@@ -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);
     }
 
index 6c76665a299003ca9f4722ed7455f4a51ecef270..a8a4cb36426cb31639506b2252bdd873a1713ba6 100644 (file)
@@ -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();
index 4ee1918456c531c3ba67d92b46f80e0af39eda7e..99dff81d55cd91c2ab23be64742ab2b586ea6e15 100644 (file)
@@ -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<String> 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 + "&amp;revision=" + TEST_REVISION));
+                List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;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 + "&amp;revision=" + TEST_REVISION));
+                List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;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 + "&amp;revision=" + TEST_REVISION));
+                List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;revision=" + TEST_REVISION));
         final Map<QName, CapabilityOrigin> 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 + "&amp;revision=" + TEST_REVISION));
+                List.of(TEST_NAMESPACE + "?module=" + TEST_MODULE + "&amp;revision=" + TEST_REVISION));
 
         netconfSpy.onRemoteSessionUp(sessionCaps, listener);
 
@@ -551,18 +544,14 @@ public class NetconfDeviceTest extends AbstractTestModelTest {
 
     public NetconfSessionPreferences getSessionCaps(final boolean addMonitor,
                                                     final Collection<String> additionalCapabilities) {
-        final ArrayList<String> capabilities = Lists.newArrayList(
-                XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0,
-                XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1);
-
+        final var capabilities = new ArrayList<String>();
+        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 {
index 981d744f60c2793d0277171c59e512c1b9fa1cf0..cc576af006ca83f9870a8478d84daf1478cace66 100644 (file)
@@ -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<String> additionalCapabilities) {
-        final ArrayList<String> 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);
     }
 }
index 7c5d812131dbb064a9d0457c1e5005a8399f7387..4eb1bc6a89475f8bc94da33c9aa56cb1ca8e65ee 100644 (file)
@@ -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,
index 69adf48c87db78a48a37d8a2410a0f725b2052d3..453d5cda8b92041ed8bef9b2c2c0650f6f3a1d57 100644 (file)
@@ -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
index 4c789c7b8cc348b3e3e8bdb948501327f6437f51..be94009d25fd4bd9798941db1181da3b4bbbc505 100644 (file)
@@ -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)),
index 4217f56a9a7b32c50b390ff1a4b9ea88015aed1e..dba9d8a1e13a160b60367aaeb0c61a0faf1eaeb2 100644 (file)
@@ -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<Capability>();
 
         // 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
index 7a89296343fd9e4dc9bb339e5a5fc0bed3166783..0805109426ca535a0f446dc184c00b986a0c24a1 100644 (file)
@@ -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 (file)
index 0000000..f78ad58
--- /dev/null
@@ -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
+ * <a href="https://www.iana.org/assignments/netconf-capability-urns/netconf-capability-urns.xhtml">
+ * Network Configuration Protocol (NETCONF) Capability URNs</a> IANA registry as well as any other capabilities we
+ * explicitly recognize.
+ *
+ * <p>
+ * The basic concept of Capabilities is defined in
+ * <a href="https://www.rfc-editor.org/rfc/rfc6241#section-8">RFC6241 section 8</a>. 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
+     * <a href="https://www.rfc-editor.org/rfc/rfc4741.html#section-8.1">RFC4741, section 8.1</a>.
+     * @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
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.1">RFC6241, section 8.1</a>.
+     */
+    public static final String BASE_1_1 = "urn:ietf:params:netconf:base:1.1";
+    /**
+     * The Candidate Configuration Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.3">RFC6241, section 8.3</a>.
+     */
+    public static final String CANDIDATE = "urn:ietf:params:netconf:capability:candidate:1.0";
+    /**
+     * The Candidate Configuration Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc4741.html#section-8.3">RFC4741, section 8.3</a>.
+     * @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
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.4">RFC6241, section 8.4</a>.
+     */
+    public static final String CONFIRMED_COMMIT_1_1 = "urn:ietf:params:netconf:capability:confirmed-commit:1.1";
+    /**
+     * The EXI Capability, as defined in
+     * <a href="https://datatracker.ietf.org/doc/html/draft-varga-netconf-exi-capability-01#section-3">
+     * draft-varga-netconf-exi-capability-01, section 3</a>. 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
+     * <a href="https://www.rfc-editor.org/rfc/rfc5277.html#section-6">RFC5277, section 6</a>.
+     */
+    public static final String INTERLEAVE = "urn:ietf:params:netconf:capability:interleave:1.0";
+    /**
+     * The Validate Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc5277.html#section-3.1">RFC5277, section 3.1</a>.
+     */
+    public static final String NOTIFICATION = "urn:ietf:params:netconf:capability:notification:1.0";
+    /**
+     * The Partial Locking Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc5717.html#section-2">RFC5715, section 2</a>.
+     */
+    public static final String PARTIAL_LOCK = "urn:ietf:params:netconf:capability:partial-lock:1.0";
+    /**
+     * The Rollback-on-Error Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.5">RFC6241, section 8.5</a>.
+     */
+    public static final String ROLLBACK_ON_ERROR = "urn:ietf:params:netconf:capability:rollback-on-error:1.0";
+    /**
+     * The Distinct Startup Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.7">RFC6241, section 8.7</a>.
+     */
+    public static final String STARTUP = "urn:ietf:params:netconf:capability:startup:1.0";
+    /**
+     * The Time Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc7758.html#section-4">RFC7758, section 4</a>.
+     */
+    public static final String TIME = "urn:ietf:params:netconf:capability:time:1.0";
+    /**
+     * The URL Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.8">RFC6241, section 8.8</a>.
+     */
+    public static final String URL = "urn:ietf:params:netconf:capability:url:1.0";
+    /**
+     * The Validate Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc4741.html#section-8.6">RFC4741, section 8.6</a>.
+     * @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
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.6">RFC6241, section 8.6</a>.
+     */
+    public static final String VALIDATE_1_1 = "urn:ietf:params:netconf:capability:validate:1.1";
+    /**
+     * The With-defaults Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6243.html#section-4">RFC6243, section 4</a>.
+     */
+    public static final String WITH_DEFAULTS = "urn:ietf:params:netconf:capability:with-defaults:1.0";
+    /**
+     * The With-defaults Capability, as augmented by
+     * <a href="https://www.rfc-editor.org/rfc/rfc8526#section-3.1.1.2">RFC8526, section 3.1.1.2</a>.
+     */
+    public static final String WITH_OPERATIONAL_DEFAULTS =
+        "urn:ietf:params:netconf:capability:with-operational-defaults:1.0";
+    /**
+     * The Writable-Running Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.2">RFC6241, section 8.2</a>.
+     */
+    public static final String WRITABLE_RUNNING = "urn:ietf:params:netconf:capability:writable-running:1.0";
+    /**
+     * The XPath Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc6241.html#section-8.9">RFC6241, section 8.9</a>.
+     */
+    public static final String XPATH = "urn:ietf:params:netconf:capability:xpath:1.0";
+    /**
+     * The YANG Module Library Capability, as defined in
+     * <a href="hhttps://www.rfc-editor.org/rfc/rfc7950.html#section-5.6.4">RFC7950, section 5.6.4</a> and further
+     * specified by <a href="https://www.rfc-editor.org/rfc/rfc7895">RFC7895</a>. Note this applies to NETCONF endpoints
+     * which DO NOT support Network Management Datastore Architecture as specified by
+     * <a href="https://www.rfc-editor.org/rfc/rfc8342">RFC8342</a>.
+     */
+    public static final String YANG_LIBRARY = "urn:ietf:params:netconf:capability:yang-library:1.0";
+    /**
+     * The YANG Library Capability, as defined in
+     * <a href="https://www.rfc-editor.org/rfc/rfc8526.html#section-2">RFC8526, section 2</a> and further specified
+     * by <a href="https://www.rfc-editor.org/rfc/rfc8525">RFC8525</a>. Note this applies to NETCONF endpoints
+     * which DO support Network Management Datastore Architecture as specified by
+     * <a href="https://www.rfc-editor.org/rfc/rfc8342">RFC8342</a>.
+     */
+    public static final String YANG_LIBRARY_1_1 = "urn:ietf:params:netconf:capability:yang-library:1.1";
+
+    private CapabilityURN() {
+        // Hidden on purpose
+    }
+}
index 602917ef71a811a1d513e23bfc6f3cfac99991ee..726d1913419c73dc0e67d6d1a2303b797bc0c00b 100644 (file)
@@ -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
+    }
 }
index af1ef5fce0b2826ab6dbb10b67e15ad9f9d65dc9..d5fdc02cc9e9151b194ce9ea59e99bfbed69bfc6 100644 (file)
@@ -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<NetconfClientSession, NetconfClientSessionListener> {
 
     public static final Set<String> 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<String> 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<String> 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<String> LEGACY_FRAMING_CLIENT_CAPABILITIES = ImmutableSet.of(
-            XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0);
+    public static final Set<String> 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";
index c6bb6abd035fc70c7a4d76df93f2fe168938d7f9..6a5fde3d18f499e40eb444b47df0a44235c9656b 100644 (file)
@@ -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<NetconfServerSession, NetconfServerSessionListener> {
 
     public static final Set<String> 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<String> 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();
     }
 
index aab72b595314e4c376601f2c12699e2984ededdd..5740a1228743aacc34ed5e48ee01e212913bd26e 100644 (file)
@@ -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<Schema.Location> 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, Uri> CAPABILITY_TO_URI = input -> new Uri(input.getCapabilityUri());
 
     private final NetconfOperationServiceFactory netconfOperationProvider;
@@ -180,9 +178,9 @@ final class NetconfCapabilityMonitoringService implements CapabilityListener, Au
         Set<Capability> 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;
     }
 
index 9abef7580d91ec32103b92c1a5b72a369580ac9a..983bca0a2d504c463bf54f05c2adf41e682c6495 100644 (file)
@@ -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<String> 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<String> 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 {
index e1bd48f3f751ba328525a5a4a2984ed318a4e328..ec3a8c1b9294531e1d4924fe3bcf5e0c302ac538 100644 (file)
@@ -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&amp;"
                 + "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()));