Fix logging arguments
[netconf.git] / netconf / callhome-provider / src / main / java / org / opendaylight / netconf / callhome / mount / IetfZeroTouchCallHomeServerProvider.java
index e8b96e671b47b724bd05d35ab061db9e476fb6b5..d2dbec65d27e856154f65c7fb36bd83583d1eb40 100644 (file)
@@ -5,29 +5,32 @@
  * 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.callhome.mount;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import io.netty.channel.nio.NioEventLoopGroup;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.callhome.protocol.CallHomeAuthorizationProvider;
 import org.opendaylight.netconf.callhome.protocol.NetconfCallHomeServer;
 import org.opendaylight.netconf.callhome.protocol.NetconfCallHomeServerBuilder;
@@ -62,7 +65,8 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
     private int port = 0; // 0 = use default in NetconfCallHomeBuilder
     private final CallhomeStatusReporter statusReporter;
 
-    public IetfZeroTouchCallHomeServerProvider(DataBroker dataBroker, CallHomeMountDispatcher mountDispacher) {
+    public IetfZeroTouchCallHomeServerProvider(final DataBroker dataBroker,
+            final CallHomeMountDispatcher mountDispacher) {
         this.dataBroker = dataBroker;
         this.mountDispacher = mountDispacher;
         this.authProvider = new CallHomeAuthProviderImpl(dataBroker);
@@ -75,14 +79,14 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
             LOG.info("Initializing provider for {}", APPNAME);
             initializeServer();
             listenerReg = dataBroker.registerDataTreeChangeListener(
-                    new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, ALL_DEVICES), this);
+                DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, ALL_DEVICES), this);
             LOG.info("Initialization complete for {}", APPNAME);
         } catch (IOException | Configuration.ConfigurationException e) {
             LOG.error("Unable to successfully initialize", e);
         }
     }
 
-    public void setPort(String portStr) {
+    public void setPort(final String portStr) {
         try {
             Configuration configuration = new Configuration();
             configuration.set(CALL_HOME_PORT_KEY, portStr);
@@ -105,6 +109,7 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
         if (port > 0) {
             builder.setBindAddress(new InetSocketAddress(port));
         }
+        builder.setNettyGroup(new NioEventLoopGroup());
         server = builder.build();
         server.bind();
         mountDispacher.createTopology();
@@ -112,7 +117,7 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
     }
 
     @VisibleForTesting
-    void assertValid(Object obj, String description) {
+    void assertValid(final Object obj, final String description) {
         if (obj == null) {
             throw new RuntimeException(
                     String.format("Failed to find %s in IetfZeroTouchCallHomeProvider.initialize()", description));
@@ -120,7 +125,7 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         authProvider.close();
         statusReporter.close();
 
@@ -136,13 +141,13 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
     }
 
     @Override
-    public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<AllowedDevices>> changes) {
+    public void onDataTreeChanged(final Collection<DataTreeModification<AllowedDevices>> changes) {
         // In case of any changes to the devices datatree, register the changed values with callhome server
         // As of now, no way to add a new callhome client key to the CallHomeAuthorization instance since
         // its created under CallHomeAuthorizationProvider.
         // Will have to redesign a bit here.
         // CallHomeAuthorization.
-        ReadOnlyTransaction roConfigTx = dataBroker.newReadOnlyTransaction();
+        ReadTransaction roConfigTx = dataBroker.newReadOnlyTransaction();
         ListenableFuture<Optional<AllowedDevices>> devicesFuture = roConfigTx
                 .read(LogicalDatastoreType.CONFIGURATION, IetfZeroTouchCallHomeServerProvider.ALL_DEVICES);
 
@@ -165,53 +170,68 @@ public class IetfZeroTouchCallHomeServerProvider implements AutoCloseable, DataT
                 readAndUpdateStatus(confDevice);
             }
         } catch (ExecutionException | InterruptedException e) {
-            LOG.error("Error trying to read the whitelist devices: {}", e);
+            LOG.error("Error trying to read the whitelist devices", e);
         }
     }
 
-    private void handleDeletedDevices(Set<InstanceIdentifier<?>> deletedDevices) {
+    private void handleDeletedDevices(final Set<InstanceIdentifier<?>> deletedDevices) {
         if (deletedDevices.isEmpty()) {
             return;
         }
 
-        ReadWriteTransaction opTx = dataBroker.newReadWriteTransaction();
-
-        int numRemoved = deletedDevices.size();
+        WriteTransaction opTx = dataBroker.newWriteOnlyTransaction();
 
         for (InstanceIdentifier<?> removedIID : deletedDevices) {
             LOG.info("Deleting the entry for callhome device {}", removedIID);
             opTx.delete(LogicalDatastoreType.OPERATIONAL, removedIID);
         }
 
-        if (numRemoved > 0) {
-            opTx.submit();
-        }
+        opTx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.debug("Device deletions committed");
+            }
+
+            @Override
+            public void onFailure(final Throwable cause) {
+                LOG.warn("Failed to commit device deletions", cause);
+            }
+        }, MoreExecutors.directExecutor());
     }
 
-    private List<Device> getReadDevices(
-            ListenableFuture<Optional<AllowedDevices>> devicesFuture) throws InterruptedException, ExecutionException {
-        Optional<AllowedDevices> opt = devicesFuture.get();
-        return opt.isPresent() ? opt.get().getDevice() : Collections.emptyList();
+    private static List<Device> getReadDevices(final ListenableFuture<Optional<AllowedDevices>> devicesFuture)
+            throws InterruptedException, ExecutionException {
+        return devicesFuture.get().map(AllowedDevices::getDevice).orElse(Collections.emptyList());
     }
 
-    private void readAndUpdateStatus(Device cfgDevice) throws InterruptedException, ExecutionException {
+    private void readAndUpdateStatus(final Device cfgDevice) throws InterruptedException, ExecutionException {
         InstanceIdentifier<Device> deviceIID = InstanceIdentifier.create(NetconfCallhomeServer.class)
                 .child(AllowedDevices.class).child(Device.class, new DeviceKey(cfgDevice.getUniqueId()));
 
         ReadWriteTransaction tx = dataBroker.newReadWriteTransaction();
         ListenableFuture<Optional<Device>> deviceFuture = tx.read(LogicalDatastoreType.OPERATIONAL, deviceIID);
 
+        final Device1 devStatus;
         Optional<Device> opDevGet = deviceFuture.get();
-        Device1 devStatus = new Device1Builder().setDeviceStatus(Device1.DeviceStatus.DISCONNECTED).build();
         if (opDevGet.isPresent()) {
-            Device opDevice = opDevGet.get();
-            devStatus = opDevice.getAugmentation(Device1.class);
+            devStatus = opDevGet.get().augmentation(Device1.class);
+        } else {
+            devStatus = new Device1Builder().setDeviceStatus(Device1.DeviceStatus.DISCONNECTED).build();
         }
 
-        cfgDevice = new DeviceBuilder().addAugmentation(Device1.class, devStatus)
-                .setSshHostKey(cfgDevice.getSshHostKey()).setUniqueId(cfgDevice.getUniqueId()).build();
+        tx.merge(LogicalDatastoreType.OPERATIONAL, deviceIID, new DeviceBuilder()
+            .addAugmentation(Device1.class, devStatus).setSshHostKey(cfgDevice.getSshHostKey())
+            .setUniqueId(cfgDevice.getUniqueId()).build());
+        tx.commit().addCallback(new FutureCallback<CommitInfo>() {
+            @Override
+            public void onSuccess(final CommitInfo result) {
+                LOG.debug("Device {} status update committed", cfgDevice.key());
+            }
 
-        tx.merge(LogicalDatastoreType.OPERATIONAL, deviceIID, cfgDevice);
-        tx.submit();
+            @Override
+            public void onFailure(final Throwable cause) {
+                LOG.warn("Failed to commit device {} status update", cfgDevice.key(), cause);
+            }
+        }, MoreExecutors.directExecutor());
     }
 }