Merge "Add .gitreview"
authorMaros Marsalek <mmarsale@cisco.com>
Fri, 11 Sep 2015 06:58:22 +0000 (06:58 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 11 Sep 2015 06:58:22 +0000 (06:58 +0000)
35 files changed:
features/restconf/pom.xml
features/restconf/src/main/resources/features.xml
opendaylight/netconf/messagebus-netconf/src/main/java/org/opendaylight/netconf/messagebus/eventsources/netconf/ConnectionNotificationTopicRegistration.java
opendaylight/netconf/messagebus-netconf/src/main/java/org/opendaylight/netconf/messagebus/eventsources/netconf/NetconfEventSource.java
opendaylight/netconf/messagebus-netconf/src/main/java/org/opendaylight/netconf/messagebus/eventsources/netconf/StreamNotificationTopicRegistration.java
opendaylight/netconf/netconf-auth/src/main/java/org/opendaylight/netconf/auth/AuthConstants.java [deleted file]
opendaylight/netconf/netconf-it/pom.xml
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/AbstractNetconfConfigTest.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/AbstractNetconfConfigTest.java with 92% similarity]
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfConfigPersisterITTest.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfConfigPersisterITTest.java with 97% similarity]
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITMonitoringTest.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITMonitoringTest.java with 94% similarity]
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITSecureTest.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITSecureTest.java with 89% similarity]
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITSecureTestTool.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITSecureTestTool.java with 92% similarity]
opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITTest.java [moved from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITTest.java with 98% similarity]
opendaylight/netconf/netconf-mdsal-config/src/main/resources/initial/08-netconf-mdsal.xml
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/controller/config/yang/netconf/northbound/ssh/NetconfNorthboundSshModule.java
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/netconf/ssh/SshProxyServer.java
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/netconf/ssh/SshProxyServerConfiguration.java
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/netconf/ssh/SshProxyServerConfigurationBuilder.java
opendaylight/netconf/netconf-ssh/src/main/java/org/opendaylight/netconf/ssh/osgi/AuthProviderTracker.java
opendaylight/netconf/netconf-ssh/src/main/yang/netconf-northbound-ssh.yang
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoClient.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoClient.java with 98% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoClientHandler.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoClientHandler.java with 98% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoServer.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoServer.java with 98% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoServerHandler.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoServerHandler.java with 97% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/ProxyServer.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/ProxyServer.java with 98% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/ProxyServerHandler.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/ProxyServerHandler.java with 98% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/SSHTest.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/SSHTest.java with 93% similarity]
opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/ssh/authentication/SSHServerTest.java [moved from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/ssh/authentication/SSHServerTest.java with 92% similarity]
opendaylight/netconf/pom.xml
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceDatastoreAdapter.java [new file with mode: 0644]
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalFacade.java
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalProvider.java
opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/DummyMonitoringService.java
opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/NetconfDeviceSimulator.java
opendaylight/restconf/restconf-artifacts/pom.xml

index d7fa70706ec005b6237ffbf602074d4151183684..2f9e6043ed7ee149f5a5823eb22307e93d8c3ac0 100644 (file)
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
-    <!-- dependency>
+    <dependency>
       <groupId>org.opendaylight.aaa</groupId>
       <artifactId>features-aaa</artifactId>
       <version>${aaa.version}</version>
       <classifier>features</classifier>
       <type>xml</type>
-    </dependency -->
+    </dependency>
 
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
index 99afd6dc923d220cbf04528e9a4495562814ac87..4ac45920006a5f8caaf79f8745b13933cd8bb3d2 100644 (file)
@@ -24,7 +24,7 @@
     -->
     <repository>mvn:org.opendaylight.controller/features-mdsal/${mdsal.version}/xml/features</repository>
     <repository>mvn:org.opendaylight.yangtools/features-yangtools/${yangtools.version}/xml/features</repository>
-    <!-- repository>mvn:org.opendaylight.aaa/features-aaa/${aaa.version}/xml/features</repository -->
+    <repository>mvn:org.opendaylight.aaa/features-aaa/${aaa.version}/xml/features</repository>
     <feature name='odl-restconf-all' version='${project.version}' description='OpenDaylight :: Restconf :: All'>
         <!--
             Necessary TODO:
@@ -85,7 +85,7 @@
     -->
 
     <feature name='odl-restconf' version='${project.version}' description="OpenDaylight :: Restconf">
-        <!-- feature version='${aaa.version}'>odl-aaa-authn</feature -->
+        <feature version='${aaa.version}'>odl-aaa-authn</feature>
         <feature version='${project.version}'>odl-restconf-noauth</feature>
     </feature>
     <feature name='odl-restconf-noauth' version='${project.version}' description="OpenDaylight :: Restconf">
index 4ad5647097cdf50444d5b118156e4f8fd64a6239..fd7d784669d9ee83dc7a484b827f889a056755d7 100644 (file)
@@ -39,7 +39,7 @@ public class ConnectionNotificationTopicRegistration extends NotificationTopicRe
 
     public static final SchemaPath EVENT_SOURCE_STATUS_PATH = SchemaPath
         .create(true, QName.create(EventSourceStatusNotification.QNAME, "event-source-status"));
-    private static final NodeIdentifier EVENT_SOURCE_STATUS_ARG = new NodeIdentifier(
+    private static final NodeIdentifier EVENT_SOURCE_STATUS_ARG = NodeIdentifier.create(
         EventSourceStatusNotification.QNAME);
     private static final String XMLNS_ATTRIBUTE_KEY = "xmlns";
     private static final String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
index 30ed9be743fa17e39f8cd270095018eccf47099f..756f1523a0ff5b33ec588e7b43901d651e304c45 100644 (file)
@@ -77,12 +77,12 @@ public class NetconfEventSource implements EventSource, DOMNotificationListener
 
     private static final Logger LOG = LoggerFactory.getLogger(NetconfEventSource.class);
 
-    private static final NodeIdentifier TOPIC_NOTIFICATION_ARG = new NodeIdentifier(TopicNotification.QNAME);
-    private static final NodeIdentifier EVENT_SOURCE_ARG = new NodeIdentifier(
+    private static final NodeIdentifier TOPIC_NOTIFICATION_ARG = NodeIdentifier.create(TopicNotification.QNAME);
+    private static final NodeIdentifier EVENT_SOURCE_ARG = NodeIdentifier.create(
         QName.create(TopicNotification.QNAME, "node-id"));
-    private static final NodeIdentifier TOPIC_ID_ARG = new NodeIdentifier(
+    private static final NodeIdentifier TOPIC_ID_ARG = NodeIdentifier.create(
         QName.create(TopicNotification.QNAME, "topic-id"));
-    private static final NodeIdentifier PAYLOAD_ARG = new NodeIdentifier(
+    private static final NodeIdentifier PAYLOAD_ARG = NodeIdentifier.create(
         QName.create(TopicNotification.QNAME, "payload"));
     private static final String ConnectionNotificationSourceName = "ConnectionNotificationSource";
 
index 16bd9d37f13763491046c62cd844b4637231298d..7031d7bee5f804f0e3013cace1565cbbede2ea73 100644 (file)
@@ -35,12 +35,14 @@ import org.slf4j.LoggerFactory;
 public class StreamNotificationTopicRegistration extends NotificationTopicRegistration {
 
     private static final Logger LOG = LoggerFactory.getLogger(StreamNotificationTopicRegistration.class);
-    private static final NodeIdentifier STREAM_QNAME = new NodeIdentifier(
+    private static final NodeIdentifier STREAM_QNAME = NodeIdentifier.create(
         QName.create(CreateSubscriptionInput.QNAME, "stream"));
     private static final SchemaPath CREATE_SUBSCRIPTION = SchemaPath
         .create(true, QName.create(CreateSubscriptionInput.QNAME, "create-subscription"));
-    private static final NodeIdentifier START_TIME_SUBSCRIPTION = new NodeIdentifier(
+    private static final NodeIdentifier START_TIME_SUBSCRIPTION = NodeIdentifier.create(
         QName.create(CreateSubscriptionInput.QNAME, "startTime"));
+    private static final NodeIdentifier CREATE_SUBSCRIPTION_INPUT = NodeIdentifier.create(
+        CreateSubscriptionInput.QNAME);
 
     final private DOMMountPoint domMountPoint;
     final private String nodeId;
@@ -68,7 +70,7 @@ public class StreamNotificationTopicRegistration extends NotificationTopicRegist
         if (isActive() == false) {
             LOG.info("Stream {} is not active on node {}. Will subscribe.", this.getStreamName(), this.nodeId);
             final ContainerNode input = Builders.containerBuilder()
-                .withNodeIdentifier(new NodeIdentifier(CreateSubscriptionInput.QNAME))
+                .withNodeIdentifier(CREATE_SUBSCRIPTION_INPUT)
                 .withChild(ImmutableNodes.leafNode(STREAM_QNAME, this.getStreamName())).build();
             CheckedFuture<DOMRpcResult, DOMRpcException> csFuture = domMountPoint.getService(DOMRpcService.class).get()
                 .invokeRpc(CREATE_SUBSCRIPTION, input);
@@ -89,7 +91,7 @@ public class StreamNotificationTopicRegistration extends NotificationTopicRegist
         if (isActive()) {
             LOG.info("Stream {} is reactivating on node {}.", this.getStreamName(), this.nodeId);
             DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> inputBuilder = Builders.containerBuilder()
-                .withNodeIdentifier(new NodeIdentifier(CreateSubscriptionInput.QNAME))
+                .withNodeIdentifier(CREATE_SUBSCRIPTION_INPUT)
                 .withChild(ImmutableNodes.leafNode(STREAM_QNAME, this.getStreamName()));
             if (isReplaySupported() && this.getLastEventTime() != null) {
                 inputBuilder.withChild(ImmutableNodes.leafNode(START_TIME_SUBSCRIPTION, this.getLastEventTime()));
diff --git a/opendaylight/netconf/netconf-auth/src/main/java/org/opendaylight/netconf/auth/AuthConstants.java b/opendaylight/netconf/netconf-auth/src/main/java/org/opendaylight/netconf/auth/AuthConstants.java
deleted file mode 100644 (file)
index a5340de..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. 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.auth;
-
-public class AuthConstants {
-
-    /**
-     * This property should be set for every implementation of AuthService published to OSGi.
-     * Netconf SSH will pick the service with highest preference in case of multiple services present in OSGi.
-     */
-    public static final String SERVICE_PREFERENCE_KEY = "preference";
-}
index e0bd3de31a9d0dc5b9b15dcce9cda6bbafe2eda0..f26e91d57191608473bfcf89a37d6bea3c32bf9d 100644 (file)
@@ -38,7 +38,7 @@
     </dependency>
     <!-- compile dependencies -->
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.opendaylight.controller</groupId>
       <artifactId>config-api</artifactId>
       <scope>test</scope>
     </dependency>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.opendaylight.controller</groupId>
       <artifactId>netty-config-api</artifactId>
       <scope>test</scope>
     </dependency>
similarity index 92%
rename from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/AbstractNetconfConfigTest.java
rename to opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/AbstractNetconfConfigTest.java
index 4d0d55f99e353e22e82f891016c58fea1f681b41..21ba9068a3131936d47e9af3405dd1c44d5a0407 100644 (file)
@@ -5,7 +5,7 @@
  * 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.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -43,18 +43,18 @@ import org.opendaylight.controller.config.yang.test.impl.IdentityTestModuleFacto
 import org.opendaylight.controller.config.yang.test.impl.MultipleDependenciesModuleFactory;
 import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleFactory;
 import org.opendaylight.controller.config.yang.test.impl.TestImplModuleFactory;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.api.monitoring.NetconfMonitoringService;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl;
-import org.opendaylight.controller.netconf.client.SimpleNetconfClientSessionListener;
-import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration;
-import org.opendaylight.controller.netconf.client.conf.NetconfClientConfigurationBuilder;
-import org.opendaylight.controller.netconf.confignetconfconnector.osgi.NetconfOperationServiceFactoryImpl;
-import org.opendaylight.controller.netconf.impl.NetconfServerDispatcherImpl;
-import org.opendaylight.controller.netconf.impl.NetconfServerSessionNegotiatorFactory;
-import org.opendaylight.controller.netconf.impl.SessionIdProvider;
-import org.opendaylight.controller.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
-import org.opendaylight.controller.netconf.impl.osgi.NetconfMonitoringServiceImpl;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.client.NetconfClientDispatcherImpl;
+import org.opendaylight.netconf.client.SimpleNetconfClientSessionListener;
+import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
+import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
+import org.opendaylight.netconf.confignetconfconnector.osgi.NetconfOperationServiceFactoryImpl;
+import org.opendaylight.netconf.impl.NetconfServerDispatcherImpl;
+import org.opendaylight.netconf.impl.NetconfServerSessionNegotiatorFactory;
+import org.opendaylight.netconf.impl.SessionIdProvider;
+import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
+import org.opendaylight.netconf.impl.osgi.NetconfMonitoringServiceImpl;
 import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 import org.opendaylight.netconf.monitoring.osgi.NetconfMonitoringActivator;
 import org.opendaylight.netconf.monitoring.osgi.NetconfMonitoringOperationService;
@@ -5,7 +5,7 @@
  * 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.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
@@ -34,8 +34,8 @@ import org.opendaylight.controller.config.api.jmx.notifications.ConfigJMXNotific
 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
 import org.opendaylight.controller.config.persist.api.Persister;
 import org.opendaylight.controller.config.persist.impl.ConfigPersisterNotificationHandler;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.client.TestingNetconfClient;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.client.TestingNetconfClient;
 import org.opendaylight.netconf.util.test.XmlFileLoader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2;
similarity index 94%
rename from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITMonitoringTest.java
rename to opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITMonitoringTest.java
index fcc504129073f6a721448f6e752420eda4069d51..87b145717bad04d83b9a3f95ce13a3055434e3f6 100644 (file)
@@ -5,7 +5,7 @@
  * 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.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
@@ -29,10 +29,10 @@ import java.util.Set;
 import org.junit.Test;
 import org.opendaylight.controller.config.util.capability.Capability;
 import org.opendaylight.controller.config.util.xml.XmlUtil;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.api.monitoring.CapabilityListener;
-import org.opendaylight.controller.netconf.client.TestingNetconfClient;
-import org.opendaylight.controller.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.api.monitoring.CapabilityListener;
+import org.opendaylight.netconf.client.TestingNetconfClient;
+import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
 import org.opendaylight.netconf.mapping.api.NetconfOperationService;
 import org.opendaylight.netconf.util.test.XmlFileLoader;
 import org.w3c.dom.Document;
similarity index 89%
rename from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITSecureTest.java
rename to opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITSecureTest.java
index 24e2ae52d235f121690d3b82a2564d643a829c4a..d39f2e5de4900c2a5bb4554a2ecc97b21756f065 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -35,32 +35,30 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
-import org.apache.sshd.server.session.ServerSession;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.config.util.xml.XmlUtil;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.auth.AuthProvider;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl;
-import org.opendaylight.controller.netconf.client.NetconfClientSessionListener;
-import org.opendaylight.controller.netconf.client.SimpleNetconfClientSessionListener;
-import org.opendaylight.controller.netconf.client.TestingNetconfClient;
-import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration;
-import org.opendaylight.controller.netconf.client.conf.NetconfClientConfigurationBuilder;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.auth.AuthProvider;
+import org.opendaylight.netconf.client.NetconfClientDispatcher;
+import org.opendaylight.netconf.client.NetconfClientDispatcherImpl;
+import org.opendaylight.netconf.client.NetconfClientSessionListener;
+import org.opendaylight.netconf.client.SimpleNetconfClientSessionListener;
+import org.opendaylight.netconf.client.TestingNetconfClient;
+import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
+import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.LoginPassword;
-import org.opendaylight.netconf.ssh.SshProxyServer;
-import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder;
-import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
-import org.opendaylight.netconf.util.osgi.NetconfConfigUtil;
 import org.opendaylight.netconf.sal.connect.api.RemoteDevice;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
+import org.opendaylight.netconf.ssh.SshProxyServer;
+import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder;
+import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
+import org.opendaylight.netconf.util.osgi.NetconfConfigUtil;
 import org.opendaylight.protocol.framework.NeverReconnectStrategy;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -90,13 +88,13 @@ public class NetconfITSecureTest extends AbstractNetconfConfigTest {
                 new SshProxyServerConfigurationBuilder()
                         .setBindingAddress(TLS_ADDRESS)
                         .setLocalAddress(NetconfConfigUtil.getNetconfLocalAddress())
-                        .setAuthenticator(new PasswordAuthenticator() {
-                            @Override
-                            public boolean authenticate(final String username, final String password, final ServerSession session) {
-                                return true;
-                            }
-                        }
-                    )
+                        .setAuthenticator(new AuthProvider() {
+                                              @Override
+                                              public boolean authenticated(String username, String password) {
+                                                  return true;
+                                              }
+                                          }
+                        )
                         .setKeyPairProvider(new PEMGeneratorHostKeyProvider(Files.createTempFile("prefix", "suffix").toAbsolutePath().toString()))
                         .setIdleTimeout(Integer.MAX_VALUE)
                         .createSshProxyServerConfiguration());
similarity index 92%
rename from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITSecureTestTool.java
rename to opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITSecureTestTool.java
index 2636cefff83032ccdc9754d5da4f52faec139835..a6e2717aef3d425574766fbf5443722f719c66fe 100644 (file)
@@ -1,17 +1,17 @@
 /*
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014 Cisco Systems, Inc. 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.html
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static java.lang.Thread.sleep;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.opendaylight.controller.netconf.it.NetconfITSecureTest.getSessionListener;
+import static org.opendaylight.netconf.it.NetconfITSecureTest.getSessionListener;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.Lists;
@@ -34,10 +34,10 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl;
-import org.opendaylight.controller.netconf.client.TestingNetconfClient;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.client.NetconfClientDispatcher;
+import org.opendaylight.netconf.client.NetconfClientDispatcherImpl;
+import org.opendaylight.netconf.client.TestingNetconfClient;
 import org.opendaylight.netconf.test.tool.Main.Params;
 import org.opendaylight.netconf.test.tool.NetconfDeviceSimulator;
 import org.opendaylight.netconf.util.test.XmlFileLoader;
similarity index 98%
rename from opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/controller/netconf/it/NetconfITTest.java
rename to opendaylight/netconf/netconf-it/src/test/java/org/opendaylight/netconf/it/NetconfITTest.java
index 8dd829db96d45b2234fa2e510e5378774686a865..5d7ce7d0f7a41170c8213a353f468a831c60c382 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.it;
+package org.opendaylight.netconf.it;
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
@@ -40,9 +40,9 @@ import org.opendaylight.controller.config.yang.test.impl.MultipleDependenciesMod
 import org.opendaylight.controller.config.yang.test.impl.MultipleDependenciesModuleMXBean;
 import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleFactory;
 import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleMXBean;
-import org.opendaylight.controller.netconf.api.NetconfMessage;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.controller.netconf.client.TestingNetconfClient;
+import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.client.NetconfClientDispatcher;
+import org.opendaylight.netconf.client.TestingNetconfClient;
 import org.opendaylight.netconf.util.test.XmlFileLoader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2;
index 72a3dcf3885165aad54083ad4774d62e4fe29f8d..be3bb09ed529af84af8cf526899875f31d1fa4cf 100644 (file)
                   <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:netconf:northbound">prefix:netconf-server-dispatcher</type>
                   <name>netconf-mdsal-server-dispatcher</name>
               </dispatcher>
-
-              <username>admin</username>
-              <password>admin</password>
+              <auth-provider xmlns="urn:opendaylight:params:xml:ns:yang:controller:netconf:northbound:ssh">
+                  <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:netconf:auth">prefix:netconf-auth-provider</type>
+                  <name>default-auth-provider</name>
+              </auth-provider>
           </module>
 
 
index 8d0afa9738b56bec757049e3af9c3502ae19670f..f212edc2d3f3a4f44aae85d53c1fa06d993d2afa 100644 (file)
@@ -8,9 +8,7 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.concurrent.Executors;
-import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
-import org.apache.sshd.server.session.ServerSession;
 import org.opendaylight.netconf.api.NetconfServerDispatcher;
 import org.opendaylight.netconf.ssh.SshProxyServer;
 import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder;
@@ -47,7 +45,7 @@ public class NetconfNorthboundSshModule extends org.opendaylight.controller.conf
         final SshProxyServerConfigurationBuilder sshProxyServerConfigurationBuilder = new SshProxyServerConfigurationBuilder();
         sshProxyServerConfigurationBuilder.setBindingAddress(bindingAddress);
         sshProxyServerConfigurationBuilder.setLocalAddress(localAddress);
-        sshProxyServerConfigurationBuilder.setAuthenticator(new UserAuthenticator(getUsername(), getPassword()));
+        sshProxyServerConfigurationBuilder.setAuthenticator(getAuthProviderDependency());
         sshProxyServerConfigurationBuilder.setIdleTimeout(Integer.MAX_VALUE);
         sshProxyServerConfigurationBuilder.setKeyPairProvider(new PEMGeneratorHostKeyProvider());
 
@@ -101,22 +99,4 @@ public class NetconfNorthboundSshModule extends org.opendaylight.controller.conf
             }
         }
     }
-
-
-    private static final class UserAuthenticator implements PasswordAuthenticator {
-
-        private final String username;
-        private final String password;
-
-        public UserAuthenticator(final String username, final String password) {
-            this.username = username;
-            this.password = password;
-        }
-
-        @Override
-        public boolean authenticate(final String username, final String password, final ServerSession session) {
-            // FIXME use aaa stuff here instead
-            return this.username.equals(username) && this.password.equals(password);
-        }
-    }
 }
index ccf5744fab0bf1ab465b29dd5817b2e7e93d5475..57c6789f78f6a307c07bcdd354972355ea217bec 100644 (file)
@@ -36,7 +36,9 @@ import org.apache.sshd.common.io.nio2.Nio2Connector;
 import org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory;
 import org.apache.sshd.common.util.CloseableUtils;
 import org.apache.sshd.server.Command;
+import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.ServerFactoryManager;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * Proxy SSH server that just delegates decrypted content to a delegate server within same VM.
@@ -71,7 +73,13 @@ public class SshProxyServer implements AutoCloseable {
                 i.remove();
             }
         }
-        sshServer.setPasswordAuthenticator(sshProxyServerConfiguration.getAuthenticator());
+        sshServer.setPasswordAuthenticator(new PasswordAuthenticator() {
+            @Override
+            public boolean authenticate(final String username, final String password, final ServerSession session) {
+                return sshProxyServerConfiguration.getAuthenticator().authenticated(username, password);
+            }
+        });
+
         sshServer.setKeyPairProvider(sshProxyServerConfiguration.getKeyPairProvider());
 
         sshServer.setIoServiceFactoryFactory(nioServiceWithPoolFactoryFactory);
index 85688c482a6e971579537ccdb6cf73faa92463e5..55b54862d2e2abcea38ba1bc61ba3a00f1e3dfc0 100644 (file)
@@ -12,16 +12,16 @@ import com.google.common.base.Preconditions;
 import io.netty.channel.local.LocalAddress;
 import java.net.InetSocketAddress;
 import org.apache.sshd.common.KeyPairProvider;
-import org.apache.sshd.server.PasswordAuthenticator;
+import org.opendaylight.netconf.auth.AuthProvider;
 
 public final class SshProxyServerConfiguration {
     private final InetSocketAddress bindingAddress;
     private final LocalAddress localAddress;
-    private final PasswordAuthenticator authenticator;
+    private final AuthProvider authenticator;
     private final KeyPairProvider keyPairProvider;
     private final int idleTimeout;
 
-    SshProxyServerConfiguration(final InetSocketAddress bindingAddress, final LocalAddress localAddress, final PasswordAuthenticator authenticator, final KeyPairProvider keyPairProvider, final int idleTimeout) {
+    SshProxyServerConfiguration(final InetSocketAddress bindingAddress, final LocalAddress localAddress, final AuthProvider authenticator, final KeyPairProvider keyPairProvider, final int idleTimeout) {
         this.bindingAddress = Preconditions.checkNotNull(bindingAddress);
         this.localAddress = Preconditions.checkNotNull(localAddress);
         this.authenticator = Preconditions.checkNotNull(authenticator);
@@ -39,7 +39,7 @@ public final class SshProxyServerConfiguration {
         return localAddress;
     }
 
-    public PasswordAuthenticator getAuthenticator() {
+    public AuthProvider getAuthenticator() {
         return authenticator;
     }
 
index 477eea4ff4b816fea8a9d6f99e668eecf1412a02..14b00b462d93c6942f413fc4551f16e7cf832117 100644 (file)
@@ -11,12 +11,12 @@ package org.opendaylight.netconf.ssh;
 import io.netty.channel.local.LocalAddress;
 import java.net.InetSocketAddress;
 import org.apache.sshd.common.KeyPairProvider;
-import org.apache.sshd.server.PasswordAuthenticator;
+import org.opendaylight.netconf.auth.AuthProvider;
 
 public final class SshProxyServerConfigurationBuilder {
     private InetSocketAddress bindingAddress;
     private LocalAddress localAddress;
-    private PasswordAuthenticator authenticator;
+    private AuthProvider authenticator;
     private KeyPairProvider keyPairProvider;
     private int idleTimeout;
 
@@ -30,7 +30,7 @@ public final class SshProxyServerConfigurationBuilder {
         return this;
     }
 
-    public SshProxyServerConfigurationBuilder setAuthenticator(final PasswordAuthenticator authenticator) {
+    public SshProxyServerConfigurationBuilder setAuthenticator(final AuthProvider authenticator) {
         this.authenticator = authenticator;
         return this;
     }
index 7b2d840d2e1578ee44188e43376f427db4cd4b86..51be1bc3eae126e1e1204d2ef626fcb3433366cc 100644 (file)
@@ -8,10 +8,6 @@
 
 package org.opendaylight.netconf.ssh.osgi;
 
-import com.google.common.base.Preconditions;
-import org.apache.sshd.server.PasswordAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.opendaylight.netconf.auth.AuthConstants;
 import org.opendaylight.netconf.auth.AuthProvider;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -20,14 +16,13 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-final class AuthProviderTracker implements ServiceTrackerCustomizer<AuthProvider, AuthProvider>, PasswordAuthenticator {
+final class AuthProviderTracker implements ServiceTrackerCustomizer<AuthProvider, AuthProvider>, AuthProvider {
     private static final Logger LOG = LoggerFactory.getLogger(AuthProviderTracker.class);
 
     private final BundleContext bundleContext;
 
-    private Integer maxPreference;
     private final ServiceTracker<AuthProvider, AuthProvider> listenerTracker;
-    private AuthProvider authProvider;
+    private volatile AuthProvider authProvider;
 
     public AuthProviderTracker(final BundleContext bundleContext) {
         this.bundleContext = bundleContext;
@@ -38,54 +33,32 @@ final class AuthProviderTracker implements ServiceTrackerCustomizer<AuthProvider
     @Override
     public AuthProvider addingService(final ServiceReference<AuthProvider> reference) {
         LOG.trace("Service {} added", reference);
-        final AuthProvider authService = bundleContext.getService(reference);
-        final Integer newServicePreference = getPreference(reference);
-        if(isBetter(newServicePreference)) {
-            maxPreference = newServicePreference;
-            this.authProvider = authService;
-        }
-        return authService;
-    }
-
-    private static Integer getPreference(final ServiceReference<AuthProvider> reference) {
-        final Object preferenceProperty = reference.getProperty(AuthConstants.SERVICE_PREFERENCE_KEY);
-        return preferenceProperty == null ? Integer.MIN_VALUE : Integer.valueOf(preferenceProperty.toString());
-    }
-
-    private boolean isBetter(final Integer newServicePreference) {
-        Preconditions.checkNotNull(newServicePreference);
-        if(maxPreference == null) {
-            return true;
-        }
-
-        return newServicePreference > maxPreference;
+        this.authProvider = bundleContext.getService(reference);
+        return authProvider;
     }
 
     @Override
     public void modifiedService(final ServiceReference<AuthProvider> reference, final AuthProvider service) {
         final AuthProvider authService = bundleContext.getService(reference);
-        final Integer newServicePreference = getPreference(reference);
-        if(isBetter(newServicePreference)) {
-            LOG.trace("Replacing modified service {} in netconf SSH.", reference);
-            this.authProvider = authService;
-        }
+        LOG.trace("Replacing modified service {} in netconf SSH.", reference);
+        this.authProvider = authService;
     }
 
     @Override
     public void removedService(final ServiceReference<AuthProvider> reference, final AuthProvider service) {
         LOG.trace("Removing service {} from netconf SSH. {}", reference,
                 " SSH won't authenticate users until AuthProvider service will be started.");
-        maxPreference = null;
         this.authProvider = null;
     }
 
     public void stop() {
         listenerTracker.close();
+        this.authProvider = null;
         // sshThread should finish normally since sshServer.close stops processing
     }
 
     @Override
-    public boolean authenticate(final String username, final String password, final ServerSession session) {
+    public boolean authenticated(final String username, final String password) {
         if (authProvider == null) {
             LOG.warn("AuthProvider is missing, failing authentication");
             return false;
index 2e9d0b15b4ffad8b7bd16ef958dd68142e522817..4fa945e54cd6a7c3015933d067800ffb3b7dca90 100644 (file)
@@ -9,6 +9,7 @@ module netconf-northbound-ssh {
     import threadpool {prefix th;}
     import netty {prefix netty;}
     import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
+    import netconf-auth { prefix na; revision-date 2015-07-15; }
 
     organization "Cisco Systems, Inc.";
 
@@ -76,18 +77,14 @@ module netconf-northbound-ssh {
                 }
             }
 
-            // FIXME use auth provider from aaa instead
-            leaf username {
-                description "Specifies username credential";
-                type string;
-            }
-
-            leaf password {
-                description "Specifies password credential";
-                type string;
+            container auth-provider {
+                uses config:service-ref {
+                    refine type {
+                        config:required-identity na:netconf-auth-provider;
+                    }
+                }
             }
 
-
         }
     }
 
similarity index 98%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoClient.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoClient.java
index bdaee7957d277ef7bff5c9aafb81e1e0fcd85cb5..c8584a7ed8cb608aa34279aba1e866ea37fe34c4 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.ChannelFuture;
similarity index 98%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoClientHandler.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoClientHandler.java
index 1d3cd5325cb99f77c40a270f8963abd2ed2e3a12..ccc63f6513923e6c7a563e3330ed4ec3324cc73b 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import static com.google.common.base.Preconditions.checkState;
 
similarity index 98%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoServer.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoServer.java
index c53544fef1e142724e7a9517d8b2f44380106267..53a54dc601ef6525c5d3aa6cb638b7a39100352c 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
similarity index 97%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/EchoServerHandler.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/EchoServerHandler.java
index abb6658b11a7dcfff730ded38b096aa22349bd6a..ea157e04ac08a752de2fca56f32f7ab119889ae3 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Splitter;
similarity index 98%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/ProxyServer.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/ProxyServer.java
index 7f6edafe264d39112f47aac01702b4401f95738d..8294a35c954b3326f42c87d27466907f83aec515 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
similarity index 98%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/ProxyServerHandler.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/ProxyServerHandler.java
index e633ab2332dde4a7426b7ebb8cef9b1efdc73000..43296d0b1c20256e82191714a62422ab24be8264 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import com.google.common.base.Charsets;
 import io.netty.bootstrap.Bootstrap;
similarity index 93%
rename from opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/controller/netconf/netty/SSHTest.java
rename to opendaylight/netconf/netconf-ssh/src/test/java/org/opendaylight/netconf/netty/SSHTest.java
index 83e7876b5b4a14b156fbc78abc98c9b64222c7a7..b7379808cf3d941374abd6b4f025b59c3243771e 100644 (file)
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.controller.netconf.netty;
+package org.opendaylight.netconf.netty;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -26,13 +26,12 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
-import org.apache.sshd.server.session.ServerSession;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.opendaylight.controller.netconf.netty.EchoClientHandler.State;
+import org.opendaylight.netconf.auth.AuthProvider;
+import org.opendaylight.netconf.netty.EchoClientHandler.State;
 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.LoginPassword;
 import org.opendaylight.netconf.nettyutil.handler.ssh.client.AsyncSshHandler;
 import org.opendaylight.netconf.ssh.SshProxyServer;
@@ -75,9 +74,9 @@ public class SSHTest {
         final InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 10831);
         final SshProxyServer sshProxyServer = new SshProxyServer(minaTimerEx, nettyGroup, nioExec);
         sshProxyServer.bind(
-                new SshProxyServerConfigurationBuilder().setBindingAddress(addr).setLocalAddress(NetconfConfigUtil.getNetconfLocalAddress()).setAuthenticator(new PasswordAuthenticator() {
+                new SshProxyServerConfigurationBuilder().setBindingAddress(addr).setLocalAddress(NetconfConfigUtil.getNetconfLocalAddress()).setAuthenticator(new AuthProvider() {
                     @Override
-                    public boolean authenticate(final String username, final String password, final ServerSession session) {
+                    public boolean authenticated(final String username, final String password) {
                         return true;
                     }
                 }).setKeyPairProvider(new PEMGeneratorHostKeyProvider(sshKeyPair.toPath().toAbsolutePath().toString())).setIdleTimeout(Integer.MAX_VALUE).createSshProxyServerConfiguration());
@@ -5,7 +5,7 @@
  * 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.controller.netconf.ssh.authentication;
+package org.opendaylight.netconf.ssh.authentication;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
@@ -25,13 +25,12 @@ import org.apache.sshd.ClientSession;
 import org.apache.sshd.SshClient;
 import org.apache.sshd.client.future.AuthFuture;
 import org.apache.sshd.client.future.ConnectFuture;
-import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
-import org.apache.sshd.server.session.ServerSession;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.opendaylight.netconf.auth.AuthProvider;
 import org.opendaylight.netconf.ssh.SshProxyServer;
 import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder;
 import org.opendaylight.netconf.util.osgi.NetconfConfigUtil;
@@ -74,9 +73,9 @@ public class SSHServerTest {
         final InetSocketAddress addr = InetSocketAddress.createUnresolved(HOST, PORT);
         server = new SshProxyServer(minaTimerEx, clientGroup, nioExec);
         server.bind(
-                new SshProxyServerConfigurationBuilder().setBindingAddress(addr).setLocalAddress(NetconfConfigUtil.getNetconfLocalAddress()).setAuthenticator(new PasswordAuthenticator() {
+                new SshProxyServerConfigurationBuilder().setBindingAddress(addr).setLocalAddress(NetconfConfigUtil.getNetconfLocalAddress()).setAuthenticator(new AuthProvider() {
                     @Override
-                    public boolean authenticate(final String username, final String password, final ServerSession session) {
+                    public boolean authenticated(final String username, final String password) {
                         return true;
                     }
                 }).setKeyPairProvider(new PEMGeneratorHostKeyProvider(sshKeyPair.toPath().toAbsolutePath().toString())).setIdleTimeout(Integer.MAX_VALUE).createSshProxyServerConfiguration());
index b2d5e2a77373f1eb5a39cc24e10ecdb9343533da..cf719572ac52705c9ca18280f7364f9b6131084a 100644 (file)
 
     </dependencies>
   </dependencyManagement>
-
-  <profiles>
-    <profile>
-      <id>integrationtests</id>
-      <activation>
-        <activeByDefault>false</activeByDefault>
-      </activation>
-      <modules>
-        <module>netconf-it</module>
-      </modules>
-    </profile>
-  </profiles>
 </project>
diff --git a/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceDatastoreAdapter.java b/opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceDatastoreAdapter.java
new file mode 100644 (file)
index 0000000..9b499c0
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.sal.connect.netconf.sal;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.FluentIterable;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Set;
+import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.inventory.rev140108.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.inventory.rev140108.NetconfNodeBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Asynchronous (Binding-aware) adapter over datastore subtree for netconf device.
+ *
+ * All data changes are submitted to an ExecutorService to avoid Thread blocking while sal is waiting for schema.
+ *
+ * @deprecated Data is pushed into Topology instead if Inventory model
+ */
+@Deprecated
+final class NetconfDeviceDatastoreAdapter implements AutoCloseable {
+
+    private static final Logger logger  = LoggerFactory.getLogger(NetconfDeviceDatastoreAdapter.class);
+
+    private final RemoteDeviceId id;
+    private final BindingTransactionChain txChain;
+
+    NetconfDeviceDatastoreAdapter(final RemoteDeviceId deviceId, final DataBroker dataService) {
+        this.id = Preconditions.checkNotNull(deviceId);
+        this.txChain = Preconditions.checkNotNull(dataService).createTransactionChain(new TransactionChainListener() {
+            @Override
+            public void onTransactionChainFailed(TransactionChain<?, ?> chain, AsyncTransaction<?, ?> transaction, Throwable cause) {
+                logger.error("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause);
+                throw new IllegalStateException(id + "  TransactionChain(" + chain + ") not committed correctly", cause);
+            }
+
+            @Override
+            public void onTransactionChainSuccessful(TransactionChain<?, ?> chain) {
+                logger.trace("{}: TransactionChain({}) {} SUCCESSFUL", id, chain);
+            }
+        });
+
+        initDeviceData();
+    }
+
+    public void updateDeviceState(final boolean up, final Set<QName> capabilities) {
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node data = buildDataForDeviceState(
+                up, capabilities, id);
+
+        final ReadWriteTransaction transaction = txChain.newReadWriteTransaction();
+        logger.trace("{}: Update device state transaction {} merging operational data started.", id, transaction.getIdentifier());
+        transaction.put(LogicalDatastoreType.OPERATIONAL, id.getBindingPath(), data);
+        logger.trace("{}: Update device state transaction {} merging operational data ended.", id, transaction.getIdentifier());
+
+        commitTransaction(transaction, "update");
+    }
+
+    private void removeDeviceConfigAndState() {
+        final WriteTransaction transaction = txChain.newWriteOnlyTransaction();
+        logger.trace("{}: Close device state transaction {} removing all data started.", id, transaction.getIdentifier());
+        transaction.delete(LogicalDatastoreType.CONFIGURATION, id.getBindingPath());
+        transaction.delete(LogicalDatastoreType.OPERATIONAL, id.getBindingPath());
+        logger.trace("{}: Close device state transaction {} removing all data ended.", id, transaction.getIdentifier());
+
+        commitTransaction(transaction, "close");
+    }
+
+    private void initDeviceData() {
+        final WriteTransaction transaction = txChain.newWriteOnlyTransaction();
+
+        createNodesListIfNotPresent(transaction);
+
+        final InstanceIdentifier<Node> path = id.getBindingPath();
+        final Node nodeWithId = getNodeWithId(id);
+
+        logger.trace("{}: Init device state transaction {} putting if absent operational data started.", id, transaction.getIdentifier());
+        transaction.put(LogicalDatastoreType.OPERATIONAL, path, nodeWithId);
+        logger.trace("{}: Init device state transaction {} putting operational data ended.", id, transaction.getIdentifier());
+
+        logger.trace("{}: Init device state transaction {} putting if absent config data started.", id, transaction.getIdentifier());
+        transaction.put(LogicalDatastoreType.CONFIGURATION, path, nodeWithId);
+        logger.trace("{}: Init device state transaction {} putting config data ended.", id, transaction.getIdentifier());
+
+        commitTransaction(transaction, "init");
+    }
+
+    private void createNodesListIfNotPresent(final WriteTransaction writeTx) {
+        final Nodes nodes = new NodesBuilder().build();
+        final InstanceIdentifier<Nodes> path = InstanceIdentifier.builder(Nodes.class).build();
+        logger.trace("{}: Merging {} container to ensure its presence", id, Nodes.QNAME, writeTx.getIdentifier());
+        writeTx.merge(LogicalDatastoreType.CONFIGURATION, path, nodes);
+        writeTx.merge(LogicalDatastoreType.OPERATIONAL, path, nodes);
+    }
+
+    private void commitTransaction(final WriteTransaction transaction, final String txType) {
+        logger.trace("{}: Committing Transaction {}:{}", id, txType, transaction.getIdentifier());
+        final CheckedFuture<Void, TransactionCommitFailedException> result = transaction.submit();
+
+        Futures.addCallback(result, new FutureCallback<Void>() {
+            @Override
+            public void onSuccess(final Void result) {
+                logger.trace("{}: Transaction({}) {} SUCCESSFUL", id, txType, transaction.getIdentifier());
+            }
+
+            @Override
+            public void onFailure(final Throwable t) {
+                logger.error("{}: Transaction({}) {} FAILED!", id, txType, transaction.getIdentifier(), t);
+                throw new IllegalStateException(id + "  Transaction(" + txType + ") not committed correctly", t);
+            }
+        });
+
+    }
+
+    @Override
+    public void close() throws Exception {
+        removeDeviceConfigAndState();
+        txChain.close();
+    }
+
+    public static org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node buildDataForDeviceState(
+            final boolean up, final Set<QName> capabilities, final RemoteDeviceId id) {
+
+        final NodeBuilder nodeBuilder = getNodeWithIdBuilder(id);
+        final NetconfNodeBuilder netconfNodeBuilder = new NetconfNodeBuilder();
+        netconfNodeBuilder.setConnected(up);
+        netconfNodeBuilder.setInitialCapability(FluentIterable.from(capabilities)
+                .transform(new Function<QName, String>() {
+                    @Override
+                    public String apply(final QName input) {
+                        return input.toString();
+                    }
+                }).toList());
+        nodeBuilder.addAugmentation(NetconfNode.class, netconfNodeBuilder.build());
+
+        return nodeBuilder.build();
+    }
+
+    private static ListenableFuture<Optional<Node>> readNodeData(
+            final LogicalDatastoreType store,
+            final ReadWriteTransaction transaction,
+            final InstanceIdentifier<Node> path) {
+        return transaction.read(store, path);
+    }
+
+    private static Node getNodeWithId(final RemoteDeviceId id) {
+        final NodeBuilder nodeBuilder = getNodeWithIdBuilder(id);
+        return nodeBuilder.build();
+    }
+
+    private static NodeBuilder getNodeWithIdBuilder(final RemoteDeviceId id) {
+        final NodeBuilder nodeBuilder = new NodeBuilder();
+        nodeBuilder.setKey(id.getBindingKey());
+        nodeBuilder.setId(id.getBindingKey().getId());
+        return nodeBuilder;
+    }
+}
index 172bcd9955764bdadfdadc379dbc2d06ddf1114f..7bb3df08a5ef6644028be5fcd162145b361dd1db 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.netconf.sal.connect.netconf.sal;
 
 import com.google.common.collect.Lists;
+import java.util.Collections;
 import java.util.List;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMNotification;
@@ -18,6 +19,7 @@ import org.opendaylight.netconf.sal.connect.api.RemoteDeviceHandler;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,20 +59,24 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice
 
         final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService();
 
+        salProvider.getMountInstance().onDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService);
+        salProvider.getDatastoreAdapter().updateDeviceState(true, netconfSessionPreferences.getModuleBasedCaps());
         salProvider.getMountInstance().onTopologyDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService);
         salProvider.getTopologyDatastoreAdapter().updateDeviceData(true, netconfSessionPreferences.getNetconfDeviceCapabilities());
     }
 
     @Override
     public synchronized void onDeviceDisconnected() {
-        salProvider.getTopologyDatastoreAdapter().updateDeviceData(false,
-                new NetconfDeviceCapabilities());
+        salProvider.getDatastoreAdapter().updateDeviceState(false, Collections.<QName>emptySet());
+        salProvider.getTopologyDatastoreAdapter().updateDeviceData(false, new NetconfDeviceCapabilities());
+        salProvider.getMountInstance().onDeviceDisconnected();
         salProvider.getMountInstance().onTopologyDeviceDisconnected();
     }
 
     @Override
     public synchronized void onDeviceFailed(final Throwable throwable) {
         salProvider.getTopologyDatastoreAdapter().setDeviceAsFailed(throwable);
+        salProvider.getMountInstance().onDeviceDisconnected();
         salProvider.getMountInstance().onTopologyDeviceDisconnected();
     }
 
@@ -87,8 +93,7 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice
             try {
                 resource.close();
             } catch (final Exception e) {
-                LOG.warn("{}: Ignoring exception while closing {}", id,
-                        resource, e);
+                LOG.warn("{}: Ignoring exception while closing {}", id, resource, e);
             }
         }
     }
index 890c0aa0a98cb3a079226eb2fe4f089926c8d651..8cb34c15daeeda9a2b540010eac8bac4a24832c6 100644 (file)
@@ -29,9 +29,10 @@ import org.slf4j.LoggerFactory;
 
 final class NetconfDeviceSalProvider implements AutoCloseable, Provider, BindingAwareProvider {
 
-    private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceSalProvider.class);
+    private static final Logger logger = LoggerFactory.getLogger(NetconfDeviceSalProvider.class);
 
     private final RemoteDeviceId id;
+    private volatile NetconfDeviceDatastoreAdapter datastoreAdapter;
     private MountInstance mountInstance;
 
     private volatile NetconfDeviceTopologyAdapter topologyDatastoreAdapter;
@@ -46,6 +47,12 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
         return mountInstance;
     }
 
+    public NetconfDeviceDatastoreAdapter getDatastoreAdapter() {
+        Preconditions.checkState(datastoreAdapter != null,
+                "%s: Sal provider %s was not initialized by sal. Cannot get datastore adapter", id);
+        return datastoreAdapter;
+    }
+
     public NetconfDeviceTopologyAdapter getTopologyDatastoreAdapter() {
         Preconditions.checkState(topologyDatastoreAdapter != null,
                 "%s: Sal provider %s was not initialized by sal. Cannot get topology datastore adapter", id);
@@ -54,7 +61,7 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
 
     @Override
     public void onSessionInitiated(final Broker.ProviderSession session) {
-        LOG.debug("{}: (BI)Session with sal established {}", id, session);
+        logger.debug("{}: (BI)Session with sal established {}", id, session);
 
         final DOMMountPointService mountService = session.getService(DOMMountPointService.class);
         if (mountService != null) {
@@ -69,15 +76,18 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
 
     @Override
     public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
-        LOG.debug("{}: Session with sal established {}", id, session);
+        logger.debug("{}: Session with sal established {}", id, session);
 
         final DataBroker dataBroker = session.getSALService(DataBroker.class);
+        datastoreAdapter = new NetconfDeviceDatastoreAdapter(id, dataBroker);
 
         topologyDatastoreAdapter = new NetconfDeviceTopologyAdapter(id, dataBroker);
     }
 
     public void close() throws Exception {
         mountInstance.close();
+        datastoreAdapter.close();
+        datastoreAdapter = null;
         topologyDatastoreAdapter.close();
         topologyDatastoreAdapter = null;
     }
@@ -86,6 +96,7 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
 
         private DOMMountPointService mountService;
         private final RemoteDeviceId id;
+        private ObjectRegistration<DOMMountPoint> registration;
         private NetconfDeviceNotificationService notificationService;
 
         private ObjectRegistration<DOMMountPoint> topologyRegistration;
@@ -95,6 +106,44 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
             this.id = Preconditions.checkNotNull(id);
         }
 
+        @Deprecated
+        synchronized void onDeviceConnected(final SchemaContext initialCtx,
+                                            final DOMDataBroker broker, final DOMRpcService rpc,
+                                            final NetconfDeviceNotificationService notificationService) {
+
+            Preconditions.checkNotNull(mountService, "Closed");
+            Preconditions.checkState(registration == null, "Already initialized");
+
+            final DOMMountPointService.DOMMountPointBuilder mountBuilder = mountService.createMountPoint(id.getPath());
+            mountBuilder.addInitialSchemaContext(initialCtx);
+
+            mountBuilder.addService(DOMDataBroker.class, broker);
+            mountBuilder.addService(DOMRpcService.class, rpc);
+            mountBuilder.addService(DOMNotificationService.class, notificationService);
+            this.notificationService = notificationService;
+
+            registration = mountBuilder.register();
+            logger.debug("{}: Mountpoint exposed into MD-SAL {}", id, registration);
+        }
+
+        @Deprecated
+        synchronized void onDeviceDisconnected() {
+            if(registration == null) {
+                logger.trace("{}: Not removing mountpoint from MD-SAL, mountpoint was not registered yet", id);
+                return;
+            }
+
+            try {
+                registration.close();
+            } catch (final Exception e) {
+                // Only log and ignore
+                logger.warn("Unable to unregister mount instance for {}. Ignoring exception", id.getPath(), e);
+            } finally {
+                logger.debug("{}: Mountpoint removed from MD-SAL {}", id, registration);
+                registration = null;
+            }
+        }
+
         synchronized void onTopologyDeviceConnected(final SchemaContext initialCtx,
                                                     final DOMDataBroker broker, final DOMRpcService rpc,
                                                     final NetconfDeviceNotificationService notificationService) {
@@ -108,19 +157,15 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
             mountBuilder.addService(DOMDataBroker.class, broker);
             mountBuilder.addService(DOMRpcService.class, rpc);
             mountBuilder.addService(DOMNotificationService.class, notificationService);
-            this.notificationService = notificationService;
 
             topologyRegistration = mountBuilder.register();
-            LOG.debug("{}: TOPOLOGY Mountpoint exposed into MD-SAL {}", id,
-                    topologyRegistration);
+            logger.debug("{}: TOPOLOGY Mountpoint exposed into MD-SAL {}", id, registration);
 
         }
 
         synchronized void onTopologyDeviceDisconnected() {
             if(topologyRegistration == null) {
-                LOG.trace(
-                        "{}: Not removing TOPOLOGY mountpoint from MD-SAL, mountpoint was not registered yet",
-                        id);
+                logger.trace("{}: Not removing TOPOLOGY mountpoint from MD-SAL, mountpoint was not registered yet", id);
                 return;
             }
 
@@ -128,18 +173,16 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding
                 topologyRegistration.close();
             } catch (final Exception e) {
                 // Only log and ignore
-                LOG.warn(
-                        "Unable to unregister mount instance for {}. Ignoring exception",
-                        id.getTopologyPath(), e);
+                logger.warn("Unable to unregister mount instance for {}. Ignoring exception", id.getTopologyPath(), e);
             } finally {
-                LOG.debug("{}: TOPOLOGY Mountpoint removed from MD-SAL {}",
-                        id, topologyRegistration);
+                logger.debug("{}: TOPOLOGY Mountpoint removed from MD-SAL {}", id, registration);
                 topologyRegistration = null;
             }
         }
 
         @Override
         synchronized public void close() throws Exception {
+            onDeviceDisconnected();
             onTopologyDeviceDisconnected();
             mountService = null;
         }
index 85dc3372e7728d756f60455886855c02681e2cae..60f08e19ca72e2f0fda84210b9cde446608944b5 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.Optional;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import java.util.Collections;
 import java.util.Set;
 import javax.annotation.Nullable;
@@ -68,12 +69,16 @@ public class DummyMonitoringService implements NetconfMonitoringService {
         this.capabilities = new CapabilitiesBuilder().setCapability(
                 Lists.newArrayList(Collections2.transform(capabilities, CAPABILITY_URI_FUNCTION))).build();
 
+        Set<Capability> moduleCapabilities = Sets.newHashSet();
         this.capabilityMultiMap = ArrayListMultimap.create();
         for (Capability cap : capabilities) {
-            capabilityMultiMap.put(cap.getModuleName().get(), cap);
+            if(cap.getModuleName().isPresent()) {
+                capabilityMultiMap.put(cap.getModuleName().get(), cap);
+                moduleCapabilities.add(cap);
+            }
         }
 
-        this.schemas = new SchemasBuilder().setSchema(Lists.newArrayList(Collections2.transform(capabilities, CAPABILITY_SCHEMA_FUNCTION))).build();
+        this.schemas = new SchemasBuilder().setSchema(Lists.newArrayList(Collections2.transform(moduleCapabilities, CAPABILITY_SCHEMA_FUNCTION))).build();
     }
 
     @Override
index 35c6786a2875c2b44eb50c207914fb8416a55a0a..edf74ca4c6ec02c6e20e9772a898072ab5b90947 100644 (file)
@@ -51,12 +51,12 @@ import java.util.concurrent.ScheduledExecutorService;
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
 import org.apache.sshd.common.util.ThreadUtils;
-import org.apache.sshd.server.PasswordAuthenticator;
 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
-import org.apache.sshd.server.session.ServerSession;
+import org.opendaylight.controller.config.util.capability.BasicCapability;
 import org.opendaylight.controller.config.util.capability.Capability;
 import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.netconf.auth.AuthProvider;
 import org.opendaylight.netconf.impl.NetconfServerDispatcherImpl;
 import org.opendaylight.netconf.impl.NetconfServerSessionNegotiatorFactory;
 import org.opendaylight.netconf.impl.SessionIdProvider;
@@ -135,6 +135,8 @@ public class NetconfDeviceSimulator implements Closeable {
         final NetconfOperationServiceFactory operationProvider = mdSal ? new MdsalOperationProvider(idProvider, capabilities, schemaContext) :
             new SimulatedOperationProvider(idProvider, capabilities, notificationsFile);
 
+        capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
+
         final NetconfMonitoringService monitoringService1 = new DummyMonitoringService(capabilities);
 
         final NetconfMonitoringActivator.NetconfMonitoringOperationServiceFactory monitoringService =
@@ -274,9 +276,9 @@ public class NetconfDeviceSimulator implements Closeable {
         return new SshProxyServerConfigurationBuilder()
                 .setBindingAddress(bindingAddress)
                 .setLocalAddress(tcpLocalAddress)
-                .setAuthenticator(new PasswordAuthenticator() {
+                .setAuthenticator(new AuthProvider() {
                     @Override
-                    public boolean authenticate(final String username, final String password, final ServerSession session) {
+                    public boolean authenticated(final String username, final String password) {
                         return true;
                     }
                 })
index 5d6635d750d2639e6f4654be5d514c1edfb0e33d..6fab65725b2b4493be86424710dcc866403da801 100644 (file)
@@ -40,6 +40,9 @@
                 <groupId>${project.groupId}</groupId>
                 <artifactId>features-restconf</artifactId>
                 <version>${project.version}</version>
+                <classifier>features</classifier>
+                <type>xml</type>
+                <scope>runtime</scope>
             </dependency>
         </dependencies>
     </dependencyManagement>