Create extractUserCapabilities()
[netconf.git] / netconf / netconf-topology / src / main / java / org / opendaylight / netconf / topology / spi / NetconfNodeUtils.java
index 085680fb6b3b72b54d1a228109c081a1cdd5ce99..0e1a4de1d93c9df7b87fba2c38328b76825e3bc3 100644 (file)
@@ -8,12 +8,15 @@
 package org.opendaylight.netconf.topology.spi;
 
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
+import org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
 /**
@@ -24,10 +27,17 @@ public final class NetconfNodeUtils {
         // Hidden on purpose
     }
 
+    /**
+     * Create an {@link InetSocketAddress} targeting a particular {@link NetconfNode}.
+     *
+     * @param node A {@link NetconfNode}
+     * @return A {@link InetSocketAddress}
+     * @throws NullPointerException if {@code node} is {@code null}
+     */
     public static @NonNull InetSocketAddress toInetSocketAddress(final NetconfNode node) {
-        final Host host = node.requireHost();
+        final var host = node.requireHost();
         final int port = node.requirePort().getValue().toJava();
-        final IpAddress ipAddress = host.getIpAddress();
+        final var ipAddress = host.getIpAddress();
         return ipAddress != null ? new InetSocketAddress(IetfInetUtil.INSTANCE.inetAddressFor(ipAddress), port)
             : new InetSocketAddress(host.getDomainName().getValue(), port);
     }
@@ -35,4 +45,50 @@ public final class NetconfNodeUtils {
     public static @NonNull RemoteDeviceId toRemoteDeviceId(final NodeId nodeId, final NetconfNode node) {
         return new RemoteDeviceId(nodeId.getValue(), toInetSocketAddress(node));
     }
+
+    /**
+     * Extract {@link UserPreferences} from na {@link NetconfNode}.
+     *
+     * @param node A {@link NetconfNode}
+     * @return {@link UserPreferences}, potentially {@code null}
+     * @throws NullPointerException if {@code node} is {@code null}
+     * @throws IllegalArgumentException there are any non-module capabilities
+     */
+    public static @Nullable UserPreferences extractUserCapabilities(final NetconfNode node) {
+        final var moduleCaps = node.getYangModuleCapabilities();
+        final var nonModuleCaps = node.getNonModuleCapabilities();
+
+        if (moduleCaps == null && nonModuleCaps == null) {
+            // if none of yang-module-capabilities or non-module-capabilities is specified
+            return null;
+        }
+
+        final var capabilities = new ArrayList<String>();
+        final boolean overrideYangModuleCaps;
+        if (moduleCaps != null) {
+            capabilities.addAll(moduleCaps.getCapability());
+            overrideYangModuleCaps = moduleCaps.getOverride();
+        } else {
+            overrideYangModuleCaps = false;
+        }
+
+        //non-module capabilities should not exist in yang module capabilities
+        final var sessionPreferences = NetconfSessionPreferences.fromStrings(capabilities);
+        final var nonModulePrefs = sessionPreferences.getNonModuleCaps();
+        if (!nonModulePrefs.isEmpty()) {
+            throw new IllegalArgumentException("List yang-module-capabilities/capability should contain only module "
+                + "based capabilities. Non-module capabilities used: " + nonModulePrefs);
+        }
+
+        final boolean overrideNonModuleCaps;
+        if (nonModuleCaps != null) {
+            capabilities.addAll(nonModuleCaps.getCapability());
+            overrideNonModuleCaps = nonModuleCaps.getOverride();
+        } else {
+            overrideNonModuleCaps = false;
+        }
+
+        return new UserPreferences(NetconfSessionPreferences.fromStrings(capabilities, CapabilityOrigin.UserDefined),
+            overrideYangModuleCaps, overrideNonModuleCaps);
+    }
 }