ONOS-3340 IOException throwing in case of no response from NETCONF device on given ip:port

Change-Id: I0fcc6be38e138703d14ef987bfeef9857945a0b5
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
index 6411c01..ea07728 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
@@ -19,6 +19,7 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 
+import java.io.IOException;
 import java.util.Map;
 
 /**
@@ -48,7 +49,7 @@
      * @param deviceInfo info about the device to add
      * @return NetconfDevice Netconf device
      */
-    NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo);
+    NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo) throws IOException;
 
     /**
      * Removes a Netconf device.
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
index a572a2b..cc53e37 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
@@ -91,9 +91,9 @@
     }
 
     @Override
-    public NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo) {
+    public NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo) throws IOException {
         if (netconfDeviceMap.containsKey(deviceInfo.getDeviceId())) {
-            log.warn("Device {} is already present");
+            log.info("Device {} is already present");
             return netconfDeviceMap.get(deviceInfo.getDeviceId());
         } else {
             log.info("Creating NETCONF device {}", deviceInfo);
@@ -110,19 +110,13 @@
         }
     }
 
-    private NetconfDevice createDevice(NetconfDeviceInfo deviceInfo) {
+    private NetconfDevice createDevice(NetconfDeviceInfo deviceInfo) throws IOException {
         NetconfDevice netconfDevice = null;
-        try {
-            netconfDevice = new NetconfDeviceImpl(deviceInfo);
-            for (NetconfDeviceListener l : netconfDeviceListeners) {
-                l.deviceAdded(deviceInfo);
-            }
-            netconfDeviceMap.put(deviceInfo.getDeviceId(), netconfDevice);
-        } catch (IOException e) {
-            throw new IllegalStateException("Cannot create NETCONF device " +
-                                                    "with device Info: " +
-                                                    deviceInfo + " \n" + e);
+        netconfDevice = new NetconfDeviceImpl(deviceInfo);
+        for (NetconfDeviceListener l : netconfDeviceListeners) {
+            l.deviceAdded(deviceInfo);
         }
+        netconfDeviceMap.put(deviceInfo.getDeviceId(), netconfDevice);
         return netconfDevice;
     }
 
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index d12c647..12b9351 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -49,6 +49,7 @@
 import org.onosproject.netconf.NetconfDeviceListener;
 import org.slf4j.Logger;
 
+import java.io.IOException;
 import java.util.Map;
 
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
@@ -192,11 +193,23 @@
         if (cfg != null) {
             log.info("cfg {}", cfg);
             try {
-                cfg.getDevicesAddresses().stream().forEach(addr -> controller
-                        .connectDevice(new NetconfDeviceInfo(addr.name(),
-                                                             addr.password(),
-                                                             addr.ip(),
-                                                             addr.port())));
+                cfg.getDevicesAddresses().stream()
+                        .forEach(addr -> {
+                                     try {
+                                         controller.connectDevice(
+                                                 new NetconfDeviceInfo(addr.name(),
+                                                                       addr.password(),
+                                                                       addr.ip(),
+                                                                       addr.port()));
+                                     } catch (IOException e) {
+                                         log.warn("Can't connect to NETCONF " +
+                                                          "device on {}:{}",
+                                                            addr.ip(),
+                                                            addr.port());
+                                     }
+                                 }
+                        );
+
             } catch (ConfigException e) {
                 log.error("Cannot read config error " + e);
             }