Fix findbugs violations in applications 85/67885/7
authorTom Pantelis <tompantelis@gmail.com>
Fri, 2 Feb 2018 23:30:41 +0000 (18:30 -0500)
committerTom Pantelis <tompantelis@gmail.com>
Wed, 28 Feb 2018 18:45:10 +0000 (13:45 -0500)
- Method ignores return value
- Consider using Locale parameterized version of invoked method
- Reliance on default encoding
- Write to static field from instance method
- Inefficient use of keySet iterator instead of entrySet iterator
- Dead store to local variable
- Consider returning a zero length array rather than null
- Consider using Locale parameterized version of invoked method
- Boxing/unboxing to parse a primitive - use parseXXX method
- Unread field
- Dead store to local variable
- Non-transient non-serializable instance field in serializable class
- Parameter must be non-null but is marked as nullable
- Field not initialized in constructor but dereferenced without null check
- Nullcheck of value previously dereferenced
- Redundant nullcheck of value known to be non-null

Change-Id: I1887f775f61fb8e3e6989113edf7faf4f9b06b34
Signed-off-by: Tom Pantelis <tompantelis@gmail.com>
38 files changed:
applications/bulk-o-matic/pom.xml
applications/bulk-o-matic/src/main/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/BulkOMaticUtils.java
applications/bulk-o-matic/src/main/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/FlowWriterDirectOFRpc.java
applications/bulk-o-matic/src/main/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/FlowWriterSequential.java
applications/bulk-o-matic/src/main/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/FlowWriterTxChain.java
applications/bulk-o-matic/src/main/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/SalBulkFlowServiceImpl.java
applications/bulk-o-matic/src/test/java/org/opendaylight/openflowplugin/applications/bulk/o/matic/FlowWriterDirectOFRpcTest.java
applications/forwardingrules-manager/pom.xml
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/ForwardingRulesProperty.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractNodeConnectorCommitter.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeConnectorInventoryTranslatorImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeReconciliationImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/ForwardingRulesManagerImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java
applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/SyncReactorRetryDecorator.java
applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/strategy/SyncPlanPushStrategyFlatBatchImpl.java
applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/impl/strategy/SyncPlanPushStrategyIncrementalImpl.java
applications/forwardingrules-sync/src/main/java/org/opendaylight/openflowplugin/applications/frsync/util/SemaphoreKeeperGuavaImpl.java
applications/lldp-speaker/pom.xml
applications/lldp-speaker/src/main/java/org/opendaylight/openflowplugin/applications/lldpspeaker/DeviceOwnershipStatusService.java
applications/lldp-speaker/src/main/java/org/opendaylight/openflowplugin/applications/lldpspeaker/LLDPSpeaker.java
applications/lldp-speaker/src/main/java/org/opendaylight/openflowplugin/applications/lldpspeaker/LLDPUtil.java
applications/lldp-speaker/src/test/java/org/opendaylight/openflowplugin/applications/lldpspeaker/LLDPSpeakerTest.java
applications/of-switch-config-pusher/pom.xml
applications/of-switch-config-pusher/src/main/java/org/opendaylight/openflowplugin/openflow/ofswitch/config/DefaultConfigPusher.java
applications/of-switch-config-pusher/src/test/java/org/opendaylight/openflowplugin/openflow/ofswitch/config/DefaultConfigPusherTest.java
applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/cli/GetAllNodesCommandProvider.java
applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/cli/ShowNodeCommandProvider.java
applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/util/ShellUtil.java
applications/table-miss-enforcer/pom.xml
applications/table-miss-enforcer/src/main/java/org/opendaylight/openflowplugin/applications/tablemissenforcer/LLDPPacketPuntEnforcer.java
applications/table-miss-enforcer/src/test/java/org/opendaylight/openflowplugin/applications/tablemissenforcer/LLDPDataTreeChangeListenerTest.java
applications/topology-lldp-discovery/src/main/java/org/opendaylight/openflowplugin/applications/topology/lldp/LLDPActivator.java
applications/topology-lldp-discovery/src/main/java/org/opendaylight/openflowplugin/applications/topology/lldp/TopologyLLDPDiscoveryProperty.java
applications/topology-lldp-discovery/src/main/java/org/opendaylight/openflowplugin/applications/topology/lldp/utils/LLDPDiscoveryUtils.java

index c1dcd3a8341be902b080a44eb6894fcf08886462..6779f2459fa4b0feaa2f00cab856e140c8730ff1 100644 (file)
       <groupId>org.opendaylight.openflowplugin.model</groupId>
       <artifactId>model-flow-base</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.infrautils</groupId>
+      <artifactId>infrautils-util</artifactId>
+      <version>${infrautils.version}</version>
+    </dependency>
 
         <!-- Test dependencies -->
     <dependency>
index 2b0352181c11585b902cf46e9b43563193db0592..9d095c2644788284a3bee057b2c013ca15bee2a1 100644 (file)
@@ -47,7 +47,7 @@ public final class BulkOMaticUtils {
                 .append(number & 0xFF).append("/32").toString();
     }
 
-    public static Match getMatch(final Integer sourceIp) {
+    public static Match getMatch(final int sourceIp) {
         Ipv4Match ipv4Match = new Ipv4MatchBuilder().setIpv4Source(new Ipv4Prefix(ipIntToStr(sourceIp))).build();
         MatchBuilder matchBuilder = new MatchBuilder();
         matchBuilder.setLayer3Match(ipv4Match);
index 3a743fcfcc12681bfc5c2b06d59cb27d75b4af04..ab68cf9555322e48ef1423b10de800af735b8020 100644 (file)
@@ -13,15 +13,18 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
@@ -30,6 +33,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -134,7 +138,8 @@ public class FlowWriterDirectOFRpc {
                 AddFlowInput addFlowInput = builder.build();
 
                 LOG.debug("RPC invocation for adding flow-id {} with input {}", flowId, addFlowInput.toString());
-                flowService.addFlow(addFlowInput);
+                final Future<RpcResult<AddFlowOutput>> resultFuture = flowService.addFlow(addFlowInput);
+                JdkFutures.addErrorLogging(resultFuture, LOG, "addFlow");
 
                 if (i % batchSize == 0) {
                     try {
index 7e8fe0009fab658b03f81e8f2ae3379d13100036..21b3cb3ad6b1fd609df0b36de96f6498d0eca1d2 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.openflowplugin.applications.bulk.o.matic;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
@@ -108,11 +107,11 @@ public class FlowWriterSequential implements FlowCounterMBean {
             writeOpStatus.set(FlowCounter.OperationStatus.IN_PROGRESS.status());
 
             Short tableId = startTableId;
-            Integer sourceIp = 1;
 
             WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
             short calculatedTableId = tableId;
 
+            int sourceIp = 1;
             for (; sourceIp <= batchSize; sourceIp++) {
                 String flowId = "Flow-" + dpId + "." + calculatedTableId + "." + sourceIp;
                 LOG.debug("Adding flow with id: {}", flowId);
@@ -149,12 +148,12 @@ public class FlowWriterSequential implements FlowCounterMBean {
             }
         }
 
-        private class DsCallBack implements FutureCallback {
+        private class DsCallBack implements FutureCallback<Void> {
             private final String dpId;
-            private Integer sourceIp;
+            private int sourceIp;
             private final Short tableId;
 
-            DsCallBack(String dpId, Integer sourceIp, Short tableId) {
+            DsCallBack(String dpId, int sourceIp, Short tableId) {
                 this.dpId = dpId;
                 this.sourceIp = sourceIp;
                 short numberA = 1;
@@ -163,7 +162,7 @@ public class FlowWriterSequential implements FlowCounterMBean {
             }
 
             @Override
-            public void onSuccess(Object object) {
+            public void onSuccess(Void notUsed) {
                 if (sourceIp > flowsPerDpn) {
                     long dur = System.nanoTime() - startTime;
                     LOG.info("Completed all flows installation for: dpid: {}, tableId: {}, sourceIp: {} in {}ns", dpId,
index f427542da7d8c8be080a4acca9c50ec44323c2fd..b7fa18230cb0aea8070cd6ad5abb3791b7b6141b 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.openflowplugin.applications.bulk.o.matic;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
@@ -87,7 +86,7 @@ public class FlowWriterTxChain implements FlowCounterMBean {
         private final boolean isCreateParents;
         private final AtomicInteger remainingTxReturn = new AtomicInteger(0);
 
-        BindingTransactionChain txChain;
+        private BindingTransactionChain txChain;
 
         FlowHandlerTask(final String dpId,
                         final int flowsPerDpn,
@@ -146,7 +145,8 @@ public class FlowWriterTxChain implements FlowCounterMBean {
                 LOG.debug("Submitting Txn for dpId: {}, begin tableId: {}, end tableId: {}, sourceIp: {}", dpId,
                         tableId, calculatedTableId, sourceIp - 1);
                 Futures.addCallback(writeTransaction.submit(),
-                        new DsCallBack(dpId, tableId, calculatedTableId, sourceIp), MoreExecutors.directExecutor());
+                        new DsCallBack(dpId, tableId, calculatedTableId, sourceIp, txChain),
+                        MoreExecutors.directExecutor());
                 // Wrap around
                 tableId = (short) ((calculatedTableId + 1) % (short) (endTableId - startTableId + 1) + startTableId);
                 newBatchSize += batchSize;
@@ -185,21 +185,24 @@ public class FlowWriterTxChain implements FlowCounterMBean {
             }
         }
 
-        private class DsCallBack implements FutureCallback {
+        private class DsCallBack implements FutureCallback<Void> {
             private final String dpId;
             private final int sourceIp;
             private final short endTableId;
             private final short beginTableId;
+            private final BindingTransactionChain txChain;
 
-            DsCallBack(String dpId, Short beginTableId, Short endTableId, Integer sourceIp) {
+            DsCallBack(String dpId, Short beginTableId, Short endTableId, Integer sourceIp,
+                    BindingTransactionChain txChain) {
                 this.dpId = dpId;
                 this.sourceIp = sourceIp;
                 this.endTableId = endTableId;
                 this.beginTableId = beginTableId;
+                this.txChain = txChain;
             }
 
             @Override
-            public void onSuccess(Object object) {
+            public void onSuccess(Void notUsed) {
                 if (remainingTxReturn.decrementAndGet() <= 0) {
                     long dur = System.nanoTime() - startTime;
                     LOG.info("Completed all flows installation for: dpid: {} in {}ns", dpId, dur);
index 4e017a5b07dea545ea360a911e345dd40596cd87..ba92da80126f712747c00d4657f8ac8f6ce84aaa 100644 (file)
@@ -32,6 +32,7 @@ import javax.management.ObjectName;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsDsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsRpcInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.BulkFlowBaseContentGrouping;
@@ -80,7 +81,8 @@ public class SalBulkFlowServiceImpl implements SalBulkFlowService {
     public SalBulkFlowServiceImpl(SalFlowService flowService, DataBroker dataBroker) {
         this.flowService = Preconditions.checkNotNull(flowService);
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
-        register();
+
+        JdkFutures.addErrorLogging(register(), LOG, "register");
     }
 
     @Override
index a3ae13e875d00e9db4baaa98f17c9a9780129344..4c0cd569672b0aa303f3709856e3d2eb465227d2 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.openflowplugin.applications.bulk.o.matic;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
 import com.google.common.base.Optional;
@@ -32,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 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.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,6 +62,8 @@ public class FlowWriterDirectOFRpcTest {
 
     @Before
     public void setUp() throws Exception {
+        doReturn(RpcResultBuilder.success().buildFuture()).when(mockSalFlowService).addFlow(any());
+
         when(mockDataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
         NodeBuilder nodeBuilder = new NodeBuilder()
                 .setId(new NodeId("1"));
index ec05dd4dff972f209efce3f4b35782f2ebffa4a4..d2a39704b74c35a27ef6a5952e6551f76f978ffb 100644 (file)
       <artifactId>reconciliation-framework</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.infrautils</groupId>
+      <artifactId>infrautils-util</artifactId>
+      <version>${infrautils.version}</version>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
index ef84873d1f59eced836d13ecf80bb3cc9d79ceb4..fe17ddae4c9bd0317b89a2e12411b617770e1b58 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.openflowplugin.applications.frm;
 
 import com.google.common.collect.ImmutableMap;
+import java.util.Locale;
 import java.util.Map;
 
 public enum ForwardingRulesProperty {
@@ -48,6 +49,6 @@ public enum ForwardingRulesProperty {
      */
     @Override
     public String toString() {
-        return this.name().toLowerCase().replace('_', '-');
+        return this.name().toLowerCase(Locale.ROOT).replace('_', '-');
     }
 }
index 3fd406139eff6303fd665cd90a00ed5e04c490db..6e642b6332dc869dcf614810fa73bf09abb1f2f4 100644 (file)
@@ -13,18 +13,12 @@ import java.util.Collection;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.openflowplugin.applications.frm.FlowCapableNodeConnectorCommitter;
-import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public abstract class AbstractNodeConnectorCommitter<T extends DataObject>
         implements FlowCapableNodeConnectorCommitter<T> {
-    private final ForwardingRulesManager provider;
-
-    public AbstractNodeConnectorCommitter(ForwardingRulesManager provider) {
-        this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
-    }
 
     @Override
     public void onDataTreeChanged(Collection<DataTreeModification<T>> changes) {
index 1dfd755b9433f024b2a10511849dfdcf4bbd2329..c3cc81cde40c5024f674cfb9214ccc46957fd0ef 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -36,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Flow
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
@@ -107,7 +109,9 @@ public class FlowForwarder extends AbstractListeningCommiter<Flow> {
             // into remove-flow input so that only a flow entry associated with
             // a given flow object is removed.
             builder.setTransactionUri(new Uri(provider.getNewTransactionId())).setStrict(Boolean.TRUE);
-            provider.getSalFlowService().removeFlow(builder.build());
+            final Future<RpcResult<RemoveFlowOutput>> resultFuture =
+                    provider.getSalFlowService().removeFlow(builder.build());
+            JdkFutures.addErrorLogging(resultFuture, LOG, "removeFlow");
         }
     }
 
@@ -155,7 +159,9 @@ public class FlowForwarder extends AbstractListeningCommiter<Flow> {
             builder.setUpdatedFlow(new UpdatedFlowBuilder(update).setStrict(Boolean.TRUE).build());
             builder.setOriginalFlow(new OriginalFlowBuilder(original).setStrict(Boolean.TRUE).build());
 
-            provider.getSalFlowService().updateFlow(builder.build());
+            final Future<RpcResult<UpdateFlowOutput>> resultFuture =
+                    provider.getSalFlowService().updateFlow(builder.build());
+            JdkFutures.addErrorLogging(resultFuture, LOG, "updateFlow");
         }
     }
 
index 69f13b5709d519ad09df51df65d4844a2b257e53..affc74c8c94d847374bc65ac35eabba9edfc13bc 100644 (file)
@@ -18,7 +18,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.applications.frm.FlowNodeConnectorInventoryTranslator;
-import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -50,8 +49,7 @@ public class FlowNodeConnectorInventoryTranslatorImpl extends AbstractNodeConnec
             .synchronizedListMultimap(ArrayListMultimap.<BigInteger, String>create());
 
     @SuppressWarnings("IllegalCatch")
-    public FlowNodeConnectorInventoryTranslatorImpl(final ForwardingRulesManager manager, final DataBroker dataBroker) {
-        super(manager);
+    public FlowNodeConnectorInventoryTranslatorImpl(final DataBroker dataBroker) {
         Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
 
         final DataTreeIdentifier<FlowCapableNodeConnector> treeId =
index 282024869a547e7b9c154642e0ea17073933eef8..0ab4da610930b68f2d91be32e7bd4d94943fcc71 100644 (file)
@@ -300,7 +300,7 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
             BigInteger dpnId = getDpnIdFromNodeName(node);
 
             ReadOnlyTransaction trans = provider.getReadTranaction();
-            Optional<FlowCapableNode> flowNode = Optional.absent();
+            Optional<FlowCapableNode> flowNode;
             // initialize the counter
             int counter = 0;
             try {
index fc95f9e916794931c8c238d1e5f8ac5e0d381eb5..e8dde0391a8ec53c0fc39ee745b93b5b805cd8c4 100644 (file)
@@ -15,7 +15,6 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 import javax.annotation.Nonnull;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -130,7 +129,7 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
         }
         this.deviceMastershipManager = new DeviceMastershipManager(clusterSingletonServiceProvider, notificationService,
                 this.nodeListener, dataService);
-        flowNodeConnectorInventoryTranslatorImpl = new FlowNodeConnectorInventoryTranslatorImpl(this, dataService);
+        flowNodeConnectorInventoryTranslatorImpl = new FlowNodeConnectorInventoryTranslatorImpl(dataService);
 
         this.flowListener = new FlowForwarder(this, dataService);
         this.groupListener = new GroupForwarder(this, dataService);
@@ -300,7 +299,7 @@ public class ForwardingRulesManagerImpl implements ForwardingRulesManager {
                     staleMarkingEnabled = Boolean.valueOf(propertyValue);
                     break;
                 case RECONCILIATION_RETRY_COUNT:
-                    reconciliationRetryCount = Integer.valueOf(propertyValue);
+                    reconciliationRetryCount = Integer.parseInt(propertyValue);
                     break;
                 case BUNDLE_BASED_RECONCILIATION_ENABLED:
                     isBundleBasedReconciliationEnabled = Boolean.valueOf(propertyValue);
index 5f9398c1efd5f926560932b160222e166be5bb04..9f59df23109ede94b2381fbf0100fde2eeb401ec 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -27,6 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Add
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
@@ -100,7 +102,10 @@ public class GroupForwarder extends AbstractListeningCommiter<Group> {
         builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
         builder.setGroupRef(new GroupRef(identifier));
         builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
-        this.provider.getSalGroupService().removeGroup(builder.build());
+
+        final Future<RpcResult<RemoveGroupOutput>> resultFuture =
+                this.provider.getSalGroupService().removeGroup(builder.build());
+        JdkFutures.addErrorLogging(resultFuture, LOG, "removeGroup");
     }
 
     // TODO: Pull this into ForwardingRulesCommiter and override it here
@@ -131,7 +136,9 @@ public class GroupForwarder extends AbstractListeningCommiter<Group> {
         builder.setUpdatedGroup(new UpdatedGroupBuilder(updatedGroup).build());
         builder.setOriginalGroup(new OriginalGroupBuilder(originalGroup).build());
 
-        this.provider.getSalGroupService().updateGroup(builder.build());
+        final Future<RpcResult<UpdateGroupOutput>> resultFuture =
+                this.provider.getSalGroupService().updateGroup(builder.build());
+        JdkFutures.addErrorLogging(resultFuture, LOG, "updateGroup");
     }
 
     @Override
index 2b04d00577bde7281f6fac78f0df1a33d0d13655..97b32fea2118cd60f054cd7d21af1d013fc9517c 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -34,6 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Add
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
@@ -100,7 +102,10 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
         builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
         builder.setMeterRef(new MeterRef(identifier));
         builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
-        this.provider.getSalMeterService().removeMeter(builder.build());
+
+        final Future<RpcResult<RemoveMeterOutput>> resultFuture =
+                this.provider.getSalMeterService().removeMeter(builder.build());
+        JdkFutures.addErrorLogging(resultFuture, LOG, "removeMeter");
     }
 
     @Override
@@ -127,7 +132,9 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
         builder.setUpdatedMeter(new UpdatedMeterBuilder(update).build());
         builder.setOriginalMeter(new OriginalMeterBuilder(original).build());
 
-        this.provider.getSalMeterService().updateMeter(builder.build());
+        final Future<RpcResult<UpdateMeterOutput>> resultFuture =
+                this.provider.getSalMeterService().updateMeter(builder.build());
+        JdkFutures.addErrorLogging(resultFuture, LOG, "updateMeter");
     }
 
     @Override
index 96feb79ddfe607e9a3e7a352ceaa7d849310da95..640a253e6ea52a23817cb7694ad814fe58b9a0e9 100644 (file)
@@ -15,6 +15,7 @@ import java.util.concurrent.Future;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -23,6 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.OriginalTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableRef;
@@ -110,7 +112,10 @@ public class TableForwarder extends AbstractListeningCommiter<TableFeatures> {
         if (this.provider.getSalTableService() != null) {
             LOG.debug(" Handle to SalTableServices" + this.provider.getSalTableService());
         }
-        this.provider.getSalTableService().updateTable(builder.build());
+
+        final Future<RpcResult<UpdateTableOutput>> resultFuture =
+                this.provider.getSalTableService().updateTable(builder.build());
+        JdkFutures.addErrorLogging(resultFuture, LOG, "updateTable");
 
     }
 
index 2460cb121de46a328dec7ad6110d7d8d18ff5843..102e37000052d2266851388167f324188c39cb11 100644 (file)
@@ -8,7 +8,6 @@
 
 package org.opendaylight.openflowplugin.applications.frsync.impl;
 
-import com.google.common.base.Function;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -36,6 +35,7 @@ public class SyncReactorRetryDecorator implements SyncReactor {
         this.reconciliationRegistry = reconciliationRegistry;
     }
 
+    @Override
     public ListenableFuture<Boolean> syncup(final InstanceIdentifier<FlowCapableNode> flowcapableNodePath,
                                             final SyncupEntry syncupEntry) {
 
@@ -47,16 +47,14 @@ public class SyncReactorRetryDecorator implements SyncReactor {
 
         ListenableFuture<Boolean> syncupResult = delegate.syncup(flowcapableNodePath,syncupEntry);
 
-        return Futures.transform(syncupResult, new Function<Boolean, Boolean>() {
-            @Override
-            public Boolean apply(Boolean result) {
-                if (result) {
-                    reconciliationRegistry.unregisterIfRegistered(nodeId);
-                } else {
-                    reconciliationRegistry.register(nodeId);
-                }
-                return result;
+        return Futures.transform(syncupResult, result -> {
+            if (result) {
+                reconciliationRegistry.unregisterIfRegistered(nodeId);
+            } else {
+                reconciliationRegistry.register(nodeId);
             }
+
+            return result;
         }, MoreExecutors.directExecutor());
     }
 }
index a022c282b9e65da672a34cf37dde98261d90d2aa..70d37ab48eb92ea82c73a9f55a60abae37ac0468 100644 (file)
@@ -22,7 +22,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Future;
-import javax.annotation.Nullable;
+import javax.annotation.Nonnull;
 import org.opendaylight.openflowplugin.applications.frsync.SyncPlanPushStrategy;
 import org.opendaylight.openflowplugin.applications.frsync.util.ItemSyncBox;
 import org.opendaylight.openflowplugin.applications.frsync.util.PathUtil;
@@ -161,7 +161,7 @@ public class SyncPlanPushStrategyFlatBatchImpl implements SyncPlanPushStrategy {
                                                                                     final SyncCrudCounters counters) {
         return new FutureCallback<RpcResult<ProcessFlatBatchOutput>>() {
             @Override
-            public void onSuccess(@Nullable final RpcResult<ProcessFlatBatchOutput> result) {
+            public void onSuccess(@Nonnull final RpcResult<ProcessFlatBatchOutput> result) {
                 if (!result.isSuccessful() && result.getResult() != null
                         && !result.getResult().getBatchFailure().isEmpty()) {
                     Map<Range<Integer>, Batch> batchMap = mapBatchesToRanges(inputBatchBag, failureIndexLimit);
index 1b2156330d79d3e0fea58d4d74a1e746f1c1cbe1..40265410b004559fe6cebef535e39ca3f8552b06 100644 (file)
@@ -45,8 +45,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Add
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
@@ -323,25 +321,22 @@ public class SyncPlanPushStrategyIncrementalImpl implements SyncPlanPushStrategy
     ListenableFuture<RpcResult<Void>> updateTableFeatures(final InstanceIdentifier<FlowCapableNode> nodeIdent,
                                                           final FlowCapableNode flowCapableNodeConfigured) {
         // CHECK if while pushing the update, updateTableInput can be null to emulate a table add
-        final List<Table> tableList = ReconcileUtil.safeTables(flowCapableNodeConfigured);
+        //final List<Table> tableList = ReconcileUtil.safeTables(flowCapableNodeConfigured);
 
         final List<ListenableFuture<RpcResult<UpdateTableOutput>>> allResults = new ArrayList<>();
-        for (Table table : tableList) {
-            TableKey tableKey = table.getKey();
-            KeyedInstanceIdentifier<TableFeatures, TableFeaturesKey> tableFeaturesII = nodeIdent
-                    .child(TableFeatures.class, new TableFeaturesKey(tableKey.getId()));
-            List<TableFeatures> tableFeatures = flowCapableNodeConfigured.getTableFeatures();
-            if (tableFeatures != null) {
-                for (TableFeatures tableFeaturesItem : tableFeatures) {
-                    // TODO uncomment java.lang.NullPointerException
-                    // at
-                    // org.opendaylight.openflowjava.protocol.impl.serialization.match.AbstractOxmMatchEntrySerializer
-                    //    .serializeHeader(AbstractOxmMatchEntrySerializer.java:31
-                    // allResults.add(JdkFutureAdapters.listenInPoolThread(
-                    // tableForwarder.update(tableFeaturesII, null, tableFeaturesItem, nodeIdent)));
-                }
-            }
-        }
+//        for (Table table : tableList) {
+//            List<TableFeatures> tableFeatures = flowCapableNodeConfigured.getTableFeatures();
+//            if (tableFeatures != null) {
+//                for (TableFeatures tableFeaturesItem : tableFeatures) {
+//                    // TODO uncomment java.lang.NullPointerException
+//                    // at
+//                    // org.opendaylight.openflowjava.protocol.impl.serialization.match.AbstractOxmMatchEntrySerializer
+//                    //    .serializeHeader(AbstractOxmMatchEntrySerializer.java:31
+//                    // allResults.add(JdkFutureAdapters.listenInPoolThread(
+//                    // tableForwarder.update(tableFeaturesII, null, tableFeaturesItem, nodeIdent)));
+//                }
+//            }
+//        }
 
         final ListenableFuture<RpcResult<Void>> singleVoidResult = Futures.transform(
                 Futures.allAsList(allResults),
index 12040c58112d620f1f1e208127d046fca7f9305f..9b485d5e89dbc1d1f35766ad10b989e8512098e9 100644 (file)
@@ -32,9 +32,7 @@ public class SemaphoreKeeperGuavaImpl<K> implements SemaphoreKeeper<K> {
                 .build(new CacheLoader<K, Semaphore>() {
                     @Override
                     public Semaphore load(final K key) throws Exception {
-                        return new Semaphore(permits, fair) {
-                            private static final long serialVersionUID = 1L;
-                        };
+                        return new Semaphore(permits, fair);
                     }
                 });
     }
index 762a1ff51c76e9e92c7727357c6d92afdd72fc79..6f27c584ee757e98797428d8e038cb281f654bcf 100644 (file)
             <groupId>org.opendaylight.openflowplugin.applications</groupId>
             <artifactId>topology-lldp-discovery</artifactId>
         </dependency>
+        <dependency>
+          <groupId>org.opendaylight.infrautils</groupId>
+          <artifactId>infrautils-util</artifactId>
+          <version>${infrautils.version}</version>
+        </dependency>
 
         <!-- Test dependencies -->
         <dependency>
index 1b2b71bd7c3a21fde9c2ae9cee72b2191f6c8416..88bc618679748bf5bfa049b770c676d86cf25212 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.openflowplugin.applications.lldpspeaker;
 
 import com.google.common.base.Optional;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -59,6 +60,7 @@ public class DeviceOwnershipStatusService implements EntityOwnershipListener {
     }
 
     @Override
+    @SuppressFBWarnings("BC_UNCONFIRMED_CAST_OF_RETURN_VALUE")
     public void ownershipChanged(final EntityOwnershipChange ownershipChange) {
         final String entityName = ownershipChange.getEntity().getIdentifier().firstKeyOf(Entity.class).getName();
         if (entityName != null && isOpenFlowEntity(entityName)) {
index ddc7481714830d993ef3861edb92515017cd913c..bd5dc5d92d80fe06a691a9ab2c11e027a8aed00a 100644 (file)
@@ -10,16 +10,20 @@ package org.opendaylight.openflowplugin.applications.lldpspeaker;
 
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
+import org.opendaylight.openflowplugin.libraries.liblldp.PacketException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
@@ -34,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.Tr
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.lldp.speaker.rev141023.OperStatus;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -139,9 +144,6 @@ public class LLDPSpeaker implements NodeConnectorEventsObserver, Runnable, AutoC
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void nodeConnectorAdded(final InstanceIdentifier<NodeConnector> nodeConnectorInstanceId,
                                    final FlowCapableNodeConnector flowConnector) {
@@ -169,17 +171,24 @@ public class LLDPSpeaker implements NodeConnectorEventsObserver, Runnable, AutoC
         }
 
         // Generate packet with destination switch and port
-        TransmitPacketInput packet = new TransmitPacketInputBuilder()
-                .setEgress(new NodeConnectorRef(nodeConnectorInstanceId))
-                .setNode(new NodeRef(nodeInstanceId)).setPayload(LLDPUtil.buildLldpFrame(nodeId,
-                        nodeConnectorId, srcMacAddress, outputPortNo, addressDestionation)).build();
+        TransmitPacketInput packet;
+        try {
+            packet = new TransmitPacketInputBuilder()
+                    .setEgress(new NodeConnectorRef(nodeConnectorInstanceId))
+                    .setNode(new NodeRef(nodeInstanceId)).setPayload(LLDPUtil.buildLldpFrame(nodeId,
+                            nodeConnectorId, srcMacAddress, outputPortNo, addressDestionation)).build();
+        } catch (NoSuchAlgorithmException | PacketException e) {
+            LOG.error("Error building LLDP frame", e);
+            return;
+        }
 
         // Save packet to node connector id -> packet map to transmit it periodically on the configured interval.
         nodeConnectorMap.put(nodeConnectorInstanceId, packet);
         LOG.debug("Port {} added to LLDPSpeaker.nodeConnectorMap", nodeConnectorId.getValue());
 
         // Transmit packet for first time immediately
-        packetProcessingService.transmitPacket(packet);
+        final Future<RpcResult<Void>> resultFuture = packetProcessingService.transmitPacket(packet);
+        JdkFutures.addErrorLogging(resultFuture, LOG, "transmitPacket");
     }
 
     @Override
index 0bb7cea7e9ca83f9a4325e10104fc98e864e21e0..b443809a2081c05394729840392f81595fbb6fa7 100644 (file)
@@ -13,6 +13,7 @@ import static org.opendaylight.openflowplugin.libraries.liblldp.LLDPTLV.CUSTOM_T
 
 import java.math.BigInteger;
 import java.security.NoSuchAlgorithmException;
+import javax.annotation.Nonnull;
 import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.openflowplugin.libraries.liblldp.EtherTypes;
 import org.opendaylight.openflowplugin.libraries.liblldp.Ethernet;
@@ -37,8 +38,10 @@ public final class LLDPUtil {
     private LLDPUtil() {
     }
 
+    @Nonnull
     static byte[] buildLldpFrame(final NodeId nodeId, final NodeConnectorId nodeConnectorId, final MacAddress src,
-                                 final Long outPortNo, final MacAddress destinationAddress) {
+            final Long outPortNo, final MacAddress destinationAddress)
+                    throws NoSuchAlgorithmException, PacketException {
         // Create discovery pkt
         LLDP discoveryPkt = new LLDP();
 
@@ -81,18 +84,12 @@ public final class LLDPUtil {
         discoveryPkt.addCustomTLV(customTlv);
 
         //Create LLDP CustomSec TLV
-        byte[] pureValue = new byte[1];
-        try {
-            pureValue = getValueForLLDPPacketIntegrityEnsuring(nodeConnectorId);
-            byte[] customSecValue = LLDPTLV.createCustomTLVValue(CUSTOM_TLV_SUB_TYPE_CUSTOM_SEC, pureValue);
-            LLDPTLV customSecTlv = new LLDPTLV();
-            customSecTlv.setType(LLDPTLV.TLVType.Custom.getValue()).setLength((short) customSecValue.length)
-                    .setValue(customSecValue);
-            discoveryPkt.addCustomTLV(customSecTlv);
-        } catch (NoSuchAlgorithmException e) {
-            LOG.warn("LLDP extra authenticator creation failed.", e);
-        }
-
+        byte[] pureValue = getValueForLLDPPacketIntegrityEnsuring(nodeConnectorId);
+        byte[] customSecValue = LLDPTLV.createCustomTLVValue(CUSTOM_TLV_SUB_TYPE_CUSTOM_SEC, pureValue);
+        LLDPTLV customSecTlv = new LLDPTLV();
+        customSecTlv.setType(LLDPTLV.TLVType.Custom.getValue()).setLength((short) customSecValue.length)
+            .setValue(customSecValue);
+        discoveryPkt.addCustomTLV(customSecTlv);
 
         // Create ethernet pkt
         byte[] sourceMac = HexEncode.bytesFromHexString(src.getValue());
@@ -104,16 +101,12 @@ public final class LLDPUtil {
             ethPkt.setDestinationMACAddress(HexEncode.bytesFromHexString(destinationAddress.getValue()));
         }
 
-        try {
-            return ethPkt.serialize();
-        } catch (PacketException e) {
-            LOG.warn("Error creating LLDP packet.", e);
-        }
-        return null;
+        return ethPkt.serialize();
     }
 
+    @Nonnull
     static byte[] buildLldpFrame(final NodeId nodeId, final NodeConnectorId nodeConnectorId,
-                                 final MacAddress srcMacAddress, final Long outputPortNo) {
+            final MacAddress srcMacAddress, final Long outputPortNo) throws NoSuchAlgorithmException, PacketException {
         return buildLldpFrame(nodeId, nodeConnectorId, srcMacAddress, outputPortNo, null);
     }
 
index 804f82985c069f3548c7b37d578e73a8506cc178..a3ebd12ec5574b6ad5d9f2c300505644f593940e 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.openflowplugin.applications.lldpspeaker;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -17,6 +18,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import com.google.common.base.Optional;
+import java.security.NoSuchAlgorithmException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -27,6 +29,7 @@ import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
+import org.opendaylight.openflowplugin.libraries.liblldp.PacketException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
@@ -41,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.Tr
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.lldp.speaker.rev141023.OperStatus;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
  * Tests for {@link LLDPSpeaker}.
@@ -52,12 +56,7 @@ public class LLDPSpeakerTest {
     private static final MacAddress MAC_ADDRESS = new MacAddress("01:23:45:67:89:AB");
     private static final FlowCapableNodeConnector FLOW_CAPABLE_NODE_CONNECTOR =
             TestUtils.createFlowCapableNodeConnector(MAC_ADDRESS, 1L).build();
-    private static final byte[] LLDP_FRAME = LLDPUtil.buildLldpFrame(new NodeId("openflow:1"),
-            new NodeConnectorId("openflow:1:1"), MAC_ADDRESS, 1L);
-    private static final TransmitPacketInput PACKET_INPUT = new TransmitPacketInputBuilder()
-            .setEgress(new NodeConnectorRef(ID))
-            .setNode(new NodeRef(ID.firstIdentifierOf(Node.class)))
-            .setPayload(LLDP_FRAME).build();
+    private TransmitPacketInput packetInput;
 
     @Mock
     private PacketProcessingService packetProcessingService;
@@ -68,19 +67,23 @@ public class LLDPSpeakerTest {
     @Mock
     private EntityOwnershipService entityOwnershipService;
 
-    private final MacAddress destinationMACAddress = null;
     private LLDPSpeaker lldpSpeaker;
 
     @Before
-    public void setUp() {
-        when(
-                scheduledExecutorService.scheduleAtFixedRate(
-                        any(Runnable.class), anyLong(), anyLong(),
-                        any(TimeUnit.class))).thenReturn(scheduledSpeakerTask);
+    public void setUp() throws NoSuchAlgorithmException, PacketException {
+        byte[] lldpFrame = LLDPUtil.buildLldpFrame(new NodeId("openflow:1"),
+                new NodeConnectorId("openflow:1:1"), MAC_ADDRESS, 1L);
+        packetInput = new TransmitPacketInputBuilder().setEgress(new NodeConnectorRef(ID))
+                .setNode(new NodeRef(ID.firstIdentifierOf(Node.class))).setPayload(lldpFrame).build();
+
+        when(scheduledExecutorService.scheduleAtFixedRate(any(Runnable.class), anyLong(), anyLong(),
+                any(TimeUnit.class))).thenReturn(scheduledSpeakerTask);
         lldpSpeaker = new LLDPSpeaker(packetProcessingService,
-                scheduledExecutorService, destinationMACAddress, entityOwnershipService);
+                scheduledExecutorService, null, entityOwnershipService);
         when(entityOwnershipService.getOwnershipState(any())).thenReturn(Optional.of(EntityOwnershipState.IS_OWNER));
         lldpSpeaker.setOperationalStatus(OperStatus.RUN);
+
+        doReturn(RpcResultBuilder.success().buildFuture()).when(packetProcessingService).transmitPacket(any());
     }
 
     /**
@@ -98,7 +101,7 @@ public class LLDPSpeakerTest {
         lldpSpeaker.run();
 
         // Check packet transmission
-        verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
+        verify(packetProcessingService, times(1)).transmitPacket(packetInput);
         verifyNoMoreInteractions(packetProcessingService);
     }
 
@@ -120,7 +123,7 @@ public class LLDPSpeakerTest {
         lldpSpeaker.run();
 
         // Check packet transmission
-        verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
+        verify(packetProcessingService, times(1)).transmitPacket(packetInput);
         verifyNoMoreInteractions(packetProcessingService);
     }
 
@@ -141,7 +144,7 @@ public class LLDPSpeakerTest {
 
         // Verify that LLDP frame sent only once (by nodeConnectorAdded),
         // e.g. no flood after removal
-        verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
+        verify(packetProcessingService, times(1)).transmitPacket(packetInput);
         verifyNoMoreInteractions(packetProcessingService);
     }
 
@@ -158,7 +161,7 @@ public class LLDPSpeakerTest {
         }
 
         // Check packet transmission
-        verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
+        verify(packetProcessingService, times(1)).transmitPacket(packetInput);
         verifyNoMoreInteractions(packetProcessingService);
     }
 
index 4a15f7b4422b1a50900d1d9c81f5101ed2c62e22..cc740887ae434dcdc1a29233450ce6b636185624 100644 (file)
             <groupId>org.opendaylight.openflowplugin</groupId>
             <artifactId>openflowplugin-common</artifactId>
         </dependency>
+        <dependency>
+          <groupId>org.opendaylight.infrautils</groupId>
+          <artifactId>infrautils-util</artifactId>
+          <version>${infrautils.version}</version>
+      </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
index cb4be50cc4f40c5e8eefd16629ffb7c5d571ccc8..72af57e34e0eb25f3d6137b7d09bd6129403d06e 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.openflowplugin.openflow.ofswitch.config;
 
 import java.util.Collection;
+import java.util.concurrent.Future;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
@@ -16,6 +17,7 @@ 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.common.api.data.LogicalDatastoreType;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -24,9 +26,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.NodeConfigService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFlag;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,7 +40,7 @@ public class DefaultConfigPusher implements AutoCloseable, DataTreeChangeListene
     private static final int STARTUP_LOOP_MAX_RETRIES = 8;
     private final NodeConfigService nodeConfigService;
     private final DataBroker dataBroker;
-    private ListenerRegistration<DataTreeChangeListener> listenerRegistration;
+    private ListenerRegistration<?> listenerRegistration;
 
     public DefaultConfigPusher(NodeConfigService nodeConfigService, DataBroker dataBroker) {
         this.nodeConfigService = nodeConfigService;
@@ -76,7 +80,9 @@ public class DefaultConfigPusher implements AutoCloseable, DataTreeChangeListene
                 setConfigInputBuilder.setMissSearchLength(OFConstants.OFPCML_NO_BUFFER);
                 setConfigInputBuilder.setNode(new NodeRef(modification.getRootPath()
                         .getRootIdentifier().firstIdentifierOf(Node.class)));
-                nodeConfigService.setConfig(setConfigInputBuilder.build());
+                final Future<RpcResult<SetConfigOutput>> resultFuture =
+                        nodeConfigService.setConfig(setConfigInputBuilder.build());
+                JdkFutures.addErrorLogging(resultFuture, LOG, "addFlow");
             }
         }
     }
index c035592026868e5f427a271ac1960acbb54d3a1a..d2ed20f1ae343741a7f3e3d3cf7a71d6a202a1a9 100644 (file)
@@ -8,6 +8,9 @@
 
 package org.opendaylight.openflowplugin.openflow.ofswitch.config;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+
 import java.util.Collections;
 import org.junit.After;
 import org.junit.Assert;
@@ -35,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.Nod
 import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFlag;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
  * Test for {@link DefaultConfigPusher}.
@@ -53,6 +57,7 @@ public class DefaultConfigPusherTest {
 
     @Before
     public void setUp() throws Exception {
+        doReturn(RpcResultBuilder.success().buildFuture()).when(nodeConfigService).setConfig(any());
         defaultConfigPusher = new DefaultConfigPusher(nodeConfigService, Mockito.mock(DataBroker.class));
         final DataTreeIdentifier<FlowCapableNode> identifier =
                 new DataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, NODE_IID);
index a3c06c6acb4b5788c1dd170e7ea2e8f24ca9df05..6ce3071bbe56c9397d42ce1f5f50a02f3cbd6cec 100644 (file)
@@ -32,7 +32,7 @@ public class GetAllNodesCommandProvider extends OsgiCommandSupport {
         List<OFNode> ofNodeList = ShellUtil.getAllNodes(dataBroker);
         if (ofNodeList.isEmpty()) {
             session.getConsole().println("No node is connected yet");
-        } else if (ofNodeList != null && ofNodeList.size() > 0) {
+        } else {
             StringBuilder stringBuilder = new StringBuilder();
             Formatter formatter = new Formatter(stringBuilder);
             session.getConsole().println("Number of nodes: " + ofNodeList.size());
index 3b3c92c8a84ff252fe19fa8f833ef62c0349cdf1..e44684bc83855202851ee036a338be36eb3dae98 100644 (file)
@@ -8,8 +8,6 @@
 package org.opendaylight.openflowplugin.applications.southboundcli.cli;
 
 import java.util.Formatter;
-import java.util.HashSet;
-import java.util.Set;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
@@ -62,7 +60,6 @@ public class ShowNodeCommandProvider extends OsgiCommandSupport {
     }
 
     private void printNodeOutput(final OFNode ofNode) {
-        Set<String> portNames = new HashSet<>();
         String ofNodeId = ofNode.getNodeId().toString();
         String ofNodeName = ofNode.getNodeName();
         for (String port : ofNode.getPorts()) {
index 0da9d0d4541e49055f29fe779d15913db23369ae..065ccfce9f7c145083978ca7691b5734de65bb9a 100644 (file)
@@ -14,11 +14,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
@@ -38,6 +38,7 @@ public final class ShellUtil {
     private ShellUtil() {
     }
 
+    @Nonnull
     public static List<OFNode> getAllNodes(final DataBroker broker) {
         List<Node> nodes = null;
         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
@@ -62,13 +63,11 @@ public final class ShellUtil {
                     name = node.<FlowCapableNode>getAugmentation(FlowCapableNode.class).getDescription();
                 } else {
                     LOG.error("Error while converting OFNode: {} to FlowCapableNode", node.getId());
-                    return null;
+                    return Collections.emptyList();
                 }
                 OFNode ofNode = new OFNode(Long.parseLong(nodeId[1]), name);
-                if (ofNode != null) {
-                    LOG.trace("Added OFNode: {} to the list", ofNode.getNodeId());
-                    nodeList.add(ofNode);
-                }
+                LOG.trace("Added OFNode: {} to the list", ofNode.getNodeId());
+                nodeList.add(ofNode);
             }
             Collections.sort(nodeList);
             return nodeList;
@@ -126,7 +125,6 @@ public final class ShellUtil {
                         LOG.error("Error for OFNode:{} while reading nodeConnectors {}", node.getId());
                         return null;
                     } else {
-                        MacAddress hardwareAddress = flowCapableNodeConnector.getHardwareAddress();
                         String portName = flowCapableNodeConnector.getName();
                         portList.add(portName);
                     }
index 35205ebdd275167d62068119b8054cffd022e96c..3949a5951f11e44495915deade6d0a53fdf4a1ce 100644 (file)
           <groupId>org.opendaylight.openflowplugin.model</groupId>
           <artifactId>model-flow-service</artifactId>
       </dependency>
+      <dependency>
+          <groupId>org.opendaylight.infrautils</groupId>
+          <artifactId>infrautils-util</artifactId>
+          <version>${infrautils.version}</version>
+      </dependency>
       <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
index dd361870634c298b56057e7af138140c1ff91dd0..356822c55cc81a50c904339a66430974df6d0d61 100644 (file)
@@ -12,15 +12,15 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
-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.common.api.data.LogicalDatastoreType;
+import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -35,6 +35,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
@@ -51,8 +52,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class LLDPPacketPuntEnforcer implements AutoCloseable, ClusteredDataTreeChangeListener<FlowCapableNode> {
+    private static final Logger LOG = LoggerFactory.getLogger(LLDPPacketPuntEnforcer.class);
     private static final long STARTUP_LOOP_TICK = 500L;
     private static final int STARTUP_LOOP_MAX_RETRIES = 8;
     private static final short TABLE_ID = (short) 0;
@@ -60,7 +65,7 @@ public class LLDPPacketPuntEnforcer implements AutoCloseable, ClusteredDataTreeC
     private static final String DEFAULT_FLOW_ID = "42";
     private final SalFlowService flowService;
     private final DataBroker dataBroker;
-    private ListenerRegistration<DataTreeChangeListener> listenerRegistration;
+    private ListenerRegistration<?> listenerRegistration;
 
     public LLDPPacketPuntEnforcer(SalFlowService flowService, DataBroker dataBroker) {
         this.flowService = flowService;
@@ -71,17 +76,12 @@ public class LLDPPacketPuntEnforcer implements AutoCloseable, ClusteredDataTreeC
     public void start() {
         final InstanceIdentifier<FlowCapableNode> path = InstanceIdentifier.create(Nodes.class).child(Node.class)
                 .augmentation(FlowCapableNode.class);
-        final DataTreeIdentifier<FlowCapableNode> identifier = new DataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
-                                                                                      path);
+        final DataTreeIdentifier<FlowCapableNode> identifier = new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, path);
         SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(STARTUP_LOOP_TICK, STARTUP_LOOP_MAX_RETRIES);
         try {
-            listenerRegistration = looper
-                    .loopUntilNoException(new Callable<ListenerRegistration<DataTreeChangeListener>>() {
-                        @Override
-                        public ListenerRegistration<DataTreeChangeListener> call() throws Exception {
-                            return dataBroker.registerDataTreeChangeListener(identifier, LLDPPacketPuntEnforcer.this);
-                        }
-                    });
+            listenerRegistration = looper.loopUntilNoException(() ->
+                dataBroker.registerDataTreeChangeListener(identifier, LLDPPacketPuntEnforcer.this));
         } catch (Exception e) {
             throw new IllegalStateException("registerDataTreeChangeListener failed", e);
         }
@@ -96,12 +96,13 @@ public class LLDPPacketPuntEnforcer implements AutoCloseable, ClusteredDataTreeC
 
     @Override
     public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<FlowCapableNode>> modifications) {
-        for (DataTreeModification modification : modifications) {
+        for (DataTreeModification<FlowCapableNode> modification : modifications) {
             if (modification.getRootNode().getModificationType() == ModificationType.WRITE) {
                 AddFlowInputBuilder addFlowInput = new AddFlowInputBuilder(createFlow());
                 addFlowInput.setNode(
                         new NodeRef(modification.getRootPath().getRootIdentifier().firstIdentifierOf(Node.class)));
-                this.flowService.addFlow(addFlowInput.build());
+                final Future<RpcResult<AddFlowOutput>> resultFuture = this.flowService.addFlow(addFlowInput.build());
+                JdkFutures.addErrorLogging(resultFuture, LOG, "addFlow");
             }
         }
     }
index 2149e962556b2439e8fcf28210defe5827addf67..58f64130073767a2c5e6a29ff50bdbbf7d678d19 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.openflowplugin.applications.tablemissenforcer;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 
 import java.util.Collections;
 import org.junit.After;
@@ -42,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
 /**
  * Test for {@link LLDPPacketPuntEnforcer}.
@@ -60,6 +63,7 @@ public class LLDPDataTreeChangeListenerTest {
 
     @Before
     public void setUp() {
+        doReturn(RpcResultBuilder.success().buildFuture()).when(flowService).addFlow(any());
         lldpPacketPuntEnforcer = new LLDPPacketPuntEnforcer(flowService, Mockito.mock(DataBroker.class));
         final DataTreeIdentifier<FlowCapableNode> identifier = new DataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
                                                                                       NODE_IID);
index b93da5fab4d1bd227bf9e4a57286ed3ddab890c3..f3709a694b251e1441342e295674f37579820d6f 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.openflowplugin.applications.topology.lldp;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.lldp.discovery.config.rev160511.TopologyLldpDiscoveryConfig;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
@@ -21,6 +22,7 @@ public class LLDPActivator implements AutoCloseable {
 
     private final ListenerRegistration<NotificationListener> lldpNotificationRegistration;
 
+    @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     public LLDPActivator(NotificationProviderService notificationService, LLDPDiscoveryListener lldpDiscoveryListener,
                          TopologyLldpDiscoveryConfig topologyLldpDiscoveryConfig) {
         lldpSecureKey = topologyLldpDiscoveryConfig.getLldpSecureKey();
index ec54eabfae1600ae83d4d4b4b88fa7a57a645ef0..e1644b9dfa3b7fcef72ac917cf0a7f40c5604a2b 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.openflowplugin.applications.topology.lldp;
 
 import com.google.common.collect.ImmutableMap;
-
+import java.util.Locale;
 import java.util.Map;
 
 public enum TopologyLLDPDiscoveryProperty {
@@ -46,6 +46,6 @@ public enum TopologyLLDPDiscoveryProperty {
      */
     @Override
     public String toString() {
-        return this.name().toLowerCase().replace('_', '-');
+        return this.name().toLowerCase(Locale.ROOT).replace('_', '-');
     }
 }
index 5d39586995d1ed02a801f03193db1a8bcffc55e1..054128e52f5ba755d209e7d72f2d57eb6c9f70c9 100644 (file)
@@ -16,6 +16,7 @@ import com.google.common.hash.Hashing;
 import java.lang.management.ManagementFactory;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Objects;
@@ -156,7 +157,7 @@ public final class LLDPDiscoveryUtils {
         }
         final String pureValue = nodeConnectorId + finalKey;
 
-        final byte[] pureBytes = pureValue.getBytes();
+        final byte[] pureBytes = pureValue.getBytes(StandardCharsets.UTF_8);
         HashFunction hashFunction = Hashing.md5();
         Hasher hasher = hashFunction.newHasher();
         HashCode hashedValue = hasher.putBytes(pureBytes).hash();