From 85a5359612deb86016401ad2a089b485fb9cb34e Mon Sep 17 00:00:00 2001 From: Stephen Kitt Date: Tue, 16 Oct 2018 16:52:09 +0200 Subject: [PATCH] Handle nullable lists in elanmanager Following YANGTOOLS-585, lists can be null (which is correctly indicated with an @Nullable annotation). This patch deals with the fallout. Change-Id: I50cddb975389da42dc85bac65724576741cf6a5b Signed-off-by: Stephen Kitt --- .../netvirt/elanmanager/api/IL2gwService.java | 3 +- .../elanmanager/utils/ElanL2GwCacheUtils.java | 5 +- .../netvirt/elan/cli/ElanAdd.java | 2 + .../netvirt/elan/cli/ElanDelete.java | 2 + .../netvirt/elan/cli/ElanGet.java | 2 + .../netvirt/elan/cli/ElanInterfaceAdd.java | 2 + .../netvirt/elan/cli/ElanInterfaceDelete.java | 2 + .../netvirt/elan/cli/ElanInterfaceGet.java | 2 + .../netvirt/elan/cli/ElanInterfaceUpdate.java | 2 + .../netvirt/elan/cli/ElanMacTableFlush.java | 2 + .../netvirt/elan/cli/ElanMacTableGet.java | 2 + .../netvirt/elan/cli/ElanUpdate.java | 2 + .../netvirt/elan/cli/StaticMacAdd.java | 2 + .../netvirt/elan/cli/StaticMacDelete.java | 2 + .../netvirt/elan/cli/etree/EtreeAdd.java | 2 + .../netvirt/elan/cli/etree/EtreeDelete.java | 2 + .../netvirt/elan/cli/etree/EtreeGet.java | 2 + .../elan/cli/etree/EtreeInterfaceAdd.java | 2 + .../elan/cli/etree/EtreeInterfaceDelete.java | 2 + .../elan/cli/etree/EtreeInterfaceGet.java | 2 + .../elan/cli/l2gw/L2GwUtilsCacheCli.java | 2 + .../elan/cli/l2gw/L2GwValidateCli.java | 18 +++-- .../cli/l2gw/NetworkL2gwDeviceInfoCli.java | 27 +++++--- .../elan/evpn/utils/EvpnMacVrfUtils.java | 1 + .../netvirt/elan/evpn/utils/EvpnUtils.java | 12 +++- .../elan/internal/ElanBridgeManager.java | 12 +++- .../ElanDpnInterfaceClusteredListener.java | 14 ++-- .../internal/ElanDpnInterfacesListener.java | 10 +-- .../elan/internal/ElanInterfaceManager.java | 46 +++++++------ .../ElanInterfaceStateClusteredListener.java | 2 +- .../elan/internal/ElanOvsdbNodeListener.java | 2 +- .../elan/internal/ElanPacketInHandler.java | 5 +- .../elan/internal/ElanServiceProvider.java | 32 +++++---- .../netvirt/elan/l2gw/ha/HwvtepHAUtil.java | 17 +++-- .../elan/l2gw/ha/commands/BaseCommand.java | 12 ++-- .../elan/l2gw/ha/commands/LocalMcastCmd.java | 10 ++- .../elan/l2gw/ha/commands/LocalUcastCmd.java | 2 + .../l2gw/ha/commands/LogicalSwitchesCmd.java | 2 + .../elan/l2gw/ha/commands/MergeCommand.java | 4 +- .../l2gw/ha/commands/PhysicalLocatorCmd.java | 5 +- .../elan/l2gw/ha/commands/RemoteMcastCmd.java | 10 ++- .../elan/l2gw/ha/commands/RemoteUcastCmd.java | 5 +- .../elan/l2gw/ha/commands/SwitchesCmd.java | 2 + .../l2gw/ha/commands/TerminationPointCmd.java | 2 + .../elan/l2gw/ha/commands/TunnelCmd.java | 2 + .../elan/l2gw/ha/commands/TunnelIpCmd.java | 2 + .../elan/l2gw/ha/handlers/NodeCopier.java | 2 +- .../elan/l2gw/listeners/ChildListener.java | 2 + .../l2gw/listeners/ElanGroupListener.java | 9 +-- .../HwvtepPhysicalSwitchListener.java | 3 + .../HwvtepTerminationPointListener.java | 12 ++-- .../utils/ElanL2GatewayMulticastUtils.java | 26 +++++--- .../elan/l2gw/utils/ElanL2GatewayUtils.java | 30 +++++---- .../l2gw/utils/L2GatewayConnectionUtils.java | 29 ++++---- .../elan/statisitcs/ElanStatisticsImpl.java | 2 + .../netvirt/elan/utils/ElanDmacUtils.java | 11 ++-- .../netvirt/elan/utils/ElanEtreeUtils.java | 2 + .../netvirt/elan/utils/ElanItmUtils.java | 3 +- .../netvirt/elan/utils/ElanUtils.java | 66 +++++++++++-------- .../utils/TransportZoneNotificationUtil.java | 9 ++- 60 files changed, 350 insertions(+), 158 deletions(-) diff --git a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/IL2gwService.java b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/IL2gwService.java index 598b730643..f6eb2d6f3a 100644 --- a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/IL2gwService.java +++ b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/IL2gwService.java @@ -11,6 +11,7 @@ package org.opendaylight.netvirt.elanmanager.api; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; @@ -26,7 +27,7 @@ public interface IL2gwService { void addL2GatewayConnection(L2gatewayConnection input); void addL2GatewayConnection(L2gatewayConnection input, - String l2GwDeviceName, + @Nullable String l2GwDeviceName, L2gateway l2Gateway); List getAssociatedL2GwConnections(Set l2GatewayIds); diff --git a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/utils/ElanL2GwCacheUtils.java b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/utils/ElanL2GwCacheUtils.java index 7867215324..79ad578a54 100644 --- a/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/utils/ElanL2GwCacheUtils.java +++ b/elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/utils/ElanL2GwCacheUtils.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import javax.annotation.Nullable; import org.opendaylight.genius.utils.cache.CacheUtil; import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice; @@ -47,7 +48,7 @@ public final class ElanL2GwCacheUtils { cachedMap.values().forEach(deviceMap -> deviceMap.remove(deviceName)); } - + @Nullable public static L2GatewayDevice removeL2GatewayDeviceFromCache(String elanName, String l2gwDeviceNodeId) { ConcurrentMap> cachedMap = (ConcurrentMap>) CacheUtil.getCache( @@ -60,6 +61,7 @@ public final class ElanL2GwCacheUtils { } } + @Nullable public static L2GatewayDevice getL2GatewayDeviceFromCache(String elanName, String l2gwDeviceNodeId) { ConcurrentMap> cachedMap = (ConcurrentMap>) CacheUtil.getCache( @@ -83,6 +85,7 @@ public final class ElanL2GwCacheUtils { return result; } + @Nullable public static List getAllElanDevicesFromCache() { ConcurrentMap> cachedMap = (ConcurrentMap>) CacheUtil.getCache( diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanAdd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanAdd.java index 59d5420765..26b0d5896b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanAdd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanAdd.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -32,6 +33,7 @@ public class ElanAdd extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { if (macTimeOut == -1) { macTimeOut = 30; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanDelete.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanDelete.java index 046e8e28bf..8ea21c3f21 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanDelete.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanDelete.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -28,6 +29,7 @@ public class ElanDelete extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing the Deletion of ElanInstance command for elanName: {}", elanName); boolean isSuccess = elanProvider.deleteElanInstance(elanName); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanGet.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanGet.java index 9e80f213bb..608659c03f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanGet.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanGet.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -31,6 +32,7 @@ public class ElanGet extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing Get ElanInstance command for elanName: {}", elanName); if (elanName != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceAdd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceAdd.java index 6627903752..9e6fd8e6cf 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceAdd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceAdd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -36,6 +37,7 @@ public class ElanInterfaceAdd extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing create ElanInterface command for elanName:{}, interfaceName:{}, staticMacAddresses:{}," + "elanInterfaceDescr:{}",elanName, interfaceName, staticMacAddresses, elanInterfaceDescr); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceDelete.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceDelete.java index 6536095529..8d00ee71e9 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceDelete.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceDelete.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -29,6 +30,7 @@ public class ElanInterfaceDelete extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Deleting ElanInterface command for elanName:{}, interfaceName:{}", elanName, interfaceName); elanProvider.deleteElanInterface(interfaceName); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceGet.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceGet.java index 60b858f5b5..46ea6c79d7 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceGet.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceGet.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -38,6 +39,7 @@ public class ElanInterfaceGet extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing Get ElanInterface command for the corresponding Elan Instance for {}", elanName); if (elanName != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceUpdate.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceUpdate.java index 2405cd0434..714665450b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceUpdate.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanInterfaceUpdate.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -36,6 +37,7 @@ public class ElanInterfaceUpdate extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing elanInterface update command for elanName:{}, interfaceName:{}, staticMacAddresses:{}," + "elanInterfaceDescr:{}", elanName, interfaceName, staticMacAddresses, elanInterfaceDescr); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableFlush.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableFlush.java index ba603f567e..3cf3ecbef3 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableFlush.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableFlush.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -28,6 +29,7 @@ public class ElanMacTableFlush extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing mac table flush command for {}", elanName); elanProvider.flushMACTable(elanName); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableGet.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableGet.java index 516af9339d..326860c50e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableGet.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanMacTableGet.java @@ -10,6 +10,7 @@ package org.opendaylight.netvirt.elan.cli; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -33,6 +34,7 @@ public class ElanMacTableGet extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing elan mac table get command for {}", elanName); Collection macTables = elanProvider.getElanMacTable(elanName); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanUpdate.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanUpdate.java index 57f2ecfc8a..8aca18544f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanUpdate.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/ElanUpdate.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -31,6 +32,7 @@ public class ElanUpdate extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Updating elanInstance update command for elanName:{}, macTimeOut:{}, elanDescr:{}", elanName, macTimeOut, elanDescr); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacAdd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacAdd.java index 22aeedae41..1938999f55 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacAdd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacAdd.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -32,6 +33,7 @@ public class StaticMacAdd extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing static mac add command for elanName:{}, interfaceName:{}, staticMacAddress:{}", elanName, interfaceName, staticMacAddress); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacDelete.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacDelete.java index aab6bec29b..03b4991681 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacDelete.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/StaticMacDelete.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -32,6 +33,7 @@ public class StaticMacDelete extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing static mac delete command for elanName:{}, interfaceName:{}, staticMacAddress:{}", elanName, interfaceName, staticMacAddress); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeAdd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeAdd.java index 1c71ec5ae5..e8d5dc712e 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeAdd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeAdd.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli.etree; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -32,6 +33,7 @@ public class EtreeAdd extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { if (macTimeOut == -1) { macTimeOut = 30; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeDelete.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeDelete.java index 02d91d6773..a1a11d3f66 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeDelete.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeDelete.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli.etree; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -28,6 +29,7 @@ public class EtreeDelete extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing the Deletion of EtreeInstance command {}", etreeName); boolean isSuccess = elanProvider.deleteEtreeInstance(etreeName); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeGet.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeGet.java index b93bc924eb..9b2737f213 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeGet.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeGet.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli.etree; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -32,6 +33,7 @@ public class EtreeGet extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing Get EtreeInstance command for {}", etreeName); if (etreeName != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceAdd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceAdd.java index 633b6e269b..44c9b6bbb9 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceAdd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceAdd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli.etree; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -41,6 +42,7 @@ public class EtreeInterfaceAdd extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { EtreeInterfaceType inputType = null; for (EtreeInterfaceType type : EtreeInterfaceType.values()) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceDelete.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceDelete.java index 81273ea4f2..2484a555dd 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceDelete.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceDelete.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netvirt.elan.cli.etree; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -31,6 +32,7 @@ public class EtreeInterfaceDelete extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Deleting EtreeInterface command etreeName:{}, interfaceName:{}", etreeName, interfaceName); ElanInterface existingInterface = diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceGet.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceGet.java index 2331afc197..41666e3132 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceGet.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/etree/EtreeInterfaceGet.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.cli.etree; import java.util.List; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -40,6 +41,7 @@ public class EtreeInterfaceGet extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { LOG.debug("Executing Get EtreeInterface command for the corresponding Etree Instance {}", etreeName); if (etreeName != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwUtilsCacheCli.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwUtilsCacheCli.java index e141348cf1..6b035924df 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwUtilsCacheCli.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwUtilsCacheCli.java @@ -17,6 +17,7 @@ import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Option; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -50,6 +51,7 @@ public class L2GwUtilsCacheCli extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() throws IOException { if (cacheName == null) { session.getConsole().println("Available caches"); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java index 75f007f364..00c9598aa2 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java @@ -8,6 +8,9 @@ package org.opendaylight.netvirt.elan.cli.l2gw; +import static java.util.Collections.emptyList; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.Sets; @@ -23,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -109,6 +113,7 @@ public class L2GwValidateCli extends OsgiCommandSupport { @Override @SuppressFBWarnings("DM_DEFAULT_ENCODING") + @Nullable public Object doExecute() throws Exception { try { pw = new PrintWriter(new FileOutputStream(new File("l2gw.validation.txt"))); @@ -132,13 +137,15 @@ public class L2GwValidateCli extends OsgiCommandSupport { Optional configTopoOptional = tx.read(LogicalDatastoreType.CONFIGURATION, topoId).checkedGet(); if (operationalTopoOptional.isPresent()) { - for (Node node : operationalTopoOptional.get().getNode()) { + for (Node node : requireNonNullElse(operationalTopoOptional.get().getNode(), + Collections.emptyList())) { InstanceIdentifier nodeIid = topoId.child(Node.class, node.key()); operationalNodes.put(nodeIid, node); } } if (configTopoOptional.isPresent()) { - for (Node node : configTopoOptional.get().getNode()) { + for (Node node : requireNonNullElse(configTopoOptional.get().getNode(), + Collections.emptyList())) { InstanceIdentifier nodeIid = topoId.child(Node.class, node.key()); configNodes.put(nodeIid, node); } @@ -171,6 +178,7 @@ public class L2GwValidateCli extends OsgiCommandSupport { return false; } + @Nullable private DataObject getData(Map, Map> dataMap, InstanceIdentifier nodeIid, InstanceIdentifier dataIid) { if (dataMap.containsKey(nodeIid)) { @@ -385,7 +393,7 @@ public class L2GwValidateCli extends OsgiCommandSupport { L2gateway l2gateway = uuidToL2Gateway.get(l2gatewayConnection.getL2gatewayId()); String logicalSwitchName = l2gatewayConnection.getNetworkId().getValue(); - List devices = l2gateway.getDevices(); + List devices = requireNonNullElse(l2gateway.getDevices(), emptyList()); for (Devices device : devices) { @@ -549,8 +557,8 @@ public class L2GwValidateCli extends OsgiCommandSupport { } VlanBindings expectedBindings = !expectedVlans.isEmpty() ? expectedVlans.get(0) : null; boolean foundBindings = false; - List vlanBindingses = configTerminationPoint.augmentation( - HwvtepPhysicalPortAugmentation.class).getVlanBindings(); + List vlanBindingses = requireNonNullElse(configTerminationPoint.augmentation( + HwvtepPhysicalPortAugmentation.class).getVlanBindings(), emptyList()); for (VlanBindings actual : vlanBindingses) { if (actual.equals(expectedBindings)) { foundBindings = true; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java index a1368692d9..95f0c3801d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java @@ -8,13 +8,18 @@ package org.opendaylight.netvirt.elan.cli.l2gw; +import static java.util.Collections.emptyList; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + import com.google.common.base.Optional; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Option; import org.apache.karaf.shell.console.OsgiCommandSupport; @@ -90,6 +95,7 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { } @Override + @Nullable protected Object doExecute() { List nodes = new ArrayList<>(); Set networks = new HashSet<>(); @@ -97,7 +103,7 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { Optional topologyOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, createHwvtepTopologyInstanceIdentifier()); if (topologyOptional.isPresent()) { - nodes = topologyOptional.get().getNode(); + nodes = requireNonNullElse(topologyOptional.get().getNode(), emptyList()); } } else { Optional nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, @@ -251,7 +257,8 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { if (elanName.equals(lsFromLocalMac)) { String mac = localMac.getMacEntryKey().getValue(); List locatorsets = new ArrayList<>(); - for (LocatorSet locatorSet : localMac.getLocatorSet()) { + for (LocatorSet locatorSet : requireNonNullElse(localMac.getLocatorSet(), + Collections.emptyList())) { locatorsets.add(getLocatorValue(locatorSet.getLocatorRef())); } session.getConsole().println(mac + GAP + locatorsets.toString()); @@ -278,7 +285,8 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { if (elanName.equals(lsFromremoteMac)) { String mac = remoteMac.getMacEntryKey().getValue(); List locatorsets = new ArrayList<>(); - for (LocatorSet locatorSet : remoteMac.getLocatorSet()) { + for (LocatorSet locatorSet : requireNonNullElse(remoteMac.getLocatorSet(), + Collections.emptyList())) { locatorsets.add(getLocatorValue(locatorSet.getLocatorRef())); } session.getConsole().println(mac + GAP + locatorsets.toString()); @@ -317,6 +325,7 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { } + @Nullable String getLocatorValue(HwvtepPhysicalLocatorRef locatorRef) { if (locatorRef == null) { return null; @@ -325,6 +334,7 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { .firstKeyOf(TerminationPoint.class).getTpId().getValue(); } + @Nullable String getLogicalSwitchValue(HwvtepLogicalSwitchRef logicalSwitchRef) { if (logicalSwitchRef == null) { return null; @@ -333,12 +343,13 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport { .firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue(); } + @Nullable Node getPSnode(Node hwvtepNode, LogicalDatastoreType datastoreType) { - if (hwvtepNode.augmentation(HwvtepGlobalAugmentation.class) != null - && hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).getSwitches() != null) { - for (Switches switches : hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).getSwitches()) { - NodeId psNodeId = switches.getSwitchRef().getValue().firstKeyOf(Node.class).getNodeId(); - return HwvtepUtils.getHwVtepNode(dataBroker, datastoreType, psNodeId); + if (hwvtepNode.augmentation(HwvtepGlobalAugmentation.class) != null) { + List switches = hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).getSwitches(); + if (switches != null) { + return HwvtepUtils.getHwVtepNode(dataBroker, datastoreType, + switches.iterator().next().getSwitchRef().getValue().firstKeyOf(Node.class).getNodeId()); } } return null; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java index 7fc05c284f..e3916b03e6 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java @@ -266,6 +266,7 @@ public class EvpnMacVrfUtils { } } + @Nullable public String getRoutePathNexthopIp(MacVrfEntry macVrfEntry) { if (macVrfEntry.getRoutePaths() == null || macVrfEntry.getRoutePaths().isEmpty()) { LOG.debug("RoutePaths is null or empty for macvrfentry {}", macVrfEntry); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java index 5eada5cd57..1c0f2ca23a 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java @@ -7,7 +7,9 @@ */ package org.opendaylight.netvirt.elan.evpn.utils; +import static java.util.Collections.emptyList; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; @@ -23,6 +25,7 @@ import java.util.function.BiConsumer; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -143,6 +146,7 @@ public class EvpnUtils { }); } + @Nullable public String getEndpointIpAddressForDPN(BigInteger dpnId) { Future> result = itmRpcService.getDpnEndpointIps( @@ -176,6 +180,7 @@ public class EvpnUtils { : interfaceManager.getInterfaceInfoFromOperationalDataStore(ifName).getMacAddress()); } + @Nullable public String getL3vpnNameFromElan(ElanInstance elanInfo) { if (elanInfo == null) { LOG.debug("getL3vpnNameFromElan :elanInfo is NULL"); @@ -185,6 +190,7 @@ public class EvpnUtils { return evpnAugmentation != null ? evpnAugmentation.getL3vpnName() : null; } + @Nullable public static String getEvpnNameFromElan(ElanInstance elanInfo) { if (elanInfo == null) { LOG.debug("getEvpnNameFromElan :elanInfo is NULL"); @@ -194,6 +200,7 @@ public class EvpnUtils { return evpnAugmentation != null ? evpnAugmentation.getEvpnName() : null; } + @Nullable public String getEvpnRd(ElanInstance elanInfo) { String evpnName = getEvpnNameFromElan(elanInfo); if (evpnName == null) { @@ -353,9 +360,10 @@ public class EvpnUtils { LOG.info("No External Tunnel Configured while programming the l2vni table."); return tunnelInterfaceNameList; } - List externalTunnels = externalTunnelListOptional.get().getExternalTunnel(); + List externalTunnels = + requireNonNullElse(externalTunnelListOptional.get().getExternalTunnel(), emptyList()); - dcGatewayIps + requireNonNullElse(dcGatewayIps, Collections.emptyList()) .forEach(dcIp -> externalTunnels .stream() .filter(externalTunnel -> externalTunnel.getDestinationDevice() diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java index a298366140..cef926b432 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -214,6 +215,7 @@ public class ElanBridgeManager implements IElanBridgeManager { } + @Nullable private List getManagedNodeEntries(Node node) { OvsdbNodeAugmentation ovsdbNode = southboundUtils.extractNodeAugmentation(node); if (ovsdbNode == null) { @@ -311,7 +313,7 @@ public class ElanBridgeManager implements IElanBridgeManager { * @param mac mac address to set on the bridge or null * @return true if no errors occurred */ - public boolean addBridge(Node ovsdbNode, String bridgeName, String mac) { + public boolean addBridge(Node ovsdbNode, String bridgeName, @Nullable String mac) { boolean rv = true; if (southboundUtils.getBridgeFromConfig(ovsdbNode, bridgeName) == null) { Class dpType = null; @@ -398,6 +400,7 @@ public class ElanBridgeManager implements IElanBridgeManager { * @param physicalNetworkName name of physical network * @return physical network name */ + @Nullable public String getProviderMappingValue(Node node, String physicalNetworkName) { Map providerMappings = getOpenvswitchOtherConfigMap(node, PROVIDER_MAPPINGS_KEY); String providerMappingValue = providerMappings.get(physicalNetworkName); @@ -567,6 +570,7 @@ public class ElanBridgeManager implements IElanBridgeManager { * {@inheritDoc}. */ @Override + @Nullable public Node getBridgeNode(BigInteger dpId) { List ovsdbNodes = southboundUtils.getOvsdbNodes(); if (null == ovsdbNodes) { @@ -588,6 +592,7 @@ public class ElanBridgeManager implements IElanBridgeManager { return null; } + @Nullable public String getProviderInterfaceName(BigInteger dpId, String physicalNetworkName) { Node brNode; @@ -600,6 +605,7 @@ public class ElanBridgeManager implements IElanBridgeManager { return getProviderInterfaceName(brNode, physicalNetworkName); } + @Nullable public String getProviderInterfaceName(Node bridgeNode, String physicalNetworkName) { if (physicalNetworkName == null) { return null; @@ -625,10 +631,10 @@ public class ElanBridgeManager implements IElanBridgeManager { } public boolean hasDatapathID(Node node) { - return southboundUtils.getDataPathId(node) > 0 ? true : false; + return southboundUtils.getDataPathId(node) > 0; } - public Boolean isBridgeOnOvsdbNode(Node ovsdbNode, String bridgename) { + public boolean isBridgeOnOvsdbNode(Node ovsdbNode, String bridgename) { return southboundUtils.isBridgeOnOvsdbNode(ovsdbNode, bridgename); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java index 8e843eac71..6b69e7193d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java @@ -7,7 +7,10 @@ */ package org.opendaylight.netvirt.elan.internal; -import java.util.Collections; +import static java.util.Collections.emptyList; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + +import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; @@ -84,7 +87,7 @@ public class ElanDpnInterfaceClusteredListener elanClusterUtils.runOnlyInOwnerNode(elanName, "updating mcast mac upon tunnel event", () -> { elanL2GatewayMulticastUtils.updateRemoteMcastMacOnElanL2GwDevices(elanName); - return Collections.emptyList(); + return emptyList(); }); } @@ -120,8 +123,9 @@ public class ElanDpnInterfaceClusteredListener @Override protected void update(InstanceIdentifier identifier, DpnInterfaces original, final DpnInterfaces dpnInterfaces) { - LOG.debug("dpninterfaces update fired new size {}", dpnInterfaces.getInterfaces().size()); - if (dpnInterfaces.getInterfaces().isEmpty()) { + List interfaces = requireNonNullElse(dpnInterfaces.getInterfaces(), emptyList()); + LOG.debug("dpninterfaces update fired new size {}", interfaces.size()); + if (interfaces.isEmpty()) { elanInstanceDpnsCache.remove(getElanName(identifier), dpnInterfaces); LOG.debug("dpninterfaces last dpn interface on this elan {} ", dpnInterfaces.key()); // this is the last dpn interface on this elan @@ -146,7 +150,7 @@ public class ElanDpnInterfaceClusteredListener elanL2GatewayMulticastUtils.updateRemoteMcastMacOnElanL2GwDevices(elanName); } } - return null; + return emptyList(); }); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java index 5b17290e75..23650aa7a5 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java @@ -8,8 +8,10 @@ package org.opendaylight.netvirt.elan.internal; +import static java.util.Collections.emptyList; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + import java.math.BigInteger; -import java.util.Collections; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -76,13 +78,13 @@ public class ElanDpnInterfacesListener ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull(); if (elanInstance != null && !elanInstance.isExternal() && ElanUtils.isVlan(elanInstance)) { - List interfaces = update.getInterfaces(); + List interfaces = requireNonNullElse(update.getInterfaces(), emptyList()); // trigger deletion for vlan provider intf on the DPN for the vlan provider network if (interfaces.size() == 1 && interfaceManager.isExternalInterface(interfaces.get(0))) { LOG.debug("deleting vlan prv intf for elan {}, dpn {}", elanInstanceName, dpnId); jobCoordinator.enqueueJob(dpnId.toString(), () -> { elanService.deleteExternalElanNetwork(elanInstance, dpnId); - return Collections.emptyList(); + return emptyList(); }); } } @@ -102,7 +104,7 @@ public class ElanDpnInterfacesListener LOG.debug("creating vlan member intf for elan {}, dpn {}", elanInstance.getPhysicalNetworkName(), dpnId); elanService.createExternalElanNetwork(elanInstance, dpnId); - return Collections.emptyList(); + return emptyList(); }); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index a4d4620085..b64e2c1031 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -7,10 +7,12 @@ */ package org.opendaylight.netvirt.elan.internal; +import static java.util.Collections.emptyList; import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import static org.opendaylight.genius.infra.Datastore.OPERATIONAL; import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -264,7 +266,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase { - List elanInterfaces = elanState.getElanInterfaces(); + List elanInterfaces = requireNonNullElse(elanState.getElanInterfaces(), emptyList()); if (elanInterfaces.isEmpty()) { holder.isLastElanInterface = true; } @@ -367,7 +369,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanInterfaces = elanState.getElanInterfaces(); + List elanInterfaces = requireNonNullElse(elanState.getElanInterfaces(), emptyList()); boolean isRemoved = elanInterfaces.remove(interfaceName); if (!isRemoved) { return elanState; @@ -486,7 +488,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBaseemptyList())) { ElanInterfaceMac macs = elanUtils.getElanInterfaceMacByInterfaceName(elanInterface); if (macs == null || macs.getMacEntry() == null) { continue; @@ -641,7 +644,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase remoteElanInterfaces = dpnInterfaces.getInterfaces(); @@ -717,7 +720,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanInterfaces = existingElanDpnInterfaces.get().getInterfaces(); + List elanInterfaces = + requireNonNullElse(existingElanDpnInterfaces.get().getInterfaces(), emptyList()); elanInterfaces.add(interfaceName); holder.dpnInterfaces = updateElanDpnInterfacesList(elanInstanceName, holder.dpId, elanInterfaces, operTx); @@ -731,7 +735,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanInterfaces = existingElanDpnInterfaces.get().getInterfaces(); + List elanInterfaces = + requireNonNullElse(existingElanDpnInterfaces.get().getInterfaces(), emptyList()); elanInterfaces.add(interfaceName); if (elanInterfaces.size() == 1) { // 1st dpn interface elanL2GatewayUtils.installElanL2gwDevicesLocalMacsInDpn(holder.dpId, elanInstance, @@ -880,13 +885,14 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase interfaces = requireNonNullElse(dpnInterfaces.getInterfaces(), emptyList()); + if (interfaces.contains(routerPortUuid)) { dummyInterfaceCount++; } - if (dpnInterfaces.getInterfaces().contains(elanInstanceName)) { + if (interfaces.contains(elanInstanceName)) { dummyInterfaceCount++; } - return dpnInterfaces.getInterfaces().size() - dummyInterfaceCount == 0; + return interfaces.size() - dummyInterfaceCount == 0; } private InstanceIdentifier getMacEntryOperationalDataPath(String elanName, PhysAddress physAddress) { @@ -1008,7 +1014,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase dpnInterfaces = elanDpns.getDpnInterfaces(); + List dpnInterfaces = requireNonNullElse(elanDpns.getDpnInterfaces(), emptyList()); for (DpnInterfaces dpnInterface : dpnInterfaces) { List remoteListBucketInfo = new ArrayList<>(); if (elanUtils.isDpnPresent(dpnInterface.getDpId()) && !Objects.equals(dpnInterface.getDpId(), dpId) @@ -1125,7 +1131,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase listBucket) { @@ -1149,7 +1155,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase interfaces = new ArrayList<>(); - if (newDpnInterface != null) { + if (newDpnInterface != null && newDpnInterface.getInterfaces() != null) { interfaces = newDpnInterface.getInterfaces(); } for (String ifName : interfaces) { @@ -1182,7 +1188,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase interfaces = new ArrayList<>(); - if (newDpnInterface != null) { + if (newDpnInterface != null && newDpnInterface.getInterfaces() != null) { interfaces = newDpnInterface.getInterfaces(); } for (String ifName : interfaces) { @@ -1565,7 +1571,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanDpnIf = dpnInterfaceLists.getElanDpnInterfacesList(); + List elanDpnIf = + requireNonNullElse(dpnInterfaceLists.getElanDpnInterfacesList(), emptyList()); for (ElanDpnInterfacesList elanDpns : elanDpnIf) { int cnt = 0; String elanName = elanDpns.getElanInstanceName(); @@ -1586,9 +1593,9 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanDpnIf = dpnInterfaceLists.getElanDpnInterfacesList(); + List elanDpnIf = + requireNonNullElse(dpnInterfaceLists.getElanDpnInterfacesList(), emptyList()); for (ElanDpnInterfacesList elanDpns : elanDpnIf) { String elanName = elanDpns.getElanInstanceName(); ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java index eae199f095..8d1865ac92 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java @@ -69,7 +69,7 @@ public class ElanInterfaceStateClusteredListener extends @Override protected void add(InstanceIdentifier identifier, final Interface intrf) { if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) { - if (intrf.getOperStatus().equals(Interface.OperStatus.Up)) { + if (Interface.OperStatus.Up.equals(intrf.getOperStatus())) { final String interfaceName = intrf.getName(); elanClusterUtils.runOnlyInOwnerNode("external tunnel update", () -> { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java index 327ae36c68..06d90a9beb 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java @@ -81,7 +81,7 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase identifier, Node original, Node update) { LOG.debug("ElanOvsdbNodeListener.update, updated node detected. original: {} new: {}", original, update); - Boolean integrationBridgeExist = bridgeMgr.isBridgeOnOvsdbNode(update, bridgeMgr.getIntegrationBridgeName()); + boolean integrationBridgeExist = bridgeMgr.isBridgeOnOvsdbNode(update, bridgeMgr.getIntegrationBridgeName()); // ignore updates where the bridge was deleted if (!(bridgeMgr.isBridgeOnOvsdbNode(original, bridgeMgr.getIntegrationBridgeName()) && !integrationBridgeExist)) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanPacketInHandler.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanPacketInHandler.java index 07767fdc30..bf51464c02 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanPacketInHandler.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanPacketInHandler.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; @@ -171,7 +172,7 @@ public class ElanPacketInHandler implements PacketProcessingListener { final boolean isVlanOrFlatProviderIface) { jobCoordinator.enqueueJob(ElanUtils.getElanMacKey(elanTag, macAddress), () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> { - if (oldMacEntry != null && oldMacEntry.getInterface().equals(interfaceName)) { + if (oldMacEntry != null && Objects.equals(oldMacEntry.getInterface(), interfaceName)) { // This should never occur because of ovs temporary mac learning elanManagerCounters.unknownSmacPktinForwardingEntriesRemoved(); } else if (oldMacEntry != null && !isVlanOrFlatProviderIface) { @@ -226,7 +227,7 @@ public class ElanPacketInHandler implements PacketProcessingListener { private void macMigrationFlowsCleanup(String interfaceName, ElanInstance elanInstance, MacEntry macEntry, boolean isVlanOrFlatProviderIface) { - if (macEntry != null && !macEntry.getInterface().equals(interfaceName) + if (macEntry != null && !Objects.equals(macEntry.getInterface(), interfaceName) && !isVlanOrFlatProviderIface) { tryAndRemoveInvalidMacEntry(elanInstance.getElanInstanceName(), macEntry); elanManagerCounters.unknownSmacPktinFlowsRemovedForRelearned(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java index 2faa3844af..e5420d19bb 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java @@ -8,6 +8,9 @@ package org.opendaylight.netvirt.elan.internal; +import static java.util.Collections.emptyList; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + import com.google.common.base.Optional; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.math.BigInteger; @@ -17,10 +20,12 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.Future; import java.util.function.BiFunction; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -130,6 +135,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi candidateRegistration = registerCandidate(entityOwnershipService); } + @Nullable private static EntityOwnershipCandidateRegistration registerCandidate( EntityOwnershipService entityOwnershipService) { try { @@ -235,6 +241,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi } @Override + @Nullable public EtreeInterface getEtreeInterfaceByElanInterfaceName(String elanInterface) { return elanInterfaceCache.getEtreeInterface(elanInterface).orNull(); } @@ -243,7 +250,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi String description) { boolean isEqual = false; if (existingElanInstance.getMacTimeout() == macTimeOut - && existingElanInstance.getDescription().equals(description)) { + && Objects.equals(existingElanInstance.getDescription(), description)) { isEqual = true; } return isEqual; @@ -261,17 +268,15 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi @Override public boolean deleteElanInstance(String elanInstanceName) { - boolean isSuccess = false; Optional existingElanInstance = elanInstanceCache.get(elanInstanceName); if (!existingElanInstance.isPresent()) { LOG.debug("Elan Instance is not present for {}", elanInstanceName); - return isSuccess; + return false; } LOG.debug("Deletion of the existing Elan Instance {}", existingElanInstance); ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION, ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName)); - isSuccess = true; - return isSuccess; + return true; } @Override @@ -301,8 +306,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi } @Override - public void addElanInterface(String elanInstanceName, String interfaceName, List staticMacAddresses, - String description) { + public void addElanInterface(String elanInstanceName, String interfaceName, + @Nullable List staticMacAddresses, @Nullable String description) { Optional existingElanInstance = elanInstanceCache.get(elanInstanceName); if (existingElanInstance.isPresent()) { ElanInterfaceBuilder elanInterfaceBuilder = new ElanInterfaceBuilder() @@ -420,6 +425,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi } @Override + @Nullable public ElanInstance getElanInstance(String elanName) { return elanInstanceCache.get(elanName).orNull(); } @@ -429,7 +435,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi InstanceIdentifier elanInstancesIdentifier = InstanceIdentifier.builder(ElanInstances.class) .build(); return ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).toJavaUtil().map( - ElanInstances::getElanInstance).orElse(Collections.emptyList()); + ElanInstances::getElanInstance).orElse(emptyList()); } @Override @@ -443,9 +449,10 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi if (!elanInterfacesOptional.isPresent()) { return elanInterfaces; } - List elanInterfaceList = elanInterfacesOptional.get().getElanInterface(); + List elanInterfaceList = + requireNonNullElse(elanInterfacesOptional.get().getElanInterface(), emptyList()); for (ElanInterface elanInterface : elanInterfaceList) { - if (elanInterface.getElanInstanceName().equals(elanInstanceName)) { + if (Objects.equals(elanInterface.getElanInstanceName(), elanInstanceName)) { elanInterfaces.add(elanInterface.getName()); } } @@ -661,6 +668,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi } @Override + @Nullable public ElanInterface getElanInterfaceByElanInterfaceName(String interfaceName) { return elanInterfaceCache.get(interfaceName).orNull(); } @@ -722,13 +730,13 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi ElanInstance elanInstance = getElanInstance(elanInstanceName); if (elanInstance == null) { LOG.debug("No ELAN instance found for {}", elanInstanceName); - return Collections.emptyList(); + return emptyList(); } Long elanTag = elanInstance.getElanTag(); if (elanTag == null) { LOG.debug("No ELAN tag found for {}", elanInstanceName); - return Collections.emptyList(); + return emptyList(); } return Collections.singletonList( new NxMatchRegister(ElanConstants.ELAN_REG_ID, elanTag, MetaDataUtil.getElanMaskForReg())); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java index 4124b82e9c..8f05dd0eb3 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; @@ -203,7 +204,7 @@ public final class HwvtepHAUtil { return physicalLocatorRef; } - public static boolean isEmptyList(List list) { + public static boolean isEmptyList(@Nullable List list) { return list == null || list.isEmpty(); } @@ -211,6 +212,7 @@ public final class HwvtepHAUtil { return collection == null || collection.isEmpty(); } + @Nullable public static Node getOriginal(DataObjectModification mod) { Node node = null; switch (mod.getModificationType()) { @@ -229,6 +231,7 @@ public final class HwvtepHAUtil { return node; } + @Nullable public static Node getUpdated(DataObjectModification mod) { Node node = null; switch (mod.getModificationType()) { @@ -246,6 +249,7 @@ public final class HwvtepHAUtil { return node; } + @Nullable public static Node getCreated(DataObjectModification mod) { if (mod.getModificationType() == DataObjectModification.ModificationType.WRITE && mod.getDataBefore() == null) { @@ -254,6 +258,7 @@ public final class HwvtepHAUtil { return null; } + @Nullable public static Node getRemoved(DataObjectModification mod) { if (mod.getModificationType() == DataObjectModification.ModificationType.DELETE) { return mod.getDataBefore(); @@ -261,6 +266,7 @@ public final class HwvtepHAUtil { return null; } + @Nullable public static String getPsName(Node psNode) { String psNodeId = psNode.getNodeId().getValue(); if (psNodeId.contains(PHYSICALSWITCH)) { @@ -269,6 +275,7 @@ public final class HwvtepHAUtil { return null; } + @Nullable public static String getPsName(InstanceIdentifier psNodeIid) { String psNodeId = psNodeIid.firstKeyOf(Node.class).getNodeId().getValue(); if (psNodeId.contains(PHYSICALSWITCH)) { @@ -285,6 +292,7 @@ public final class HwvtepHAUtil { return convertToInstanceIdentifier(psNodeId); } + @Nullable public static InstanceIdentifier convertPsPath(Node psNode, InstanceIdentifier nodePath) { String psNodeId = psNode.getNodeId().getValue(); if (psNodeId.contains(PHYSICALSWITCH)) { @@ -304,6 +312,7 @@ public final class HwvtepHAUtil { return nodeBuilder; } + @Nullable public static String getHAIdFromManagerOtherConfig(Node node) { if (node.augmentation(HwvtepGlobalAugmentation.class) == null) { return null; @@ -311,9 +320,9 @@ public final class HwvtepHAUtil { HwvtepGlobalAugmentation globalAugmentation = node.augmentation(HwvtepGlobalAugmentation.class); if (globalAugmentation != null) { List managers = globalAugmentation.getManagers(); - if (managers != null && managers.size() > 0 && managers.get(0).getManagerOtherConfigs() != null) { + if (managers != null && !managers.isEmpty() && managers.get(0).getManagerOtherConfigs() != null) { for (ManagerOtherConfigs configs : managers.get(0).getManagerOtherConfigs()) { - if (configs.getOtherConfigKey().equals(HA_ID)) { + if (HA_ID.equals(configs.getOtherConfigKey())) { return configs.getOtherConfigValue(); } } @@ -342,7 +351,7 @@ public final class HwvtepHAUtil { return childNodeIds; } for (ManagerOtherConfigs otherConfigs : managers.getManagerOtherConfigs()) { - if (otherConfigs.getOtherConfigKey().equals(HA_CHILDREN)) { + if (HA_CHILDREN.equals(otherConfigs.getOtherConfigKey())) { String nodeIdsVal = otherConfigs.getOtherConfigValue(); if (nodeIdsVal != null) { String[] parts = nodeIdsVal.split(","); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/BaseCommand.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/BaseCommand.java index f3f430a8ea..74cee2f4ee 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/BaseCommand.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/BaseCommand.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public abstract class BaseCommand { @@ -19,10 +20,11 @@ public abstract class BaseCommand { * @param updated Updated List * @param original Origina list to be compared with * @param comparator based on which diff will be returned - * @param T extends DataObject + * @param U extends DataObject * @return List of diff based on comparator */ - public List diffOf(List updated, final List original, final Comparator comparator) { + public List diffOf(@Nullable List updated, @Nullable final List original, + final Comparator comparator) { if (updated == null) { return new ArrayList<>(); } @@ -30,10 +32,10 @@ public abstract class BaseCommand { return new ArrayList<>(updated); } - List result = new ArrayList<>(); - for (T ele : updated) { + List result = new ArrayList<>(); + for (U ele : updated) { boolean present = false; - for (T orig : original) { + for (U orig : original) { if (0 == comparator.compare(ele, orig)) { present = true; break; diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalMcastCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalMcastCmd.java index 962e65f00e..913dd6bc83 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalMcastCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalMcastCmd.java @@ -7,8 +7,13 @@ */ package org.opendaylight.netvirt.elan.l2gw.ha.commands; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; + import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Objects; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder; @@ -31,6 +36,7 @@ public class LocalMcastCmd } @Override + @Nullable public List getData(HwvtepGlobalAugmentation node) { if (node != null) { return node.getLocalMcastMacs(); @@ -55,7 +61,7 @@ public class LocalMcastCmd public LocalMcastMacs transform(InstanceIdentifier nodePath, LocalMcastMacs src) { LocalMcastMacsBuilder ucmlBuilder = new LocalMcastMacsBuilder(src); List locatorSet = new ArrayList<>(); - for (LocatorSet locator : src.getLocatorSet()) { + for (LocatorSet locator : requireNonNullElse(src.getLocatorSet(), Collections.emptyList())) { locatorSet.add(new LocatorSetBuilder().setLocatorRef(HwvtepHAUtil.buildLocatorRef(nodePath, HwvtepHAUtil.getTepIpVal(locator.getLocatorRef()))).build()); } @@ -86,7 +92,7 @@ public class LocalMcastCmd .getHwvtepNodeName(); InstanceIdentifier origMacRefIdentifier = orig.getLogicalSwitchRef().getValue(); HwvtepNodeName origMacNodeName = origMacRefIdentifier.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName(); - if (updated.getMacEntryKey().equals(orig.getMacEntryKey()) + if (Objects.equals(updated.getMacEntryKey(), orig.getMacEntryKey()) && updatedMacNodeName.equals(origMacNodeName)) { List updatedLocatorSet = updated.getLocatorSet(); List origLocatorSet = orig.getLocatorSet(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalUcastCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalUcastCmd.java index 1599816d22..4aefc90907 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalUcastCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LocalUcastCmd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder; @@ -30,6 +31,7 @@ public class LocalUcastCmd } @Override + @Nullable public List getData(HwvtepGlobalAugmentation node) { if (node != null) { return node.getLocalUcastMacs(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LogicalSwitchesCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LogicalSwitchesCmd.java index 94de5168fb..f977830264 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LogicalSwitchesCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/LogicalSwitchesCmd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder; @@ -24,6 +25,7 @@ public class LogicalSwitchesCmd extends MergeCommand getData(HwvtepGlobalAugmentation node) { if (node != null) { return node.getLogicalSwitches(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java index 44a8bdcd80..d75f76bd1f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import javax.annotation.Nonnull; +import javax.annotation.Nullable; 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.LogicalDatastoreType; @@ -186,7 +187,7 @@ public abstract class MergeCommand getData(Z node); public abstract void setData(Y builder, List data); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/PhysicalLocatorCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/PhysicalLocatorCmd.java index b03e8a2018..e7234f8e08 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/PhysicalLocatorCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/PhysicalLocatorCmd.java @@ -8,6 +8,8 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import java.util.Objects; +import javax.annotation.Nullable; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; @@ -21,6 +23,7 @@ public class PhysicalLocatorCmd extends MergeCommand getData(Node node) { if (node != null) { return node.getTerminationPoint(); @@ -59,7 +62,7 @@ public class PhysicalLocatorCmd extends MergeCommand getData(HwvtepGlobalAugmentation augmentation) { if (augmentation != null) { return augmentation.getRemoteMcastMacs(); @@ -55,7 +61,7 @@ public class RemoteMcastCmd extends public RemoteMcastMacs transform(InstanceIdentifier nodePath, RemoteMcastMacs src) { RemoteMcastMacsBuilder ucmlBuilder = new RemoteMcastMacsBuilder(src); List locatorSet = new ArrayList<>(); - for (LocatorSet locator : src.getLocatorSet()) { + for (LocatorSet locator : requireNonNullElse(src.getLocatorSet(), Collections.emptyList())) { locatorSet.add(new LocatorSetBuilder().setLocatorRef(HwvtepHAUtil.buildLocatorRef(nodePath, HwvtepHAUtil.getTepIpVal(locator.getLocatorRef()))).build()); } @@ -87,7 +93,7 @@ public class RemoteMcastCmd extends .getHwvtepNodeName(); InstanceIdentifier origMacRefIdentifier = orig.getLogicalSwitchRef().getValue(); HwvtepNodeName origMacNodeName = origMacRefIdentifier.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName(); - if (updated.getMacEntryKey().equals(orig.getMacEntryKey()) + if (Objects.equals(updated.getMacEntryKey(), orig.getMacEntryKey()) && updatedMacNodeName.equals(origMacNodeName)) { List updatedLocatorSet = updated.getLocatorSet(); List origLocatorSet = orig.getLocatorSet(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/RemoteUcastCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/RemoteUcastCmd.java index f73e37d8d6..d8abdfe01d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/RemoteUcastCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/RemoteUcastCmd.java @@ -8,6 +8,8 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import java.util.Objects; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder; @@ -28,6 +30,7 @@ public class RemoteUcastCmd extends MergeCommand getData(HwvtepGlobalAugmentation node) { if (node != null) { return node.getRemoteUcastMacs(); @@ -78,7 +81,7 @@ public class RemoteUcastCmd extends MergeCommand origMacRefIdentifier = orig.getLogicalSwitchRef().getValue(); HwvtepNodeName origMacNodeName = origMacRefIdentifier.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName(); - return updated.getMacEntryKey().equals(orig.getMacEntryKey()) + return Objects.equals(updated.getMacEntryKey(), orig.getMacEntryKey()) && updatedMacNodeName.equals(origMacNodeName); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/SwitchesCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/SwitchesCmd.java index 1ff7919285..1b9670188f 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/SwitchesCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/SwitchesCmd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder; @@ -24,6 +25,7 @@ public class SwitchesCmd extends MergeCommand getData(HwvtepGlobalAugmentation node) { if (node != null) { return node.getSwitches(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TerminationPointCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TerminationPointCmd.java index e2e80a8430..db1cf06eac 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TerminationPointCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TerminationPointCmd.java @@ -11,6 +11,7 @@ import java.io.Serializable; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder; @@ -29,6 +30,7 @@ public class TerminationPointCmd extends MergeCommand getData(Node node) { if (node != null) { return node.getTerminationPoint(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelCmd.java index d5a15c2995..2d7cfc2e20 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelCmd.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; +import javax.annotation.Nullable; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation; @@ -27,6 +28,7 @@ public class TunnelCmd extends MergeCommand getData(PhysicalSwitchAugmentation node) { if (node != null) { return node.getTunnels(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelIpCmd.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelIpCmd.java index 66aa92e752..e64c5a55fb 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelIpCmd.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/TunnelIpCmd.java @@ -9,6 +9,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.commands; import java.util.List; import java.util.Objects; +import javax.annotation.Nullable; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelIps; @@ -23,6 +24,7 @@ public class TunnelIpCmd extends } @Override + @Nullable public List getData(PhysicalSwitchAugmentation node) { if (node != null) { return node.getTunnelIps(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java index d03465597f..1c31257b4c 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java @@ -166,7 +166,7 @@ public class NodeCopier implements INodeCopier { */ HwvtepHAUtil.deleteNodeIfPresent(tx, dstPsPath); } - }), LOG, "Failed to read source node {}", srcPsNodeOptional.get()); + }), LOG, "Failed to read source node {}", srcPsPath); }); } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java index b4eba7e305..3a3e6b2968 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java @@ -11,6 +11,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nullable; import javax.annotation.PreDestroy; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; @@ -204,6 +205,7 @@ public abstract class ChildListener

mod) { try { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java index d313171cf5..c7a78ddc12 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java @@ -12,6 +12,7 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import java.math.BigInteger; import java.util.List; import java.util.concurrent.ConcurrentMap; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -41,7 +42,6 @@ import org.slf4j.LoggerFactory; public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanGroupListener.class); - private final DataBroker broker; private final ManagedNewTransactionRunner txRunner; private final ElanClusterUtils elanClusterUtils; private final ElanUtils elanUtils; @@ -52,13 +52,12 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< public ElanGroupListener(DataBroker db, ElanClusterUtils elanClusterUtils, ElanUtils elanUtils, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, ElanInstanceCache elanInstanceCache) { super(Group.class, ElanGroupListener.class); - broker = db; this.txRunner = new ManagedNewTransactionRunnerImpl(db); this.elanClusterUtils = elanClusterUtils; this.elanUtils = elanUtils; this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.elanInstanceCache = elanInstanceCache; - registerListener(LogicalDatastoreType.CONFIGURATION, broker); + registerListener(LogicalDatastoreType.CONFIGURATION, db); LOG.trace("ElanGroupListener registered"); } @@ -74,6 +73,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< } + @Nullable ElanInstance getElanInstanceFromGroupId(Group update) { for (ElanInstance elanInstance : elanInstanceCache.getAllPresent()) { if (elanInstance.getElanTag() != null) { @@ -87,6 +87,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< return null; } + @Nullable private BigInteger getDpnId(String node) { //openflow:1] String[] temp = node.split(":"); @@ -97,7 +98,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< } @Override - protected void update(InstanceIdentifier identifier, Group original, Group update) { + protected void update(InstanceIdentifier identifier, @Nullable Group original, Group update) { LOG.trace("received group updated {}", update.key().getGroupId()); final BigInteger dpnId = getDpnId(identifier.firstKeyOf(Node.class).getId().getValue()); if (dpnId == null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java index 2a16e8ebee..525031420d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java @@ -18,6 +18,7 @@ import java.util.Objects; import java.util.Set; import java.util.function.BiPredicate; import java.util.function.Predicate; +import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; @@ -360,6 +361,7 @@ public class HwvtepPhysicalSwitchListener return psNodeId; } + @Nullable private InstanceIdentifier getManagedByNodeIid(InstanceIdentifier identifier) { String psNodeId = identifier.firstKeyOf(Node.class).getNodeId().getValue(); if (psNodeId.contains(HwvtepHAUtil.PHYSICALSWITCH)) { @@ -369,6 +371,7 @@ public class HwvtepPhysicalSwitchListener return null; } + @Nullable private String getPsName(InstanceIdentifier identifier) { String psNodeId = identifier.firstKeyOf(Node.class).getNodeId().getValue(); if (psNodeId.contains(HwvtepHAUtil.PHYSICALSWITCH)) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java index 1717446ea4..452f2d581b 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java @@ -7,12 +7,15 @@ */ package org.opendaylight.netvirt.elan.l2gw.listeners; +import static java.util.Collections.emptyList; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -144,7 +147,7 @@ public class HwvtepTerminationPointListener } else { LOG.error("{} entry not in config datastore", psNodeId); } - return Collections.emptyList(); + return emptyList(); } private List> handlePortDeleted(InstanceIdentifier identifier) { @@ -164,12 +167,13 @@ public class HwvtepTerminationPointListener } else { String logicalSwitchName = ElanL2GatewayUtils.getLogicalSwitchFromElan( l2GwConn.getNetworkId().getValue()); - List l2Devices = l2Gateway.getDevices(); + List l2Devices = requireNonNullElse(l2Gateway.getDevices(), emptyList()); for (Devices l2Device : l2Devices) { String l2DeviceName = l2Device.getDeviceName(); if (l2DeviceName != null && l2DeviceName.equals(psName)) { - for (Interfaces deviceInterface : l2Device.getInterfaces()) { - if (deviceInterface.getInterfaceName().equals(newPortId)) { + for (Interfaces deviceInterface : requireNonNullElse(l2Device.getInterfaces(), + Collections.emptyList())) { + if (Objects.equals(deviceInterface.getInterfaceName(), newPortId)) { if (deviceInterface.getSegmentationIds() != null && !deviceInterface.getSegmentationIds().isEmpty()) { for (Integer vlanId : deviceInterface.getSegmentationIds()) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java index a5bde94635..97dfa4922d 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java @@ -10,16 +10,19 @@ package org.opendaylight.netvirt.elan.l2gw.utils; import static java.util.Collections.emptyList; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.ConcurrentMap; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -230,14 +233,14 @@ public class ElanL2GatewayMulticastUtils { setupElanBroadcastGroups(elanInfo, null, dpnId, confTx); } - public void setupElanBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, + public void setupElanBroadcastGroups(ElanInstance elanInfo, @Nullable DpnInterfaces dpnInterfaces, BigInteger dpnId, TypedWriteTransaction confTx) { setupStandardElanBroadcastGroups(elanInfo, dpnInterfaces, dpnId, confTx); setupLeavesEtreeBroadcastGroups(elanInfo, dpnInterfaces, dpnId, confTx); } - public void setupStandardElanBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, - TypedWriteTransaction confTx) { + public void setupStandardElanBroadcastGroups(ElanInstance elanInfo, @Nullable DpnInterfaces dpnInterfaces, + BigInteger dpnId, TypedWriteTransaction confTx) { List listBucket = new ArrayList<>(); int bucketId = 0; int actionKey = 0; @@ -256,8 +259,8 @@ public class ElanL2GatewayMulticastUtils { mdsalManager.addGroup(confTx, dpnId, group); } - public void setupLeavesEtreeBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, - TypedWriteTransaction confTx) { + public void setupLeavesEtreeBroadcastGroups(ElanInstance elanInfo, @Nullable DpnInterfaces dpnInterfaces, + BigInteger dpnId, TypedWriteTransaction confTx) { EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class); if (etreeInstance != null) { long etreeLeafTag = etreeInstance.getEtreeLeafTagVal().getValue(); @@ -280,10 +283,12 @@ public class ElanL2GatewayMulticastUtils { } } + @Nullable private DpnInterfaces getDpnInterfaces(ElanDpnInterfacesList elanDpns, BigInteger dpnId) { if (elanDpns != null) { - for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { - if (dpnInterface.getDpId().equals(dpnId)) { + for (DpnInterfaces dpnInterface : requireNonNullElse(elanDpns.getDpnInterfaces(), + Collections.emptyList())) { + if (Objects.equals(dpnInterface.getDpId(), dpnId)) { return dpnInterface; } } @@ -313,8 +318,8 @@ public class ElanL2GatewayMulticastUtils { } @Nonnull - public List getRemoteBCGroupBuckets(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, - int bucketId, long elanTag) { + public List getRemoteBCGroupBuckets(ElanInstance elanInfo, @Nullable DpnInterfaces dpnInterfaces, + BigInteger dpnId, int bucketId, long elanTag) { List listBucketInfo = new ArrayList<>(); ElanDpnInterfacesList elanDpns = elanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); @@ -396,7 +401,8 @@ public class ElanL2GatewayMulticastUtils { long elanTagOrVni) { List listBucketInfo = new ArrayList<>(); if (elanDpns != null) { - for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { + for (DpnInterfaces dpnInterface : requireNonNullElse(elanDpns.getDpnInterfaces(), + Collections.emptyList())) { if (elanUtils.isDpnPresent(dpnInterface.getDpId()) && !Objects.equals(dpnInterface.getDpId(), dpnId) && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { try { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java index 3d22638c90..6be28a0370 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.l2gw.utils; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.base.Optional; import com.google.common.collect.Lists; @@ -32,6 +33,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; @@ -74,6 +76,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpc import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVteps; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.AddL2GwDeviceInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.AddL2GwDeviceOutput; @@ -207,7 +210,7 @@ public class ElanL2GatewayUtils { HwvtepSouthboundUtils.createPhysicalLocatorInstanceIdentifier(nodeId, expectedPhyLocatorAug)); if (remoteMcastMac.getLocatorSet() != null) { for (LocatorSet locatorSet : remoteMcastMac.getLocatorSet()) { - if (locatorSet.getLocatorRef().equals(expectedPhyLocRef)) { + if (Objects.equals(locatorSet.getLocatorRef(), expectedPhyLocRef)) { LOG.trace("matched phyLocRef: {}", expectedPhyLocRef); return true; } @@ -274,6 +277,7 @@ public class ElanL2GatewayUtils { return HwvtepUtils.deleteRemoteUcastMacs(broker, nodeId, logicalSwitchName, lstMac); } + @Nullable public ElanInstance getElanInstanceForUcastLocalMac(LocalUcastMacs localUcastMac) { Optional lsOpc = ElanUtils.read(broker, LogicalDatastoreType.OPERATIONAL, (InstanceIdentifier) localUcastMac.getLogicalSwitchRef().getValue()); @@ -361,7 +365,7 @@ public class ElanL2GatewayUtils { } public void installL2GwUcastMacInElan(final ElanInstance elan, final L2GatewayDevice extL2GwDevice, - final String macToBeAdded, final LocalUcastMacs localUcastMacs, String interfaceName) { + final String macToBeAdded, final LocalUcastMacs localUcastMacs, @Nullable String interfaceName) { final String extDeviceNodeId = extL2GwDevice.getHwvtepNodeId(); final String elanInstanceName = elan.getElanInstanceName(); final Collection elanDpns = getElanDpns(elanInstanceName); @@ -771,6 +775,7 @@ public class ElanL2GatewayUtils { * the interface name * @return the dpid from interface */ + @Nullable public BigInteger getDpidFromInterface(String interfaceName) { BigInteger dpId = null; Future> output = interfaceManagerRpcService @@ -935,6 +940,7 @@ public class ElanL2GatewayUtils { return interfaceInstanceIdentifierBuilder.build(); } + @Nullable public static Interface getInterfaceFromConfigDS(InterfaceKey interfaceKey, DataBroker dataBroker) { InstanceIdentifier interfaceId = getInterfaceIdentifier(interfaceKey); try { @@ -1004,7 +1010,8 @@ public class ElanL2GatewayUtils { return; } String psNodeId = globalNodeId + HwvtepHAUtil.PHYSICALSWITCH + psName; - tzonesoptional.get().getTransportZone().stream() + requireNonNullElse(tzonesoptional.get().getTransportZone(), + Collections.emptyList()).stream() .filter(transportZone -> transportZone.getSubnets() != null) .flatMap(transportZone -> transportZone.getSubnets().stream()) .filter(subnet -> subnet.getDeviceVteps() != null) @@ -1046,16 +1053,17 @@ public class ElanL2GatewayUtils { } JdkFutures.addErrorLogging( new ManagedNewTransactionRunnerImpl(dataBroker).callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, - tx -> { - optionalElan.get().getElanInstance().stream() - .flatMap(elan -> elan.getExternalTeps().stream() - .map(externalTep -> ElanL2GatewayMulticastUtils.buildExternalTepPath( - elan.getElanInstanceName(), externalTep.getTepIp()))) + tx -> requireNonNullElse(optionalElan.get().getElanInstance(), + Collections.emptyList()).stream() + .flatMap(elan -> requireNonNullElse(elan.getExternalTeps(), + Collections.emptyList()).stream() + .map(externalTep -> ElanL2GatewayMulticastUtils.buildExternalTepPath( + elan.getElanInstanceName(), externalTep.getTepIp()))) .filter(externalTepIid -> Objects.equals( - deviceVteps.getIpAddress(), externalTepIid.firstKeyOf(ExternalTeps.class).getTepIp())) + deviceVteps.getIpAddress(), externalTepIid.firstKeyOf(ExternalTeps.class).getTepIp())) .peek(externalTepIid -> LOG.info("Deleting stale external tep {}", externalTepIid)) - .forEach(externalTepIid -> tx.delete(externalTepIid)); - }), LOG, "Failed to delete stale external teps {}", deviceVteps); + .forEach(tx::delete)), LOG, + "Failed to delete stale external teps {}", deviceVteps); Thread.sleep(10000);//TODO remove the sleep currently it waits for interfacemgr to finish the cleanup } catch (ReadFailedException | InterruptedException e) { LOG.error("Failed to delete stale l2gw tep {}", deviceVteps, e); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java index 15adbcff05..6e3a42cdc7 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java @@ -8,7 +8,9 @@ package org.opendaylight.netvirt.elan.l2gw.utils; +import static java.util.Collections.emptyList; import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.base.Optional; import com.google.common.collect.Lists; @@ -16,11 +18,12 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; @@ -105,9 +108,10 @@ public class L2GatewayConnectionUtils implements AutoCloseable { } public static boolean isGatewayAssociatedToL2Device(L2GatewayDevice l2GwDevice) { - return l2GwDevice.getL2GatewayIds().size() > 0; + return !l2GwDevice.getL2GatewayIds().isEmpty(); } + @Nullable public static L2gateway getNeutronL2gateway(DataBroker broker, Uuid l2GatewayId) { LOG.debug("getNeutronL2gateway for {}", l2GatewayId.getValue()); InstanceIdentifier inst = InstanceIdentifier.create(Neutron.class).child(L2gateways.class) @@ -119,7 +123,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable { public static List getL2gatewayList(DataBroker broker) { InstanceIdentifier inst = InstanceIdentifier.create(Neutron.class).child(L2gateways.class); return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst).toJavaUtil().map( - L2gateways::getL2gateway).orElse(Collections.emptyList()); + L2gateways::getL2gateway).orElse(emptyList()); } @Nonnull @@ -127,7 +131,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable { InstanceIdentifier inst = InstanceIdentifier.create(Neutron.class) .child(L2gatewayConnections.class); return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst).toJavaUtil().map( - L2gatewayConnections::getL2gatewayConnection).orElse(Collections.emptyList()); + L2gatewayConnections::getL2gatewayConnection).orElse(emptyList()); } /** @@ -145,7 +149,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable { List l2GwConnections = new ArrayList<>(); for (Uuid l2GatewayId : l2GatewayIds) { for (L2gatewayConnection l2GwConn : allL2GwConns) { - if (l2GwConn.getL2gatewayId().equals(l2GatewayId)) { + if (Objects.equals(l2GwConn.getL2gatewayId(), l2GatewayId)) { l2GwConnections.add(l2GwConn); } } @@ -184,8 +188,8 @@ public class L2GatewayConnectionUtils implements AutoCloseable { } public void addL2GatewayConnection(final L2gatewayConnection input, - final String l2GwDeviceName , - L2gateway l2Gateway) { + @Nullable final String l2GwDeviceName , + @Nullable L2gateway l2Gateway) { LOG.info("Adding L2gateway Connection with ID: {}", input.key().getUuid()); Uuid networkUuid = input.getNetworkId(); @@ -224,7 +228,8 @@ public class L2GatewayConnectionUtils implements AutoCloseable { private void disAssociateHwvtepsFromElan(String elanName, L2gatewayConnection input) { Integer defaultVlan = input.getSegmentId(); - List l2Devices = ElanL2GwCacheUtils.getAllElanDevicesFromCache(); + List l2Devices = + requireNonNullElse(ElanL2GwCacheUtils.getAllElanDevicesFromCache(), emptyList()); List l2gwDevicesToBeDeleted = new ArrayList<>(); for (L2GatewayDevice elanL2gwDevice : l2Devices) { if (elanL2gwDevice.getL2GatewayIds().contains(input.key().getUuid())) { @@ -238,7 +243,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable { if (l2Gateway == null) { LOG.error("Failed to find the l2gateway for the connection {}", input.getUuid()); return; - } else { + } else if (l2Gateway.getDevices() != null) { l2gwDevicesToBeDeleted.addAll(l2Gateway.getDevices()); } } @@ -274,11 +279,11 @@ public class L2GatewayConnectionUtils implements AutoCloseable { } private void associateHwvtepsToElan(ElanInstance elanInstance, - L2gateway l2Gateway, L2gatewayConnection input, String l2GwDeviceName) { + L2gateway l2Gateway, L2gatewayConnection input, @Nullable String l2GwDeviceName) { String elanName = elanInstance.getElanInstanceName(); Integer defaultVlan = input.getSegmentId(); Uuid l2GwConnId = input.key().getUuid(); - List l2Devices = l2Gateway.getDevices(); + List l2Devices = requireNonNullElse(l2Gateway.getDevices(), emptyList()); LOG.trace("Associating ELAN {} with L2Gw Conn Id {} having below L2Gw devices {}", elanName, l2GwConnId, l2Devices); @@ -409,7 +414,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable { List l2GwConnections = new ArrayList<>(); List allL2GwConns = getAllL2gatewayConnections(broker); for (L2gatewayConnection l2GwConn : allL2GwConns) { - if (l2GwConn.getL2gatewayId().equals(l2GatewayId)) { + if (Objects.equals(l2GwConn.getL2gatewayId(), l2GatewayId)) { l2GwConnections.add(l2GwConn); } } diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java index a0cae369a1..d79b270e06 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java @@ -10,6 +10,7 @@ package org.opendaylight.netvirt.elan.statisitcs; import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; @@ -84,6 +85,7 @@ public class ElanStatisticsImpl implements ElanStatisticsService { .withResult(queryforElanInterfaceStatistics(tableId, elanInstanceName, interfaceInfo)).build()); } + @Nullable private GetElanInterfaceStatisticsOutput queryforElanInterfaceStatistics(short tableId, String elanInstanceName, InterfaceInfo interfaceInfo) { // BigInteger dpId = interfaceInfo.getDpId(); diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java index 8068ee67a2..e373f55166 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java @@ -15,6 +15,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -305,15 +306,15 @@ public class ElanDmacUtils { private ListenableFuture buildEtreeDmacFlowForExternalRemoteMacWithBatch( BigInteger dpnId, String extDeviceNodeId, Long vni, String macAddress, String displayName, - String interfaceName, EtreeLeafTagName etreeLeafTag) { + @Nullable String interfaceName, EtreeLeafTagName etreeLeafTag) { boolean isRoot; if (interfaceName == null) { isRoot = true; } else { Optional etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName); - isRoot = etreeInterface.isPresent() ? etreeInterface.get().getEtreeInterfaceType() - == EtreeInterface.EtreeInterfaceType.Root : false; + isRoot = etreeInterface.isPresent() + && etreeInterface.get().getEtreeInterfaceType() == EtreeInterface.EtreeInterfaceType.Root; } if (isRoot) { Flow flow = buildDmacFlowForExternalRemoteMac(dpnId, extDeviceNodeId, @@ -337,7 +338,7 @@ public class ElanDmacUtils { public List> installDmacFlowsToExternalRemoteMacInBatch( BigInteger dpnId, String extDeviceNodeId, Long elanTag, Long vni, String macAddress, String displayName, - String interfaceName) { + @Nullable String interfaceName) { Flow flow = buildDmacFlowForExternalRemoteMac(dpnId, extDeviceNodeId, elanTag, vni, macAddress, displayName); @@ -355,7 +356,7 @@ public class ElanDmacUtils { private List> installEtreeDmacFlowsToExternalRemoteMacInBatch( BigInteger dpnId, String extDeviceNodeId, Long elanTag, Long vni, String macAddress, String displayName, - String interfaceName) { + @Nullable String interfaceName) { EtreeLeafTagName etreeLeafTag = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag); if (etreeLeafTag != null) { diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java index 3ee407e195..33c6da0256 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.utils; import com.google.common.base.Optional; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -25,6 +26,7 @@ public class ElanEtreeUtils { this.broker = broker; } + @Nullable public EtreeLeafTagName getEtreeLeafTagByElanTag(long elanTag) { InstanceIdentifier elanId = ElanUtils.getElanInfoEntriesOperationalDataPath(elanTag); Optional existingElanInfo = ElanUtils.read(broker, diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java index db9fd89eca..defc7821d1 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java @@ -12,6 +12,7 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -203,7 +204,7 @@ public class ElanItmUtils { * @return the list */ @SuppressWarnings("checkstyle:IllegalCatch") - public List buildItmEgressActions(String interfaceName, Long tunnelKey, boolean internal) { + public List buildItmEgressActions(String interfaceName, @Nullable Long tunnelKey, boolean internal) { try { if (internal && interfaceManager.isItmDirectTunnelsEnabled()) { GetEgressActionsForTunnelInput getEgressActInputItm = new GetEgressActionsForTunnelInputBuilder() diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index ff832a637f..3a6fce8d3c 100755 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -7,6 +7,8 @@ */ package org.opendaylight.netvirt.elan.utils; +import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; @@ -26,6 +28,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -331,6 +334,7 @@ public class ElanUtils { } // elan-state Operational container + @Nullable public static Elan getElanByName(DataBroker broker, String elanInstanceName) { InstanceIdentifier elanIdentifier = getElanInstanceOperationalDataPath(elanInstanceName); return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).orNull(); @@ -347,18 +351,14 @@ public class ElanUtils { } // grouping of forwarding-entries + @Nullable public MacEntry getInterfaceMacEntriesOperationalDataPath(String interfaceName, PhysAddress physAddress) { InstanceIdentifier existingMacEntryId = getInterfaceMacEntriesIdentifierOperationalDataPath( interfaceName, physAddress); return read(broker, LogicalDatastoreType.OPERATIONAL, existingMacEntryId).orNull(); } - public MacEntry getInterfaceMacEntriesOperationalDataPathFromId(InstanceIdentifier identifier) { - Optional existingInterfaceMacEntry = read(broker, - LogicalDatastoreType.OPERATIONAL, identifier); - return existingInterfaceMacEntry.orNull(); - } - + @Nullable public MacEntry getInterfaceMacEntriesOperationalDataPathFromId(TypedReadTransaction tx, InstanceIdentifier identifier) throws ExecutionException, InterruptedException { return tx.read(identifier).get().orNull(); @@ -384,12 +384,7 @@ public class ElanUtils { return tx.read(macId).get(); } - public MacEntry getMacEntryFromElanMacId(InstanceIdentifier identifier) { - Optional existingInterfaceMacEntry = read(broker, - LogicalDatastoreType.OPERATIONAL, identifier); - return existingInterfaceMacEntry.orNull(); - } - + @Nullable public MacEntry getMacEntryFromElanMacId(TypedReadTransaction tx, InstanceIdentifier identifier) throws ExecutionException, InterruptedException { return tx.read(identifier).get().orNull(); @@ -445,7 +440,7 @@ public class ElanUtils { /** * Returns the list of Interfaces that belong to an Elan on an specific DPN. - * Data retrieved from Elan's operational DS: elan-dpn-interfaces container + * Data retrieved from Elan's operational DS: elan-dpn-interfaces container. * * @param elanInstanceName * name of the Elan to which the interfaces must belong to @@ -453,6 +448,7 @@ public class ElanUtils { * Id of the DPN where the interfaces are located * @return the elan interface Info */ + @Nullable public DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, BigInteger dpId) { InstanceIdentifier elanDpnInterfacesId = getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId); @@ -478,6 +474,7 @@ public class ElanUtils { } // elan-tag-name-map Operational Container + @Nullable public ElanTagName getElanInfoByElanTag(long elanTag) { InstanceIdentifier elanId = getElanInfoEntriesOperationalDataPath(elanTag); Optional existingElanInfo = read(broker, @@ -506,11 +503,13 @@ public class ElanUtils { .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); } + @Nullable public ElanDpnInterfacesList getElanDpnInterfacesList(String elanName) { InstanceIdentifier elanDpnInterfaceId = getElanDpnOperationDataPath(elanName); return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orNull(); } + @Nullable public ElanDpnInterfaces getElanDpnInterfacesList() { InstanceIdentifier elanDpnInterfaceId = InstanceIdentifier.builder(ElanDpnInterfaces.class) .build(); @@ -535,7 +534,8 @@ public class ElanUtils { if (!existingElanDpnInterfaces.isPresent()) { return dpIds; } - List dpnInterfaces = existingElanDpnInterfaces.get().getDpnInterfaces(); + List dpnInterfaces = + requireNonNullElse(existingElanDpnInterfaces.get().getDpnInterfaces(), emptyList()); for (DpnInterfaces dpnInterface : dpnInterfaces) { dpIds.add(dpnInterface.getDpId()); } @@ -560,15 +560,17 @@ public class ElanUtils { if (!existingElanDpnInterfaces.isPresent()) { return false; } - List dpnInterfaces = existingElanDpnInterfaces.get().getDpnInterfaces(); + List dpnInterfaces = + requireNonNullElse(existingElanDpnInterfaces.get().getDpnInterfaces(), emptyList()); for (DpnInterfaces dpnInterface : dpnInterfaces) { - if (dpnInterface.getDpId().equals(dpId)) { + if (Objects.equals(dpnInterface.getDpId(), dpId)) { return true; } } return false; } + @Nullable public ElanForwardingTables getElanForwardingList() { InstanceIdentifier elanForwardingTableId = InstanceIdentifier .builder(ElanForwardingTables.class).build(); @@ -586,6 +588,7 @@ public class ElanUtils { * the elan name * @return the elan mac table */ + @Nullable public MacTable getElanMacTable(String elanName) { return getElanMacTable(broker, elanName); } @@ -800,7 +803,8 @@ public class ElanUtils { * @return the egress actions for interface */ @SuppressWarnings("checkstyle:IllegalCatch") - public List getEgressActionsForInterface(String ifName, Long tunnelKey) { + @Nonnull + public List getEgressActionsForInterface(String ifName, @Nullable Long tunnelKey) { List listAction = new ArrayList<>(); try { GetEgressActionsForInterfaceInput getEgressActionInput = new GetEgressActionsForInterfaceInputBuilder() @@ -812,8 +816,7 @@ public class ElanUtils { LOG.debug("RPC Call to Get egress actions for interface {} returned with Errors {}", ifName, rpcResult.getErrors()); } else { - List actions = rpcResult.getResult().getAction(); - listAction = actions; + listAction = requireNonNullElse(rpcResult.getResult().getAction(), emptyList()); } } catch (Exception e) { LOG.warn("Exception when egress actions for interface {}", ifName, e); @@ -843,7 +846,7 @@ public class ElanUtils { List elanDpns = getInvolvedDpnsInElan(elanInstanceName); for (DpnInterfaces elanDpn : elanDpns) { - if (elanDpn.getDpId().equals(dpId)) { + if (Objects.equals(elanDpn.getDpId(), dpId)) { continue; } @@ -877,7 +880,7 @@ public class ElanUtils { public List getElanDPNByName(String elanInstanceName) { InstanceIdentifier elanIdentifier = getElanDpnOperationDataPath(elanInstanceName); return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).toJavaUtil().map( - ElanDpnInterfacesList::getDpnInterfaces).orElse(Collections.emptyList()); + ElanDpnInterfacesList::getDpnInterfaces).orElse(emptyList()); } private void setupLocalDmacFlow(long elanTag, BigInteger dpId, String ifName, String macAddress, @@ -1296,6 +1299,7 @@ public class ElanUtils { * the datastore type * @return the external tunnel */ + @Nullable public ExternalTunnel getExternalTunnel(String sourceDevice, String destinationDevice, LogicalDatastoreType datastoreType) { Class tunType = TunnelTypeVxlan.class; @@ -1313,6 +1317,7 @@ public class ElanUtils { * the datastore type * @return the external tunnel */ + @Nullable public ExternalTunnel getExternalTunnel(String interfaceName, LogicalDatastoreType datastoreType) { ExternalTunnel externalTunnel = null; List externalTunnels = getAllExternalTunnels(datastoreType); @@ -1335,7 +1340,7 @@ public class ElanUtils { public List getAllExternalTunnels(LogicalDatastoreType datastoreType) { InstanceIdentifier iid = InstanceIdentifier.builder(ExternalTunnelList.class).build(); return read(broker, datastoreType, iid).toJavaUtil().map(ExternalTunnelList::getExternalTunnel).orElse( - Collections.emptyList()); + emptyList()); } public static List buildMatchesForElanTagShFlagAndDstMac(long elanTag, boolean shFlag, String macAddr) { @@ -1375,6 +1380,7 @@ public class ElanUtils { * the data broker * @return the interface state from oper ds */ + @Nullable public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang .ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS( String interfaceName, DataBroker dataBroker) { @@ -1435,7 +1441,7 @@ public class ElanUtils { && elanInstance.getSegmentationId() != null && elanInstance.getSegmentationId() != 0; } - private static boolean isVxlanSegment(ElanInstance elanInstance) { + private static boolean isVxlanSegment(@Nullable ElanInstance elanInstance) { if (elanInstance != null) { List elanSegments = elanInstance.getElanSegments(); if (elanSegments != null) { @@ -1451,7 +1457,7 @@ public class ElanUtils { return false; } - public static boolean isVxlanNetworkOrVxlanSegment(ElanInstance elanInstance) { + public static boolean isVxlanNetworkOrVxlanSegment(@Nullable ElanInstance elanInstance) { return isVxlan(elanInstance) || isVxlanSegment(elanInstance); } @@ -1524,6 +1530,7 @@ public class ElanUtils { matches, instructions); } + @Nullable public String getExternalElanInterface(String elanInstanceName, BigInteger dpnId) { DpnInterfaces dpnInterfaces = getElanInterfaceInfoByElanDpn(elanInstanceName, dpnId); if (dpnInterfaces == null || dpnInterfaces.getInterfaces() == null) { @@ -1656,7 +1663,7 @@ public class ElanUtils { public List getElanMacEntries(String elanName) { MacTable macTable = getElanMacTable(elanName); if (macTable == null) { - return Collections.emptyList(); + return emptyList(); } return macTable.getMacEntry(); } @@ -1704,6 +1711,7 @@ public class ElanUtils { NwConstants.ARP_RESPONDER_TABLE)), LOG, "Error removing ARP responder flow"); } + @Nullable public static String getRouterPordIdFromElanInstance(DataBroker dataBroker, String elanInstanceName) { Optional subnetMapsData = read(dataBroker, LogicalDatastoreType.CONFIGURATION, buildSubnetMapsWildCardPath()); @@ -1730,6 +1738,10 @@ public class ElanUtils { return InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))) .augmentation(FlowCapableNode.class).child(Group.class, new GroupKey(new GroupId(groupId))).build(); } -} - + // Use Objects.requireNonNullElse instead with JDK9+ + @Nonnull + public static T requireNonNullElse(@Nullable T obj, @Nonnull T defaultObj) { + return obj != null ? obj : requireNonNull(defaultObj); + } +} diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java index c4c6898a8c..cf63fe76f2 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.elan.utils; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.requireNonNullElse; import com.google.common.base.Optional; import com.google.common.collect.MapDifference; @@ -20,6 +21,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @@ -394,8 +396,8 @@ public class TransportZoneNotificationUtil { } Subnets subnets = getOrAddSubnet(zoneSubnets, subnetIp); - for (Vteps existingVtep : subnets.getVteps()) { - if (existingVtep.getDpnId().equals(dpnId)) { + for (Vteps existingVtep : requireNonNullElse(subnets.getVteps(), Collections.emptyList())) { + if (Objects.equals(existingVtep.getDpnId(), dpnId)) { return false; } } @@ -425,7 +427,7 @@ public class TransportZoneNotificationUtil { IpPrefix subnetPrefix = IpPrefixBuilder.getDefaultInstance(subnetIp); for (Subnets subnet : subnets) { - if (subnet.getPrefix().equals(subnetPrefix)) { + if (Objects.equals(subnet.getPrefix(), subnetPrefix)) { return subnet; } } @@ -444,6 +446,7 @@ public class TransportZoneNotificationUtil { return subnetsBuilder.build(); } + @Nullable private String getDpnLocalIp(BigInteger dpId) throws ReadFailedException { Optional node = getPortsNode(dpId); -- 2.36.6