NETVIRT-1630 migrate to md-sal APIs 57/88457/42
authorAshik Alias <ashik.alias@ericsson.com>
Tue, 17 Mar 2020 11:45:19 +0000 (17:15 +0530)
committerKarthikeyan Krishnan <karthikeyangceb007@gmail.com>
Mon, 27 Apr 2020 13:38:40 +0000 (19:08 +0530)
handles migration to new mdsal APIs for
    - databroker
    - Listener base classes
    - Readwrite txns

The following changes are the major in this review

1) import org.opendaylight.controller.md.sal.binding.api.DataBroker;
to
   import org.opendaylight.mdsal.binding.api.DataBroker; (included blueprint)
2) .toJavaUtil(); to be removed
3) import com.google.common.base.Optional
       to
   import java.util.Optional
4) Optional.fromNullable to Optional.ofNullable
5) Optional.absent() to Optional.empty();
6) import
org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
    to
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
7) import
org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
    to
  import org.opendaylight.mdsal.binding.api.ReadTransaction;

8) ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction()
    to
  ReadTransaction readTx = dataBroker.newReadOnlyTransaction()

9) writeTransaction/rw.submit().get() to writeTransaction.commit().get()

10) ReadFailedException to InterruptedException | ExecutionException

Dependency:
=============
This review is dependent on below reviews

https://git.opendaylight.org/gerrit/c/infrautils/+/89057
https://git.opendaylight.org/gerrit/c/ovsdb/+/87802
https://git.opendaylight.org/gerrit/c/genius/+/89001
https://git.opendaylight.org/gerrit/c/genius/+/89060

Change-Id: Id8903946f3c000186a596392b51621aff1e4a618
Signed-off-by: Ashik Alias <ashik.alias@ericsson.com>
Signed-off-by: Chetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
382 files changed:
aclservice/impl/pom.xml
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AbstractAclServiceImpl.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/AclServiceImplFactory.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/EgressAclServiceImpl.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/IngressAclServiceImpl.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclElanInterfaceListener.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclEventListener.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceListener.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclInterfaceStateListener.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/listeners/AclNodeListener.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/recovery/AclInstanceRecoveryHandler.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/recovery/AclInterfaceRecoveryHandler.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/stats/AclLiveStatisticsHelper.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/stats/AclLiveStatisticsRpcServiceImpl.java
aclservice/impl/src/main/java/org/opendaylight/netvirt/aclservice/utils/AclServiceUtils.java
aclservice/impl/src/main/resources/OSGI-INF/blueprint/aclservice.xml
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/stats/AclLiveStatisticsRpcServiceTest.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/AclServiceTestBase.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/AclServiceTestModule.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedAceBuilder.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/IdentifiedInterfaceWithAclBuilder.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/StateInterfaceBuilderHelper.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataBrokerPairsUtil.java
aclservice/impl/src/test/java/org/opendaylight/netvirt/aclservice/tests/infra/DataTreeIdentifierDataObjectPairBuilder.java
bgpmanager/impl/pom.xml
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/EvpnRdNetworkListener.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/FibDSWriter.java
bgpmanager/impl/src/main/resources/OSGI-INF/blueprint/bgpmanager.xml
bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/AbstractMockFibManager.java
bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/BgpManagerTest.java
bgpmanager/impl/src/test/java/org/opendaylight/netvirt/bgpmanager/test/MockFibManager.java
cloud-servicechain/impl/pom.xml
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/ElanServiceChainHandler.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/RemoveVpnPseudoPortDataJob.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/VpnPseudoPortDataBaseJob.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/CloudScVpnInterfaceListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/ElanDpnInterfacesListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToDpnListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnToElanFallbackNodeListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VrfListener.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/ElanServiceChainUtils.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java
cloud-servicechain/impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java
cloud-servicechain/impl/src/main/resources/OSGI-INF/blueprint/cloud-servicechain.xml
cloud-servicechain/impl/src/test/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandlerTest.java
dhcpservice/impl/pom.xml
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpAllocationPoolManager.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpConfigListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpDesignatedDpnListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpExternalTunnelManager.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceConfigListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpInterfaceEventListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpL2GwUtil.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpManager.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpMcastMacListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNeutronPortListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpNodeListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpPktHandler.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpServiceUtils.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpSubnetListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/DhcpUCastMacListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/NodeListener.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolAddJob.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpAllocationPoolRemoveJob.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceAddJob.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceRemoveJob.java
dhcpservice/impl/src/main/java/org/opendaylight/netvirt/dhcpservice/jobs/DhcpInterfaceUpdateJob.java
dhcpservice/impl/src/main/resources/OSGI-INF/blueprint/dhcpservice.xml
elanmanager/api/src/main/java/org/opendaylight/netvirt/elanmanager/api/ElanHelper.java
elanmanager/impl/pom.xml
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ConfigMcastCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInstanceCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cache/ElanInterfaceCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/L2GwValidateCli.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/cli/l2gw/NetworkL2gwDeviceInfoCli.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/ElanMacEntryListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/EvpnElanInstanceListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/listeners/MacVrfEntryListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/ElanEvpnFlowUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepConfigListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanGroupCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanPacketInHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElan.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceAddWorkerOnElanInterface.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/HwvtepHAUtil.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/IMergeCommand.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/commands/MergeCommand.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/ConfigNodeUpdatedHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/IHAEventHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeConnectedHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/NodeCopier.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/OpNodeUpdatedHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeDataListener.java [deleted file]
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/ManagerListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/merge/MergeCommandsAggregator.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/AssociateHwvtepToElanJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/BcGroupUpdateJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteL2GwDeviceMacsFromElanJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DeleteLogicalSwitchJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DpnDmacJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/HwvtepDeviceMcastMacUpdateJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/LogicalSwitchAddedJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/McastUpdateJob.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ChildListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceEntityOwnershipListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanMacTableCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepConfigNodeCache.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepRemoteMcastMacListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayConnectionInstanceRecoveryHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/recovery/impl/L2GatewayInstanceRecoveryHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanRefUtil.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/StaleVlanBindingsCleaner.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/recovery/impl/ElanInterfaceRecoveryHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanClusterUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanDmacUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanEtreeUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanItmUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java
elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java
elanmanager/impl/src/main/resources/OSGI-INF/blueprint/elanmanager.xml
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/LogicalSwitchesCmdTest.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/NodeConnectedHandlerTest.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/NodeConnectedHandlerUtils.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestComparators.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elan/l2gw/nodehandlertest/TestUtil.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/L2gwBuilders.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/Verifications.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/BgpManagerTestImpl.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/EvpnTestHelper.java
elanmanager/impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/VpnManagerTestImpl.java
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/RouterInterfaceVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java
fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml
fibmanager/impl/src/test/java/org/opendaylight/netvirt/fibmanager/test/FibManagerTest.java
fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java
fibmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml
ipv6service/impl/pom.xml
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6NodeListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/Ipv6ServiceInterfaceEventListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronNetworkChangeListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronRouterChangeListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronSubnetChangeListener.java
ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/utils/Ipv6ServiceUtils.java
ipv6service/impl/src/main/resources/OSGI-INF/blueprint/ipv6service.xml
natservice/impl/pom.xml
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/NatSwitchCacheImpl.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatCentralizedSwitchChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalSubnetVpnInstanceListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6ForwardingService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/Ipv6SubnetFlowProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatArpNotificationHandler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatRouterInterfaceListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatScalein.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSwitchCacheListenerImpl.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTepChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatVpnMapsChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterPortsListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatExternalRoutersListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetGwMacChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VipStateTracker.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java
natservice/impl/src/main/resources/OSGI-INF/blueprint/commands.xml
natservice/impl/src/main/resources/OSGI-INF/blueprint/natservice.xml
neutronvpn/api/pom.xml
neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/ChangeUtils.java
neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/api/utils/NeutronUtils.java
neutronvpn/api/src/main/java/org/opendaylight/netvirt/neutronvpn/interfaces/INeutronVpnManager.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/HostConfigCache.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronBgpvpnChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronFloatingToFixedIpMappingChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronHostConfigChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronRouterChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityGroupUtils.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSecurityRuleListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronSubnetChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronTrunkChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManagerImpl.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/UpgradeStateListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/manager/NeutronEvpnManager.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/evpn/utils/NeutronEvpnUtils.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/AddL2GwDevicesToTransportZoneJob.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/l2gw/L2GwTransportZoneListener.java
neutronvpn/impl/src/main/resources/OSGI-INF/blueprint/neutronvpn.xml
neutronvpn/impl/src/test/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListenerTest.java
neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpConfigureCommand.java
neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/DhcpShowCommand.java
neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowSubnet.java
neutronvpn/shell/src/main/java/org/opendaylight/netvirt/neutronvpn/shell/ShowVpnIpToPort.java
neutronvpn/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyAceFlowProgrammer.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteFlowProgrammer.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/PolicyRouteGroupProgrammer.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyAceChangeListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyNodeListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/PolicyProfileChangeListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelStateChangeListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/TunnelUnderlayNetworkChangeListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/listeners/UnderlayNetworkDpnListener.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceFlowUtil.java
policyservice/impl/src/main/java/org/opendaylight/netvirt/policyservice/util/PolicyServiceUtil.java
policyservice/impl/src/main/resources/OSGI-INF/blueprint/policyservice.xml
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertConfigListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosAlertManager.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosInterfaceStateChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronNetworkChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronPortChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNeutronUtils.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosNodeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosPolicyChangeListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/QosTerminationPointListener.java
qosservice/impl/src/main/java/org/opendaylight/netvirt/qosservice/UuidUtil.java
qosservice/impl/src/main/resources/OSGI-INF/blueprint/qosservice.xml
qosservice/impl/src/test/java/org/opendaylight/netvirt/qosservice/UuidUtilTest.java
statemanager/impl/pom.xml
statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/StateManager.java
statemanager/impl/src/main/resources/OSGI-INF/blueprint/statemanager.xml
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/AbstractCountersService.java
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/CountersServiceInterfaceListener.java
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/EgressCountersServiceImpl.java
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/IngressCountersServiceImpl.java
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsImpl.java
statistics/impl/src/main/java/org/opendaylight/netvirt/statistics/StatisticsProvider.java
statistics/impl/src/main/resources/OSGI-INF/blueprint/statistics.xml
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/IVpnManager.java
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/InterfaceUtils.java
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnExtraRouteHelper.java
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/VpnHelper.java
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkCache.java
vpnmanager/api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/intervpnlink/InterVpnLinkDataComposite.java
vpnmanager/impl/pom.xml
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetOpDpnManager.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetmapChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelEndPointChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnElanInterfaceChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnFootprintService.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceOpListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnNodeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnServiceElanDpnInterfacesListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/arp/responder/ArpResponderHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheFeeder.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkCacheImpl.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeAddTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateCacheFeeder.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkStateListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkUtil.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCleanedCheckerTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkCreatorTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/tasks/InterVpnLinkRemoverTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AbstractIpLearnNotificationHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/AlivenessMonitorUtils.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorEventListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStartTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitorStopTask.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/IpMonitoringHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/iplearn/LearntVpnVipToPortEventProcessor.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverMplsGrePopulator.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnOverVxlanPopulator.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java
vpnmanager/impl/src/main/resources/OSGI-INF/blueprint/vpnmanager.xml
vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocatorTest.java
vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkTestCatalog.java
vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/SubnetOpDpnManagerTest.java
vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java
vpnmanager/impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java
vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpn.java
vpnmanager/shell/src/main/java/org/opendaylight/netvirt/vpnmanager/shell/ShowVpnInstanceOpData.java
vpnmanager/shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml

index 30ee2d351079b0d54f3f84c371dbdf6078d3276e..5ba30f84bc4bd3aa5bb66ad31f346e6385b8f416 100644 (file)
@@ -35,9 +35,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.genius</groupId>
@@ -128,11 +132,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>testutils</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
index 3e322cf3882145f60da41576f81caab41023fc89..23d4193a1dc19abfbb931d1ea74ad3f0a926018c 100644 (file)
@@ -24,7 +24,6 @@ import java.util.SortedSet;
 import java.util.concurrent.ConcurrentMap;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
@@ -43,6 +42,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceListener;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
index f3e3af62fa175467af38a113d05221d5483557d5..06a672907589a300d591c15eff1ecac9bf3e202e 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.netvirt.aclservice;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.inject.AbstractLifecycle;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.utils.AclDataUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
index 3ac7e2d37b338989339adfc7f3f53fabece5eab7..679b3b1ac54a36e9ff1bfc35c0d10581dc0c08c7 100644 (file)
@@ -7,15 +7,14 @@
  */
 package org.opendaylight.netvirt.aclservice;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
@@ -30,6 +29,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.MatchCriteria;
index 9b0c3a00b1f7cf45a3ad5fdfdcbfdebef8a5b0c4..0e7d104701a8b34e6a8bd115cd3babdbb8a6b7ee 100644 (file)
@@ -7,15 +7,14 @@
  */
 package org.opendaylight.netvirt.aclservice;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
@@ -34,6 +33,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchRegister;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
index e1b1d92605309afef2dae7a62649005fc4d38d7f..ac637823ba4be9fb54bef80d12d972b577a8591b 100644 (file)
@@ -7,13 +7,13 @@
  */
 package org.opendaylight.netvirt.aclservice.listeners;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
@@ -22,6 +22,7 @@ import org.opendaylight.netvirt.aclservice.utils.AclClusterUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
@@ -30,7 +31,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class AclElanInterfaceListener extends AsyncDataTreeChangeListenerBase<ElanInterface, AclElanInterfaceListener>
+public class AclElanInterfaceListener extends AbstractAsyncDataTreeChangeListener<ElanInterface>
         implements ClusteredDataTreeChangeListener<ElanInterface>, RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(AclElanInterfaceListener.class);
 
@@ -43,7 +44,9 @@ public class AclElanInterfaceListener extends AsyncDataTreeChangeListenerBase<El
     public AclElanInterfaceListener(AclServiceManager aclServiceManager, AclClusterUtil aclClusterUtil,
             DataBroker dataBroker, AclInterfaceCache aclInterfaceCache,
             ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(ElanInterface.class, AclElanInterfaceListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class),
+                Executors.newListeningSingleThreadExecutor("AclElanInterfaceListener", LOG));
         this.aclServiceManager = aclServiceManager;
         this.aclClusterUtil = aclClusterUtil;
         this.dataBroker = dataBroker;
@@ -51,36 +54,33 @@ public class AclElanInterfaceListener extends AsyncDataTreeChangeListenerBase<El
         serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener();
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<ElanInterface> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ElanInterface> key, ElanInterface dataObjectModification) {
+    public void remove(InstanceIdentifier<ElanInterface> key, ElanInterface dataObjectModification) {
         // do nothing
     }
 
     @Override
-    protected void update(InstanceIdentifier<ElanInterface> key, ElanInterface dataObjectModificationBefore,
+    public void update(InstanceIdentifier<ElanInterface> key, ElanInterface dataObjectModificationBefore,
             ElanInterface dataObjectModificationAfter) {
         // do nothing
     }
 
     @Override
-    protected void add(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
+    public void add(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
         String interfaceId = elanInterface.getName();
         AclInterface aclInterface = aclInterfaceCache.updateIfPresent(interfaceId, (prevAclInterface, builder) -> {
             if (prevAclInterface.getElanId() == null) {
@@ -109,7 +109,9 @@ public class AclElanInterfaceListener extends AsyncDataTreeChangeListenerBase<El
     }
 
     @Override
-    protected AclElanInterfaceListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 4bee6a91062c8cd34ea0089fad97171a723ee3bc..d0797736fa540b282ce038e73d89f8b81704cfdd 100644 (file)
@@ -19,14 +19,14 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.SortedSet;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager;
 import org.opendaylight.netvirt.aclservice.api.utils.AclInterface;
@@ -36,6 +36,7 @@ import org.opendaylight.netvirt.aclservice.utils.AclDataUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.Ace;
@@ -49,7 +50,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEventListener> implements
+public class AclEventListener extends AbstractAsyncDataTreeChangeListener<Acl> implements
         ClusteredDataTreeChangeListener<Acl>, RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(AclEventListener.class);
@@ -65,7 +66,9 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
     public AclEventListener(AclServiceManager aclServiceManager, AclClusterUtil aclClusterUtil, DataBroker dataBroker,
             AclDataUtil aclDataUtil, AclServiceUtils aclServicUtils, AclInterfaceCache aclInterfaceCache,
             ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(Acl.class, AclEventListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(AccessLists.class).child(Acl.class),
+                Executors.newListeningSingleThreadExecutor("AclEventListener", LOG));
         this.aclServiceManager = aclServiceManager;
         this.aclClusterUtil = aclClusterUtil;
         this.dataBroker = dataBroker;
@@ -75,25 +78,22 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
         serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener();
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<Acl> getWildCardPath() {
-        return InstanceIdentifier.create(AccessLists.class).child(Acl.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Acl> key, Acl acl) {
+    public void remove(InstanceIdentifier<Acl> key, Acl acl) {
         LOG.trace("On remove event, remove ACL: {}", acl);
         String aclName = acl.getAclName();
         this.aclDataUtil.removeAcl(aclName);
@@ -115,7 +115,7 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
     }
 
     @Override
-    protected void update(InstanceIdentifier<Acl> key, Acl aclBefore, Acl aclAfter) {
+    public void update(InstanceIdentifier<Acl> key, Acl aclBefore, Acl aclAfter) {
         String aclName = aclAfter.getAclName();
         Collection<AclInterface> interfacesBefore =
                 ImmutableSet.copyOf(aclDataUtil.getInterfaceList(new Uuid(aclName)));
@@ -160,7 +160,7 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
     }
 
     @Override
-    protected void add(InstanceIdentifier<Acl> key, Acl acl) {
+    public void add(InstanceIdentifier<Acl> key, Acl acl) {
         LOG.trace("On add event, add ACL: {}", acl);
         this.aclDataUtil.addAcl(acl);
 
@@ -248,11 +248,6 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
         }
     }
 
-    @Override
-    protected AclEventListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private static @NonNull List<Ace> getChangedAceList(Acl updatedAcl, Acl currentAcl) {
         if (updatedAcl == null) {
             return Collections.emptyList();
@@ -288,4 +283,11 @@ public class AclEventListener extends AsyncDataTreeChangeListenerBase<Acl, AclEv
         }
         return deletedAceList;
     }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
 }
index 61021fc6dbadbd5253b751d57d924cd943011522..9b0f9cf8af994403c9b040fdc2297f195f4168c5 100644 (file)
@@ -9,14 +9,14 @@ package org.opendaylight.netvirt.aclservice.listeners;
 
 import java.util.ArrayList;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
@@ -26,6 +26,7 @@ import org.opendaylight.netvirt.aclservice.utils.AclDataUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -39,7 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase<Interface, AclInterfaceListener>
+public class AclInterfaceListener extends AbstractAsyncDataTreeChangeListener<Interface>
         implements ClusteredDataTreeChangeListener<Interface>, RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceListener.class);
 
@@ -54,7 +55,9 @@ public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase<Interf
     public AclInterfaceListener(AclServiceManager aclServiceManager, AclClusterUtil aclClusterUtil,
             DataBroker dataBroker, AclDataUtil aclDataUtil, AclInterfaceCache aclInterfaceCache,
             AclServiceUtils aclServicUtils, ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(Interface.class, AclInterfaceListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(Interfaces.class).child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("AclEventListener", LOG));
         this.aclServiceManager = aclServiceManager;
         this.aclClusterUtil = aclClusterUtil;
         this.dataBroker = dataBroker;
@@ -64,21 +67,18 @@ public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase<Interf
         serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener();
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
@@ -251,7 +251,9 @@ public class AclInterfaceListener extends AsyncDataTreeChangeListenerBase<Interf
     }
 
     @Override
-    protected AclInterfaceListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index d199e932e5f907609d75785370b84c5b8fb61df5..6967a0a2302ab380a004fa24a7df704b53403fc1 100644 (file)
@@ -10,15 +10,15 @@ package org.opendaylight.netvirt.aclservice.listeners;
 import java.util.Collections;
 import java.util.List;
 import java.util.SortedSet;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.Action;
@@ -28,6 +28,7 @@ import org.opendaylight.netvirt.aclservice.utils.AclDataUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -40,8 +41,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<Interface,
-        AclInterfaceStateListener> implements ClusteredDataTreeChangeListener<Interface>, RecoverableListener {
+public class AclInterfaceStateListener extends AbstractAsyncDataTreeChangeListener<Interface>
+        implements ClusteredDataTreeChangeListener<Interface>, RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceStateListener.class);
 
@@ -60,7 +61,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
             DataBroker dataBroker, AclDataUtil aclDataUtil, IInterfaceManager interfaceManager,
             AclInterfaceCache aclInterfaceCache, AclServiceUtils aclServicUtils, JobCoordinator jobCoordinator,
             ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(Interface.class, AclInterfaceStateListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(InterfacesState.class).child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("AclInterfaceStateListener", LOG));
         this.aclServiceManger = aclServiceManger;
         this.aclClusterUtil = aclClusterUtil;
         this.dataBroker = dataBroker;
@@ -72,25 +75,22 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
         serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener();
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> key, Interface deleted) {
+    public void remove(InstanceIdentifier<Interface> key, Interface deleted) {
         if (!L2vlan.class.equals(deleted.getType())) {
             return;
         }
@@ -119,7 +119,7 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> key, Interface before, Interface after) {
+    public void update(InstanceIdentifier<Interface> key, Interface before, Interface after) {
         /*
          * The update is not of interest as the attributes populated from this listener will not change.
          * The northbound updates are handled in AclInterfaceListener.
@@ -134,7 +134,7 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> key, Interface added) {
+    public void add(InstanceIdentifier<Interface> key, Interface added) {
         if (!L2vlan.class.equals(added.getType())) {
             return;
         }
@@ -192,7 +192,9 @@ public class AclInterfaceStateListener extends AsyncDataTreeChangeListenerBase<I
     }
 
     @Override
-    protected AclInterfaceStateListener getDataTreeChangeListener() {
-        return AclInterfaceStateListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index ab2bc1d5c6bb1b2b0b5e2cd44ffefa33019f70d8..0cc024ddc888660c3c9e36ea20a2d797c55435ce 100644 (file)
@@ -11,23 +11,24 @@ package org.opendaylight.netvirt.aclservice.listeners;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.utils.AclConstants;
 import org.opendaylight.netvirt.aclservice.utils.AclNodeDefaultFlowsTxBuilder;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -44,7 +45,7 @@ import org.slf4j.LoggerFactory;
  * during when node is discovered.
  */
 @Singleton
-public class AclNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapableNode, AclNodeListener>
+public class AclNodeListener extends AbstractAsyncDataTreeChangeListener<FlowCapableNode>
         implements RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(AclNodeListener.class);
@@ -63,7 +64,9 @@ public class AclNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapable
     public AclNodeListener(final IMdsalApiManager mdsalManager, DataBroker dataBroker, AclserviceConfig config,
             AclServiceUtils aclServiceUtils, JobCoordinator jobCoordinator,
             ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(FlowCapableNode.class, AclNodeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class)
+                .augmentation(FlowCapableNode.class),
+                Executors.newListeningSingleThreadExecutor("AclNodeListener", LOG));
 
         this.mdsalManager = mdsalManager;
         this.dataBroker = dataBroker;
@@ -72,42 +75,40 @@ public class AclNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapable
         this.aclServiceUtils = aclServiceUtils;
         this.jobCoordinator = jobCoordinator;
         serviceRecoveryRegistry.addRecoverableListener(AclServiceUtils.getRecoverServiceRegistryKey(), this);
+        init();
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} start", getClass().getSimpleName());
         if (config != null) {
             this.securityGroupMode = config.getSecurityGroupMode();
         }
-        registerListener();
         LOG.info("AclserviceConfig: {}", this.config);
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<FlowCapableNode> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         // do nothing
     }
 
     @Override
-    protected void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
+    public void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
             FlowCapableNode dataObjectModificationAfter) {
         // do nothing
     }
 
     @Override
-    protected void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         NodeKey nodeKey = key.firstKeyOf(Node.class);
         Uint64 dpId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
         LOG.info("Received ACL node [{}] add event", dpId);
@@ -128,7 +129,9 @@ public class AclNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapable
     }
 
     @Override
-    protected AclNodeListener getDataTreeChangeListener() {
-        return AclNodeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 79869246ef320b0459b3f1eb2838ce37a3505961..805f2398cc26f02f31786a32ae2127abbcf0cc13 100644 (file)
@@ -7,16 +7,14 @@
  */
 package org.opendaylight.netvirt.aclservice.recovery;
 
-import com.google.common.base.Optional;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.api.utils.AclInterface;
 import org.opendaylight.netvirt.aclservice.listeners.AclInterfaceListener;
 import org.opendaylight.netvirt.aclservice.utils.AclDataUtil;
index 3fdeccfa88a49e6d9b036cc91d48cf4c5ab0e243..ee68090a15d0451815b88e36aaad4b65fbbfe1c5 100644 (file)
@@ -7,12 +7,12 @@
  */
 package org.opendaylight.netvirt.aclservice.recovery;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.listeners.AclInterfaceListener;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
index 3b185f04f832634b213d65eacf5f91a82f65fc17..cb1b425c049e9e3acd67a08a737f49bb420a8f54 100644 (file)
@@ -15,9 +15,9 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.aclservice.utils.AclConstants;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
index a333d72c8732bbbfad758e171360a63fe8aeb70c..e3b999611eb73c52e7acd528210caaa216931de9 100644 (file)
@@ -15,7 +15,7 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.acl.live.statistics.rev161129.AclLiveStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.acl.live.statistics.rev161129.Direction;
index a51580157fc7fdc51ab33510314105cb01116787..d75420ab8f20e2ad4a2bdfede11fb8eff380e9ec 100644 (file)
@@ -8,11 +8,10 @@
 
 package org.opendaylight.netvirt.aclservice.utils;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.net.InetAddresses;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -26,17 +25,15 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -67,6 +64,9 @@ import org.opendaylight.genius.mdsalutil.matches.MatchUdpSourcePort;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchRegister;
 import org.opendaylight.genius.mdsalutil.packet.IPProtocols;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.api.AclServiceManager.MatchCriteria;
 import org.opendaylight.netvirt.aclservice.api.utils.AclInterface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
@@ -187,11 +187,11 @@ public final class AclServiceUtils {
      */
     public static <T extends DataObject> Optional<T> read(
             DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
-            return tx.read(datastoreType, path).checkedGet();
-        } catch (ReadFailedException e) {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
+            return tx.read(datastoreType, path).get();
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read InstanceIdentifier {} from {}", path, datastoreType, e);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
@@ -205,7 +205,7 @@ public final class AclServiceUtils {
         .@Nullable Interface getInterfaceStateFromOperDS(DataBroker dataBroker, String interfaceName) {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
             .interfaces.state.Interface> ifStateId = buildStateInterfaceId(interfaceName);
-        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, ifStateId, dataBroker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, ifStateId, dataBroker).orElse(null);
     }
 
     /**
@@ -691,7 +691,7 @@ public final class AclServiceUtils {
     @Nullable
     public static ElanInterface getElanInterfaceByElanInterfaceName(String elanInterfaceName,DataBroker broker) {
         InstanceIdentifier<ElanInterface> elanInterfaceId = getElanInterfaceConfigurationDataPathId(elanInterfaceName);
-        return read(broker, LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orNull();
+        return read(broker, LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orElse(null);
     }
 
     public static InstanceIdentifier<ElanInterface> getElanInterfaceConfigurationDataPathId(String interfaceName) {
@@ -703,7 +703,7 @@ public final class AclServiceUtils {
     @Nullable
     public static ElanInstance getElanInstanceByName(String elanInstanceName, DataBroker broker) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName);
-        return read(broker, LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orNull();
+        return read(broker, LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orElse(null);
     }
 
     public static InstanceIdentifier<ElanInstance> getElanInstanceConfigurationDataPath(String elanInstanceName) {
@@ -1120,9 +1120,9 @@ public final class AclServiceUtils {
     @Nullable
     private AclPortsByIp getAclPortsByIpFromOperDs(String aclName) {
         InstanceIdentifier<AclPortsByIp> path = aclPortsByIpPath(aclName);
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
-            return tx.read(LogicalDatastoreType.OPERATIONAL, path).checkedGet().orNull();
-        } catch (ReadFailedException e) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
+            return tx.read(LogicalDatastoreType.OPERATIONAL, path).get().orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read ACL ports {}", path, e);
             return null;
         }
@@ -1131,9 +1131,9 @@ public final class AclServiceUtils {
     @Nullable
     private AclIpPrefixes getAclIpPrefixesFromOperDs(String aclName, IpPrefixOrAddress ipPrefix) {
         InstanceIdentifier<AclIpPrefixes> path = getAclIpPrefixesPath(aclName, ipPrefix);
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
-            return tx.read(LogicalDatastoreType.OPERATIONAL, path).checkedGet().orNull();
-        } catch (ReadFailedException e) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
+            return tx.read(LogicalDatastoreType.OPERATIONAL, path).get().orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read ACL IP prefixes {}", path, e);
             return null;
         }
index 690f75a6759d38cd793c3de719a9cc12fadb075e..c34c670cbb20121e52ebed13fa092d374de87df7 100644 (file)
@@ -5,7 +5,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-    interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" />
+    interface="org.opendaylight.mdsal.binding.api.DataBroker" />
   <reference id="iMdsalApiManager"
     interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
   <reference id="entityOwnershipService"
index 5031d3de32a5c2f11a2acef9d1c2179037ad05cb..f8155c6ee2e0a24354d26a4e627ffa243b072ff2 100644 (file)
@@ -12,14 +12,13 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 import static org.opendaylight.netvirt.aclservice.tests.StateInterfaceBuilderHelper.putNewStateInterface;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Future;
 import javax.inject.Inject;
-
 import org.eclipse.xtext.xbase.lib.Pair;
 import org.junit.Assert;
 import org.junit.Before;
@@ -27,15 +26,15 @@ import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.MethodRule;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.testutils.AsyncEventsWaiter;
 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorTestModule;
 import org.opendaylight.genius.datastoreutils.testutils.TestableDataTreeChangeListenerModule;
 import org.opendaylight.genius.testutils.TestInterfaceManager;
 import org.opendaylight.infrautils.inject.guice.testutils.GuiceRule;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.aclservice.tests.AclServiceModule;
 import org.opendaylight.netvirt.aclservice.tests.AclServiceTestModule;
 import org.opendaylight.netvirt.aclservice.tests.IdentifiedInterfaceWithAclBuilder;
index 25a2607cc58ca46cc84d93ae7dd1ff6bb2722738..347c8bf248d7590019f75564cc7e7b2e50684a6d 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.aclservice.tests;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 import static org.opendaylight.netvirt.aclservice.tests.StateInterfaceBuilderHelper.putNewStateInterface;
 
 import java.math.BigInteger;
@@ -21,9 +21,6 @@ import org.eclipse.xtext.xbase.lib.Pair;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.testutils.AsyncEventsWaiter;
 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorEventsWaiter;
@@ -34,6 +31,9 @@ import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManag
 import org.opendaylight.genius.testutils.TestInterfaceManager;
 import org.opendaylight.infrautils.testutils.LogCaptureRule;
 import org.opendaylight.infrautils.testutils.LogRule;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.aclservice.tests.infra.DataBrokerPairsUtil;
 import org.opendaylight.netvirt.aclservice.utils.AclConstants;
 import org.opendaylight.netvirt.aclservice.utils.AclServiceUtils;
index 9fe81ec2b1cf83eac2d9aca66031b8f77bc65e03..4a2ad11c6fa05bda92623462e38e49d7b2dbb90c 100644 (file)
@@ -12,14 +12,18 @@ import static org.opendaylight.yangtools.testutils.mockito.MoreAnswers.realOrExc
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
 import com.google.inject.AbstractModule;
+import java.util.concurrent.Executors;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.test.DataBrokerTestModule;
 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorEventsWaiter;
 import org.opendaylight.genius.datastoreutils.testutils.TestableJobCoordinatorEventsWaiter;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractBaseDataBrokerTest;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTestCustomizer;
 import org.opendaylight.netvirt.aclservice.AclInterfaceCacheImpl;
 import org.opendaylight.netvirt.aclservice.api.AclInterfaceCache;
 import org.opendaylight.netvirt.aclservice.stats.TestOdlDirectStatisticsService;
@@ -62,9 +66,26 @@ public class AclServiceTestModule extends AbstractModule {
         this.securityGroupMode = securityGroupMode;
     }
 
+    @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
     protected void configure() {
-        bind(DataBroker.class).toInstance(DataBrokerTestModule.dataBroker());
+        AbstractBaseDataBrokerTest test = new AbstractBaseDataBrokerTest() {
+            @Override
+            protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
+                return new AbstractDataBrokerTestCustomizer() {
+                    @Override
+                    public ListeningExecutorService getCommitCoordinatorExecutor() {
+                        return MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
+                    }
+                };
+            }
+        };
+        try {
+            test.setup();
+        } catch (Exception e) {
+            LOG.trace("Exception", e.getMessage());
+        }
+        bind(DataBroker.class).toInstance(test.getDataBroker());
         bind(AclserviceConfig.class).toInstance(aclServiceConfig());
         bind(AclDataUtil.class).toInstance(aclDataUtil());
         bind(AclClusterUtil.class).toInstance(() -> true);
index bcacccf869082716a255cb2be8e1c3b41e75f172..aac77b38c2de7277109773637fac4c4e1c342469 100644 (file)
@@ -7,10 +7,10 @@
  */
 package org.opendaylight.netvirt.aclservice.tests;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
 import java.util.Optional;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.tests.infra.DataTreeIdentifierDataObjectPairBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.Ipv4Acl;
index ae7b5850d6042103a065f37668ea27099e1c96bf..85e5dd691360dc98198021951c2017ba46c705f4 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.netvirt.aclservice.tests;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.aclservice.tests.infra.DataTreeIdentifierDataObjectPairBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
index 931c3335f02d02c4817ac3ab677db24496c4be18..31d59c57446107d98e9d93e4a76e2de9e5b10221 100644 (file)
@@ -8,11 +8,11 @@
 package org.opendaylight.netvirt.aclservice.tests;
 
 import static java.util.Collections.singletonList;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
index b6608409102da3ae5c4595f39d60c17511038bbc..fbe29794ef8e0955f6bbb5017595682b39dfd6e4 100644 (file)
@@ -9,12 +9,12 @@ package org.opendaylight.netvirt.aclservice.tests.infra;
 
 import javax.inject.Inject;
 import org.eclipse.xtext.xbase.lib.Pair;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
index d2e938dff974fdc3ca0b61e59fbdbb20396d441e..28a8b03a14b157d85d2458fd1ea8d35bfb1a54d5 100644 (file)
@@ -8,8 +8,8 @@
 package org.opendaylight.netvirt.aclservice.tests.infra;
 
 import org.eclipse.xtext.xbase.lib.Pair;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -34,6 +34,6 @@ public interface DataTreeIdentifierDataObjectPairBuilder<T extends DataObject>
 
     @Override
     default Pair<DataTreeIdentifier<T>, T> build() {
-        return Pair.of(new DataTreeIdentifier<>(type(), identifier()), dataObject());
+        return Pair.of(DataTreeIdentifier.create(type(), identifier()), dataObject());
     }
 }
index 888b077ec3ed9365b433434479e987e92a067edb..fc334b2d7949f4b10efe2e966b3e8886f284487b 100644 (file)
@@ -66,7 +66,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>vpnmanager-api</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
             <scope>test</scope>
@@ -76,6 +76,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>sal-binding-broker-impl</artifactId>
             <scope>test</scope>
             <type>test-jar</type>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.shell</groupId>
index 926fe55528b3a26e56885cebdb19246c5d049a0d..7df679c3a5ff04a4c0c88ee1a426ae91666ee4ac 100755 (executable)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.bgpmanager;
 import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_LIMIT;
 import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_THRESHOLD;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
 import com.google.common.util.concurrent.Futures;
@@ -33,6 +32,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Timer;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
@@ -54,17 +54,14 @@ import org.apache.thrift.TApplicationException;
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TTransport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.metrics.MetricProvider;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListenerRegistration;
@@ -90,6 +87,7 @@ import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.IVpnLinkService;
 import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
 import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebfd.rev190219.BfdConfig;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebfd.rev190219.BfdConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
@@ -416,8 +414,8 @@ public class BgpConfigurationManager implements EbgpService {
         for (Class<?> reactor : REACTORS) {
             Object obj = createListener(reactor);
             if (obj != null) {
-                AsyncDataTreeChangeListenerBase dcl = (AsyncDataTreeChangeListenerBase) obj;
-                dcl.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+                AbstractAsyncDataTreeChangeListener dcl = (AbstractAsyncDataTreeChangeListener) obj;
+                dcl.register();
                 listeners.add(dcl);
             }
         }
@@ -516,16 +514,19 @@ public class BgpConfigurationManager implements EbgpService {
     }
 
     public class ConfigServerReactor
-            extends AsyncDataTreeChangeListenerBase<ConfigServer, ConfigServerReactor>
+            extends AbstractAsyncDataTreeChangeListener<ConfigServer>
             implements ClusteredDataTreeChangeListener<ConfigServer> {
         private static final String YANG_OBJ = "config-server ";
 
         public ConfigServerReactor() {
-            super(ConfigServer.class, ConfigServerReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(ConfigServer.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("ConfigServerReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<ConfigServer> iid, ConfigServer val) {
+        public void add(InstanceIdentifier<ConfigServer> iid, ConfigServer val) {
             LOG.trace("received bgp connect config host {}", val.getHost().getValue());
             if (!isBGPEntityOwner()) {
                 return;
@@ -550,17 +551,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected ConfigServerReactor getDataTreeChangeListener() {
-            return ConfigServerReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<ConfigServer> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(ConfigServer.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<ConfigServer> iid, ConfigServer val) {
+        public void remove(InstanceIdentifier<ConfigServer> iid, ConfigServer val) {
             LOG.trace("received bgp disconnect");
             if (!isBGPEntityOwner()) {
                 return;
@@ -585,7 +576,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<ConfigServer> iid,
+        public void update(InstanceIdentifier<ConfigServer> iid,
                 ConfigServer oldval, ConfigServer newval) {
             LOG.trace("received bgp Connection update");
             if (!isBGPEntityOwner()) {
@@ -605,18 +596,21 @@ public class BgpConfigurationManager implements EbgpService {
         return bgpRouter;
     }
 
-    public class AsIdReactor
-            extends AsyncDataTreeChangeListenerBase<AsId, AsIdReactor>
+    public class AsIdReactor extends AbstractAsyncDataTreeChangeListener<AsId>
             implements ClusteredDataTreeChangeListener<AsId> {
 
         private static final String YANG_OBJ = "as-id ";
 
         public AsIdReactor() {
-            super(AsId.class, AsIdReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(AsId.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("AsIdReactor", LOG));
         }
 
+        @SuppressFBWarnings(value  = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
         @Override
-        protected void add(InstanceIdentifier<AsId> iid, AsId val) {
+        public void add(InstanceIdentifier<AsId> iid, AsId val) {
             LOG.error("received bgp add asid {}", val);
             if (!isBGPEntityOwner()) {
                 return;
@@ -638,17 +632,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected AsIdReactor getDataTreeChangeListener() {
-            return AsIdReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<AsId> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(AsId.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<AsId> iid, AsId val) {
+        public void remove(InstanceIdentifier<AsId> iid, AsId val) {
             LOG.error("received delete router config asNum {}", val.getLocalAs());
             if (!isBGPEntityOwner()) {
                 return;
@@ -691,7 +675,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<AsId> iid,
+        public void update(InstanceIdentifier<AsId> iid,
                 AsId oldval, AsId newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -700,18 +684,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class GracefulRestartReactor
-            extends AsyncDataTreeChangeListenerBase<GracefulRestart, GracefulRestartReactor>
+    public class GracefulRestartReactor extends AbstractAsyncDataTreeChangeListener<GracefulRestart>
             implements ClusteredDataTreeChangeListener<GracefulRestart> {
 
         private static final String YANG_OBJ = "graceful-restart ";
 
         public GracefulRestartReactor() {
-            super(GracefulRestart.class, GracefulRestartReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("GracefulRestartReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<GracefulRestart> iid, GracefulRestart val) {
+        public void add(InstanceIdentifier<GracefulRestart> iid, GracefulRestart val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -732,17 +718,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected GracefulRestartReactor getDataTreeChangeListener() {
-            return GracefulRestartReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<GracefulRestart> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<GracefulRestart> iid, GracefulRestart val) {
+        public void remove(InstanceIdentifier<GracefulRestart> iid, GracefulRestart val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -763,7 +739,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<GracefulRestart> iid,
+        public void update(InstanceIdentifier<GracefulRestart> iid,
                 GracefulRestart oldval, GracefulRestart newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -786,18 +762,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class LoggingReactor
-            extends AsyncDataTreeChangeListenerBase<Logging, LoggingReactor>
+    public class LoggingReactor extends AbstractAsyncDataTreeChangeListener<Logging>
             implements ClusteredDataTreeChangeListener<Logging> {
 
         private static final String YANG_OBJ = "logging ";
 
         public LoggingReactor() {
-            super(Logging.class, LoggingReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(Logging.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("LoggingReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<Logging> iid, Logging val) {
+        public void add(InstanceIdentifier<Logging> iid, Logging val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -817,17 +795,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected LoggingReactor getDataTreeChangeListener() {
-            return LoggingReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<Logging> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(Logging.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Logging> iid, Logging val) {
+        public void remove(InstanceIdentifier<Logging> iid, Logging val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -848,7 +816,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<Logging> iid,
+        public void update(InstanceIdentifier<Logging> iid,
                 Logging oldval, Logging newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -869,18 +837,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class NeighborsReactor
-            extends AsyncDataTreeChangeListenerBase<Neighbors, NeighborsReactor>
+    public class NeighborsReactor extends AbstractAsyncDataTreeChangeListener<Neighbors>
             implements ClusteredDataTreeChangeListener<Neighbors> {
 
         private static final String YANG_OBJ = "neighbors ";
 
         public NeighborsReactor() {
-            super(Neighbors.class, NeighborsReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("NeighborsReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<Neighbors> iid, Neighbors val) {
+        public void add(InstanceIdentifier<Neighbors> iid, Neighbors val) {
             if (nbrList != null && !nbrList.contains(val)) {
                 LOG.trace("Adding nbr {} to nbrlist", val.getAddress().getValue());
                 nbrList.add(val);
@@ -928,17 +898,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected NeighborsReactor getDataTreeChangeListener() {
-            return NeighborsReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<Neighbors> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Neighbors> iid, Neighbors val) {
+        public void remove(InstanceIdentifier<Neighbors> iid, Neighbors val) {
             if (nbrList != null && nbrList.contains(val)) {
                 LOG.trace("Removing nbr {} from nbr list", val.getAddress().getValue());
                 nbrList.remove(val);
@@ -977,7 +937,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<Neighbors> iid,
+        public void update(InstanceIdentifier<Neighbors> iid,
                 Neighbors oldval, Neighbors newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -986,18 +946,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class EbgpMultihopReactor
-            extends AsyncDataTreeChangeListenerBase<EbgpMultihop, EbgpMultihopReactor>
+    public class EbgpMultihopReactor extends AbstractAsyncDataTreeChangeListener<EbgpMultihop>
             implements ClusteredDataTreeChangeListener<EbgpMultihop> {
 
         private static final String YANG_OBJ = "ebgp-multihop ";
 
         public EbgpMultihopReactor() {
-            super(EbgpMultihop.class, EbgpMultihopReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
+                    .child(EbgpMultihop.class), org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("EbgpMultihopReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<EbgpMultihop> iid, EbgpMultihop val) {
+        public void add(InstanceIdentifier<EbgpMultihop> iid, EbgpMultihop val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1019,18 +981,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected EbgpMultihopReactor getDataTreeChangeListener() {
-            return EbgpMultihopReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<EbgpMultihop> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
-                    .child(EbgpMultihop.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<EbgpMultihop> iid, EbgpMultihop val) {
+        public void remove(InstanceIdentifier<EbgpMultihop> iid, EbgpMultihop val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1052,7 +1003,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<EbgpMultihop> iid,
+        public void update(InstanceIdentifier<EbgpMultihop> iid,
                 EbgpMultihop oldval, EbgpMultihop newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -1061,18 +1012,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class UpdateSourceReactor
-            extends AsyncDataTreeChangeListenerBase<UpdateSource, UpdateSourceReactor>
+    public class UpdateSourceReactor extends AbstractAsyncDataTreeChangeListener<UpdateSource>
             implements ClusteredDataTreeChangeListener<UpdateSource> {
 
         private static final String YANG_OBJ = "update-source ";
 
         public UpdateSourceReactor() {
-            super(UpdateSource.class, UpdateSourceReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
+                    .child(UpdateSource.class), org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("UpdateSourceReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<UpdateSource> iid, UpdateSource val) {
+        public void add(InstanceIdentifier<UpdateSource> iid, UpdateSource val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1094,18 +1047,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected UpdateSourceReactor getDataTreeChangeListener() {
-            return UpdateSourceReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<UpdateSource> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
-                    .child(UpdateSource.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<UpdateSource> iid, UpdateSource val) {
+        public void remove(InstanceIdentifier<UpdateSource> iid, UpdateSource val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1127,7 +1069,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<UpdateSource> iid,
+        public void update(InstanceIdentifier<UpdateSource> iid,
                 UpdateSource oldval, UpdateSource newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -1136,18 +1078,20 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class AddressFamiliesReactor
-            extends AsyncDataTreeChangeListenerBase<AddressFamilies, AddressFamiliesReactor>
+    public class AddressFamiliesReactor extends AbstractAsyncDataTreeChangeListener<AddressFamilies>
             implements ClusteredDataTreeChangeListener<AddressFamilies> {
 
         private static final String YANG_OBJ = "address-families ";
 
         public AddressFamiliesReactor() {
-            super(AddressFamilies.class, AddressFamiliesReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
+                    .child(AddressFamilies.class), org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("AddressFamiliesReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<AddressFamilies> iid, AddressFamilies val) {
+        public void add(InstanceIdentifier<AddressFamilies> iid, AddressFamilies val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1171,18 +1115,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected AddressFamiliesReactor getDataTreeChangeListener() {
-            return AddressFamiliesReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<AddressFamilies> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class)
-                    .child(AddressFamilies.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<AddressFamilies> iid, AddressFamilies val) {
+        public void remove(InstanceIdentifier<AddressFamilies> iid, AddressFamilies val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1206,7 +1139,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<AddressFamilies> iid,
+        public void update(InstanceIdentifier<AddressFamilies> iid,
                 AddressFamilies oldval, AddressFamilies newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -1215,23 +1148,19 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class NetworksReactor
-            extends AsyncDataTreeChangeListenerBase<Networks, NetworksReactor>
+    public class NetworksReactor extends AbstractAsyncDataTreeChangeListener<Networks>
             implements ClusteredDataTreeChangeListener<Networks> {
 
         private static final String YANG_OBJ = "networks ";
 
         public NetworksReactor() {
-            super(Networks.class, NetworksReactor.class);
-        }
-
-        @Override
-        public NetworksReactor getDataTreeChangeListener() {
-            return NetworksReactor.this;
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(NetworksContainer.class).child(Networks.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("NetworksReactor", LOG));
         }
 
-        @Override
-        protected void add(InstanceIdentifier<Networks> iid, Networks val) {
+        public void add(InstanceIdentifier<Networks> iid, Networks val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1271,12 +1200,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected InstanceIdentifier<Networks> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(NetworksContainer.class).child(Networks.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Networks> iid, Networks val) {
+        public void remove(InstanceIdentifier<Networks> iid, Networks val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1323,7 +1247,7 @@ public class BgpConfigurationManager implements EbgpService {
 
 
         @Override
-        protected void update(final InstanceIdentifier<Networks> iid,
+        public void update(final InstanceIdentifier<Networks> iid,
                 final Networks oldval, final Networks newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -1345,18 +1269,20 @@ public class BgpConfigurationManager implements EbgpService {
 
     static Timer timer = new Timer();
 
-    public class VrfsReactor
-            extends AsyncDataTreeChangeListenerBase<Vrfs, VrfsReactor>
+    public class VrfsReactor extends AbstractAsyncDataTreeChangeListener<Vrfs>
             implements ClusteredDataTreeChangeListener<Vrfs> {
 
         private static final String YANG_OBJ = "vrfs ";
 
         public VrfsReactor() {
-            super(Vrfs.class, VrfsReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(VrfsContainer.class).child(Vrfs.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("VrfsReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<Vrfs> iid, Vrfs vrfs) {
+        public void add(InstanceIdentifier<Vrfs> iid, Vrfs vrfs) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1405,17 +1331,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected VrfsReactor getDataTreeChangeListener() {
-            return VrfsReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<Vrfs> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(VrfsContainer.class).child(Vrfs.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Vrfs> iid, Vrfs val) {
+        public void remove(InstanceIdentifier<Vrfs> iid, Vrfs val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1445,7 +1361,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<Vrfs> iid,
+        public void update(InstanceIdentifier<Vrfs> iid,
                 Vrfs oldval, Vrfs newval) {
             if (oldval != null && newval != null) {
                 LOG.debug("received update Vrfs config val {}, VRFS: Update getting triggered for VRFS rd {}",
@@ -1513,19 +1429,19 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class BgpReactor
-            extends AsyncDataTreeChangeListenerBase<Bgp, BgpReactor>
+    public class BgpReactor extends AbstractAsyncDataTreeChangeListener<Bgp>
             implements ClusteredDataTreeChangeListener<Bgp> {
 
         private static final String YANG_OBJ = "Bgp ";
 
         public BgpReactor() {
-            super(Bgp.class, BgpReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Bgp.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("BgpReactor", LOG));
         }
 
-
         @Override
-        protected void add(InstanceIdentifier<Bgp> iid, Bgp val) {
+        public void add(InstanceIdentifier<Bgp> iid, Bgp val) {
             LOG.debug("received add Bgp config");
 
             try {
@@ -1542,17 +1458,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected BgpReactor getDataTreeChangeListener() {
-            return BgpReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<Bgp> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Bgp> iid, Bgp val) {
+        public void remove(InstanceIdentifier<Bgp> iid, Bgp val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1562,7 +1468,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<Bgp> iid,
+        public void update(InstanceIdentifier<Bgp> iid,
                 Bgp oldval, Bgp newval) {
             if (!isBGPEntityOwner()) {
                 return;
@@ -1573,39 +1479,30 @@ public class BgpConfigurationManager implements EbgpService {
     }
 
     @SuppressWarnings("deprecation")
-    public class MultipathReactor
-            extends AsyncDataTreeChangeListenerBase<Multipath, MultipathReactor>
+    public class MultipathReactor extends AbstractAsyncDataTreeChangeListener<Multipath>
             implements ClusteredDataTreeChangeListener<Multipath> {
 
         private static final String YANG_OBJ = "multipath ";
 
         public MultipathReactor() {
-            super(Multipath.class, MultipathReactor.class);
-        }
-
-
-        @Override
-        protected MultipathReactor getDataTreeChangeListener() {
-            return MultipathReactor.this;
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Bgp.class)
+                    .child(MultipathContainer.class).child(Multipath.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("MultipathReactor", LOG));
         }
 
         @Override
-        protected InstanceIdentifier<Multipath> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(MultipathContainer.class).child(Multipath.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<Multipath> iid, Multipath val) {
+        public void remove(InstanceIdentifier<Multipath> iid, Multipath val) {
             executor.execute(new MultipathStatusChange(val));
         }
 
         @Override
-        protected void update(InstanceIdentifier<Multipath> iid, Multipath oldval, Multipath newval) {
+        public void update(InstanceIdentifier<Multipath> iid, Multipath oldval, Multipath newval) {
             executor.execute(new MultipathStatusChange(newval));
         }
 
         @Override
-        protected void add(InstanceIdentifier<Multipath> key, Multipath dataObjectModification) {
+        public void add(InstanceIdentifier<Multipath> key, Multipath dataObjectModification) {
             executor.execute(new MultipathStatusChange(dataObjectModification));
         }
 
@@ -1651,25 +1548,16 @@ public class BgpConfigurationManager implements EbgpService {
     }
 
     @SuppressWarnings("deprecation")
-    public class VrfMaxpathReactor
-            extends AsyncDataTreeChangeListenerBase<VrfMaxpath, VrfMaxpathReactor>
+    public class VrfMaxpathReactor extends AbstractAsyncDataTreeChangeListener<VrfMaxpath>
             implements ClusteredDataTreeChangeListener<VrfMaxpath> {
 
         private static final String YANG_OBJ = "vrfMaxpath ";
 
         public VrfMaxpathReactor() {
-            super(VrfMaxpath.class, VrfMaxpathReactor.class);
-        }
-
-
-        @Override
-        protected VrfMaxpathReactor getDataTreeChangeListener() {
-            return VrfMaxpathReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<VrfMaxpath> getWildCardPath() {
-            return InstanceIdentifier.create(Bgp.class).child(VrfMaxpathContainer.class).child(VrfMaxpath.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(Bgp.class).child(VrfMaxpathContainer.class).child(VrfMaxpath.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("VrfMaxpathReactor", LOG));
         }
 
         class VrfMaxPathConfigurator implements Runnable {
@@ -1700,7 +1588,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void remove(InstanceIdentifier<VrfMaxpath> iid, VrfMaxpath vrfMaxPathVal) {
+        public void remove(InstanceIdentifier<VrfMaxpath> iid, VrfMaxpath vrfMaxPathVal) {
             if (isBGPEntityOwner()) {
                 synchronized (BgpConfigurationManager.this) {
                     BgpRouter br = getClient(YANG_OBJ);
@@ -1717,7 +1605,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<VrfMaxpath> iid,
+        public void update(InstanceIdentifier<VrfMaxpath> iid,
                               VrfMaxpath oldval, VrfMaxpath newval) {
             if (!Objects.equals(oldval.getMaxpaths(), newval.getMaxpaths())) {
                 executor.execute(new VrfMaxPathConfigurator(newval));
@@ -1725,7 +1613,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void add(InstanceIdentifier<VrfMaxpath> instanceIdentifier, VrfMaxpath vrfMaxpathVal) {
+        public void add(InstanceIdentifier<VrfMaxpath> instanceIdentifier, VrfMaxpath vrfMaxpathVal) {
             executor.execute(new VrfMaxPathConfigurator(vrfMaxpathVal));
         }
 
@@ -1735,18 +1623,19 @@ public class BgpConfigurationManager implements EbgpService {
         }
     }
 
-    public class BfdConfigReactor
-            extends AsyncDataTreeChangeListenerBase<BfdConfig, BfdConfigReactor>
+    public class BfdConfigReactor extends AbstractAsyncDataTreeChangeListener<BfdConfig>
             implements ClusteredDataTreeChangeListener<BfdConfig> {
 
         private static final String YANG_OBJ = "BfdConfig ";
 
         public BfdConfigReactor() {
-            super(BfdConfig.class, BfdConfigReactor.class);
+            super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(BfdConfig.class),
+                    org.opendaylight.infrautils.utils.concurrent.Executors
+                            .newListeningSingleThreadExecutor("BfdConfigReactor", LOG));
         }
 
         @Override
-        protected void add(InstanceIdentifier<BfdConfig> iid, BfdConfig val) {
+        public void add(InstanceIdentifier<BfdConfig> iid, BfdConfig val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1775,17 +1664,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected BfdConfigReactor getDataTreeChangeListener() {
-            return BfdConfigReactor.this;
-        }
-
-        @Override
-        protected InstanceIdentifier<BfdConfig> getWildCardPath() {
-            return InstanceIdentifier.create(BfdConfig.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<BfdConfig> iid, BfdConfig val) {
+        public void remove(InstanceIdentifier<BfdConfig> iid, BfdConfig val) {
             if (!isBGPEntityOwner()) {
                 return;
             }
@@ -1805,7 +1684,7 @@ public class BgpConfigurationManager implements EbgpService {
         }
 
         @Override
-        protected void update(InstanceIdentifier<BfdConfig> iid,
+        public void update(InstanceIdentifier<BfdConfig> iid,
                               BfdConfig oldval, BfdConfig newval) {
             LOG.debug("received bfd config: updated oldval bfd enabled {}"
                     + "min-rx {} min-tx {} detect-mul {} mhop {}",
@@ -1855,7 +1734,7 @@ public class BgpConfigurationManager implements EbgpService {
         try {
             InstanceIdentifier<GracefulRestart> id =
                     InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class);
-            Optional<GracefulRestart> gracefulRestartOptional = MDSALUtil.read(dataBroker,
+            Optional<GracefulRestart> gracefulRestartOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.CONFIGURATION, id);
             if (gracefulRestartOptional.isPresent()) {
                 spt = gracefulRestartOptional.get().getStalepathTime().toJava();
@@ -1868,6 +1747,9 @@ public class BgpConfigurationManager implements EbgpService {
                 LOG.trace("BGP AS id is not set using graceful");
                 spt = defValue;
             }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.trace("Exception while reading GracefulRestart DS for the As {}", asId.getStalepathTime());
+            spt = defValue;
         }
         if (spt == 0) {
             LOG.trace("BGP config/Stale-path time is not set using graceful/start-bgp");
@@ -2330,8 +2212,8 @@ public class BgpConfigurationManager implements EbgpService {
         while (0 != bgpDSretryCount.decrementAndGet()) {
             try {
                 return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                        InstanceIdentifier.create(Bgp.class)).orNull();
-            } catch (ReadFailedException e) {
+                        InstanceIdentifier.create(Bgp.class)).orElse(null);
+            } catch (InterruptedException | ExecutionException e) {
                 //Config DS may not be up, so sleep for 1 second and retry
                 LOG.debug("failed to get bgp config, may be DS is yet in consistent state(?)", e);
                 try {
@@ -3102,7 +2984,7 @@ public class BgpConfigurationManager implements EbgpService {
             } else {
                 LOG.error("createStaleFibMap:: FIBentries.class is not present");
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("createStaleFibMap:: error ", e);
         }
         LOG.error("created {} staled entries ", totalStaledCount);
@@ -3151,7 +3033,7 @@ public class BgpConfigurationManager implements EbgpService {
             } else {
                 LOG.error("deleteExternalFibRoutes:: FIBentries.class is not present");
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("deleteExternalFibRoutes:: error ", e);
         }
         LOG.debug("deleted {} fib entries {} mac entries", totalExternalRoutes, totalExternalMacRoutes);
index b0cde0dd25c1b6f1e8397d10c666b286e93822b0..40d45ad5151c6f6938e96b4cffc9892f46bb033b 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netvirt.bgpmanager;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -16,15 +15,16 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.thrift.TException;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmErrorCodes;
 import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
@@ -219,7 +219,7 @@ public class BgpManager implements AutoCloseable, IBgpManager {
                 .child(NetworksContainer.class)
                 .child(Networks.class,
                 new NetworksKey(rd, prefix)).build();
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
             Futures.addCallback(tx.read(LogicalDatastoreType.CONFIGURATION, networksId),
                 new FutureCallback<Optional<Networks>>() {
                     @Override
index 245850e44eec579920603cfa62a9ce5a3f11f3bb..a412f8c654206d890cd02016cab75c19b23c2e86 100755 (executable)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netvirt.bgpmanager;
 
-import com.google.common.base.Optional;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -15,20 +14,23 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.LinkedBlockingQueue;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.batching.ActionableResource;
 import org.opendaylight.genius.utils.batching.ActionableResourceImpl;
 import org.opendaylight.genius.utils.batching.DefaultBatchHandler;
 import org.opendaylight.genius.utils.batching.ResourceBatchingManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.encap_type;
@@ -198,8 +200,13 @@ public class BgpUtil implements AutoCloseable {
 
     public VpnInstanceOpDataEntry getVpnInstanceOpData(String rd)  {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = getVpnInstanceOpDataIdentifier(rd);
-        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData = Optional.empty();
+        try {
+            vpnInstanceOpData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading VpnInstanceOpDataEntry DS for the Vpn Rd {}", rd, e);
+        }
         if (vpnInstanceOpData.isPresent()) {
             return vpnInstanceOpData.get();
         }
@@ -213,8 +220,13 @@ public class BgpUtil implements AutoCloseable {
 
     private String getElanNamefromRd(String rd)  {
         InstanceIdentifier<EvpnRdToNetwork> id = getEvpnRdToNetworkIdentifier(rd);
-        Optional<EvpnRdToNetwork> evpnRdToNetworkOpData = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id);
+        Optional<EvpnRdToNetwork> evpnRdToNetworkOpData = Optional.empty();
+        try {
+            evpnRdToNetworkOpData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading EvpnRdToNetwork DS for the Vpn Rd {}", rd, e);
+        }
         if (evpnRdToNetworkOpData.isPresent()) {
             return evpnRdToNetworkOpData.get().getNetworkId();
         }
@@ -287,7 +299,13 @@ public class BgpUtil implements AutoCloseable {
         KeyedInstanceIdentifier<Vrfs, VrfsKey> id = InstanceIdentifier.create(Bgp.class)
                 .child(VrfsContainer.class)
                 .child(Vrfs.class, new VrfsKey(rd));
-        Optional<Vrfs> vrfsFromDs = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<Vrfs> vrfsFromDs = Optional.empty();
+        try {
+            vrfsFromDs = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading BGP VRF table for the Vpn Rd {}", rd, e);
+        }
         if (vrfsFromDs.isPresent()) {
             vrfs = vrfsFromDs.get();
         }
@@ -341,8 +359,13 @@ public class BgpUtil implements AutoCloseable {
     public BfdConfig getBfdConfig() {
         InstanceIdentifier<BfdConfig> id =
                 InstanceIdentifier.builder(BfdConfig.class).build();
-        Optional<BfdConfig> bfdConfigOptional = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id);
+        Optional<BfdConfig> bfdConfigOptional = Optional.empty();
+        try {
+            bfdConfigOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading BfdConfig", e);
+        }
         if (bfdConfigOptional.isPresent()) {
             return bfdConfigOptional.get();
         }
@@ -352,8 +375,13 @@ public class BgpUtil implements AutoCloseable {
     public DcgwTepList getDcgwTepConfig() {
         InstanceIdentifier<DcgwTepList> id =
                 InstanceIdentifier.builder(Bgp.class).child(DcgwTepList.class).build();
-        Optional<DcgwTepList> dcgwTepListOptional = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id);
+        Optional<DcgwTepList> dcgwTepListOptional = Optional.empty();
+        try {
+            dcgwTepListOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getDcgwTepConfig: Exception while reading DcgwTepList", e);
+        }
         if (dcgwTepListOptional.isPresent()) {
             return dcgwTepListOptional.get();
         }
@@ -365,8 +393,13 @@ public class BgpUtil implements AutoCloseable {
                 InstanceIdentifier.builder(Bgp.class)
                         .child(DcgwTepList.class)
                         .child(DcgwTep.class, new DcgwTepKey(dcgwIp)).build();
-        Optional<DcgwTep> tepListOptional = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id);
+        Optional<DcgwTep> tepListOptional = Optional.empty();
+        try {
+            tepListOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading DcgwTep for the IP {}", dcgwIp, e);
+        }
         if (tepListOptional.isPresent()) {
             return tepListOptional.get().getTepIps();
         }
index e3ce4494e6761ce84423fa26ac62091cfa81d62d..aa2f0ac5d48937b388fdde0135bc9d32799ecf65 100644 (file)
@@ -8,10 +8,13 @@
 
 package org.opendaylight.netvirt.bgpmanager;
 
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.EvpnRdToNetworks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.evpn.rd.to.networks.EvpnRdToNetwork;
@@ -20,7 +23,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase<EvpnRdToNetwork, EvpnRdNetworkListener>
+public class EvpnRdNetworkListener extends AbstractAsyncDataTreeChangeListener<EvpnRdToNetwork>
         implements ClusteredDataTreeChangeListener<EvpnRdToNetwork> {
     private static final Logger LOG = LoggerFactory.getLogger(EvpnRdNetworkListener.class);
 
@@ -30,29 +33,21 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase<EvpnR
 
     public EvpnRdNetworkListener(DataBroker dataBroker, BgpConfigurationManager bgpConfigManager, BgpUtil bgpUtil,
             final IdManagerService idManager) {
-        super(EvpnRdToNetwork.class, EvpnRdNetworkListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(EvpnRdToNetworks.class)
+                .child(EvpnRdToNetwork.class),
+                Executors.newListeningSingleThreadExecutor("EvpnRdNetworkListener", LOG));
         this.broker = dataBroker;
         this.bgpConfigManager = bgpConfigManager;
         this.bgpUtil = bgpUtil;
     }
 
-    @Override
+    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
-    }
-
-    @Override
-    protected InstanceIdentifier<EvpnRdToNetwork> getWildCardPath() {
-        return InstanceIdentifier.create(EvpnRdToNetworks.class).child(EvpnRdToNetwork.class);
-    }
-
-    @Override
-    protected EvpnRdNetworkListener getDataTreeChangeListener() {
-        return this;
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    protected void add(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork) {
+    public void add(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork) {
         if (!bgpConfigManager.isBGPEntityOwner()) {
             return;
         }
@@ -63,7 +58,7 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase<EvpnR
     }
 
     @Override
-    protected void update(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork,
+    public void update(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork,
                           EvpnRdToNetwork rdToNetworkOld) {
         String rd = rdToNetwork.getRd();
         String elanName = rdToNetwork.getNetworkId();
@@ -73,7 +68,7 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase<EvpnR
     }
 
     @Override
-    protected void remove(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork) {
+    public void remove(InstanceIdentifier<EvpnRdToNetwork> instanceIdentifier, EvpnRdToNetwork rdToNetwork) {
         if (!bgpConfigManager.isBGPEntityOwner()) {
             return;
         }
@@ -96,4 +91,11 @@ public class EvpnRdNetworkListener extends AsyncDataTreeChangeListenerBase<EvpnR
             bgpUtil.deleteTepFromElanInstance(rd, tepIp);
         }
     }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
 }
index 1c0797af6dfefbc7cb0bb8621cd54f1855e53c96..cf737896c683ddbbdb8fef2faf1a9eda9fd36f1f 100644 (file)
@@ -17,10 +17,10 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
index d4d784cf3b0ca5fe77eb6379e8158817f3232586..7a1b7af0703dcff2216fdf200ecef6a77b30a50e 100644 (file)
@@ -4,7 +4,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default" />
   <reference id="entityOwnershipService"
              interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService" />
index 1b0b8ab724d1527ff895099a086f597189cd310d..4de34e6e102d288be5f97e96fa34bf700e0c56ec 100644 (file)
@@ -8,8 +8,8 @@
 package org.opendaylight.netvirt.bgpmanager.test;
 
 import java.util.Collection;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 
 public abstract class AbstractMockFibManager<D extends DataObject> implements DataTreeChangeListener<D> {
index 975fadc7adc235d3dbf8fa8b8d878334aa3ab9a1..f7295962d068646e5927b5e32abc3c186f30bbb5 100644 (file)
@@ -15,8 +15,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
 import org.opendaylight.netvirt.bgpmanager.BgpUtil;
 import org.opendaylight.netvirt.bgpmanager.FibDSWriter;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
index f4da5c6bb862232cad14bc5bffd8cc8a559cb3e4..6e567645e3027e59f8e7c500d0bb15a7988658fe 100644 (file)
@@ -8,11 +8,11 @@
 package org.opendaylight.netvirt.bgpmanager.test;
 
 import java.util.Collection;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
@@ -30,9 +30,9 @@ public class MockFibManager extends AbstractMockFibManager<VrfEntry> {
         registerListener(db) ;
     }
 
-    private void registerListener(final DataBroker db) {
+    public void registerListener(final DataBroker db) {
         final DataTreeIdentifier<VrfEntry> treeId =
-                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath());
+                DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, getWildCardPath());
         listenerRegistration = db.registerDataTreeChangeListener(treeId, MockFibManager.this);
     }
 
index f40be0f5e2d933854846ef20e969571185bb6e80..61c3387cedf6261e291606e0dfc20c57a36dee39 100644 (file)
             <artifactId>javax.inject</artifactId>
             <optional>true</optional>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.genius</groupId>
index 5948e1d948073c775479f9d7107ecd6e4733b188..df118f24811362ccf5c619d3d3f81ce5f802d0d0 100755 (executable)
@@ -7,15 +7,15 @@
  */
 package org.opendaylight.netvirt.cloudservicechain;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.List;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NWUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
index f964fa1c0480331915e0a434cee8dc6349026720..40a38ca16e8b41c8d52ee630e7ff686514d3cacb 100755 (executable)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.netvirt.cloudservicechain;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -19,9 +19,9 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceServiceUtil;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -92,7 +92,7 @@ public class VPNServiceChainHandler implements AutoCloseable {
     protected VpnInstanceOpDataEntry getVpnInstance(String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = InstanceIdentifier.create(VpnInstanceOpData.class)
                 .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd));
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id).orNull();
+        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id).orElse(null);
     }
 
     /**
@@ -304,7 +304,7 @@ public class VPNServiceChainHandler implements AutoCloseable {
             return SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                                                 LogicalDatastoreType.CONFIGURATION, boundServicesIId)
                                               .isPresent();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Error while reading [{}]", boundServicesIId, e);
             return false;
         }
@@ -344,7 +344,7 @@ public class VPNServiceChainHandler implements AutoCloseable {
         String vpnRd = VpnServiceChainUtils.getVpnRd(dataBroker, vpnName);
         if (vpnRd == null) {
             LOG.trace("Checking if Vpn {} participates in SC. Could not find its RD", vpnName);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return VpnServiceChainUtils.getVpnPseudoPortData(dataBroker, vpnRd);
index 71bfd50e41581f6d0f88c965bbf003d9578751e5..721e41d2de314c4b28fb74a4e46f1be2d314006a 100644 (file)
@@ -10,9 +10,9 @@ package org.opendaylight.netvirt.cloudservicechain.jobs;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.cloudservicechain.utils.VpnServiceChainUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.vpn.to.pseudo.port.list.VpnToPseudoPortData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.vpn.to.pseudo.port.list.VpnToPseudoPortDataBuilder;
index 6af40fd720ba589db41b63c24a0f8a7fb57a813b..5f22bdfb7d5ff86da263484e0e83419f565aae01 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.cloudservicechain.jobs;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.cloudservicechain.utils.VpnServiceChainUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.vpn.to.pseudo.port.list.VpnToPseudoPortData;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
index dfe7878509c85c19ac6d286592b618611b19595b..71c51dfe6500a6775db10bddd898aa4f74ccad87 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.netvirt.cloudservicechain.jobs;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 
@@ -18,7 +18,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
  * Modifies VpnPseudoPort stateful data. Objects of this class are intended to
  * be used with DataStoreJobCoordinator
  */
-public abstract class VpnPseudoPortDataBaseJob implements Callable<List<ListenableFuture<Void>>> {
+public abstract class VpnPseudoPortDataBaseJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     final ManagedNewTransactionRunner txRunner;
     protected final String vpnRd;
index 12e44d3a5df8fae6d5ba191d8d1c62b171f0c006..f948471db4b5f60840f202df248d4b5562e893da 100644 (file)
@@ -7,13 +7,13 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.netvirt.cloudservicechain.VPNServiceChainHandler;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
@@ -72,7 +72,7 @@ public class CloudScVpnInterfaceListener
                     LOG.trace("Vpn {} is not related to ServiceChaining. No further action", vpnName);
                     return;
                 }
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Error reading the ServiceChaining information for VPN {}", vpnName, e);
             }
             break;
@@ -101,7 +101,7 @@ public class CloudScVpnInterfaceListener
                 }
                 vpnScHandler.bindScfOnVpnInterface(vpnIfaceAdded.key().getName(),
                         optScfInfoForVpn.get().getScfTag());
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Error reading the ServiceChaining information for VPN {}", vpnName, e);
             }
         }
index de0384ff444b4b1157edbf2c5f68ce1e76d21599..a7752ee2e56ddcdcd07399164a4ac86e9f7503f8 100755 (executable)
@@ -7,14 +7,14 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
index 92f76c7fbc7034484155b899f9a089c2cc91605f..a6ad4c96a6536df1042a1e9a52a7f922990c0172 100755 (executable)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.cloudservicechain.listeners;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.netvirt.cloudservicechain.utils.VpnPseudoPortCache;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.VpnToPseudoPortList;
index ec0d036c682ca85eb442228ce7cd3de8ef22ec66..dbd81f6d301edc5905e1c863b40f5530bbb4a000 100644 (file)
@@ -7,14 +7,14 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.List;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.netvirt.cloudservicechain.CloudServiceChainConstants;
@@ -108,7 +108,7 @@ public class VpnToDpnListener implements OdlL3vpnListener {
             VpnServiceChainUtils.programLPortDispatcherFlowForScfToVpn(mdsalMgr, vpnId, dpnId,
                                                                        vpnToPseudoPortInfo.getVpnLportTag().intValue(),
                                                                        addOrRemove);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error retrieving the VPN to pseudo-port data for {}", rd, e);
         }
     }
index 913dbd6673c197d042c512acacd6694897118948..037d0df68c42b4f0448951341cfd17e6d0bf27a6 100644 (file)
@@ -14,8 +14,8 @@ import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MatchInfo;
index 9d0aec0e26f489d6b7042bf9c94b6dbcba1bebe9..fdf922689b0b821ef5f1cd8addf0d54a0f66fa1b 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.Collections;
@@ -16,8 +16,8 @@ import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
index 677fb430def5ea97f1f42766724965c3519bb843..90ca4c0ed511488461ba2ce86e0f6f08171d3b97 100755 (executable)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.utils;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -15,8 +15,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MatchInfo;
@@ -278,7 +278,7 @@ public final class ElanServiceChainUtils {
      *
      * @param broker dataBroker service reference
      * @param elanInstanceName the name of the Elan
-     * @return the ElanToPseudoPortData object or Optional.absent() if it
+     * @return the ElanToPseudoPortData object or Optional.empty() if it
      *     cannot be found
      */
     public static Optional<ElanServiceChainState> getElanServiceChainState(final DataBroker broker,
index 1960556c739e021e1fb241af1a0b6cb0e7a33017..2ce54f907436dcc87d941c42a192b2f917ab7bad 100755 (executable)
@@ -15,8 +15,8 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev160711.vpn.to.pseudo.port.list.VpnToPseudoPortData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,7 +44,7 @@ public class VpnPseudoPortCache {
             for (VpnToPseudoPortData vpnToPseudoPort : allVpnToPseudoPortData) {
                 add(vpnToPseudoPort.getVrfId(), vpnToPseudoPort.getVpnLportTag());
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading VPN to pseudo-port map", e);
         }
     }
index b2108d91f5f217ca220fb47a22a350051cdbb044..e0834c51b2e226c6b6d1c8949cdeef01096e3e6c 100755 (executable)
@@ -7,15 +7,15 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.utils;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
@@ -523,7 +523,7 @@ public final class VpnServiceChainUtils {
                             .flatMap(dpn -> dpn.getVpnInterfaces().stream())
                             .map(VpnInterfaces::getInterfaceName)
                             .collect(Collectors.toList());
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("getAllVpnInterfaces for vpn {}: Failure on read operation", vpnName, e);
             return Collections.emptyList();
         }
index 69c104b9da6564a8f0ebb20c012de38df4d4e7b6..fd9d1a22109c1e9e5ca6f11284071eb6b4847840 100644 (file)
@@ -3,7 +3,7 @@
            xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
            odl:use-default-for-reference-types="true">
 
-    <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+    <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker"
                odl:type="pingpong" />
     <reference id="iMdsalApiManager" interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
     <reference id="iVpnFootprintService" interface="org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService" />
index ef4e1be3efb130008c60a1d7b6a4f733f01b1170..6f486596fa6793405f309e96465166fbdfcb741a 100755 (executable)
@@ -17,7 +17,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.opendaylight.genius.mdsalutil.NWUtil.getEtherTypeFromIpPrefix;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
 import java.math.BigInteger;
 import java.util.Collections;
@@ -35,11 +35,11 @@ import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceServiceUtil;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
@@ -104,7 +104,7 @@ public class VPNServiceChainHandlerTest {
     private VPNServiceChainHandler vpnsch; // SUT
 
     @Mock DataBroker broker;
-    @Mock ReadOnlyTransaction readTx;
+    @Mock ReadTransaction readTx;
     @Mock WriteTransaction writeTx;
     @Mock IMdsalApiManager mdsalMgr;
     @Mock IVpnFootprintService vpnFootprintService;
@@ -156,7 +156,7 @@ public class VPNServiceChainHandlerTest {
         InstanceIdentifier<VpnInstance> id = VpnServiceChainUtils.getVpnInstanceToVpnIdIdentifier(vpnName);
         CheckedFuture chkdFuture = mock(CheckedFuture.class);
 
-        when(chkdFuture.checkedGet()).thenReturn(Optional.of(instance));
+        when(chkdFuture.get()).thenReturn(Optional.of(instance));
         // when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION), eq(id))).thenReturn(chkdFuture);
         when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION),
                          argThat(isIIdType(VpnInstance.class)))).thenReturn(chkdFuture);
@@ -165,7 +165,7 @@ public class VPNServiceChainHandlerTest {
 
     private void stubNoRdForVpnName(String vpnName) throws Exception {
         CheckedFuture<Optional<VpnInstance>, ReadFailedException> chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.absent());
+        when(chkdFuture.get()).thenReturn(Optional.empty());
         when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION),
                          eq(VpnServiceChainUtils.getVpnInstanceToVpnIdIdentifier(vpnName))))
             .thenReturn(chkdFuture);
@@ -173,7 +173,7 @@ public class VPNServiceChainHandlerTest {
 
     private void stubNoVpnInstanceForRD(String rd) throws Exception {
         CheckedFuture<Optional<VpnInstanceOpDataEntry>, ReadFailedException> chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.absent());
+        when(chkdFuture.get()).thenReturn(Optional.empty());
 
         InstanceIdentifier<VpnInstanceOpDataEntry> id = InstanceIdentifier.create(VpnInstanceOpData.class)
                 .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd));
@@ -199,7 +199,7 @@ public class VPNServiceChainHandlerTest {
                                                .setVpnToDpnList(Collections.singletonList(vtdlb.build()))
                                                .setVrfId("1").build();
         CheckedFuture chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.of(vpnInstanceOpDataEntry));
+        when(chkdFuture.get()).thenReturn(Optional.of(vpnInstanceOpDataEntry));
         when(readTx.read(eq(LogicalDatastoreType.OPERATIONAL),
                          eq(VpnServiceChainUtils.getVpnInstanceOpDataIdentifier(rd)))).thenReturn(chkdFuture);
     }
@@ -210,7 +210,7 @@ public class VPNServiceChainHandlerTest {
         VrfTables tables = new VrfTablesBuilder().withKey(new VrfTablesKey(rd)).setRouteDistinguisher(rd)
                                                  .setVrfEntry(vrfEntryList).build();
         CheckedFuture chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.of(tables));
+        when(chkdFuture.get()).thenReturn(Optional.of(tables));
         when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION), eq(VpnServiceChainUtils.buildVrfId(rd))))
                 .thenReturn(chkdFuture);
 
@@ -226,7 +226,7 @@ public class VPNServiceChainHandlerTest {
                           .collect(Collectors.toList());
 
         CheckedFuture chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.of(vpnIfacesList));
+        when(chkdFuture.get()).thenReturn(Optional.of(vpnIfacesList));
         when(readTx.read(eq(LogicalDatastoreType.OPERATIONAL),
                          eq(VpnServiceChainUtils.getVpnToDpnListIdentifier(rd, dpnId))))
              .thenReturn(chkdFuture);
@@ -240,7 +240,7 @@ public class VPNServiceChainHandlerTest {
                                                   CloudServiceChainConstants.COOKIE_SCF_BASE,
                                                   null /*instructions*/);
 
-        when(chkdFuture.checkedGet()).thenReturn(Optional.of(boundService));
+        when(chkdFuture.get()).thenReturn(Optional.of(boundService));
         when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION),
                          eq(VpnServiceChainUtils.buildBoundServicesIid(NwConstants.SCF_SERVICE_INDEX, ifName))))
              .thenReturn(chkdFuture);
@@ -248,7 +248,7 @@ public class VPNServiceChainHandlerTest {
 
     private void stubScfIsNotBoundOnIface(long scfTag, String ifName) throws Exception {
         CheckedFuture chkdFuture = mock(CheckedFuture.class);
-        when(chkdFuture.checkedGet()).thenReturn(Optional.absent());
+        when(chkdFuture.get()).thenReturn(Optional.empty());
         when(readTx.read(eq(LogicalDatastoreType.CONFIGURATION),
                          eq(VpnServiceChainUtils.buildBoundServicesIid(NwConstants.SCF_SERVICE_INDEX, ifName))))
              .thenReturn(chkdFuture);
index fd4e294bda1d02fd9733086996744a9a273311e4..f41e6722049b0cfe0312cb1e56a7f5db29103763 100644 (file)
@@ -36,10 +36,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>org.apache.karaf.shell.console</artifactId>
             <scope>provided</scope>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-eos-binding-api</artifactId>
index 35ace802c779f35fa9239d36089347a838f08a23..79bd80ef22ca22325f43db19c1b14b72e7622a58 100644 (file)
@@ -11,15 +11,17 @@ import java.math.BigInteger;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import javax.annotation.PreDestroy;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpAllocationPoolAddJob;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpAllocationPoolRemoveJob;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.DhcpAllocationPool;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.Network;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp_allocation_pool.rev161214.dhcp_allocation_pool.network.AllocationPool;
@@ -28,8 +30,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpAllocationPoolListener
-        extends AsyncDataTreeChangeListenerBase<AllocationPool, DhcpAllocationPoolListener> {
+public class DhcpAllocationPoolListener extends AbstractAsyncDataTreeChangeListener<AllocationPool> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpAllocationPoolListener.class);
 
@@ -40,17 +41,18 @@ public class DhcpAllocationPoolListener
 
     public DhcpAllocationPoolListener(final DhcpAllocationPoolManager dhcpAllocationPoolManager,
             final DataBroker dataBroker, final JobCoordinator jobCoordinator) {
-        super(AllocationPool.class, DhcpAllocationPoolListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(DhcpAllocationPool.class)
+                .child(Network.class).child(AllocationPool.class),
+                Executors.newListeningSingleThreadExecutor("DhcpAllocationPoolListener", LOG));
         this.dhcpAllocationPoolManager = dhcpAllocationPoolManager;
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.jobCoordinator = jobCoordinator;
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
         LOG.info("DhcpAllocationPoolListener initialized");
     }
 
     @Override
-    protected void add(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModification) {
+    public void add(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModification) {
         String networkId = key.firstKeyOf(Network.class).getNetworkId();
         dhcpAllocationPoolManager.createIdAllocationPool(networkId, dataObjectModification);
         Map<Uint64, List<String>> elanDpnInterfacesByName =
@@ -67,18 +69,7 @@ public class DhcpAllocationPoolListener
     }
 
     @Override
-    protected DhcpAllocationPoolListener getDataTreeChangeListener() {
-        return this;
-    }
-
-    @Override
-    protected InstanceIdentifier<AllocationPool> getWildCardPath() {
-        return InstanceIdentifier.builder(DhcpAllocationPool.class)//
-                .child(Network.class).child(AllocationPool.class).build();
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModification) {
+    public void remove(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModification) {
         String networkId = key.firstKeyOf(Network.class).getNetworkId();
         dhcpAllocationPoolManager.releaseIdAllocationPool(networkId, dataObjectModification);
         Map<Uint64, List<String>> elanDpnInterfacesByName =
@@ -91,9 +82,16 @@ public class DhcpAllocationPoolListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModificationBefore,
+    public void update(InstanceIdentifier<AllocationPool> key, AllocationPool dataObjectModificationBefore,
             AllocationPool dataObjectModificationAfter) {
         // TODO Auto-generated method stub
 
     }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
 }
index 453fa80f16f8614272b20be8d93a85cb7778c1db..15c93189bcb0657ed62419c1a1061f078e2d2f52 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
 import java.util.EventListener;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
@@ -21,13 +21,11 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
@@ -111,7 +109,7 @@ public class DhcpAllocationPoolManager implements AutoCloseable, EventListener {
     }
 
     @Nullable
-    public AllocationPool getAllocationPoolByNetwork(String networkId) throws ReadFailedException {
+    public AllocationPool getAllocationPoolByNetwork(String networkId) throws ExecutionException, InterruptedException {
         InstanceIdentifier<Network> network = InstanceIdentifier.builder(DhcpAllocationPool.class)
                 .child(Network.class, new NetworkKey(networkId)).build();
         Optional<Network> optionalNetworkConfData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
@@ -136,8 +134,15 @@ public class DhcpAllocationPoolManager implements AutoCloseable, EventListener {
     public Map<Uint64, List<String>> getElanDpnInterfacesByName(DataBroker broker, String elanInstanceName) {
         InstanceIdentifier<ElanDpnInterfacesList> elanDpnIfacesIid = InstanceIdentifier.builder(ElanDpnInterfaces.class)
                 .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build();
-        Optional<ElanDpnInterfacesList> elanDpnIfacesOpc = MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                elanDpnIfacesIid);
+        Optional<ElanDpnInterfacesList> elanDpnIfacesOpc;
+        try {
+            elanDpnIfacesOpc = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    elanDpnIfacesIid);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getElanDpnInterfacesByName: Exception while reading the ElanDpnInterfacesList DS for the "
+                    + "elan-instance {}", elanInstanceName, e);
+            return Collections.emptyMap();
+        }
         if (!elanDpnIfacesOpc.isPresent()) {
             LOG.warn("Could not find DpnInterfaces for elan {}", elanInstanceName);
             return Collections.emptyMap();
@@ -149,7 +154,7 @@ public class DhcpAllocationPoolManager implements AutoCloseable, EventListener {
     }
 
     @Nullable
-    public String getNetworkByPort(String portUuid) throws ReadFailedException {
+    public String getNetworkByPort(String portUuid) throws ExecutionException, InterruptedException {
         InstanceIdentifier<ElanInterface> elanInterfaceName = InstanceIdentifier.builder(ElanInterfaces.class)
                 .child(ElanInterface.class, new ElanInterfaceKey(portUuid)).build();
         Optional<ElanInterface> optionalElanInterface = SingleTransactionDataBroker.syncReadOptional(dataBroker,
index 3267c0de6867f2cde05dd6d26cd78ea01b310d42..14d13f2a7645c98d733c6ec4bbeccba1e7762224 100644 (file)
@@ -7,15 +7,15 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DhcpConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.dhcp.config.Configs;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -23,7 +23,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpConfigListener extends AsyncClusteredDataTreeChangeListenerBase<DhcpConfig, DhcpConfigListener> {
+public class DhcpConfigListener extends AbstractClusteredAsyncDataTreeChangeListener<DhcpConfig> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpConfigListener.class);
 
@@ -32,42 +32,38 @@ public class DhcpConfigListener extends AsyncClusteredDataTreeChangeListenerBase
 
     @Inject
     public DhcpConfigListener(final DataBroker db, final DhcpManager dhcpMgr) {
-        super(DhcpConfig.class, DhcpConfigListener.class);
+        super(db, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(DhcpConfig.class),
+                Executors.newListeningSingleThreadExecutor("DhcpConfigListener", LOG));
         dhcpManager = dhcpMgr;
         this.dataBroker = db;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<DhcpConfig> getWildCardPath() {
-        return InstanceIdentifier.create(DhcpConfig.class);
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     @Override
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.debug("DhcpConfig Listener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig del) {
+    public void remove(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig del) {
         LOG.trace("DhcpConfig removed: {}", del);
         updateConfig(null);
     }
 
     @Override
-    protected void update(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig original, DhcpConfig update) {
+    public void update(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig original, DhcpConfig update) {
         LOG.trace("DhcpConfig changed to {}", update);
         updateConfig(update);
     }
 
     @Override
-    protected void add(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig add) {
+    public void add(InstanceIdentifier<DhcpConfig> identifier, DhcpConfig add) {
         LOG.trace("DhcpConfig added {}", add);
         updateConfig(add);
     }
@@ -88,9 +84,4 @@ public class DhcpConfigListener extends AsyncClusteredDataTreeChangeListenerBase
             //TODO: What to do if string is ""
         }
     }
-
-    @Override
-    protected DhcpConfigListener getDataTreeChangeListener() {
-        return DhcpConfigListener.this;
-    }
 }
index 188f9461ce1bd64f204aa8c2b3f67b95d94d932c..0078cf1a48b841a056765b2242ab6df76fd844c9 100644 (file)
@@ -7,13 +7,13 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp.rev160428.DesignatedSwitchesForExternalTunnels;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp.rev160428.designated.switches._for.external.tunnels.DesignatedSwitchForTunnel;
@@ -25,8 +25,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpDesignatedDpnListener
-        extends AsyncClusteredDataTreeChangeListenerBase<DesignatedSwitchForTunnel, DhcpDesignatedDpnListener> {
+public class DhcpDesignatedDpnListener extends AbstractClusteredAsyncDataTreeChangeListener<DesignatedSwitchForTunnel> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpDesignatedDpnListener.class);
     private final DhcpExternalTunnelManager dhcpExternalTunnelManager;
@@ -37,16 +36,19 @@ public class DhcpDesignatedDpnListener
     public DhcpDesignatedDpnListener(final DhcpExternalTunnelManager dhcpExternalTunnelManager,
                                      final DataBroker broker,
                                      final DhcpserviceConfig config) {
-        super(DesignatedSwitchForTunnel.class, DhcpDesignatedDpnListener.class);
+        super(broker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(DesignatedSwitchesForExternalTunnels.class)
+                        .child(DesignatedSwitchForTunnel.class),
+                Executors.newListeningSingleThreadExecutor("DhcpDesignatedDpnListener", LOG));
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         this.broker = broker;
         this.config = config;
+        init();
     }
 
-    @PostConstruct
     public void init() {
         if (config.isControllerDhcpEnabled()) {
-            registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+            LOG.info("{} close", getClass().getSimpleName());
         }
     }
 
@@ -54,11 +56,15 @@ public class DhcpDesignatedDpnListener
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.debug("DhcpDesignatedDpnListener Listener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel del) {
+    public void remove(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel del) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.debug("Remove for DesignatedSwitchForTunnel : {}", del);
         dhcpExternalTunnelManager.removeFromLocalCache(Uint64.valueOf(del.getDpId()),
                 del.getTunnelRemoteIpAddress(), del.getElanInstanceName());
@@ -76,8 +82,11 @@ public class DhcpDesignatedDpnListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel original,
+    public void update(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel original,
             DesignatedSwitchForTunnel update) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.debug("Update for DesignatedSwitchForTunnel original {}, update {}", original, update);
         dhcpExternalTunnelManager.removeFromLocalCache(Uint64.valueOf(original.getDpId()),
                 original.getTunnelRemoteIpAddress(), original.getElanInstanceName());
@@ -103,7 +112,10 @@ public class DhcpDesignatedDpnListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel add) {
+    public void add(InstanceIdentifier<DesignatedSwitchForTunnel> identifier, DesignatedSwitchForTunnel add) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.debug("Add for DesignatedSwitchForTunnel : {}", add);
         Uint64 designatedDpnId = Uint64.valueOf(add.getDpId());
         IpAddress tunnelRemoteIpAddress = add.getTunnelRemoteIpAddress();
@@ -119,15 +131,4 @@ public class DhcpDesignatedDpnListener
                     subnetDhcpData.get().getPortMacaddress());
         }
     }
-
-    @Override
-    protected InstanceIdentifier<DesignatedSwitchForTunnel> getWildCardPath() {
-        return InstanceIdentifier.create(DesignatedSwitchesForExternalTunnels.class)
-                .child(DesignatedSwitchForTunnel.class);
-    }
-
-    @Override
-    protected DhcpDesignatedDpnListener getDataTreeChangeListener() {
-        return DhcpDesignatedDpnListener.this;
-    }
 }
index bf49cab29025a4d9ac89b7d4fd6361dcae6ea957..32437129b52310d9d7ca82e482aed75de0043ff3 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.netvirt.dhcpservice;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
@@ -21,6 +20,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -35,10 +35,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -55,6 +52,9 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.dhcpservice.api.IDhcpExternalTunnelManager;
@@ -175,8 +175,14 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager {
         LOG.trace("Loading designatedDpnsToTunnelIpElanNameCache");
         InstanceIdentifier<DesignatedSwitchesForExternalTunnels> instanceIdentifier =
                 InstanceIdentifier.builder(DesignatedSwitchesForExternalTunnels.class).build();
-        Optional<DesignatedSwitchesForExternalTunnels> designatedSwitchForTunnelOptional =
-                MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        Optional<DesignatedSwitchesForExternalTunnels> designatedSwitchForTunnelOptional;
+        try {
+            designatedSwitchForTunnelOptional = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("initilizeCaches: Exception while reading the DesignatedSwitchesForExternalTunnels DS", e);
+            return;
+        }
         if (designatedSwitchForTunnelOptional.isPresent()) {
             List<DesignatedSwitchForTunnel> list =
                 designatedSwitchForTunnelOptional.get().nonnullDesignatedSwitchForTunnel();
@@ -197,7 +203,14 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager {
         }
         LOG.trace("Loading vniMacAddressToPortCache");
         InstanceIdentifier<Ports> inst = InstanceIdentifier.builder(Neutron.class).child(Ports.class).build();
-        Optional<Ports> optionalPorts = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+        Optional<Ports> optionalPorts;
+        try {
+            optionalPorts = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    inst);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("initilizeCaches: Exception while reading the Ports DS", e);
+            return;
+        }
         if (optionalPorts.isPresent()) {
             List<Port> list = optionalPorts.get().nonnullPort();
             for (Port port : list) {
@@ -287,8 +300,15 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager {
                 InstanceIdentifier.builder(DesignatedSwitchesForExternalTunnels.class)
                         .child(DesignatedSwitchForTunnel.class,
                                 new DesignatedSwitchForTunnelKey(elanInstanceName, tunnelIp)).build();
-        Optional<DesignatedSwitchForTunnel> designatedSwitchForTunnelOptional =
-                MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        Optional<DesignatedSwitchForTunnel> designatedSwitchForTunnelOptional;
+        try {
+            designatedSwitchForTunnelOptional = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("readDesignatedSwitchesForExternalTunnel: Exception while reading the DesignatedSwitchForTunnel "
+                    + "DS for the elan-instance {} tunnelIp {}", elanInstanceName, tunnelIp, e);
+            return Uint64.ZERO;
+        }
         if (designatedSwitchForTunnelOptional.isPresent()) {
             return Uint64.valueOf(designatedSwitchForTunnelOptional.get().getDpId());
         }
@@ -350,8 +370,15 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager {
     private boolean isDpnDesignatedDpn(Uint64 dpId) {
         InstanceIdentifier<DesignatedSwitchesForExternalTunnels> instanceIdentifier =
                 InstanceIdentifier.builder(DesignatedSwitchesForExternalTunnels.class).build();
-        Optional<DesignatedSwitchesForExternalTunnels> designatedSwitchForTunnelOptional =
-                MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        Optional<DesignatedSwitchesForExternalTunnels> designatedSwitchForTunnelOptional;
+        try {
+            designatedSwitchForTunnelOptional = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, instanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("isDpnDesignatedDpn: Exception while reading the DesignatedSwitchesForExternalTunnels "
+                    + "DS for the dpId {}", dpId, e);
+            return false;
+        }
         if (designatedSwitchForTunnelOptional.isPresent()) {
             List<DesignatedSwitchForTunnel> list =
                     designatedSwitchForTunnelOptional.get().nonnullDesignatedSwitchForTunnel();
@@ -837,13 +864,13 @@ public class DhcpExternalTunnelManager implements IDhcpExternalTunnelManager {
                 .setLogicalSwitchRef(lsRef).build();
         InstanceIdentifier<RemoteMcastMacs> iid = HwvtepSouthboundUtils.createRemoteMcastMacsInstanceIdentifier(
                 dstDevice.getNodeId(), remoteMcastMacs.key());
-        ReadOnlyTransaction transaction = broker.newReadOnlyTransaction();
+        ReadTransaction transaction = broker.newReadOnlyTransaction();
         try {
             //TODO do async mdsal read
-            remoteMcastMacs = transaction.read(LogicalDatastoreType.CONFIGURATION, iid).checkedGet().get();
+            remoteMcastMacs = transaction.read(LogicalDatastoreType.CONFIGURATION, iid).get().get();
             locators.addAll(remoteMcastMacs.getLocatorSet());
             return new RemoteMcastMacsBuilder(remoteMcastMacs).setLocatorSet(new ArrayList<>(locators)).build();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read the macs {}", iid);
         } finally {
             transaction.close();
index e6ac823e212bfaa0ee2b3f19d5ad9cc48e77ab7b..bc0897a58beff8aee521f3232b91330b664aae49 100644 (file)
@@ -11,14 +11,16 @@ package org.opendaylight.netvirt.dhcpservice;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.Collections;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import javax.annotation.PreDestroy;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 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.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
@@ -31,8 +33,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceConfigListener
-        extends AsyncDataTreeChangeListenerBase<Interface, DhcpInterfaceConfigListener> {
+public class DhcpInterfaceConfigListener extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceConfigListener.class);
 
@@ -44,22 +45,25 @@ public class DhcpInterfaceConfigListener
     public DhcpInterfaceConfigListener(DataBroker dataBroker,
             DhcpExternalTunnelManager dhcpExternalTunnelManager, DhcpManager dhcpManager,
             JobCoordinator jobCoordinator) {
-        super(Interface.class, DhcpInterfaceConfigListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Interfaces.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("DhcpInterfaceConfigListener", LOG));
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         this.dhcpManager = dhcpManager;
         this.jobCoordinator = jobCoordinator;
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
+    @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.info("DhcpInterfaceConfigListener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface del) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface del) {
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(del.getName()), () -> {
             IfTunnel tunnelInterface = del.augmentation(IfTunnel.class);
             IfL2vlan vlanInterface = del.augmentation(IfL2vlan.class);
@@ -85,12 +89,12 @@ public class DhcpInterfaceConfigListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
+    public void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
         // Handled in update () DhcpInterfaceEventListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface add) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface add) {
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(add.getName()), () -> {
             String interfaceName = add.getName();
             IfL2vlan vlanInterface = add.augmentation(IfL2vlan.class);
@@ -109,14 +113,4 @@ public class DhcpInterfaceConfigListener
             return Collections.emptyList();
         }, DhcpMConstants.RETRY_COUNT);
     }
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
-    }
-
-    @Override
-    protected DhcpInterfaceConfigListener getDataTreeChangeListener() {
-        return DhcpInterfaceConfigListener.this;
-    }
 }
index 94600b8b1d4e31066482ad4867d5003fb1849b75..fd3515839b41b1ac24a3336725f16df7fd757e75 100644 (file)
@@ -8,17 +8,19 @@
 package org.opendaylight.netvirt.dhcpservice;
 
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import javax.annotation.PreDestroy;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceAddJob;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceRemoveJob;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceUpdateJob;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
@@ -32,8 +34,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceEventListener
-        extends AsyncDataTreeChangeListenerBase<Interface, DhcpInterfaceEventListener> {
+public class DhcpInterfaceEventListener extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceEventListener.class);
 
@@ -51,7 +52,9 @@ public class DhcpInterfaceEventListener
                                       IInterfaceManager interfaceManager, IElanService elanService,
                                       DhcpPortCache dhcpPortCache, JobCoordinator jobCoordinator,
                                       ItmRpcService itmRpcService) {
-        super(Interface.class, DhcpInterfaceEventListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("DhcpInterfaceEventListener", LOG));
         this.dhcpManager = dhcpManager;
         this.dataBroker = dataBroker;
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
@@ -60,17 +63,18 @@ public class DhcpInterfaceEventListener
         this.dhcpPortCache = dhcpPortCache;
         this.jobCoordinator = jobCoordinator;
         this.itmRpcService = itmRpcService;
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
+    @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.info("DhcpInterfaceEventListener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface del) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface del) {
         if (!L2vlan.class.equals(del.getType()) && !Tunnel.class.equals(del.getType())) {
             return;
         }
@@ -93,7 +97,7 @@ public class DhcpInterfaceEventListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier,
+    public void update(InstanceIdentifier<Interface> identifier,
             Interface original, Interface update) {
         // We're only interested in Vlan and Tunnel ports
         if (!L2vlan.class.equals(update.getType()) && !Tunnel.class.equals(update.getType())) {
@@ -120,7 +124,7 @@ public class DhcpInterfaceEventListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface add) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface add) {
         // We're only interested in Vlan and Tunnel ports
         if (!L2vlan.class.equals(add.getType()) && !Tunnel.class.equals(add.getType())) {
             return;
@@ -144,14 +148,4 @@ public class DhcpInterfaceEventListener
                 add, dpnId, interfaceManager, elanService, itmRpcService);
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(interfaceName), job, DhcpMConstants.RETRY_COUNT);
     }
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
-    }
-
-    @Override
-    protected DhcpInterfaceEventListener getDataTreeChangeListener() {
-        return DhcpInterfaceEventListener.this;
-    }
 }
index 5e806ab1941d51ab197785a9450ef88140c57943..856bf03d441fee92731497f8eea87ef2e6c31cbc 100644 (file)
@@ -7,15 +7,16 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Predicate;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
 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;
@@ -64,25 +65,32 @@ public class DhcpL2GwUtil {
 
     @Nullable
     private IpAddress getTunnelIp(InstanceIdentifier<Node> nodeIid) {
-        Optional<Node> nodeOptional =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, nodeIid);
-        if (!CONTAINS_GLOBAL_AUGMENTATION.test(nodeOptional)) {
-            return null;
-        }
-        List<Switches> switchIids = nodeOptional.get().augmentation(HwvtepGlobalAugmentation.class).getSwitches();
-        if (EMPTY_LIST.test(switchIids)) {
-            return null;
-        }
-        InstanceIdentifier<Node> psIid = (InstanceIdentifier<Node>) switchIids.get(0).getSwitchRef().getValue();
-        nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, psIid);
-        if (!CONTAINS_SWITCH_AUGMENTATION.test(nodeOptional)) {
-            return null;
-        }
-        List<TunnelIps> tunnelIps = nodeOptional.get().augmentation(PhysicalSwitchAugmentation.class).getTunnelIps();
-        if (EMPTY_LIST.test(tunnelIps)) {
+        Optional<Node> nodeOptional;
+        try {
+            nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, nodeIid);
+            if (!CONTAINS_GLOBAL_AUGMENTATION.test(nodeOptional)) {
+                return null;
+            }
+            List<Switches> switchIids = nodeOptional.get().augmentation(HwvtepGlobalAugmentation.class).getSwitches();
+            if (EMPTY_LIST.test(switchIids)) {
+                return null;
+            }
+            InstanceIdentifier<Node> psIid = (InstanceIdentifier<Node>) switchIids.get(0).getSwitchRef().getValue();
+            nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    psIid);
+            if (!CONTAINS_SWITCH_AUGMENTATION.test(nodeOptional)) {
+                return null;
+            }
+            List<TunnelIps> tunnelIps = nodeOptional.get().augmentation(PhysicalSwitchAugmentation.class)
+                    .getTunnelIps();
+            if (EMPTY_LIST.test(tunnelIps)) {
+                return null;
+            }
+            return tunnelIps.get(0).key().getTunnelIpsKey();
+        } catch (ExecutionException | InterruptedException e) {
             return null;
         }
-        return tunnelIps.get(0).key().getTunnelIpsKey();
     }
 
 }
index 54fd5ba4cbce0cd5efe143f5d763eed1cfe8b38d..7d77420155a55aa51cdfa421ed27ed2bda6c0249 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -17,8 +17,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
@@ -35,6 +34,8 @@ import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -170,7 +171,14 @@ public class DhcpManager {
         Subnet subnet = null;
         InstanceIdentifier<Subnet> inst = InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet
                 .class, new SubnetKey(subnetId));
-        Optional<Subnet> sn = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+        Optional<Subnet> sn;
+        try {
+            sn = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    inst);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading subnet DS for the subnetId {}", subnetId.getValue(), e);
+            return subnet;
+        }
         if (sn.isPresent()) {
             subnet = sn.get();
         }
@@ -183,7 +191,14 @@ public class DhcpManager {
         Port prt = null;
         InstanceIdentifier<Port> inst = InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class,
                 new PortKey(new Uuid(name)));
-        Optional<Port> port = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+        Optional<Port> port;
+        try {
+            port = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    inst);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while reading port DS for the port {}", name, e);
+            return prt;
+        }
         if (port.isPresent()) {
             prt = port.get();
         }
index 8ff9e81fbf9c994936eeb030302d31c42e9110c0..67fb5f0d4b175031b0950c5366ecdf3b7c07b0ff 100644 (file)
@@ -14,13 +14,13 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
-import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractAsyncDataTreeChangeListener;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.dhcpservice.config.rev150710.DhcpserviceConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
index 9e8dd0822577cba08baa489c084651ebfbb647f8..a242c1d35043e86d700d6dd40930466d2e5c0afa 100644 (file)
@@ -15,19 +15,18 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.function.Consumer;
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput.ArpReponderInputBuilder;
@@ -35,6 +34,7 @@ import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
@@ -50,8 +50,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpNeutronPortListener
-        extends AsyncClusteredDataTreeChangeListenerBase<Port, DhcpNeutronPortListener> {
+public class DhcpNeutronPortListener extends AbstractClusteredAsyncDataTreeChangeListener<Port> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpNeutronPortListener.class);
     private final DhcpExternalTunnelManager dhcpExternalTunnelManager;
@@ -69,8 +68,9 @@ public class DhcpNeutronPortListener
             @Named("elanService") IElanService ielanService, IInterfaceManager interfaceManager,
             DhcpserviceConfig config, final JobCoordinator jobCoordinator, DhcpManager dhcpManager,
             ItmRpcService itmRpcService) {
-
-        super(Port.class, DhcpNeutronPortListener.class);
+        super(db, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class).child(Ports.class)
+                .child(Port.class),
+                Executors.newListeningSingleThreadExecutor("DhcpNeutronPortListener", LOG));
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         this.elanService = ielanService;
         this.interfaceManager = interfaceManager;
@@ -80,29 +80,28 @@ public class DhcpNeutronPortListener
         this.jobCoordinator = jobCoordinator;
         this.dhcpManager = dhcpManager;
         this.itmRpcService = itmRpcService;
+        init();
     }
 
-    @PostConstruct
     public void init() {
         if (config.isControllerDhcpEnabled()) {
-            registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+            LOG.info("{} init", getClass().getSimpleName());
         }
     }
 
-    @Override
-    protected InstanceIdentifier<Port> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class);
-    }
-
     @Override
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.debug("DhcpNeutronPortListener Listener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Port> identifier, Port del) {
+    public void remove(InstanceIdentifier<Port> identifier, Port del) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.trace("Port removed: {}", del);
         if (NeutronConstants.IS_ODL_DHCP_PORT.test(del)) {
             jobCoordinator.enqueueJob(getJobKey(del),
@@ -131,7 +130,10 @@ public class DhcpNeutronPortListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
+    public void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.trace("Port changed to {}", update);
         //With Ipv6 changes we can get ipv4 subnets later. The below check is to support such scenario.
         if (original.nonnullFixedIps().size() < update.nonnullFixedIps().size()) {
@@ -190,7 +192,10 @@ public class DhcpNeutronPortListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<Port> identifier, Port add) {
+    public void add(InstanceIdentifier<Port> identifier, Port add) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.trace("Port added {}", add);
         if (NeutronConstants.IS_ODL_DHCP_PORT.test(add)) {
             jobCoordinator.enqueueJob(getJobKey(add),
@@ -257,11 +262,6 @@ public class DhcpNeutronPortListener
         return vnicType.equals("direct") || vnicType.equals("macvtap");
     }
 
-    @Override
-    protected DhcpNeutronPortListener getDataTreeChangeListener() {
-        return DhcpNeutronPortListener.this;
-    }
-
     /**
      * Handle(Add/Remove) ARP Responder for DHCP IP on all the DPNs when DHCP is
      * enabled/disabled on subnet add or update or delete.
index 42a595a176bcad971ad8441b1fada0175cf54bfe..2a69cb524a7c3ece86fc9f9708e4a63f14127bb1 100644 (file)
@@ -9,14 +9,13 @@
 package org.opendaylight.netvirt.dhcpservice;
 
 import java.math.BigInteger;
-
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -26,34 +25,31 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpNodeListener extends AsyncClusteredDataTreeChangeListenerBase<Node, DhcpNodeListener> {
+public class DhcpNodeListener extends AbstractClusteredAsyncDataTreeChangeListener<Node> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpNodeListener.class);
     private final DataBroker broker;
 
     @Inject
     public DhcpNodeListener(DataBroker broker) {
-        super(Node.class, DhcpNodeListener.class);
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class),
+                Executors.newListeningSingleThreadExecutor("DhcpNodeListener", LOG));
         this.broker = broker;
     }
 
-    @PostConstruct
-    public void start() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+    public void init() {
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
+    @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class);
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<Node> key, Node del) {
+    public void remove(InstanceIdentifier<Node> key, Node del) {
         LOG.trace("Received remove for {}", del);
         NodeId nodeId = del.getId();
         String[] node =  nodeId.getValue().split(":");
@@ -66,12 +62,12 @@ public class DhcpNodeListener extends AsyncClusteredDataTreeChangeListenerBase<N
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> key, Node dataObjectModificationBefore,
+    public void update(InstanceIdentifier<Node> key, Node dataObjectModificationBefore,
             Node dataObjectModificationAfter) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<Node> key, Node add) {
+    public void add(InstanceIdentifier<Node> key, Node add) {
         LOG.trace("Received add for {}", add);
         NodeId nodeId = add.getId();
         String[] node =  nodeId.getValue().split(":");
@@ -82,10 +78,4 @@ public class DhcpNodeListener extends AsyncClusteredDataTreeChangeListenerBase<N
         BigInteger dpId = new BigInteger(node[1]);
         DhcpServiceUtils.addToDpnIdCache(Uint64.valueOf(dpId));
     }
-
-    @Override
-    protected DhcpNodeListener getDataTreeChangeListener() {
-        return DhcpNodeListener.this;
-    }
-
 }
index 0d9b64243285950c45b243e708db6d4618cdde03..78655b7d688767eb9d9c1318ee4c5ea2e0e6b06b 100644 (file)
@@ -24,8 +24,6 @@ import org.apache.commons.net.util.SubnetUtils;
 import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
@@ -41,6 +39,7 @@ import org.opendaylight.infrautils.metrics.Labeled;
 import org.opendaylight.infrautils.metrics.MetricDescriptor;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.api.DHCP;
 import org.opendaylight.netvirt.dhcpservice.api.DHCPConstants;
 import org.opendaylight.netvirt.dhcpservice.api.DHCPUtils;
@@ -315,7 +314,7 @@ public class DhcpPktHandler implements PacketProcessingListener {
                 default:
                     break;
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading from MD-SAL", e);
         }
         return null;
index 8a2e6264fc77d66f3fee79221f48570c9b1ce40b..10650acd8927b80d204a16a545c0d59496f9acab 100644 (file)
@@ -8,9 +8,8 @@
 
 package org.opendaylight.netvirt.dhcpservice;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -20,6 +19,7 @@ import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.function.BiConsumer;
@@ -28,9 +28,7 @@ import java.util.stream.Collectors;
 import java.util.stream.LongStream;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -58,6 +56,8 @@ import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.mdsalutil.matches.MatchUdpDestinationPort;
 import org.opendaylight.genius.mdsalutil.matches.MatchUdpSourcePort;
 import org.opendaylight.genius.utils.ServiceIndex;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
@@ -260,13 +260,18 @@ public final class DhcpServiceUtils {
         if (!connectedDpnIds.isEmpty()) {
             return connectedDpnIds;
         }
-        return extractDpnsFromNodes(MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifier.builder(Nodes.class).build()));
+        try {
+            return extractDpnsFromNodes(MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                    InstanceIdentifier.builder(Nodes.class).build()));
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getListOfDpns: Exception while reading getListOfDpns DS", e);
+            return Collections.emptyList();
+        }
     }
 
     @NonNull
     private static List<Uint64> extractDpnsFromNodes(Optional<Nodes> optionalNodes) {
-        return optionalNodes.toJavaUtil().map(
+        return optionalNodes.map(
             nodes -> nodes.nonnullNode().stream().map(Node::getId).filter(Objects::nonNull).map(
                     MDSALUtil::getDpnIdFromNodeName).collect(
                     Collectors.toList())).orElse(Collections.emptyList());
@@ -278,8 +283,15 @@ public final class DhcpServiceUtils {
         InstanceIdentifier<ElanDpnInterfacesList> elanDpnInstanceIdentifier =
                 InstanceIdentifier.builder(ElanDpnInterfaces.class)
                         .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build();
-        Optional<ElanDpnInterfacesList> elanDpnOptional =
-                MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInstanceIdentifier);
+        Optional<ElanDpnInterfacesList> elanDpnOptional;
+        try {
+            elanDpnOptional = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    elanDpnInstanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getDpnsForElan: Exception while reading ElanDpnInterfacesList DS for the elanInstanceName {}",
+                    elanInstanceName, e);
+            return Collections.emptyList();
+        }
         if (elanDpnOptional.isPresent()) {
             List<DpnInterfaces> dpns = elanDpnOptional.get().nonnullDpnInterfaces();
             for (DpnInterfaces dpnInterfaces : dpns) {
@@ -299,7 +311,7 @@ public final class DhcpServiceUtils {
                 .interfaces.state.Interface> interfaceId = InstanceIdentifier.builder(InterfacesState.class)
                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
                         .interfaces.state.Interface.class, interfaceKey).build();
-        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, interfaceId, dataBroker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, interfaceId, dataBroker).orElse(null);
     }
 
 
@@ -307,7 +319,14 @@ public final class DhcpServiceUtils {
     public static String getSegmentationId(Uuid networkId, DataBroker broker) {
         InstanceIdentifier<Network> inst = InstanceIdentifier.create(Neutron.class)
                 .child(Networks.class).child(Network.class, new NetworkKey(networkId));
-        Optional<Network> optionalNetwork = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+        Optional<Network> optionalNetwork;
+        try {
+            optionalNetwork = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getSegmentationId: Exception while reading Network DS for the Network {}",
+                    networkId.getValue(), e);
+            return null;
+        }
         if (!optionalNetwork.isPresent()) {
             return null;
         }
@@ -399,7 +418,7 @@ public final class DhcpServiceUtils {
         try {
             return java.util.Optional
                     .ofNullable(SingleTransactionDataBroker.syncRead(broker, LogicalDatastoreType.CONFIGURATION, id));
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.warn("Failed to read SubnetToDhcpPort for DS due to error {}", e.getMessage());
         }
         return java.util.Optional.empty();
@@ -492,7 +511,15 @@ public final class DhcpServiceUtils {
     @NonNull
     public static List<Uuid> getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier id = buildNetworkMapIdentifier(networkId);
-        Optional<NetworkMap> optionalNetworkMap = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<NetworkMap> optionalNetworkMap;
+        try {
+            optionalNetworkMap = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getSubnetIdsFromNetworkId: Exception while reading NetworkMap DS for the network {}",
+                    networkId.getValue(), e);
+            return Collections.emptyList();
+        }
         if (optionalNetworkMap.isPresent()) {
             @Nullable List<Uuid> subnetIdList = optionalNetworkMap.get().getSubnetIdList();
             if (subnetIdList != null) {
@@ -511,7 +538,15 @@ public final class DhcpServiceUtils {
         final SubnetKey subnetkey = new SubnetKey(subnetUuid);
         final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
                 .child(Subnets.class).child(Subnet.class, subnetkey);
-        final Optional<Subnet> subnet = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
+        final Optional<Subnet> subnet;
+        try {
+            subnet = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    subnetidentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("isIpv4Subnet: Exception while reading Subnet DS for the Subnet {}",
+                    subnetUuid.getValue(), e);
+            return false;
+        }
         if (subnet.isPresent()) {
             Class<? extends IpVersionBase> ipVersionBase = subnet.get().getIpVersion();
             return IpVersionV4.class.equals(ipVersionBase);
index f8fb73c599b83fafbd822a1904f3ed87e4f8481a..c371cd0e89a2536509a6d3a5ede7e9333f1f805c 100644 (file)
@@ -10,23 +10,23 @@ package org.opendaylight.netvirt.dhcpservice;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 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.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -47,7 +47,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpSubnetListener extends AsyncClusteredDataTreeChangeListenerBase<Subnet, DhcpSubnetListener> {
+public class DhcpSubnetListener extends AbstractClusteredAsyncDataTreeChangeListener<Subnet> {
     private static final Logger LOG = LoggerFactory.getLogger(DhcpSubnetListener.class);
 
     private final DataBroker dataBroker;
@@ -59,38 +59,37 @@ public class DhcpSubnetListener extends AsyncClusteredDataTreeChangeListenerBase
     @Inject
     public DhcpSubnetListener(final DhcpManager dhcpManager, final DhcpExternalTunnelManager
             dhcpExternalTunnelManager, final DataBroker broker, final DhcpserviceConfig config) {
-        super(Subnet.class, DhcpSubnetListener.class);
+        super(broker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class).child(Subnets.class)
+                .child(Subnet.class), Executors.newListeningSingleThreadExecutor("DhcpSubnetListener", LOG));
         this.dhcpManager = dhcpManager;
         this.dataBroker = broker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         this.config = config;
+        init();
     }
 
-    @PostConstruct
     public void init() {
         if (config.isControllerDhcpEnabled()) {
-            registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+            LOG.info("{} init", getClass().getSimpleName());
         }
     }
 
     @Override
-    protected void add(InstanceIdentifier<Subnet> identifier, Subnet add) {
+    public void add(InstanceIdentifier<Subnet> identifier, Subnet add) {
 
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnet> identifier, Subnet del) {
+    public void remove(InstanceIdentifier<Subnet> identifier, Subnet del) {
 
     }
 
     @Override
-    protected InstanceIdentifier<Subnet> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet.class);
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
+    public void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         LOG.trace("DhcpSubnetListener Update : Original dhcpstatus: {}, Updated dhcpstatus {}", original.isEnableDhcp(),
                 update.isEnableDhcp());
 
@@ -234,7 +233,7 @@ public class DhcpSubnetListener extends AsyncClusteredDataTreeChangeListenerBase
         SubnetmapBuilder builder = null ;
         InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class)
                 .child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
-        ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
+        ReadTransaction tx = broker.newReadOnlyTransaction();
 
         Optional<Subnetmap> sn ;
         try {
@@ -257,11 +256,7 @@ public class DhcpSubnetListener extends AsyncClusteredDataTreeChangeListenerBase
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.info("DhcpSubnetListener Closed");
     }
-
-    @Override
-    protected DhcpSubnetListener getDataTreeChangeListener() {
-        return DhcpSubnetListener.this;
-    }
 }
index de2fc8a64933a55b2eb987be6b9c549545986d3e..df8cadea6254883957101e6b8e2614d5eabc9ac9 100644 (file)
@@ -7,21 +7,22 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
@@ -39,8 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class DhcpUCastMacListener
-        extends AsyncClusteredDataTreeChangeListenerBase<LocalUcastMacs, DhcpUCastMacListener> {
+public class DhcpUCastMacListener extends AbstractClusteredAsyncDataTreeChangeListener<LocalUcastMacs> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpUCastMacListener.class);
     private final DhcpExternalTunnelManager dhcpExternalTunnelManager;
@@ -51,36 +51,37 @@ public class DhcpUCastMacListener
     @Inject
     public DhcpUCastMacListener(final DhcpManager dhcpManager, final DhcpExternalTunnelManager dhcpExtTunnelMgr,
                                 final DataBroker dataBroker, final DhcpserviceConfig config) {
-        super(LocalUcastMacs.class, DhcpUCastMacListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class).child(Node.class).augmentation(HwvtepGlobalAugmentation.class)
+                .child(LocalUcastMacs.class),
+                Executors.newListeningSingleThreadExecutor("DhcpUCastMacListener", LOG));
         this.broker = dataBroker;
         this.dhcpExternalTunnelManager = dhcpExtTunnelMgr;
         this.dhcpManager = dhcpManager;
         this.config = config;
+        init();
     }
 
-    @PostConstruct
     public void init() {
         if (config.isControllerDhcpEnabled()) {
-            registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+            LOG.info("{} init", getClass().getSimpleName());
         }
     }
 
-    @Override
-    protected InstanceIdentifier<LocalUcastMacs> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class).child(Node.class)
-                .augmentation(HwvtepGlobalAugmentation.class).child(LocalUcastMacs.class);
-    }
-
     @Override
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.info("DhcpUCastMacListener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<LocalUcastMacs> identifier,
+    public void remove(InstanceIdentifier<LocalUcastMacs> identifier,
             LocalUcastMacs del) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         // Flow removal for table 18 is handled in Neutron Port delete.
         //remove the new CR-DHCP
         NodeId torNodeId = identifier.firstKeyOf(Node.class).getNodeId();
@@ -101,20 +102,29 @@ public class DhcpUCastMacListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<LocalUcastMacs> identifier,
+    public void update(InstanceIdentifier<LocalUcastMacs> identifier,
             LocalUcastMacs original, LocalUcastMacs update) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    protected void add(InstanceIdentifier<LocalUcastMacs> identifier,
+    public void add(InstanceIdentifier<LocalUcastMacs> identifier,
             LocalUcastMacs add) {
+        if (!config.isControllerDhcpEnabled()) {
+            return;
+        }
         NodeId torNodeId = identifier.firstKeyOf(Node.class).getNodeId();
         InstanceIdentifier<LogicalSwitches> logicalSwitchRef =
                 (InstanceIdentifier<LogicalSwitches>) add.getLogicalSwitchRef().getValue();
-        Optional<LogicalSwitches> logicalSwitchOptional =
-                MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef);
+        Optional<LogicalSwitches> logicalSwitchOptional;
+        try {
+            logicalSwitchOptional = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.OPERATIONAL, logicalSwitchRef);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("add: Exception while reading LogicalSwitches DS for the TOR Node ID {}", torNodeId, e);
+            return;
+        }
         if (!logicalSwitchOptional.isPresent()) {
             LOG.error("Logical Switch ref doesn't have data {}", logicalSwitchRef);
             return;
@@ -157,11 +167,12 @@ public class DhcpUCastMacListener
     private LogicalSwitches getLogicalSwitches(LocalUcastMacs ucastMacs) {
         InstanceIdentifier<LogicalSwitches> logicalSwitchRef =
                 (InstanceIdentifier<LogicalSwitches>)ucastMacs.getLogicalSwitchRef().getValue();
-        return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef).orNull();
-    }
-
-    @Override
-    protected DhcpUCastMacListener getDataTreeChangeListener() {
-        return DhcpUCastMacListener.this;
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    logicalSwitchRef).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getLogicalSwitches: Exception while reading LogicalSwitches DS for ucastMacs {}", ucastMacs, e);
+            return null;
+        }
     }
 }
index 8a9027b66b62223d35da7d57cfffdcae6997c8db..c47d8e34203965bd38f447c963ea9007757d5765 100644 (file)
@@ -7,17 +7,17 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -27,7 +27,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NodeListener extends AsyncDataTreeChangeListenerBase<Node, NodeListener> {
+public class NodeListener extends AbstractAsyncDataTreeChangeListener<Node> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NodeListener.class);
 
@@ -39,30 +39,29 @@ public class NodeListener extends AsyncDataTreeChangeListenerBase<Node, NodeList
     @Inject
     public NodeListener(final DataBroker db, final DhcpManager dhcpMgr,
             final DhcpExternalTunnelManager dhcpExternalTunnelManager) {
-        super(Node.class, NodeListener.class);
+        super(db, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class),
+                Executors.newListeningSingleThreadExecutor("NodeListener", LOG));
         this.broker = db;
         this.dhcpManager = dhcpMgr;
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         this.txRunner = new ManagedNewTransactionRunnerImpl(db);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node del) {
+    public void remove(InstanceIdentifier<Node> identifier, Node del) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
 
     }
 
     @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node add) {
+    public void add(InstanceIdentifier<Node> identifier, Node add) {
         NodeId nodeId = add.getId();
         String[] node =  nodeId.getValue().split(":");
         if (node.length < 2) {
@@ -89,16 +88,7 @@ public class NodeListener extends AsyncDataTreeChangeListenerBase<Node, NodeList
     @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.debug("Node Listener Closed");
     }
-
-    @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class);
-    }
-
-    @Override
-    protected NodeListener getDataTreeChangeListener() {
-        return NodeListener.this;
-    }
 }
index 06ca214c3b1116fb1aa8d381f2fa7b588083c3c2..e5ad1861dac984ddaf3380ee08d19801d1675f9a 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.netvirt.dhcpservice.DhcpServiceUtils;
 
-public class DhcpAllocationPoolAddJob implements Callable<List<ListenableFuture<Void>>> {
+public class DhcpAllocationPoolAddJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private final ManagedNewTransactionRunner txRunner;
     private final String interfaceName;
index 3aff1a0c108691b530086d4acabaea581fd85972..df4c798a89c630c3d1dbac8472ebcacf82d0656d 100644 (file)
@@ -16,7 +16,7 @@ import java.util.concurrent.Callable;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.netvirt.dhcpservice.DhcpServiceUtils;
 
-public class DhcpAllocationPoolRemoveJob implements Callable<List<ListenableFuture<Void>>> {
+public class DhcpAllocationPoolRemoveJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private final ManagedNewTransactionRunner txRunner;
     private final String interfaceName;
index defb8469f8a8968266c580e371df6ee5f5a1f95b..b85a9d575ab1862c115d94311b008f8fab897607 100644 (file)
@@ -16,11 +16,11 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.DhcpExternalTunnelManager;
 import org.opendaylight.netvirt.dhcpservice.DhcpManager;
 import org.opendaylight.netvirt.dhcpservice.DhcpServiceUtils;
@@ -39,7 +39,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceAddJob implements Callable<List<ListenableFuture<Void>>> {
+public class DhcpInterfaceAddJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceAddJob.class);
 
index 3e64f02b0449ff9c0abeb3d52bdb20b5bb979dac..509e65ef1e6cd175f24d2d45e2606b0384bcfec3 100644 (file)
@@ -17,12 +17,12 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.DhcpExternalTunnelManager;
 import org.opendaylight.netvirt.dhcpservice.DhcpManager;
 import org.opendaylight.netvirt.dhcpservice.DhcpServiceUtils;
@@ -41,7 +41,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceRemoveJob implements Callable<List<ListenableFuture<Void>>> {
+public class DhcpInterfaceRemoveJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceRemoveJob.class);
 
@@ -120,7 +120,7 @@ public class DhcpInterfaceRemoveJob implements Callable<List<ListenableFuture<Vo
         InstanceIdentifier<InterfaceNameMacAddress> instanceIdentifier =
                 InstanceIdentifier.builder(InterfaceNameMacAddresses.class)
                         .child(InterfaceNameMacAddress.class, new InterfaceNameMacAddressKey(interfaceName)).build();
-        return tx.read(instanceIdentifier).get().toJavaUtil().map(
+        return tx.read(instanceIdentifier).get().map(
             interfaceNameMacAddress -> {
                 String vmMacAddress = interfaceNameMacAddress.getMacAddress();
                 LOG.trace("Entry for interface found in InterfaceNameVmMacAddress map {}, {}", interfaceName,
index 065b1d5f217db4093d0ac1414b5f9feccea746fa..dd4a3239062c3cc6f7ae600c94c4114313f4d5d9 100644 (file)
@@ -11,8 +11,8 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.DhcpExternalTunnelManager;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
@@ -22,7 +22,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceUpdateJob implements Callable<List<ListenableFuture<Void>>> {
+public class DhcpInterfaceUpdateJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceUpdateJob.class);
     private final DhcpExternalTunnelManager dhcpExternalTunnelManager;
index 1034d3e072817ce319cff65712164e114c46d7b0..7b9024a0a59e4c9e7d6f1fd6ccf4064e35170ea1 100644 (file)
@@ -4,7 +4,7 @@
   odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-    interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+    interface="org.opendaylight.mdsal.binding.api.DataBroker"
     odl:type="default" />
   <reference id="entityOwnershipService"
     interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService" />
index f7ab4fb04828dfc3a8b0c68bb5d1a27da179d491..c054cb85aeb8d02b46d3aaa932d891fe95b995e6 100644 (file)
@@ -10,12 +10,11 @@ package org.opendaylight.netvirt.elanmanager.api;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList;
@@ -64,7 +63,7 @@ public final class ElanHelper {
                 return existingElanDpnInterfaces.getDpnInterfaces().stream().flatMap(v -> v.getInterfaces().stream())
                         .collect(Collectors.toList());
             }
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.warn("Failed to read ElanDpnInterfacesList with error {}", e.getMessage());
         }
         return Collections.emptyList();
index ceaabd68c57d6f3f89295b65d3e5646c97415e02..d2358de27bc36fb1a2be2d28113c2b7d7995dd68 100644 (file)
@@ -75,10 +75,14 @@ this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>neutronvpn-api</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
-        </dependency>
+        </dependency>-->
+       <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+       </dependency>
         <dependency>
             <groupId>org.opendaylight.ovsdb</groupId>
             <artifactId>hwvtepsouthbound-api</artifactId>
@@ -156,11 +160,17 @@ this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
             <version>${genius.version}</version>
             <scope>test</scope>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
             <scope>test</scope>
             <type>test-jar</type>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
index 757e9653fa827bed79e1e8b1d8cde4fa8028cc20..1e4c36e5c7888f5b20d942021d0bb76562dd4b4f 100644 (file)
@@ -9,12 +9,11 @@ package org.opendaylight.netvirt.elan.cache;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.cache.InstanceIdDataObjectCache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 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.hwvtep.global.attributes.RemoteMcastMacs;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
index 1f30d60c266409cba2ff4f3e213b11034883f001..7c691273c6a002b81d679832f4dbca03f247c063 100644 (file)
@@ -7,19 +7,19 @@
  */
 package org.opendaylight.netvirt.elan.cache;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.mdsalutil.cache.InstanceIdDataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elan.utils.Scheduler;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
@@ -63,7 +63,7 @@ public class ElanInstanceCache extends InstanceIdDataObjectCache<ElanInstance> {
             return get(ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName));
         } catch (ReadFailedException e) {
             LOG.warn("Error reading ElanInstance {}", elanInstanceName, e);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
index 975885b043a4e52d3bf6ceae700e59afef5c05df..5cb5af1e271848dbab83417d80253da57fc05a34 100644 (file)
@@ -7,20 +7,20 @@
  */
 package org.opendaylight.netvirt.elan.cache;
 
-import com.google.common.base.Optional;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.mdsalutil.cache.InstanceIdDataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
@@ -53,15 +53,15 @@ public class ElanInterfaceCache extends InstanceIdDataObjectCache<ElanInterface>
             return get(ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName));
         } catch (ReadFailedException e) {
             LOG.warn("Error reading ElanInterface {}", interfaceName, e);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
     @NonNull
     public Optional<EtreeInterface> getEtreeInterface(@NonNull String interfaceName) {
         Optional<ElanInterface> elanInterface = get(interfaceName);
-        return elanInterface.isPresent() ? Optional.fromNullable(
-                elanInterface.get().augmentation(EtreeInterface.class)) : Optional.absent();
+        return elanInterface.isPresent() ? Optional.ofNullable(
+                elanInterface.get().augmentation(EtreeInterface.class)) : Optional.empty();
     }
 
     @NonNull
index 71a2b6699e967a3da13c43f5e37603abab6b5a3b..70a561fea5e07e86276e4a7f7ada3cb0f84c53ab 100644 (file)
@@ -9,7 +9,6 @@
 package org.opendaylight.netvirt.elan.cli.l2gw;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.File;
@@ -21,17 +20,18 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LogicalSwitchesCmd;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.MergeCommand;
@@ -119,19 +119,19 @@ public class L2GwValidateCli extends OsgiCommandSupport {
             verifyConfigVsOperationalDiff();
             verifyL2GatewayConnections();
             pw.close();
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             session.getConsole().println("Failed with error " + e.getMessage());
             LOG.error("Failed with error ", e);
         }
         return null;
     }
 
-    private void readNodes() throws ReadFailedException {
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+    private void readNodes() throws ExecutionException, InterruptedException {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
             InstanceIdentifier<Topology> topoId = HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier();
 
-            Optional<Topology> operationalTopoOptional = tx.read(LogicalDatastoreType.OPERATIONAL, topoId).checkedGet();
-            Optional<Topology> configTopoOptional = tx.read(LogicalDatastoreType.CONFIGURATION, topoId).checkedGet();
+            Optional<Topology> operationalTopoOptional = tx.read(LogicalDatastoreType.OPERATIONAL, topoId).get();
+            Optional<Topology> configTopoOptional = tx.read(LogicalDatastoreType.CONFIGURATION, topoId).get();
 
             if (operationalTopoOptional.isPresent()) {
                 for (Node node : operationalTopoOptional.get().nonnullNode()) {
@@ -150,7 +150,7 @@ public class L2GwValidateCli extends OsgiCommandSupport {
             fillNodesData(configNodes, configNodesData);
 
             Optional<ElanInstances> elanInstancesOptional = tx.read(LogicalDatastoreType.CONFIGURATION,
-                    InstanceIdentifier.builder(ElanInstances.class).build()).checkedGet();
+                    InstanceIdentifier.builder(ElanInstances.class).build()).get();
 
             if (elanInstancesOptional.isPresent() && elanInstancesOptional.get().getElanInstance() != null) {
                 for (ElanInstance elanInstance : elanInstancesOptional.get().getElanInstance()) {
index e597e2fdb21ff287bbd34750a43b0d86820af777..6894dfbc61b150c27466916a7214e5da6f733a12 100644 (file)
@@ -8,22 +8,23 @@
 
 package org.opendaylight.netvirt.elan.cli.l2gw;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -95,71 +96,75 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
     protected Object doExecute() {
         List<Node> nodes = new ArrayList<>();
         Set<String> networks = new HashSet<>();
-        if (nodeId == null) {
-            Optional<Topology> topologyOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                    createHwvtepTopologyInstanceIdentifier());
-            if (topologyOptional.isPresent()) {
-                nodes.addAll(topologyOptional.get().nonnullNode());
-            }
-        } else {
-            Optional<Node> nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                    createInstanceIdentifier(new NodeId(new Uri(nodeId))));
-            if (nodeOptional.isPresent()) {
-                nodes.add(nodeOptional.get());
+        try {
+            if (nodeId == null) {
+                Optional<Topology> topologyOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                        LogicalDatastoreType.OPERATIONAL, createHwvtepTopologyInstanceIdentifier());
+                if (topologyOptional.isPresent()) {
+                    nodes.addAll(topologyOptional.get().nonnullNode());
+                }
+            } else {
+                Optional<Node> nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                        LogicalDatastoreType.OPERATIONAL, createInstanceIdentifier(new NodeId(new Uri(nodeId))));
+                if (nodeOptional.isPresent()) {
+                    nodes.add(nodeOptional.get());
+                }
             }
-        }
-        if (elanName == null) {
-            //get all elan instance
-            //get all device node id
-            //print result
-            Optional<ElanInstances> elanInstancesOptional = MDSALUtil.read(dataBroker,
-                    LogicalDatastoreType.CONFIGURATION,
-                    InstanceIdentifier.builder(ElanInstances.class).build());
-            if (elanInstancesOptional.isPresent()) {
-                List<ElanInstance> elans = elanInstancesOptional.get().getElanInstance();
-                if (elans != null) {
-                    for (ElanInstance elan : elans) {
-                        networks.add(elan.getElanInstanceName());
+            if (elanName == null) {
+                //get all elan instance
+                //get all device node id
+                //print result
+                Optional<ElanInstances> elanInstancesOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                        LogicalDatastoreType.CONFIGURATION,
+                        InstanceIdentifier.builder(ElanInstances.class).build());
+                if (elanInstancesOptional.isPresent()) {
+                    List<ElanInstance> elans = elanInstancesOptional.get().getElanInstance();
+                    if (elans != null) {
+                        for (ElanInstance elan : elans) {
+                            networks.add(elan.getElanInstanceName());
+                        }
                     }
                 }
+            } else {
+                networks.add(elanName);
             }
-        } else {
-            networks.add(elanName);
-        }
 
-        if (nodes != null) {
-            for (Node node : nodes) {
-                if (node.getNodeId().getValue().contains("physicalswitch")) {
-                    continue;
-                }
-                Node hwvtepConfigNode =
-                        HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION, node.getNodeId());
-                Node hwvtepOpPsNode = getPSnode(node, LogicalDatastoreType.OPERATIONAL);
-                Node hwvtepConfigPsNode = null;
-                if (hwvtepOpPsNode != null) {
-                    hwvtepConfigPsNode = HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                            hwvtepOpPsNode.getNodeId());
-                    opPSNodes.put(node.getNodeId(), hwvtepOpPsNode);
-                }
-                opNodes.put(node.getNodeId(), node);
-                configNodes.put(node.getNodeId(), hwvtepConfigNode);
-
-                if (hwvtepConfigPsNode != null) {
-                    configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
-                }
-            }
-        }
-        if (!networks.isEmpty()) {
-            for (String network : networks) {
-                session.getConsole().println("Network info for " + network);
+            if (nodes != null) {
                 for (Node node : nodes) {
                     if (node.getNodeId().getValue().contains("physicalswitch")) {
                         continue;
                     }
-                    session.getConsole().println("Printing for node " + node.getNodeId().getValue());
-                    process(node.getNodeId(), network);
+                    Node hwvtepConfigNode =
+                            HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION, node.getNodeId());
+                    Node hwvtepOpPsNode = getPSnode(node, LogicalDatastoreType.OPERATIONAL);
+                    Node hwvtepConfigPsNode = null;
+                    if (hwvtepOpPsNode != null) {
+                        hwvtepConfigPsNode = HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                                hwvtepOpPsNode.getNodeId());
+                        opPSNodes.put(node.getNodeId(), hwvtepOpPsNode);
+                    }
+                    opNodes.put(node.getNodeId(), node);
+                    configNodes.put(node.getNodeId(), hwvtepConfigNode);
+
+                    if (hwvtepConfigPsNode != null) {
+                        configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
+                    }
+                }
+            }
+            if (!networks.isEmpty()) {
+                for (String network : networks) {
+                    session.getConsole().println("Network info for " + network);
+                    for (Node node : nodes) {
+                        if (node.getNodeId().getValue().contains("physicalswitch")) {
+                            continue;
+                        }
+                        session.getConsole().println("Printing for node " + node.getNodeId().getValue());
+                        process(node.getNodeId(), network);
+                    }
                 }
             }
+        } catch (ExecutionException | InterruptedException e) {
+            session.getConsole().println("Failed with error " + e.getMessage());
         }
         return null;
     }
@@ -342,7 +347,8 @@ public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
     }
 
     @Nullable
-    Node getPSnode(Node hwvtepNode, LogicalDatastoreType datastoreType) {
+    Node getPSnode(Node hwvtepNode, LogicalDatastoreType datastoreType) throws ExecutionException,
+            InterruptedException {
         if (hwvtepNode.augmentation(HwvtepGlobalAugmentation.class) != null) {
             List<Switches> switches = hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).getSwitches();
             if (switches != null) {
index a5d44ab60ffc14b9448c4a28a28d6448578599b0..b61f13d7bae6f1b75680ab3e2c9f80819a1331ef 100644 (file)
@@ -8,15 +8,15 @@
 
 package org.opendaylight.netvirt.elan.evpn.listeners;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.evpn.utils.EvpnUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanForwardingTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.forwarding.tables.MacTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -26,7 +26,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanMacEntryListener extends AsyncDataTreeChangeListenerBase<MacEntry, ElanMacEntryListener> {
+public class ElanMacEntryListener extends AbstractAsyncDataTreeChangeListener<MacEntry> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanMacEntryListener.class);
     private final DataBroker broker;
@@ -36,35 +36,23 @@ public class ElanMacEntryListener extends AsyncDataTreeChangeListenerBase<MacEnt
     @Inject
     public ElanMacEntryListener(final DataBroker broker, final EvpnUtils evpnUtils,
             final ElanInstanceCache elanInstanceCache) {
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanForwardingTables.class)
+                .child(MacTable.class).child(MacEntry.class),
+                Executors.newListeningSingleThreadExecutor("ElanMacEntryListener", LOG));
         this.broker = broker;
         this.evpnUtils = evpnUtils;
         this.elanInstanceCache = elanInstanceCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
-    }
-
-    @Override
-    // Confusing with CacheElanInstanceListener.getWildcardPath but this method is implemented from an interface.
-    @SuppressFBWarnings("NM_CONFUSING")
-    protected InstanceIdentifier<MacEntry> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanForwardingTables.class)
-                .child(MacTable.class).child(MacEntry.class).build();
-    }
-
-    @Override
-    protected ElanMacEntryListener getDataTreeChangeListener() {
-        return ElanMacEntryListener.this;
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected void add(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry) {
+    public void add(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry) {
         LOG.info("ElanMacEntryListener : ADD macEntry {} ", instanceIdentifier);
         String elanName = instanceIdentifier.firstKeyOf(MacTable.class).getElanInstanceName();
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         if (EvpnUtils.getEvpnNameFromElan(elanInfo) == null) {
             LOG.trace("ElanMacEntryListener : Add evpnName is null for elan {} ", elanInfo);
             return;
@@ -73,10 +61,10 @@ public class ElanMacEntryListener extends AsyncDataTreeChangeListenerBase<MacEnt
     }
 
     @Override
-    protected void remove(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry) {
+    public void remove(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry) {
         LOG.info("ElanMacEntryListener : remove macEntry {} ", instanceIdentifier);
         String elanName = instanceIdentifier.firstKeyOf(MacTable.class).getElanInstanceName();
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         if (EvpnUtils.getEvpnNameFromElan(elanInfo) == null) {
             LOG.trace("ElanMacEntryListener : Remove evpnName is null for elan {} ", elanInfo);
             return;
@@ -85,6 +73,13 @@ public class ElanMacEntryListener extends AsyncDataTreeChangeListenerBase<MacEnt
     }
 
     @Override
-    protected void update(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry, MacEntry t1) {
+    public void update(InstanceIdentifier<MacEntry> instanceIdentifier, MacEntry macEntry, MacEntry t1) {
+    }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 776a8af04e8971a1069f74e96c7ffa258150b37d..f24f7b7fd8202c7eacb6ba3c0cc906f0f5fbea29 100644 (file)
@@ -11,18 +11,19 @@ package org.opendaylight.netvirt.elan.evpn.listeners;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.evpn.utils.EvpnMacVrfUtils;
 import org.opendaylight.netvirt.elan.evpn.utils.EvpnUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 
 @Singleton
-public class EvpnElanInstanceListener extends AsyncDataTreeChangeListenerBase<ElanInstance, EvpnElanInstanceListener> {
+public class EvpnElanInstanceListener extends AbstractAsyncDataTreeChangeListener<ElanInstance> {
     private static final Logger LOG = LoggerFactory.getLogger(EvpnElanInstanceListener.class);
     private final DataBroker broker;
     private final ManagedNewTransactionRunner txRunner;
@@ -45,7 +46,9 @@ public class EvpnElanInstanceListener extends AsyncDataTreeChangeListenerBase<El
     @Inject
     public EvpnElanInstanceListener(final DataBroker dataBroker, final EvpnUtils evpnUtils,
                                     EvpnMacVrfUtils evpnMacVrfUtils, IMdsalApiManager mdsalApiManager) {
-        super(ElanInstance.class, EvpnElanInstanceListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ElanInstances.class)
+                .child(ElanInstance.class),
+                Executors.newListeningSingleThreadExecutor("EvpnElanInstanceListener", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.evpnUtils = evpnUtils;
@@ -53,27 +56,20 @@ public class EvpnElanInstanceListener extends AsyncDataTreeChangeListenerBase<El
         this.mdsalManager = mdsalApiManager;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<ElanInstance> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class).build();
+    public void add(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance evpnAugmentation) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance evpnAugmentation) {
+    public void remove(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance evpnAugmentation) {
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance evpnAugmentation) {
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance original,
+    public void update(InstanceIdentifier<ElanInstance> instanceIdentifier, ElanInstance original,
                           ElanInstance update) {
         String elanName = update.getElanInstanceName();
         LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, confTx -> {
@@ -100,8 +96,9 @@ public class EvpnElanInstanceListener extends AsyncDataTreeChangeListenerBase<El
     }
 
     @Override
-    protected EvpnElanInstanceListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
-
 }
index 7c463ea2630efc01db3d206fac19d398572c6246..06045c972d3747c05ee9e1142131aaeac3b9b259 100644 (file)
@@ -8,13 +8,14 @@
 
 package org.opendaylight.netvirt.elan.evpn.listeners;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.evpn.utils.EvpnMacVrfUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.macvrfentries.MacVrfEntry;
@@ -35,48 +36,46 @@ import org.slf4j.LoggerFactory;
  * received dest MAC in all the DPN's (with this network footprint).
  */
 @Singleton
-public class MacVrfEntryListener extends AsyncDataTreeChangeListenerBase<MacVrfEntry, MacVrfEntryListener> {
+public class MacVrfEntryListener extends AbstractAsyncDataTreeChangeListener<MacVrfEntry> {
     private static final Logger LOG = LoggerFactory.getLogger(MacVrfEntryListener.class);
     private final DataBroker broker;
     private final EvpnMacVrfUtils evpnMacVrfUtils;
 
     @Inject
     public MacVrfEntryListener(final DataBroker broker, final EvpnMacVrfUtils evpnMacVrfUtils) {
+        super(broker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(FibEntries.class)
+                .child(VrfTables.class).child(MacVrfEntry.class),
+                Executors.newListeningSingleThreadExecutor("MacVrfEntryListener", LOG));
         this.broker = broker;
         this.evpnMacVrfUtils = evpnMacVrfUtils;
 
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
-    }
-
-    @Override
-    protected InstanceIdentifier<MacVrfEntry> getWildCardPath() {
-        return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(MacVrfEntry.class);
-    }
-
-    @Override
-    protected MacVrfEntryListener getDataTreeChangeListener() {
-        return MacVrfEntryListener.this;
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected void add(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry) {
+    public void add(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry) {
         LOG.info("ADD: Adding DMAC Entry for MACVrfEntry {} ", macVrfEntry);
         evpnMacVrfUtils.addEvpnDmacFlow(instanceIdentifier, macVrfEntry);
     }
 
     @Override
-    protected void update(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry, MacVrfEntry t1) {
+    public void update(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry, MacVrfEntry t1) {
 
     }
 
     @Override
-    protected void remove(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry) {
+    public void remove(InstanceIdentifier<MacVrfEntry> instanceIdentifier, MacVrfEntry macVrfEntry) {
         LOG.info("REMOVE: Removing DMAC Entry for MACVrfEntry {} ", macVrfEntry);
         evpnMacVrfUtils.removeEvpnDmacFlow(instanceIdentifier, macVrfEntry);
     }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
 }
index cfc65d30185c6d79bc7f58360a2ed220fa7942f0..ce51c4b6b6effe569c1f9f205939cb9dfc970412 100644 (file)
@@ -15,7 +15,6 @@ import java.util.Collections;
 import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -24,6 +23,7 @@ import org.opendaylight.genius.mdsalutil.MatchInfo;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanEtreeUtils;
 import org.opendaylight.netvirt.elan.utils.ElanItmUtils;
index a163ca9d3d2358f88c68de43fcc0ff36c4361b7a..b25486c63b0d3b6a6d5ee9fafd31c037cfe2ac6f 100644 (file)
@@ -7,23 +7,23 @@
  */
 package org.opendaylight.netvirt.elan.evpn.utils;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
@@ -81,7 +81,7 @@ public class EvpnMacVrfUtils {
         if (elanName == null) {
             LOG.error("getElanTag: elanName is NULL for iid = {}", macVrfEntryIid);
         }
-        ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
         if (elanInstance == null) {
             return null;
         }
@@ -94,7 +94,7 @@ public class EvpnMacVrfUtils {
     }
 
     public String getElanNameByMacvrfiid(InstanceIdentifier<MacVrfEntry> instanceIdentifier) {
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
             String rd = instanceIdentifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
             String elanName = null;
             InstanceIdentifier<EvpnRdToNetwork> iidEvpnRdToNet =
@@ -102,11 +102,11 @@ public class EvpnMacVrfUtils {
                             new EvpnRdToNetworkKey(rd)).build();
             try {
                 Optional<EvpnRdToNetwork> evpnRdToNetwork =
-                        tx.read(LogicalDatastoreType.CONFIGURATION, iidEvpnRdToNet).checkedGet();
+                        tx.read(LogicalDatastoreType.CONFIGURATION, iidEvpnRdToNet).get();
                 if (evpnRdToNetwork.isPresent()) {
                     elanName = evpnRdToNetwork.get().getNetworkId();
                 }
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("getElanName: unable to read elanName, exception ", e);
             }
             return elanName;
@@ -148,7 +148,7 @@ public class EvpnMacVrfUtils {
     }
 
     public boolean checkEvpnAttachedToNet(String elanName) {
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         String evpnName = EvpnUtils.getEvpnNameFromElan(elanInfo);
         if (evpnName == null) {
             LOG.error("Error : evpnName is null for elanName {}", elanName);
index f7474943d9f503cea4f4ac644c30ef0eb82a6ef0..9b1127f12ee304fc132c2dcea64e845b77585897 100644 (file)
@@ -9,13 +9,13 @@ package org.opendaylight.netvirt.elan.evpn.utils;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 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.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.function.BiConsumer;
@@ -25,11 +25,6 @@ import java.util.function.Predicate;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
@@ -47,6 +42,10 @@ import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.utils.SettableFutureCallback;
@@ -132,7 +131,7 @@ public class EvpnUtils {
             return;
         }
         String rd = vpnManager.getVpnRd(broker, evpnName);
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         macEntries.stream().filter(isIpv4PrefixAvailable).forEach(macEntry -> {
             InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(macEntry.getInterface());
             if (interfaceInfo == null) {
@@ -235,7 +234,7 @@ public class EvpnUtils {
         if (l3VpName != null) {
             VpnInstance l3VpnInstance = vpnManager.getVpnInstance(broker, l3VpName);
             l3vni = l3VpnInstance.getL3vni();
-            com.google.common.base.Optional<String> gatewayMac = getGatewayMacAddressForInterface(l3VpName,
+            Optional<String> gatewayMac = getGatewayMacAddressForInterface(l3VpName,
                     interfaceName, prefix);
             gatewayMacAddr = gatewayMac.isPresent() ? gatewayMac.get() : null;
 
@@ -321,11 +320,11 @@ public class EvpnUtils {
         ExternalTunnelList externalTunnelList = null;
         try {
             externalTunnelList = elanUtils.read2(LogicalDatastoreType.CONFIGURATION,
-                    externalTunnelListId).orNull();
-        } catch (ReadFailedException e) {
+                    externalTunnelListId).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getExternalTunnelList: unable to read ExternalTunnelList, exception ", e);
         }
-        return Optional.fromNullable(externalTunnelList);
+        return Optional.ofNullable(externalTunnelList);
     }
 
     public static InstanceIdentifier<DcGatewayIpList> getDcGatewayIpListIdentifier() {
@@ -338,11 +337,11 @@ public class EvpnUtils {
         DcGatewayIpList dcGatewayIpListConfig = null;
         try {
             dcGatewayIpListConfig = elanUtils.read2(LogicalDatastoreType.CONFIGURATION,
-                    dcGatewayIpListInstanceIdentifier).orNull();
-        } catch (ReadFailedException e) {
+                    dcGatewayIpListInstanceIdentifier).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getDcGatewayTunnelInterfaceNameList: unable to read DcGatewayTunnelList, exception ", e);
         }
-        return Optional.fromNullable(dcGatewayIpListConfig);
+        return Optional.ofNullable(dcGatewayIpListConfig);
     }
 
     public List<String> getDcGatewayTunnelInterfaceNameList() {
@@ -417,28 +416,33 @@ public class EvpnUtils {
         Uint32 elanTag = elanInfo.getElanTag();
         List<MatchInfo> mkMatches = new ArrayList<>();
         mkMatches.add(new MatchTunnelId(Uint64.valueOf(ElanUtils.getVxlanSegmentationId(elanInfo).longValue())));
-        NWUtil.getOperativeDPNs(broker).forEach(dpnId -> {
-            LOG.debug("Updating tunnel flow to dpnid {}", dpnId);
-            List<InstructionInfo> instructions = getInstructionsForExtTunnelTable(elanTag);
-            String flowRef = getFlowRef(NwConstants.L2VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, elanTag.longValue(), dpnId);
-            FlowEntity flowEntity = MDSALUtil.buildFlowEntity(
-                    dpnId,
-                    NwConstants.L2VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
-                    flowRef,
-                    5, // prio
-                    elanInfo.getElanInstanceName(), // flowName
-                    0, // idleTimeout
-                    0, // hardTimeout
-                    Uint64.valueOf(ITMConstants.COOKIE_ITM_EXTERNAL.longValue() + elanTag.longValue()),
-                    mkMatches,
-                    instructions);
-            flowHandler.accept(dpnId, flowEntity);
-        });
+        try {
+            NWUtil.getOperativeDPNs(broker).forEach(dpnId -> {
+                LOG.debug("Updating tunnel flow to dpnid {}", dpnId);
+                List<InstructionInfo> instructions = getInstructionsForExtTunnelTable(elanTag);
+                String flowRef = getFlowRef(NwConstants.L2VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, elanTag.longValue(), dpnId);
+                FlowEntity flowEntity = MDSALUtil.buildFlowEntity(
+                        dpnId,
+                        NwConstants.L2VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
+                        flowRef,
+                        5, // prio
+                        elanInfo.getElanInstanceName(), // flowName
+                        0, // idleTimeout
+                        0, // hardTimeout
+                        Uint64.valueOf(ITMConstants.COOKIE_ITM_EXTERNAL.longValue() + elanTag.longValue()),
+                        mkMatches,
+                        instructions);
+                flowHandler.accept(dpnId, flowEntity);
+            });
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("programEvpnL2vniFlow: Exception while programming Evpn L2vni flow for elanInstance {}",
+                    elanInfo, e);
+        }
     }
 
     public void programEvpnL2vniDemuxTable(String elanName, final BiConsumer<String, String> serviceHandler,
                                            BiConsumer<Uint64, FlowEntity> flowHandler) {
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         List<String> tunnelInterfaceNameList = getDcGatewayTunnelInterfaceNameList();
         if (tunnelInterfaceNameList.isEmpty()) {
             LOG.info("No DC gateways tunnels while programming l2vni table for elan {}.", elanName);
@@ -456,7 +460,7 @@ public class EvpnUtils {
             SettableFuture<Optional<T>> settableFuture = SettableFuture.create();
             List futures = Collections.singletonList(settableFuture);
 
-            try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+            try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
                 Futures.addCallback(tx.read(datastoreType, iid),
                         new SettableFutureCallback<Optional<T>>(settableFuture) {
                             @Override
index 41caf64514f46f9bc8ca810a9f14ad8da9b557a7..30903578c53c6d77a805544e1b95f710be5e14d5 100644 (file)
@@ -22,14 +22,14 @@ import java.util.Random;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
index 247c967b6d97f87e31b29b778121b688ffd7cc14..b864f2e2fefbf7313daac1256589141a09a00c67 100644 (file)
@@ -10,15 +10,15 @@ package org.opendaylight.netvirt.elan.internal;
 import static java.util.Collections.emptyList;
 
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceDpnsCache;
 import org.opendaylight.netvirt.elan.l2gw.jobs.BcGroupUpdateJob;
@@ -31,6 +31,7 @@ import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
 import org.opendaylight.netvirt.elan.utils.ElanDmacUtils;
 import org.opendaylight.netvirt.elan.utils.ElanItmUtils;
 import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces;
@@ -41,7 +42,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanDpnInterfaceClusteredListener
-        extends AsyncClusteredDataTreeChangeListenerBase<DpnInterfaces, ElanDpnInterfaceClusteredListener> {
+        extends AbstractClusteredAsyncDataTreeChangeListener<DpnInterfaces> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanDpnInterfaceClusteredListener.class);
     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("NetvirtEventLogger");
@@ -67,6 +68,9 @@ public class ElanDpnInterfaceClusteredListener
                                              ElanInstanceDpnsCache elanInstanceDpnsCache,
                                              ElanRefUtil elanRefUtil, ElanDmacUtils elanDmacUtils,
                                              ElanItmUtils elanItmUtils) {
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanDpnInterfaces.class)
+                .child(ElanDpnInterfacesList.class).child(DpnInterfaces.class),
+                Executors.newListeningSingleThreadExecutor("ElanDpnInterfaceClusteredListener", LOG));
         this.broker = broker;
         this.entityOwnershipUtils = entityOwnershipUtils;
         this.elanL2GatewayUtils = elanL2GatewayUtils;
@@ -80,15 +84,8 @@ public class ElanDpnInterfaceClusteredListener
         this.elanInstanceDpnsCache = elanInstanceDpnsCache;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, this.broker);
-    }
-
-    @Override
-    public InstanceIdentifier<DpnInterfaces> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class)
-                .child(DpnInterfaces.class).build();
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     void handleUpdate(InstanceIdentifier<DpnInterfaces> id, DpnInterfaces dpnInterfaces) {
@@ -106,7 +103,7 @@ public class ElanDpnInterfaceClusteredListener
     }
 
     @Override
-    protected void remove(InstanceIdentifier<DpnInterfaces> identifier, final DpnInterfaces dpnInterfaces) {
+    public void remove(InstanceIdentifier<DpnInterfaces> identifier, final DpnInterfaces dpnInterfaces) {
         // this is the last dpn interface on this elan
         final String elanName = getElanName(identifier);
         //Cache need to be updated in all cluster nodes and not only by leader node .
@@ -138,7 +135,7 @@ public class ElanDpnInterfaceClusteredListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
+    public void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
                           final DpnInterfaces dpnInterfaces) {
         List<String> interfaces = dpnInterfaces.getInterfaces();
         if (interfaces != null && !interfaces.isEmpty()) {
@@ -159,7 +156,7 @@ public class ElanDpnInterfaceClusteredListener
             elanInstanceDpnsCache.add(getElanName(identifier), dpnInterfaces);
             if (entityOwnershipUtils.isEntityOwner(HwvtepSouthboundConstants.ELAN_ENTITY_TYPE,
                     HwvtepSouthboundConstants.ELAN_ENTITY_NAME)) {
-                ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+                ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
                 if (elanInstance != null) {
                     BcGroupUpdateJob.updateAllBcGroups(elanName, elanRefUtil, elanL2GatewayMulticastUtils,
                             broker, true);
@@ -179,8 +176,9 @@ public class ElanDpnInterfaceClusteredListener
     }
 
     @Override
-    protected ElanDpnInterfaceClusteredListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
-
 }
index 863cee7be767f774ce0679f70e4f0796542edb05..27465ba6ede96a36383042942316af8a9876f414 100644 (file)
@@ -11,16 +11,17 @@ package org.opendaylight.netvirt.elan.internal;
 import static java.util.Collections.emptyList;
 
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces;
@@ -32,7 +33,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanDpnInterfacesListener
-        extends AsyncDataTreeChangeListenerBase<DpnInterfaces, ElanDpnInterfacesListener> {
+        extends AbstractAsyncDataTreeChangeListener<DpnInterfaces> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanDpnInterfacesListener.class);
     private final DataBroker dataBroker;
@@ -45,6 +46,9 @@ public class ElanDpnInterfacesListener
     public ElanDpnInterfacesListener(final DataBroker dataBroker, final IInterfaceManager interfaceManager,
                                      final ElanServiceProvider elanService, final JobCoordinator jobCoordinator,
                                      final ElanInstanceCache elanInstanceCache) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanDpnInterfaces.class)
+                .child(ElanDpnInterfacesList.class).child(DpnInterfaces.class),
+                Executors.newListeningSingleThreadExecutor("ElanDpnInterfacesListener", LOG));
         this.dataBroker = dataBroker;
         this.interfaceManager = interfaceManager;
         this.elanService = elanService;
@@ -52,29 +56,22 @@ public class ElanDpnInterfacesListener
         this.elanInstanceCache = elanInstanceCache;
     }
 
-    @PostConstruct
     public void start() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    public InstanceIdentifier<DpnInterfaces> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class)
-                .child(DpnInterfaces.class).build();
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
+    public void remove(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
 
     }
 
     @Override
-    protected void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
+    public void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
                           DpnInterfaces update) {
         LOG.debug("received Dpninterfaces update event for dpn {}", update.getDpId());
         Uint64 dpnId = update.getDpId();
         String elanInstanceName = identifier.firstKeyOf(ElanDpnInterfacesList.class).getElanInstanceName();
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
 
         if (elanInstance != null && !elanInstance.isExternal() && ElanUtils.isVlan(elanInstance)) {
             List<String> interfaces = update.getInterfaces();
@@ -91,11 +88,11 @@ public class ElanDpnInterfacesListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
+    public void add(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
         LOG.debug("received Dpninterfaces add event for dpn {}", dpnInterfaces.getDpId());
         Uint64 dpnId = dpnInterfaces.getDpId();
         String elanInstanceName = identifier.firstKeyOf(ElanDpnInterfacesList.class).getElanInstanceName();
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
 
         // trigger creation of vlan provider intf for the vlan provider network
         // on br-int patch port for this DPN
@@ -110,7 +107,9 @@ public class ElanDpnInterfacesListener
     }
 
     @Override
-    protected ElanDpnInterfacesListener getDataTreeChangeListener() {
-        return ElanDpnInterfacesListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 12b456cec8dbae6611577c8e1752b09110068f6b..f6ce28621c0ac54171ef0841ea522c2ff1e714bd 100644 (file)
@@ -7,15 +7,16 @@
  */
 package org.opendaylight.netvirt.elan.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.netvirt.elan.utils.TransportZoneNotificationUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList;
@@ -27,7 +28,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanDpnToTransportZoneListener
-        extends AsyncDataTreeChangeListenerBase<DpnInterfaces, ElanDpnToTransportZoneListener> {
+        extends AbstractAsyncDataTreeChangeListener<DpnInterfaces> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanDpnToTransportZoneListener.class);
     private final TransportZoneNotificationUtil transportZoneNotificationUtil;
@@ -39,34 +40,33 @@ public class ElanDpnToTransportZoneListener
     public ElanDpnToTransportZoneListener(final DataBroker dbx,
             final ElanConfig elanConfig, final TransportZoneNotificationUtil tznu,
             final ElanInstanceCache elanInstanceCache) {
+        super(dbx, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanDpnInterfaces.class)
+                .child(ElanDpnInterfacesList.class).child(DpnInterfaces.class),
+                Executors.newListeningSingleThreadExecutor("ElanDpnToTransportZoneListener", LOG));
         useTransportZone = elanConfig.isAutoConfigTransportZones();
         transportZoneNotificationUtil = tznu;
         this.dbx = dbx;
         this.elanInstanceCache = elanInstanceCache;
+        start();
     }
 
-    @PostConstruct
     public void start() {
-
         if (useTransportZone) {
-            registerListener(LogicalDatastoreType.OPERATIONAL, dbx);
             LOG.info("{} registered", getClass().getSimpleName());
         }
     }
 
     @Override
-    public InstanceIdentifier<DpnInterfaces> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class)
-                .child(DpnInterfaces.class).build();
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModification) {
+    public void remove(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModification) {
+        //Proceed only if "auto-config-transport-zones = TRUE"
+        if (!useTransportZone) {
+            return;
+        }
         LOG.debug("Elan dpn {} delete detected, deleting transport zones", dataObjectModification.getDpId());
         Uint64 dpId = dataObjectModification.getDpId();
         String elanInstanceName = key.firstKeyOf(ElanDpnInterfacesList.class).getElanInstanceName();
 
-        if (!ElanUtils.isVxlanNetworkOrVxlanSegment(elanInstanceCache.get(elanInstanceName).orNull())) {
+        if (!ElanUtils.isVxlanNetworkOrVxlanSegment(elanInstanceCache.get(elanInstanceName).orElse(null))) {
             LOG.debug("ElanInstance {} is not vxlan network, nothing to do", elanInstanceName);
             return;
         }
@@ -76,18 +76,22 @@ public class ElanDpnToTransportZoneListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModificationBefore,
+    public void update(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModificationBefore,
             DpnInterfaces dataObjectModificationAfter) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModification) {
+    public void add(InstanceIdentifier<DpnInterfaces> key, DpnInterfaces dataObjectModification) {
+        //Proceed only if "auto-config-transport-zones = TRUE"
+        if (!useTransportZone) {
+            return;
+        }
         LOG.debug("Elan dpn {} add detected, updating transport zones", dataObjectModification.getDpId());
 
         Uint64 dpId = dataObjectModification.getDpId();
         String elanInstanceName = key.firstKeyOf(ElanDpnInterfacesList.class).getElanInstanceName();
 
-        if (!ElanUtils.isVxlanNetworkOrVxlanSegment(elanInstanceCache.get(elanInstanceName).orNull())) {
+        if (!ElanUtils.isVxlanNetworkOrVxlanSegment(elanInstanceCache.get(elanInstanceName).orElse(null))) {
             return;
         }
 
@@ -95,7 +99,9 @@ public class ElanDpnToTransportZoneListener
     }
 
     @Override
-    protected ElanDpnToTransportZoneListener getDataTreeChangeListener() {
-        return ElanDpnToTransportZoneListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index c77635d569cd27b615d8878724aa258d14a904e0..952542f9666489413ecce48814b77e25d01df61f 100644 (file)
@@ -9,15 +9,16 @@ package org.opendaylight.netvirt.elan.internal;
 
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.elan.instance.ExternalTeps;
@@ -27,7 +28,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanExtnTepConfigListener
-        extends AsyncDataTreeChangeListenerBase<ExternalTeps, ElanExtnTepConfigListener> {
+        extends AbstractAsyncDataTreeChangeListener<ExternalTeps> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanExtnTepConfigListener.class);
 
@@ -36,45 +37,39 @@ public class ElanExtnTepConfigListener
 
     @Inject
     public ElanExtnTepConfigListener(DataBroker dataBroker) {
-        super(ExternalTeps.class, ElanExtnTepConfigListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ElanInstances.class)
+                .child(ElanInstance.class).child(ExternalTeps.class),
+                Executors.newListeningSingleThreadExecutor("ElanExtnTepConfigListener", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
-    }
-
-    @Override
-    public InstanceIdentifier<ExternalTeps> getWildCardPath() {
-        return InstanceIdentifier
-                .builder(ElanInstances.class)
-                .child(ElanInstance.class)
-                .child(ExternalTeps.class).build();
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    protected void add(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep) {
+    public void add(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep) {
         LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
             tx.put(iid, tep, true);
         }), LOG, "Failed to update operational external teps {}", iid);
     }
 
     @Override
-    protected void update(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep, ExternalTeps t1) {
+    public void update(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep, ExternalTeps t1) {
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep) {
+    public void remove(InstanceIdentifier<ExternalTeps> iid, ExternalTeps tep) {
         LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
             tx.delete(iid);
         }), LOG, "Failed to update operational external teps {}", iid);
     }
 
     @Override
-    protected ElanExtnTepConfigListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 4ad8848badaf359e8b3a1d1154bd8c6cbb1f832f..44974ae3190425aa15711ca41e721085397b74f5 100644 (file)
@@ -7,19 +7,20 @@
  */
 package org.opendaylight.netvirt.elan.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.jobs.BcGroupUpdateJob;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanRefUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.elan.instance.ExternalTeps;
@@ -28,7 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanExtnTepListener extends AsyncClusteredDataTreeChangeListenerBase<ExternalTeps, ElanExtnTepListener> {
+public class ElanExtnTepListener extends AbstractClusteredAsyncDataTreeChangeListener<ExternalTeps> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanExtnTepListener.class);
 
@@ -42,7 +43,9 @@ public class ElanExtnTepListener extends AsyncClusteredDataTreeChangeListenerBas
     @Inject
     public ElanExtnTepListener(DataBroker dataBroker, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils,
             JobCoordinator jobCoordinator, ElanInstanceCache elanInstanceCache, ElanRefUtil elanRefUtil) {
-        super(ExternalTeps.class, ElanExtnTepListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanInstances.class)
+                .child(ElanInstance.class).child(ExternalTeps.class),
+                Executors.newListeningSingleThreadExecutor("ElanExtnTepListener", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils;
@@ -51,28 +54,22 @@ public class ElanExtnTepListener extends AsyncClusteredDataTreeChangeListenerBas
         this.elanRefUtil = elanRefUtil;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    public InstanceIdentifier<ExternalTeps> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class).child(ExternalTeps.class);
-    }
-
-    @Override
-    protected void add(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep) {
+    public void add(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep) {
         LOG.trace("ExternalTeps add received {}", instanceIdentifier);
         updateBcGroupOfElan(instanceIdentifier, tep, true);
     }
 
     @Override
-    protected void update(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep, ExternalTeps t1) {
+    public void update(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep, ExternalTeps t1) {
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep) {
+    public void remove(InstanceIdentifier<ExternalTeps> instanceIdentifier, ExternalTeps tep) {
         LOG.trace("ExternalTeps remove received {}", instanceIdentifier);
         updateBcGroupOfElan(instanceIdentifier, tep, false);
     }
@@ -84,7 +81,9 @@ public class ElanExtnTepListener extends AsyncClusteredDataTreeChangeListenerBas
     }
 
     @Override
-    protected ElanExtnTepListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 0f63223db098a7829fa403928d130693f646d0a0..6aa03009da7344a9f42af750a6b8106f01348202 100644 (file)
@@ -8,23 +8,22 @@
 
 package org.opendaylight.netvirt.elan.internal;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
-
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.utils.Scheduler;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -34,7 +33,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase<Group, ElanGroupCache> {
+public class ElanGroupCache extends AbstractClusteredAsyncDataTreeChangeListener<Group> {
     private static final Logger LOG = LoggerFactory.getLogger(ElanGroupCache.class);
     private final DataBroker dataBroker;
     private final Scheduler scheduler;
@@ -43,21 +42,15 @@ public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase<Gro
 
     @Inject
     public ElanGroupCache(final DataBroker dataBroker, final Scheduler scheduler) {
-        super(Group.class, ElanGroupCache.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class)
+                .child(Node.class).augmentation(FlowCapableNode.class).child(Group.class),
+                Executors.newListeningSingleThreadExecutor("ElanGroupCache", LOG));
         this.dataBroker = dataBroker;
         this.scheduler = scheduler;
     }
 
-    @PostConstruct
     public synchronized void init() {
-        this.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Group> getWildCardPath() {
-        return InstanceIdentifier.builder(Nodes.class)
-                .child(Node.class).augmentation(FlowCapableNode.class)
-                .child(Group.class).build();
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     public synchronized void addJobToWaitList(InstanceIdentifier<Group> key,
@@ -71,22 +64,17 @@ public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase<Gro
     }
 
     @Override
-    protected ElanGroupCache getDataTreeChangeListener() {
-        return ElanGroupCache.this;
-    }
-
-    @Override
-    protected synchronized void remove(InstanceIdentifier<Group> key, Group deleted) {
+    public synchronized void remove(InstanceIdentifier<Group> key, Group deleted) {
         groupsById.remove(key);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Group> key, Group old, Group updated) {
+    public void update(InstanceIdentifier<Group> key, Group old, Group updated) {
         add(key, updated);
     }
 
     @Override
-    protected synchronized void add(InstanceIdentifier<Group> key, Group added) {
+    public synchronized void add(InstanceIdentifier<Group> key, Group added) {
         if (groupsById.containsKey(key)) {
             groupsById.put(key, added);
             return;
@@ -103,13 +91,21 @@ public class ElanGroupCache extends AsyncClusteredDataTreeChangeListenerBase<Gro
         }, ElanInterfaceManager.WAIT_TIME_FOR_SYNC_INSTALL, TimeUnit.MILLISECONDS);
     }
 
-    public Optional<Group> getGroup(InstanceIdentifier<Group> key) throws ReadFailedException {
+    public Optional<Group> getGroup(InstanceIdentifier<Group> key) throws InterruptedException, ExecutionException {
         if (groupsById.containsKey(key)) {
             return Optional.of(groupsById.get(key));
         }
-        ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction();
-        Optional<Group> optional = transaction.read(LogicalDatastoreType.CONFIGURATION, key).checkedGet();
+        ReadTransaction transaction = dataBroker.newReadOnlyTransaction();
+        Optional<Group> optional = transaction.read(LogicalDatastoreType.CONFIGURATION, key).get();
         transaction.close();
         return optional;
     }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
 }
index f14edc18459051e296be0939783b6f65cfa65829..bb7ee067064169c00cb7800441ffc106b00ecbd7 100644 (file)
@@ -13,20 +13,21 @@ import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
@@ -38,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanInstance, ElanInstanceManager> {
+public class ElanInstanceManager extends AbstractAsyncDataTreeChangeListener<ElanInstance> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanInstanceManager.class);
     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("NetvirtEventLogger");
@@ -56,7 +57,9 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
                                final ElanInterfaceManager elanInterfaceManager,
                                final IInterfaceManager interfaceManager, final JobCoordinator jobCoordinator,
                                final ElanInterfaceCache elanInterfaceCache) {
-        super(ElanInstance.class, ElanInstanceManager.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ElanInstances.class)
+                .child(ElanInstance.class),
+                Executors.newListeningSingleThreadExecutor("ElanInstanceManager", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.idManager = managerService;
@@ -66,14 +69,12 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
         this.elanInterfaceCache = elanInterfaceCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ElanInstance> identifier, ElanInstance deletedElan) {
+    public void remove(InstanceIdentifier<ElanInstance> identifier, ElanInstance deletedElan) {
         LOG.trace("Remove ElanInstance - Key: {}, value: {}", identifier, deletedElan);
         String elanName = deletedElan.getElanInstanceName();
         EVENT_LOGGER.debug("ELAN-Instance, REMOVE {}",elanName);
@@ -103,7 +104,7 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
     }
 
     @Override
-    protected void update(InstanceIdentifier<ElanInstance> identifier, ElanInstance original, ElanInstance update) {
+    public void update(InstanceIdentifier<ElanInstance> identifier, ElanInstance original, ElanInstance update) {
         EVENT_LOGGER.debug("ELAN-Instance, UPDATE {}", original.getElanInstanceName());
         Uint32 existingElanTag = original.getElanTag();
         String elanName = update.getElanInstanceName();
@@ -125,7 +126,7 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
     }
 
     @Override
-    protected void add(InstanceIdentifier<ElanInstance> identifier, ElanInstance elanInstanceAdded) {
+    public void add(InstanceIdentifier<ElanInstance> identifier, ElanInstance elanInstanceAdded) {
         LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, operTx -> {
             String elanInstanceName  = elanInstanceAdded.getElanInstanceName();
             EVENT_LOGGER.debug("ELAN-Instance, ADD {}", elanInstanceName);
@@ -139,12 +140,9 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
     }
 
     @Override
-    protected InstanceIdentifier<ElanInstance> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class);
-    }
-
-    @Override
-    protected ElanInstanceManager getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 }
index 25a6db5d9e787b677426ad101940971f0aacf859..d889d3226f1476ee5c57a8c6155e870ff6c8b1b7 100644 (file)
@@ -9,20 +9,21 @@ package org.opendaylight.netvirt.elan.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
@@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanInterfaceConfigListener
-    extends AsyncDataTreeChangeListenerBase<Interface, ElanInterfaceConfigListener> {
+    extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceConfigListener.class);
 
@@ -46,7 +47,9 @@ public class ElanInterfaceConfigListener
     @Inject
     public ElanInterfaceConfigListener(DataBroker dataBroker, ElanInterfaceManager elanInterfaceManager,
             JobCoordinator jobCoordinator, ElanInterfaceCache elanInterfaceCache) {
-        super(Interface.class, ElanInterfaceConfigListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Interfaces.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("ElanInterfaceConfigListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.elanInterfaceManager = elanInterfaceManager;
@@ -54,20 +57,12 @@ public class ElanInterfaceConfigListener
         this.elanInterfaceCache = elanInterfaceCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("ElanInterfaceConfigListener init");
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<Interface> key, Interface intrf) {
+    public void remove(InstanceIdentifier<Interface> key, Interface intrf) {
         // Sometimes elan service is not unbound on the interface when the user does nova delete followed
         // by neutron port delete since interface config is deleted a bit later. so adding logic to
         // unbind service for interface config removal.
@@ -90,19 +85,20 @@ public class ElanInterfaceConfigListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> key, Interface dataObjectModificationBefore,
+    public void update(InstanceIdentifier<Interface> key, Interface dataObjectModificationBefore,
             Interface dataObjectModificationAfter) {
         // Not required to handle this event
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> key, Interface dataObjectModification) {
+    public void add(InstanceIdentifier<Interface> key, Interface dataObjectModification) {
         // Not required to handle this event
     }
 
     @Override
-    protected ElanInterfaceConfigListener getDataTreeChangeListener() {
-        return this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
-
 }
index 99c27429f4ac34c35e9757f9a8da1c5675fbf672..0ed67f922045a8058631386af807b8798a22853f 100644 (file)
@@ -8,15 +8,15 @@
 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.infrautils.utils.concurrent.LoggingFutures.addErrorLogging;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
@@ -25,25 +25,21 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.infra.TransactionAdapter;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
@@ -71,8 +67,11 @@ import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
@@ -90,6 +89,7 @@ import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 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.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
@@ -151,7 +151,7 @@ import org.slf4j.LoggerFactory;
  * @see org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface
  */
 @Singleton
-public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanInterface, ElanInterfaceManager>
+public class ElanInterfaceManager extends AbstractAsyncDataTreeChangeListener<ElanInterface>
         implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceManager.class);
     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("NetvirtEventLogger");
@@ -192,7 +192,9 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                                 final ElanServiceRecoveryHandler elanServiceRecoveryHandler,
                                 ElanGroupCache elanGroupCache,
                                 final ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(ElanInterface.class, ElanInterfaceManager.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ElanInterfaces.class)
+                .child(ElanInterface.class),
+                Executors.newListeningSingleThreadExecutor("ElanInterfaceManager", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.idManager = managerService;
@@ -212,24 +214,31 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         serviceRecoveryRegistry.addRecoverableListener(elanServiceRecoveryHandler.buildServiceRegistryKey(), this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener();
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+        super.register();
+        LOG.info("Registering ElanInterfaceManager");
+    }
+
+    @Override
+    public void deregisterListener() {
+        super.close();
+        LOG.info("Deregistering ElanInterfaceManager");
     }
 
     @Override
-    protected InstanceIdentifier<ElanInterface> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<ElanInterface> identifier, ElanInterface del) {
+    public void remove(InstanceIdentifier<ElanInterface> identifier, ElanInterface del) {
         String interfaceName = del.getName();
         String elanInstanceName = del.getElanInstanceName();
         EVENT_LOGGER.debug("ELAN-Interface, REMOVE {} Instance {}", interfaceName, elanInstanceName);
@@ -240,7 +249,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                 unProcessedElanInterfaces.remove(elanInstanceName);
             }
         }
-        ElanInstance elanInfo = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanInstanceName).orElse(null);
         /*
          * Handling in case the elan instance is deleted.If the Elan instance is
          * deleted, there is no need to explicitly delete the elan interfaces
@@ -402,12 +411,13 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     }
 
     private void deleteElanInterfaceFromConfigDS(String interfaceName, TypedReadWriteTransaction<Configuration> tx)
-            throws ReadFailedException {
+            throws ExecutionException, InterruptedException {
         // removing the ElanInterface from the config data_store if interface is
         // not present in Interface config DS
-        if (interfaceManager.getInterfaceInfoFromConfigDataStore(TransactionAdapter.toReadWriteTransaction(tx),
-            interfaceName) == null
-                && elanInterfaceCache.get(interfaceName).isPresent()) {
+        InstanceIdentifier<ElanInterface> elanInterfaceId = ElanUtils
+                .getElanInterfaceConfigurationDataPathId(interfaceName);
+        FluentFuture<Optional<ElanInterface>> interfaceOptional = tx.read(elanInterfaceId);
+        if (!interfaceOptional.get().isPresent() && elanInterfaceCache.get(interfaceName).isPresent()) {
             tx.delete(ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName));
         }
     }
@@ -562,7 +572,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     * */
     @SuppressWarnings("checkstyle:ForbidCertainMethod")
     @Override
-    protected void update(InstanceIdentifier<ElanInterface> identifier, ElanInterface original, ElanInterface update) {
+    public void update(InstanceIdentifier<ElanInterface> identifier, ElanInterface original, ElanInterface update) {
         // updating the static-Mac Entries for the existing elanInterface
         String elanName = update.getElanInstanceName();
         String interfaceName = update.getName();
@@ -602,7 +612,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     }
 
     @Override
-    protected void add(InstanceIdentifier<ElanInterface> identifier, ElanInterface elanInterfaceAdded) {
+    public void add(InstanceIdentifier<ElanInterface> identifier, ElanInterface elanInterfaceAdded) {
         LOG.info("Init for ELAN interface Add {}", elanInterfaceAdded);
         addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, operTx -> {
             String elanInstanceName = elanInterfaceAdded.getElanInstanceName();
@@ -613,7 +623,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                 LOG.info("Interface {} is removed from Interface Oper DS due to port down ", interfaceName);
                 return;
             }
-            ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+            ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
 
             if (elanInstance == null) {
                 // Add the ElanInstance in the Configuration data-store
@@ -924,7 +934,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         MacEntry macEntry = new MacEntryBuilder().setMacAddress(physAddress).setInterface(interfaceName)
                 .withKey(new MacEntryKey(physAddress)).build();
         elanForwardingEntriesHandler.deleteElanInterfaceForwardingEntries(
-                elanInstanceCache.get(elanInstanceName).orNull(), interfaceInfo, macEntry);
+                elanInstanceCache.get(elanInstanceName).orElse(null), interfaceInfo, macEntry);
     }
 
     private boolean checkIfFirstInterface(String elanInterface, String elanInstanceName,
@@ -1589,7 +1599,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         for (ElanDpnInterfacesList elanDpns : elanDpnIf) {
             int cnt = 0;
             String elanName = elanDpns.getElanInstanceName();
-            ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+            ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
             if (elanInfo == null) {
                 LOG.warn("ELAN Info is null for elanName {} that does exist in elanDpnInterfaceList, "
                         + "skipping this ELAN for tunnel handling", elanName);
@@ -1680,7 +1690,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         List<ElanDpnInterfacesList> elanDpnIf = dpnInterfaceLists.nonnullElanDpnInterfacesList();
         for (ElanDpnInterfacesList elanDpns : elanDpnIf) {
             String elanName = elanDpns.getElanInstanceName();
-            ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+            ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
 
             DpnInterfaces dpnInterfaces = elanUtils.getElanInterfaceInfoByElanDpn(elanName, dpId);
             if (elanInfo == null || dpnInterfaces == null || dpnInterfaces.getInterfaces() == null
@@ -1791,11 +1801,6 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         return mkMatches;
     }
 
-    @Override
-    protected ElanInterfaceManager getDataTreeChangeListener() {
-        return this;
-    }
-
     public void handleExternalInterfaceEvent(ElanInstance elanInstance, DpnInterfaces dpnInterfaces,
                                              Uint64 dpId) {
         LOG.debug("setting up remote BC group for elan {}", elanInstance.getPhysicalNetworkName());
index ea2f0c0f8236fb2d560c75eed2bc8dcc21ea06c6..c02e46b6b73d1a4cd1f0cf2d272d51471ae0b7c6 100644 (file)
@@ -7,20 +7,21 @@
  */
 package org.opendaylight.netvirt.elan.internal;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -34,7 +35,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanInterfaceStateChangeListener
-        extends AsyncDataTreeChangeListenerBase<Interface, ElanInterfaceStateChangeListener> {
+        extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceStateChangeListener.class);
 
@@ -48,7 +49,9 @@ public class ElanInterfaceStateChangeListener
     public ElanInterfaceStateChangeListener(final DataBroker db, final ElanInterfaceManager ifManager,
             final JobCoordinator jobCoordinator, final ElanInstanceCache elanInstanceCache,
             final ElanInterfaceCache elanInterfaceCache) {
-        super(Interface.class, ElanInterfaceStateChangeListener.class);
+        super(db, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("ElanInterfaceStateChangeListener", LOG));
         broker = db;
         elanInterfaceManager = ifManager;
         this.jobCoordinator = jobCoordinator;
@@ -56,14 +59,19 @@ public class ElanInterfaceStateChangeListener
         this.elanInterfaceCache = elanInterfaceCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} registered", getClass().getSimpleName());
+    }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
         if (!L2vlan.class.equals(delIf.getType())) {
             return;
         }
@@ -82,7 +90,7 @@ public class ElanInterfaceStateChangeListener
         interfaceInfo.setInterfaceType(InterfaceInfo.InterfaceType.VLAN_INTERFACE);
         interfaceInfo.setInterfaceTag(delIf.getIfIndex());
         String elanInstanceName = elanInterface.get().getElanInstanceName();
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
         if (elanInstance == null) {
             LOG.debug("No Elan instance is available for the interface:{} ", interfaceName);
             return;
@@ -93,11 +101,11 @@ public class ElanInterfaceStateChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
+    public void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         if (!L2vlan.class.equals(intrf.getType())) {
             return;
         }
@@ -112,16 +120,4 @@ public class ElanInterfaceStateChangeListener
                 .getElanInterfaceConfigurationDataPathId(interfaceName);
         elanInterfaceManager.add(elanInterfaceId, elanInterface.get());
     }
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
-    }
-
-
-    @Override
-    protected ElanInterfaceStateChangeListener getDataTreeChangeListener() {
-        return this;
-    }
-
 }
index 5d5011f784c9e85cbe779370e980d20af73e7fff..952e45a2ea20099eccf2d92d91c36cb27c58a08b 100644 (file)
@@ -7,14 +7,15 @@
  */
 package org.opendaylight.netvirt.elan.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -25,7 +26,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanInterfaceStateClusteredListener extends
-    AsyncClusteredDataTreeChangeListenerBase<Interface, ElanInterfaceStateClusteredListener> {
+        AbstractClusteredAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceStateClusteredListener.class);
 
@@ -41,33 +42,37 @@ public class ElanInterfaceStateClusteredListener extends
     @Inject
     public ElanInterfaceStateClusteredListener(DataBroker broker, ElanInterfaceManager elanInterfaceManager,
                                                ElanUtils elanUtils, ElanClusterUtils elanClusterUtils) {
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("ElanInterfaceStateClusteredListener", LOG));
         this.broker = broker;
         this.elanInterfaceManager = elanInterfaceManager;
         this.elanUtils = elanUtils;
         this.elanClusterUtils = elanClusterUtils;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    public InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, final Interface update) {
+    public void update(InstanceIdentifier<Interface> identifier, Interface original, final Interface update) {
         add(identifier, update);
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, final Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, final Interface intrf) {
         if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
             if (Interface.OperStatus.Up.equals(intrf.getOperStatus())) {
                 final String interfaceName = intrf.getName();
@@ -94,9 +99,4 @@ public class ElanInterfaceStateClusteredListener extends
     /* (non-Javadoc)
      * @see org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase#getDataTreeChangeListener()
      */
-    @Override
-    protected ElanInterfaceStateClusteredListener getDataTreeChangeListener() {
-        return this;
-    }
-
 }
index a8522c0490f9a42ade60857d85259c6104b3d0bc..8be2db2ec99adc9b1f3cb41d188c0a61fa0f90fa 100644 (file)
@@ -5,24 +5,23 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
+
+/*
 package org.opendaylight.netvirt.elan.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -32,10 +31,14 @@ import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
@@ -50,7 +53,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElanLearntVpnVipToPortListener extends
-        AsyncDataTreeChangeListenerBase<LearntVpnVipToPort, ElanLearntVpnVipToPortListener> {
+        AbstractAsyncDataTreeChangeListener<LearntVpnVipToPort> {
     private static final Logger LOG = LoggerFactory.getLogger(ElanLearntVpnVipToPortListener.class);
     private final DataBroker broker;
     private final ManagedNewTransactionRunner txRunner;
@@ -63,7 +66,9 @@ public class ElanLearntVpnVipToPortListener extends
     @Inject
     public ElanLearntVpnVipToPortListener(DataBroker broker, IInterfaceManager interfaceManager, ElanUtils elanUtils,
             JobCoordinator jobCoordinator, ElanInstanceCache elanInstanceCache, ElanInterfaceCache elanInterfaceCache) {
-        super(LearntVpnVipToPort.class, ElanLearntVpnVipToPortListener.class);
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(LearntVpnVipToPortData.class)
+                .child(LearntVpnVipToPort.class),
+                Executors.newListeningSingleThreadExecutor("ElanLearntVpnVipToPortListener", LOG));
         this.broker = broker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.interfaceManager = interfaceManager;
@@ -73,21 +78,16 @@ public class ElanLearntVpnVipToPortListener extends
         this.elanInterfaceCache = elanInterfaceCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        /* ELAN will learn the MAC by itself using ElanPacketInHandler class.
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
-         */
-    }
+        LOG.info("{} registered", getClass().getSimpleName());
+
+       // ELAN will learn the MAC by itself using ElanPacketInHandler class.
+        //registerListener(LogicalDatastoreType.OPERATIONAL, broker);
 
-    @Override
-    protected InstanceIdentifier<LearntVpnVipToPort> getWildCardPath() {
-        return InstanceIdentifier.create(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class);
     }
 
     @Override
-    protected void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModification) {
+    public void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModification) {
         String macAddress = dataObjectModification.getMacAddress();
         String interfaceName = dataObjectModification.getPortName();
         LOG.trace("Removing mac address {} from interface {} ", macAddress, interfaceName);
@@ -96,12 +96,12 @@ public class ElanLearntVpnVipToPortListener extends
     }
 
     @Override
-    protected void update(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModificationBefore,
+    public void update(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModificationBefore,
             LearntVpnVipToPort dataObjectModificationAfter) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModification) {
+    public void add(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort dataObjectModification) {
         String macAddress = dataObjectModification.getMacAddress();
         String interfaceName = dataObjectModification.getPortName();
         LOG.trace("Adding mac address {} to interface {} ", macAddress, interfaceName);
@@ -109,12 +109,7 @@ public class ElanLearntVpnVipToPortListener extends
                 new StaticMacAddWorker(macAddress, interfaceName));
     }
 
-    @Override
-    protected ElanLearntVpnVipToPortListener getDataTreeChangeListener() {
-        return this;
-    }
-
-    private class StaticMacAddWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class StaticMacAddWorker implements Callable<List<? extends ListenableFuture<?>>> {
         String macAddress;
         String interfaceName;
 
@@ -153,13 +148,13 @@ public class ElanLearntVpnVipToPortListener extends
             InstanceIdentifier<MacEntry> elanMacEntryId =
                     ElanUtils.getMacEntryOperationalDataPath(elanName, physAddress);
             interfaceTx.put(elanMacEntryId, macEntry);
-            ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+            ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
             elanUtils.setupMacFlows(elanInstance, interfaceManager.getInterfaceInfo(interfaceName), macTimeOut,
                     macAddress, true, flowTx);
         }
     }
 
-    private class StaticMacRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class StaticMacRemoveWorker implements Callable<List<? extends ListenableFuture<?>>> {
         String macAddress;
         String interfaceName;
 
@@ -192,7 +187,7 @@ public class ElanLearntVpnVipToPortListener extends
             MacEntry macEntry = elanUtils.getInterfaceMacEntriesOperationalDataPath(interfaceName, physAddress);
             InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName);
             if (macEntry != null && interfaceInfo != null) {
-                elanUtils.deleteMacFlows(elanInstanceCache.get(elanName).orNull(), interfaceInfo, macEntry, flowTx);
+                elanUtils.deleteMacFlows(elanInstanceCache.get(elanName).orElse(null), interfaceInfo, macEntry, flowTx);
                 interfaceTx.delete(
                         ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress));
                 interfaceTx.delete(
@@ -207,3 +202,4 @@ public class ElanLearntVpnVipToPortListener extends
 
 
 }
+*/
index f97afee028f1b62b17eb976dda0e8d94acc5452b..de14506d7bef476f820273866054aa7e70e04f75 100644 (file)
@@ -17,12 +17,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
@@ -58,11 +55,15 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetDestination;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchRegister;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderConstant;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
@@ -78,7 +79,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanNodeListener extends AsyncDataTreeChangeListenerBase<Node, ElanNodeListener> {
+public class ElanNodeListener extends AbstractAsyncDataTreeChangeListener<Node> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanNodeListener.class);
     private static final int LEARN_MATCH_REG4_VALUE = 1;
@@ -101,6 +102,8 @@ public class ElanNodeListener extends AsyncDataTreeChangeListenerBase<Node, Elan
     public ElanNodeListener(DataBroker dataBroker, IMdsalApiManager mdsalManager, ElanConfig elanConfig,
             IdManagerService idManagerService, JobCoordinator jobCoordinator,
             DataTreeEventCallbackRegistrar eventCallbacks) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class),
+                Executors.newListeningSingleThreadExecutor("ElanNodeListener", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
@@ -112,27 +115,27 @@ public class ElanNodeListener extends AsyncDataTreeChangeListenerBase<Node, Elan
         this.eventCallbacks = eventCallbacks;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} registered", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node del) {
+    public void remove(InstanceIdentifier<Node> identifier, Node del) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node add) {
+    public void add(InstanceIdentifier<Node> identifier, Node add) {
         NodeId nodeId = add.getId();
         String[] node = nodeId.getValue().split(":");
         if (node.length < 2) {
@@ -319,11 +322,6 @@ public class ElanNodeListener extends AsyncDataTreeChangeListenerBase<Node, Elan
         return String.valueOf(tableId);
     }
 
-    @Override
-    protected ElanNodeListener getDataTreeChangeListener() {
-        return ElanNodeListener.this;
-    }
-
     private void setupTableMissApResponderFlow(TypedWriteTransaction<Configuration> tx, final Uint64 dpnId) {
         mdsalManager.addFlow(tx, ArpResponderUtil.getArpResponderTableMissFlow(dpnId));
     }
index 94df81dd4ae00c5f5bd0f9f1835cbc8afbc1401d..50c728efe90d1a73755a60df3172ea6fa25d0f23 100644 (file)
@@ -7,15 +7,16 @@
  */
 package org.opendaylight.netvirt.elan.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.utils.TransportZoneNotificationUtil;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfig;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -29,7 +30,7 @@ import org.slf4j.LoggerFactory;
  * Listen for new OVSDB nodes and then make sure they have the necessary bridges configured.
  */
 @Singleton
-public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase<Node, ElanOvsdbNodeListener> {
+public class ElanOvsdbNodeListener extends AbstractAsyncDataTreeChangeListener<Node> {
     private static final Logger LOG = LoggerFactory.getLogger(ElanOvsdbNodeListener.class);
     private final DataBroker dataBroker;
     private final ElanBridgeManager bridgeMgr;
@@ -50,6 +51,9 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase<Node,
     public ElanOvsdbNodeListener(final DataBroker dataBroker, ElanConfig elanConfig,
                                  final ElanBridgeManager bridgeMgr,
                                  final IElanService elanProvider, final TransportZoneNotificationUtil tzUtil) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID)).child(Node.class),
+                Executors.newListeningSingleThreadExecutor("ElanOvsdbNodeListener", LOG));
         this.dataBroker = dataBroker;
         autoCreateBridge = elanConfig.isAutoCreateBridge();
         this.generateIntBridgeMac = elanConfig.isIntBridgeGenMac();
@@ -58,28 +62,24 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase<Node,
         this.tzUtil = tzUtil;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier
-                .create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID))
-                .child(Node.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node node) {
+    public void remove(InstanceIdentifier<Node> identifier, Node node) {
         elanProvider.deleteExternalElanNetworks(node);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
         LOG.debug("ElanOvsdbNodeListener.update, updated node detected. original: NodeId = {}", original.getNodeId());
         boolean integrationBridgeExist = bridgeMgr.isBridgeOnOvsdbNode(update, bridgeMgr.getIntegrationBridgeName());
         // ignore updates where the bridge was deleted
@@ -95,7 +95,7 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase<Node,
     }
 
     @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node node) {
+    public void add(InstanceIdentifier<Node> identifier, Node node) {
         LOG.debug("ElanOvsdbNodeListener.add, new node detected {}", node);
         doNodeUpdate(node);
         elanProvider.createExternalElanNetworks(node);
@@ -110,8 +110,4 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase<Node,
     /* (non-Javadoc)
      * @see org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase#getDataTreeChangeListener()
      */
-    @Override
-    protected ElanOvsdbNodeListener getDataTreeChangeListener() {
-        return ElanOvsdbNodeListener.this;
-    }
 }
index f39d58cafb4f54c00f7db8af0f0b3ef6bcda165f..ce0360920a2762398a8dfb81f05ed4c6f6fc4d42 100755 (executable)
@@ -10,17 +10,15 @@ package org.opendaylight.netvirt.elan.internal;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
@@ -31,6 +29,8 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.packet.Ethernet;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.evpn.utils.EvpnUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
@@ -122,7 +122,7 @@ public class ElanPacketInHandler implements PacketProcessingListener {
                 }
                 String elanName = elanTagName.getName();
                 PhysAddress physAddress = new PhysAddress(macAddress);
-                MacEntry oldMacEntry = elanUtils.getMacEntryForElanInstance(elanName, physAddress).orNull();
+                MacEntry oldMacEntry = elanUtils.getMacEntryForElanInstance(elanName, physAddress).orElse(null);
                 boolean isVlanOrFlatProviderIface = interfaceManager.isExternalInterface(interfaceName);
 
                 Optional<IpAddress> srcIpAddress = elanUtils.getSourceIpAddress(res);
@@ -142,13 +142,13 @@ public class ElanPacketInHandler implements PacketProcessingListener {
                 if (srcIpAddress.isPresent()) {
                     String prefix = srcIpAddress.get().getIpv4Address().getValue();
                     InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName);
-                    ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+                    ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
                     evpnUtils.advertisePrefix(elanInstance, macAddress, prefix, interfaceName, interfaceInfo.getDpId());
                 }
                 enqueueJobForMacSpecificTasks(macAddress, elanTag, interfaceName, elanName, physAddress, oldMacEntry,
                         newMacEntry, isVlanOrFlatProviderIface);
 
-                ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+                ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
                 InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName);
                 if (interfaceInfo == null) {
                     LOG.trace("Interface:{} is not present under Config DS", interfaceName);
@@ -246,7 +246,7 @@ public class ElanPacketInHandler implements PacketProcessingListener {
      * Static MAC having been added on a wrong ELAN.
      */
     private void tryAndRemoveInvalidMacEntry(String elanName, MacEntry macEntry) {
-        ElanInstance elanInfo = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elanInfo = elanInstanceCache.get(elanName).orElse(null);
         if (elanInfo == null) {
             LOG.warn("MAC {} is been added (either statically or dynamically) for an invalid Elan {}. "
                     + "Manual cleanup may be necessary", macEntry.getMacAddress(), elanName);
index f6403b31085cefc228537c6293251d8056a52c08..5f811558963b3076a20052f954d5b7261ec365c4 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.elan.internal;
 
 import static java.util.Collections.emptyList;
 
-import com.google.common.base.Optional;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -19,6 +18,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.function.BiFunction;
@@ -26,8 +26,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -41,6 +39,8 @@ import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.infrautils.inject.AbstractLifecycle;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
@@ -240,7 +240,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
     @Override
     @Nullable
     public EtreeInterface getEtreeInterfaceByElanInterfaceName(String elanInterface) {
-        return elanInterfaceCache.getEtreeInterface(elanInterface).orNull();
+        return elanInterfaceCache.getEtreeInterface(elanInterface).orElse(null);
     }
 
     public static boolean compareWithExistingElanInstance(ElanInstance existingElanInstance, long macTimeOut,
@@ -424,14 +424,14 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
     @Override
     @Nullable
     public ElanInstance getElanInstance(String elanName) {
-        return elanInstanceCache.get(elanName).orNull();
+        return elanInstanceCache.get(elanName).orElse(null);
     }
 
     @Override
     public List<ElanInstance> getElanInstances() {
         InstanceIdentifier<ElanInstances> elanInstancesIdentifier = InstanceIdentifier.builder(ElanInstances.class)
                 .build();
-        return ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).toJavaUtil().map(
+        return ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).map(
                 ElanInstances::getElanInstance).orElse(emptyList());
     }
 
@@ -666,7 +666,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
     @Override
     @Nullable
     public ElanInterface getElanInterfaceByElanInterfaceName(String interfaceName) {
-        return elanInterfaceCache.get(interfaceName).orNull();
+        return elanInterfaceCache.get(interfaceName).orElse(null);
     }
 
     @Override
@@ -684,7 +684,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
             LOG.trace("ELAN service is after L3VPN in the Netvirt pipeline skip known L3DMAC flows installation");
             return;
         }
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
         if (elanInstance == null) {
             LOG.warn("Null elan instance {}", elanInstanceName);
             return;
@@ -706,7 +706,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
             LOG.trace("ELAN service is after L3VPN in the Netvirt pipeline skip known L3DMAC flows installation");
             return;
         }
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
         if (elanInstance == null) {
             LOG.warn("Null elan instance {}", elanInstanceName);
             return;
@@ -862,7 +862,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
                 ingressInterfaceName, macAddress, ipAddress);
         Optional<ElanInterface> elanIface = elanInterfaceCache.get(ingressInterfaceName);
         ElanInstance elanInstance = elanIface.isPresent()
-                ? elanInstanceCache.get(elanIface.get().getElanInstanceName()).orNull() : null;
+                ? elanInstanceCache.get(elanIface.get().getElanInstanceName()).orElse(null) : null;
         if (elanInstance == null) {
             LOG.debug("addArpResponderFlow: elanInstance is null, Failed to install arp responder flow for dpnId {}"
                     + "for Interface {} with MAC {} & IP {}", dpnId, ingressInterfaceName, macAddress, ipAddress);
@@ -889,7 +889,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
         LOG.trace("Installing the ExternalTunnel ARP responder flow on DPN {} for ElanInstance {} with MAC {} & IP {}",
                 dpnId, elanInstanceName, macAddress, ipAddress);
 
-        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance elanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
         if (elanInstance == null) {
             LOG.warn("Null elan instance {}", elanInstanceName);
             return;
index 9576757d2c2cd8976443dbaa28da250b57c403cb..ae3480d898575ad719b102a450a8adb345ec868b 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.elan.internal;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -18,11 +17,10 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -33,6 +31,8 @@ import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
@@ -120,17 +120,17 @@ public class ElanSmacFlowEventListener implements SalFlowListener {
                 LOG.info("Deleting the Mac-Entry:{} present on ElanInstance:{}", macEntry, elanInstanceName);
                 ListenableFuture<Void> result = txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
                     if (macEntry != null && interfaceInfo != null) {
-                        deleteSmacAndDmacFlows(elanInstanceCache.get(elanInstanceName).orNull(),
+                        deleteSmacAndDmacFlows(elanInstanceCache.get(elanInstanceName).orElse(null),
                                 interfaceInfo, srcMacAddress, tx);
                     } else if (macEntry == null) { //Remove flow of src flow entry only for MAC movement
                         MacEntry macEntryOfElanForwarding = elanUtils.getMacEntryForElanInstance(elanTagInfo.getName(),
-                                physAddress).orNull();
+                                physAddress).orElse(null);
                         if (macEntryOfElanForwarding != null) {
                             String macAddress = macEntryOfElanForwarding.getMacAddress().getValue();
-                            elanUtils.deleteSmacFlowOnly(elanInstanceCache.get(elanInstanceName).orNull(),
+                            elanUtils.deleteSmacFlowOnly(elanInstanceCache.get(elanInstanceName).orElse(null),
                                     interfaceInfo, macAddress, tx);
                         } else {
-                            deleteSmacAndDmacFlows(elanInstanceCache.get(elanInstanceName).orNull(), interfaceInfo,
+                            deleteSmacAndDmacFlows(elanInstanceCache.get(elanInstanceName).orElse(null), interfaceInfo,
                                     srcMacAddress, tx);
                         }
                     }
@@ -146,7 +146,7 @@ public class ElanSmacFlowEventListener implements SalFlowListener {
                         tx -> {
                             tx.delete(macEntryIdForElanInterface);
                             MacEntry macEntryInElanInstance = elanUtils.getMacEntryForElanInstance(elanInstanceName,
-                                physAddress).orNull();
+                                physAddress).orElse(null);
                             if (macEntryInElanInstance != null
                                 && macEntryInElanInstance.getInterface().equals(interfaceName)) {
                                 InstanceIdentifier<MacEntry> macEntryIdForElanInstance = ElanUtils
index 2ea1705665c69583c65dbcd5ac119990024fc8df..f63bfc63282921eef29a5a3bfc3f300c6c55fc05 100644 (file)
@@ -8,15 +8,16 @@
 package org.opendaylight.netvirt.elan.internal;
 
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelOperStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
@@ -27,8 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBase<StateTunnelList,
-    ElanTunnelInterfaceStateListener> {
+public class ElanTunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener<StateTunnelList> {
     private static final Logger LOG = LoggerFactory.getLogger(ElanTunnelInterfaceStateListener.class);
     private final DataBroker dataBroker;
     private final ElanInterfaceManager elanInterfaceManager;
@@ -39,35 +39,37 @@ public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListene
     public ElanTunnelInterfaceStateListener(final DataBroker dataBroker,
             final ElanInterfaceManager elanInterfaceManager, final ElanUtils elanUtils,
             final JobCoordinator jobCoordinator) {
-        super(StateTunnelList.class, ElanTunnelInterfaceStateListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(TunnelsState.class)
+                .child(StateTunnelList.class),
+                Executors.newListeningSingleThreadExecutor("ElanTunnelInterfaceStateListener", LOG));
         this.dataBroker = dataBroker;
         this.elanInterfaceManager = elanInterfaceManager;
         this.elanUtils = elanUtils;
         this.jobCoordinator = jobCoordinator;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<StateTunnelList> getWildCardPath() {
-        return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<StateTunnelList> key, StateTunnelList delete) {
+    public void remove(InstanceIdentifier<StateTunnelList> key, StateTunnelList delete) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<StateTunnelList> key, StateTunnelList original,
+    public void update(InstanceIdentifier<StateTunnelList> key, StateTunnelList original,
             StateTunnelList update) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<StateTunnelList> key, StateTunnelList add) {
+    public void add(InstanceIdentifier<StateTunnelList> key, StateTunnelList add) {
         LOG.info("processing add state for StateTunnelList {}", add);
         if (!isInternalTunnel(add)) {
             LOG.trace("tunnel {} is not a internal vxlan tunnel", add);
@@ -97,11 +99,6 @@ public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListene
         }
     }
 
-    @Override
-    protected ElanTunnelInterfaceStateListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private static boolean isInternalTunnel(StateTunnelList stateTunnelList) {
         return stateTunnelList.getDstInfo() != null
                 ? stateTunnelList.getDstInfo().getTepDeviceType() == TepTypeInternal.class : false;
index 0f6ee87b47fa3944884d2241e4429245f9ef95ae..c52bfae4d71d3d2100e4414d131a3ea732037e04 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterfaceAddWorkerOnElan implements Callable<List<ListenableFuture<Void>>> {
+public class InterfaceAddWorkerOnElan implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceAddWorkerOnElan.class);
 
index 541d1042605bd3ea27a32693eaf4cc1684222d19..1a1ca12f1e4d03f496a7e92dcd0d628cfbf75c42 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterfaceAddWorkerOnElanInterface implements Callable<List<ListenableFuture<Void>>> {
+public class InterfaceAddWorkerOnElanInterface implements Callable<List<? extends ListenableFuture<?>>> {
 
     private final String key;
     private final ElanInterface elanInterface;
index 4473bd69e5f8aec84a6c359b5510fea468bee40c..b579404917caf75b82b342766b7ab41316a5c032 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterfaceRemoveWorkerOnElan implements Callable<List<ListenableFuture<Void>>> {
+public class InterfaceRemoveWorkerOnElan implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceRemoveWorkerOnElan.class);
 
index 86a3cf555de236d2db81ca69aa203ca088ba5e3c..40035c0153cd4af0ef73859336e6d82eab48b446 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterfaceRemoveWorkerOnElanInterface implements Callable<List<ListenableFuture<Void>>> {
+public class InterfaceRemoveWorkerOnElanInterface implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceRemoveWorkerOnElanInterface.class);
 
index 723e2d4534bfdc00a2179269f39a0e4a8f80e62d..434694ca6bc43f01d3ca3e65b0fe76fbf1a9042a 100644 (file)
@@ -8,13 +8,14 @@
 package org.opendaylight.netvirt.elan.internal;
 
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.utils.TransportZoneNotificationUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
@@ -25,7 +26,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class VpnDpnToTransportZoneListener
-        extends AsyncDataTreeChangeListenerBase<VpnToDpnList, VpnDpnToTransportZoneListener> {
+        extends AbstractAsyncDataTreeChangeListener<VpnToDpnList> {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnDpnToTransportZoneListener.class);
     private final TransportZoneNotificationUtil transportZoneNotificationUtil;
@@ -35,33 +36,41 @@ public class VpnDpnToTransportZoneListener
     @Inject
     public VpnDpnToTransportZoneListener(final DataBroker dbx,
             final ElanConfig elanConfig, final TransportZoneNotificationUtil tznu) {
+        super(dbx, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(VpnInstanceOpData.class)
+                .child(VpnInstanceOpDataEntry.class).child(VpnToDpnList.class),
+                Executors.newListeningSingleThreadExecutor("VpnDpnToTransportZoneListener", LOG));
         useTransportZone = elanConfig.isAutoConfigTransportZones();
         transportZoneNotificationUtil = tznu;
         this.dbx = dbx;
+        start();
     }
 
-    @PostConstruct
     public void start() {
-
         if (useTransportZone) {
-            registerListener(LogicalDatastoreType.OPERATIONAL, dbx);
             LOG.info("{} registered", getClass().getSimpleName());
         }
     }
 
     @Override
-    protected InstanceIdentifier<VpnToDpnList> getWildCardPath() {
-        return InstanceIdentifier.builder(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class)
-                .child(VpnToDpnList.class).build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList del) {
+    public void remove(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList del) {
+        if (!useTransportZone) {
+            return;
+        }
         LOG.debug("Vpn dpn {} remove detected, SHOULD BE deleting transport zones", del.getDpnId());
     }
 
     @Override
-    protected void update(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList original, VpnToDpnList update) {
+    public void update(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList original, VpnToDpnList update) {
+        if (!useTransportZone) {
+            return;
+        }
         LOG.debug("Vpn dpn {} update detected, updating transport zones", update.getDpnId());
 
         if (update.getVpnInterfaces() == null || update.getVpnInterfaces().isEmpty()) {
@@ -84,7 +93,10 @@ public class VpnDpnToTransportZoneListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList add) {
+    public void add(InstanceIdentifier<VpnToDpnList> identifier, VpnToDpnList add) {
+        if (!useTransportZone) {
+            return;
+        }
         LOG.debug("Vpn dpn {} add detected, updating transport zones", add.getDpnId());
 
         boolean shouldCreateVtep = transportZoneNotificationUtil.shouldCreateVtep(add.getVpnInterfaces());
@@ -93,9 +105,4 @@ public class VpnDpnToTransportZoneListener
             transportZoneNotificationUtil.updateTransportZone(vrfId, add.getDpnId());
         }
     }
-
-    @Override
-    protected VpnDpnToTransportZoneListener getDataTreeChangeListener() {
-        return VpnDpnToTransportZoneListener.this;
-    }
 }
index 6bb622413ab29cca8e4849906743fff55315c32a..24828d809fac6d2f0c818bb54ecd42f0702f6017 100644 (file)
@@ -7,9 +7,8 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -17,16 +16,17 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.SwitchesCmd;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
index d0e557d5685e14a8203c3a7708c464f5f7efe45d..673433a9aab3a1b19f396bfea842891f2e26f0ce 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.commands;
 
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
index 7ad738b6ed59e8403633483b841168cc370e6f52..c56d22e5782fbb969f707cab969a12cbc3855e5b 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.commands;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 import static org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil.isEmptyList;
 
 import java.io.Serializable;
@@ -19,9 +19,9 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.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;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
index 78e28a113e498ef8600cbfaec8e5a8e0e0d10db7..f8b7dd1e1f168257075936c1504b1059508db79a 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalAugmentationMerger;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalNodeMerger;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.PSAugmentationMerger;
index 7e81f6ac2e982e6f2127f20e0983fe06c4697ff7..966be413b46036aaf741acf05e00a4750e06c0ad 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
index 6b76636d4efffe6b3b48997c853198075ac7849a..64896dea37fa2d627e6101e86c28c2d441c648b2 100644 (file)
@@ -7,10 +7,10 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
index 32349497f66386e828abe1efa27301daab73e564..443e689b53473f4e3ea0486b4c8263daf83091e8 100644 (file)
@@ -7,13 +7,12 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -21,6 +20,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.listeners.HAJobScheduler;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalAugmentationMerger;
@@ -148,7 +148,7 @@ public class NodeConnectedHandler {
             return;
         }
         for (Switches ps : switches) {
-            Node childPsNode = tx.read((InstanceIdentifier<Node>) ps.getSwitchRef().getValue()).get().orNull();
+            Node childPsNode = tx.read((InstanceIdentifier<Node>) ps.getSwitchRef().getValue()).get().orElse(null);
             if (childPsNode != null) {
                 InstanceIdentifier<Node> haPsPath = HwvtepHAUtil.convertPsPath(childPsNode, haNodePath);
                 copyChildPSOpToHAPS(childPsNode, haNodePath, haPsPath, tx);
@@ -279,7 +279,7 @@ public class NodeConnectedHandler {
 
         PhysicalSwitchAugmentation src = childPsNode.augmentation(PhysicalSwitchAugmentation.class);
 
-        Node existingHAPSNode = tx.read(haPspath).get().orNull();
+        Node existingHAPSNode = tx.read(haPspath).get().orElse(null);
         PhysicalSwitchAugmentation existingHAPSAugumentation =
                 HwvtepHAUtil.getPhysicalSwitchAugmentationOfNode(existingHAPSNode);
 
index 7e99d5a2d5c4f6e01cf05a4377748787ad078ff0..53b539db73a3f97f72118c02d9e88ea487de22f9 100644 (file)
@@ -7,17 +7,16 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -25,6 +24,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.listeners.HAJobScheduler;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalAugmentationMerger;
@@ -184,7 +184,7 @@ public class NodeCopier {
         PhysicalSwitchAugmentation srcPsAugmenatation =
                 srcPsNodeOptional.get().augmentation(PhysicalSwitchAugmentation.class);
 
-        Node existingDstPsNode = tx.read(dstPsPath).get().orNull();
+        Node existingDstPsNode = tx.read(dstPsPath).get().orElse(null);
         PhysicalSwitchAugmentation existingDstPsAugmentation =
                 HwvtepHAUtil.getPhysicalSwitchAugmentationOfNode(existingDstPsNode);
         if (Operational.class.equals(datastoreType)) {
index ff718b5af77a0297f5e28245cdd608f719696420..8d685026d688103fad1ed262a3abea7ba01d36c8 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.handlers;
 
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalAugmentationMerger;
 import org.opendaylight.netvirt.elan.l2gw.ha.merge.GlobalNodeMerger;
index 1fdf54f6af1ba934724d8df49391d01e5444cffb..dbbba719199305b713ccafe26674b3d1886db70a 100644 (file)
@@ -9,19 +9,19 @@ package org.opendaylight.netvirt.elan.l2gw.ha.listeners;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.infrautils.metrics.MetricProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.handlers.HAEventHandler;
 import org.opendaylight.netvirt.elan.l2gw.ha.handlers.IHAEventHandler;
@@ -86,7 +86,7 @@ public class HAConfigNodeListener extends HwvtepNodeBaseListener<Configuration>
             String nodeId =
                     HwvtepHAUtil.convertToGlobalNodeId(childPsPath.firstKeyOf(Node.class).getNodeId().getValue());
             InstanceIdentifier<Node> childGlobalPath = HwvtepHAUtil.convertToInstanceIdentifier(nodeId);
-            nodeCopier.copyPSNode(Optional.fromNullable(haPSNode), haPsPath, childPsPath, childGlobalPath,
+            nodeCopier.copyPSNode(Optional.ofNullable(haPSNode), haPsPath, childPsPath, childGlobalPath,
                     CONFIGURATION, tx);
         }
         LOG.trace("Handle config ps node add {}", psId);
index ac24ff9e2f3aa5006c40ec1f9e285edf42fe4be8..edc13401fce4b60983bc3a0cc501af7f0d55924f 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.netvirt.elan.l2gw.ha.listeners;
 
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
@@ -20,16 +20,15 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.infrautils.metrics.MetricProvider;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
@@ -159,9 +158,9 @@ public class HAOpClusteredListener extends HwvtepNodeBaseListener<Operational>
     public synchronized void runAfterNodeIsConnected(InstanceIdentifier<Node> iid, Consumer<Optional<Node>> consumer) {
         if (connectedNodes.contains(iid)) {
             HAJobScheduler.getInstance().submitJob(() -> {
-                try (ReadOnlyTransaction tx = getDataBroker().newReadOnlyTransaction()) {
-                    consumer.accept(tx.read(LogicalDatastoreType.OPERATIONAL, iid).checkedGet());
-                } catch (ReadFailedException e) {
+                try (ReadTransaction tx = getDataBroker().newReadOnlyTransaction()) {
+                    consumer.accept(tx.read(LogicalDatastoreType.OPERATIONAL, iid).get());
+                } catch (InterruptedException | ExecutionException e) {
                     LOG.error("Failed to read oper ds {}", iid);
                 }
             });
index f17cbc465a6f7202d3f1cf3735ce40b93bbef97e..1f209e0fbd1cda300b172d3924365c09e238d4ad 100644 (file)
@@ -10,24 +10,23 @@ package org.opendaylight.netvirt.elan.l2gw.ha.listeners;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.handlers.HAEventHandler;
 import org.opendaylight.netvirt.elan.l2gw.ha.handlers.IHAEventHandler;
@@ -106,9 +105,9 @@ public class HAOpNodeListener extends HwvtepNodeBaseListener<Operational> implem
         InstanceIdentifier<Node> haNodePath = getHwvtepNodeHACache().getParent(childGlobalPath);
         LOG.trace("Ha enabled child node connected {}", childNode.getNodeId().getValue());
         try {
-            nodeCopier.copyGlobalNode(Optional.fromNullable(childNode), childGlobalPath, haNodePath, OPERATIONAL, tx);
+            nodeCopier.copyGlobalNode(Optional.ofNullable(childNode), childGlobalPath, haNodePath, OPERATIONAL, tx);
             LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-                confTx -> nodeCopier.copyGlobalNode(Optional.fromNullable(null), haNodePath, childGlobalPath,
+                confTx -> nodeCopier.copyGlobalNode(Optional.ofNullable(null), haNodePath, childGlobalPath,
                     CONFIGURATION, confTx)), LOG, "Error copying to configuration");
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read nodes {} , {} ", childGlobalPath, haNodePath);
@@ -122,7 +121,7 @@ public class HAOpNodeListener extends HwvtepNodeBaseListener<Operational> implem
                             Node updatedChildNode,
                             Node originalChildNode,
                             DataObjectModification<Node> mod,
-                            TypedReadWriteTransaction<Operational> tx) throws ReadFailedException {
+                            TypedReadWriteTransaction<Operational> tx)  {
 
         String oldHAId = HwvtepHAUtil.getHAIdFromManagerOtherConfig(originalChildNode);
         if (!Strings.isNullOrEmpty(oldHAId)) { //was already ha child
@@ -182,10 +181,10 @@ public class HAOpNodeListener extends HwvtepNodeBaseListener<Operational> implem
         InstanceIdentifier<Node> haGlobalPath = getHwvtepNodeHACache().getParent(childGlobalPath);
         InstanceIdentifier<Node> haPsPath = HwvtepHAUtil.convertPsPath(childPsNode, haGlobalPath);
         try {
-            nodeCopier.copyPSNode(Optional.fromNullable(childPsNode), childPsPath, haPsPath, haGlobalPath,
+            nodeCopier.copyPSNode(Optional.ofNullable(childPsNode), childPsPath, haPsPath, haGlobalPath,
                     OPERATIONAL, tx);
             LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-                confTx -> nodeCopier.copyPSNode(Optional.fromNullable(null), haPsPath, childPsPath, childGlobalPath,
+                confTx -> nodeCopier.copyPSNode(Optional.ofNullable(null), haPsPath, childPsPath, childGlobalPath,
                     CONFIGURATION, confTx)), LOG, "Error copying to configuration");
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read nodes {} , {} ", childPsPath, haGlobalPath);
index 26d7d2cde3ca1c9fe5e70d3d4a85c7efead0d4d4..b40ebebea22d3cc1490e8e59b06c1d5c83444116 100644 (file)
@@ -14,12 +14,6 @@ import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
 import javax.annotation.PreDestroy;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.TaskRetryLooper;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -32,6 +26,11 @@ import org.opendaylight.infrautils.metrics.Meter;
 import org.opendaylight.infrautils.metrics.MetricDescriptor;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.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.PhysicalSwitchAugmentation;
@@ -94,7 +93,7 @@ public abstract class HwvtepNodeBaseListener<D extends Datastore>
     }
 
     protected void registerListener(Class<D> dsType, DataBroker broker) throws Exception {
-        final DataTreeIdentifier<Node> treeId = new DataTreeIdentifier<>(Datastore.toType(dsType),
+        final DataTreeIdentifier<Node> treeId = DataTreeIdentifier.create(Datastore.toType(dsType),
                 getWildcardPath());
         TaskRetryLooper looper = new TaskRetryLooper(STARTUP_LOOP_TICK, STARTUP_LOOP_MAX_RETRIES);
         registration = looper.loopUntilNoException(() ->
@@ -154,7 +153,7 @@ public abstract class HwvtepNodeBaseListener<D extends Datastore>
 
     private void processUpdatedNodes(Collection<DataTreeModification<Node>> changes,
                                      TypedReadWriteTransaction<D> tx)
-            throws ReadFailedException, ExecutionException, InterruptedException {
+            throws ExecutionException, InterruptedException {
         for (DataTreeModification<Node> change : changes) {
             final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
             final DataObjectModification<Node> mod = change.getRootNode();
@@ -209,7 +208,7 @@ public abstract class HwvtepNodeBaseListener<D extends Datastore>
 
     private void processDisconnectedNodes(Collection<DataTreeModification<Node>> changes,
                                           TypedReadWriteTransaction<D> tx)
-            throws InterruptedException, ExecutionException, ReadFailedException {
+            throws InterruptedException, ExecutionException {
         for (DataTreeModification<Node> change : changes) {
             final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
             final DataObjectModification<Node> mod = change.getRootNode();
@@ -273,11 +272,11 @@ public abstract class HwvtepNodeBaseListener<D extends Datastore>
 
     //default methods
     void onGlobalNodeDelete(InstanceIdentifier<Node> key, Node added, TypedReadWriteTransaction<D> tx)
-        throws ReadFailedException, ExecutionException, InterruptedException {
+        throws ExecutionException, InterruptedException {
     }
 
     void onPsNodeDelete(InstanceIdentifier<Node> key, Node addedPSNode, TypedReadWriteTransaction<D> tx)
-        throws ReadFailedException, ExecutionException, InterruptedException {
+        throws ExecutionException, InterruptedException {
 
     }
 
@@ -291,14 +290,12 @@ public abstract class HwvtepNodeBaseListener<D extends Datastore>
     }
 
     void onGlobalNodeUpdate(InstanceIdentifier<Node> key, Node updated, Node original,
-                            DataObjectModification<Node> mod, TypedReadWriteTransaction<D> tx)
-            throws ReadFailedException, InterruptedException, ExecutionException {
+                            DataObjectModification<Node> mod, TypedReadWriteTransaction<D> tx) {
 
     }
 
     void onPsNodeUpdate(Node updated,
-                        DataObjectModification<Node> mod, TypedReadWriteTransaction<D> tx)
-            throws ReadFailedException, InterruptedException, ExecutionException {
+                        DataObjectModification<Node> mod, TypedReadWriteTransaction<D> tx) {
 
     }
 
diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeDataListener.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeDataListener.java
deleted file mode 100644 (file)
index 62c460f..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.netvirt.elan.l2gw.ha.listeners;
-
-import com.google.common.base.Optional;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.function.BiConsumer;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
-import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
-import org.opendaylight.genius.infra.Datastore;
-import org.opendaylight.genius.infra.Datastore.Operational;
-import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
-import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.infra.TypedReadWriteTransaction;
-import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
-import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
-import org.opendaylight.netvirt.elan.l2gw.ha.commands.MergeCommand;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Listens for the node children data updates and propagates the updates between ha child and parent nodes.
- * When an operational child node data is updated, it is copied to parent
- * When a config parent node data is updated , it is copied to all its children.
- */
-public abstract class HwvtepNodeDataListener<D extends Datastore, T extends DataObject>
-        extends AsyncDataTreeChangeListenerBase<T, HwvtepNodeDataListener<D, T>> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(HwvtepNodeDataListener.class);
-
-    private final ManagedNewTransactionRunner txRunner;
-    private final SingleTransactionDataBroker singleTxBroker;
-    private final MergeCommand<T, ?, ?> mergeCommand;
-    private final Class<D> datastoreType;
-    private final BiConsumer<InstanceIdentifier<T>, T> addOperation;
-    private final BiConsumer<InstanceIdentifier<T>, T> removeOperation;
-    private final HwvtepNodeHACache hwvtepNodeHACache;
-
-    public HwvtepNodeDataListener(DataBroker broker,
-                                  HwvtepNodeHACache hwvtepNodeHACache,
-                                  Class<T> clazz,
-                                  Class<HwvtepNodeDataListener<D, T>> eventClazz,
-                                  MergeCommand<T, ?, ?> mergeCommand,
-                                  Class<D> datastoreType) {
-        super(clazz, eventClazz);
-        this.hwvtepNodeHACache = hwvtepNodeHACache;
-        this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
-        this.singleTxBroker = new SingleTransactionDataBroker(broker);
-        this.mergeCommand = mergeCommand;
-        this.datastoreType = datastoreType;
-        if (Operational.class.equals(datastoreType)) {
-            this.addOperation = this::copyToParent;
-            this.removeOperation = this::deleteFromParent;
-        } else {
-            this.addOperation = this::copyToChildren;
-            this.removeOperation = this::deleteFromChildren;
-        }
-    }
-
-    @Override
-    protected abstract InstanceIdentifier<T> getWildCardPath();
-
-    @Override
-    protected void add(InstanceIdentifier<T> identifier, T dataAdded) {
-        HAJobScheduler.getInstance().submitJob(() -> addOperation.accept(identifier, dataAdded));
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<T> key, T before, T after) {
-        HAJobScheduler.getInstance().submitJob(() -> {
-            if (Objects.equals(before, after)) {
-                //incase of cluter reboots tx.put will rewrite the data and fire unnecessary updates
-                return;
-            }
-            add(key, after);
-        });
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<T> identifier, T dataRemoved) {
-        HAJobScheduler.getInstance().submitJob(() -> removeOperation.accept(identifier, dataRemoved));
-    }
-
-    private boolean isNodeConnected(InstanceIdentifier<T> identifier)
-            throws ReadFailedException {
-        return singleTxBroker.syncReadOptional(LogicalDatastoreType.OPERATIONAL,
-            identifier.firstIdentifierOf(Node.class)).isPresent();
-    }
-
-    private static <T extends DataObject> boolean isDataUpdated(Optional<T> existingDataOptional, T newData) {
-        return !existingDataOptional.isPresent() || !Objects.equals(existingDataOptional.get(), newData);
-    }
-
-    private void copyToParent(InstanceIdentifier<T> identifier, T data) {
-        if (clazz == RemoteUcastMacs.class) {
-            LOG.trace("Skipping remote ucast macs to parent");
-            return;
-        }
-        InstanceIdentifier<Node> parent = getHAParent(identifier);
-        if (parent != null) {
-            LOG.trace("Copy child op data {} to parent {}", mergeCommand.getDescription(), getNodeId(parent));
-            T parentData = mergeCommand.transform(parent, data);
-            InstanceIdentifier<T> parentIdentifier = mergeCommand.generateId(parent, parentData);
-            LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType,
-                tx -> writeToMdsal(tx, parentData, parentIdentifier)), LOG, "Error copying to parent");
-        }
-    }
-
-    private void deleteFromParent(InstanceIdentifier<T> identifier, T data) {
-        if (clazz == RemoteUcastMacs.class) {
-            LOG.trace("Skipping remote ucast macs to parent");
-            return;
-        }
-        InstanceIdentifier<Node> parent = getHAParent(identifier);
-        if (parent != null) {
-            LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, tx -> {
-                if (isNodeConnected(identifier)) {
-                    LOG.trace("Copy child op data {} to parent {} create:{}", mergeCommand.getDescription(),
-                            getNodeId(parent), false);
-                    T parentData = mergeCommand.transform(parent, data);
-                    InstanceIdentifier<T> parentIdentifier = mergeCommand.generateId(parent, parentData);
-                    deleteFromMdsal(tx, parentIdentifier);
-                }
-            }), LOG, "Error deleting from parent");
-        }
-    }
-
-    private void copyToChildren(final InstanceIdentifier<T> parentIdentifier, final T parentData) {
-        Set<InstanceIdentifier<Node>> children = getChildrenForHANode(parentIdentifier);
-        if (children != null) {
-            LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, tx -> {
-                for (InstanceIdentifier<Node> child : children) {
-                    LOG.trace("Copy parent config data {} to child {}", mergeCommand.getDescription(),
-                            getNodeId(child));
-                    final T childData = mergeCommand.transform(child, parentData);
-                    final InstanceIdentifier<T> identifier = mergeCommand.generateId(child, childData);
-                    writeToMdsal(tx, childData, identifier);
-                }
-            }), LOG, "Error copying to children");
-        }
-    }
-
-    private void deleteFromChildren(final InstanceIdentifier<T> parentIdentifier, final T parentData) {
-        Set<InstanceIdentifier<Node>> children = getChildrenForHANode(parentIdentifier);
-        if (children != null) {
-            LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(datastoreType, tx -> {
-                for (InstanceIdentifier<Node> child : children) {
-                    LOG.trace("Delete parent config data {} to child {}", mergeCommand.getDescription(),
-                            getNodeId(child));
-                    final T childData = mergeCommand.transform(child, parentData);
-                    final InstanceIdentifier<T> identifier = mergeCommand.generateId(child, childData);
-                    deleteFromMdsal(tx, identifier);
-                }
-            }), LOG, "Error deleting from children");
-        }
-    }
-
-    private void writeToMdsal(final TypedReadWriteTransaction<D> tx, final T data,
-            final InstanceIdentifier<T> identifier) throws ExecutionException, InterruptedException {
-        if (isDataUpdated(tx.read(identifier).get(), data)) {
-            tx.put(identifier, data);
-        }
-    }
-
-    private void deleteFromMdsal(final TypedReadWriteTransaction<D> tx,
-            final InstanceIdentifier<T> identifier) throws ExecutionException, InterruptedException {
-        if (tx.read(identifier).get().isPresent()) {
-            tx.delete(identifier);
-        }
-    }
-
-    private static String getNodeId(InstanceIdentifier<Node> iid) {
-        return iid.firstKeyOf(Node.class).getNodeId().getValue();
-    }
-
-    @Override
-    protected HwvtepNodeDataListener<D, T> getDataTreeChangeListener() {
-        return HwvtepNodeDataListener.this;
-    }
-
-    protected Set<InstanceIdentifier<Node>> getChildrenForHANode(InstanceIdentifier<T> identifier) {
-        InstanceIdentifier<Node> parent = identifier.firstIdentifierOf(Node.class);
-        return hwvtepNodeHACache.getChildrenForHANode(parent);
-    }
-
-    protected InstanceIdentifier<Node> getHAParent(InstanceIdentifier<T> identifier) {
-        InstanceIdentifier<Node> child = identifier.firstIdentifierOf(Node.class);
-        return hwvtepNodeHACache.getParent(child);
-    }
-}
index da1c97c0192f68de5d283c1a0569093e94ebd923..5ad90a947af34b8755e9624032e98f49efab6a11 100644 (file)
@@ -8,15 +8,16 @@
 package org.opendaylight.netvirt.elan.l2gw.ha.listeners;
 
 import java.util.Arrays;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 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.hwvtep.global.attributes.Managers;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
@@ -25,7 +26,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public final class ManagerListener extends AsyncClusteredDataTreeChangeListenerBase<Managers, ManagerListener> {
+public final class ManagerListener extends AbstractClusteredAsyncDataTreeChangeListener<Managers> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ManagerListener.class);
 
@@ -34,34 +35,35 @@ public final class ManagerListener extends AsyncClusteredDataTreeChangeListenerB
 
     @Inject
     public ManagerListener(DataBroker dataBroker, HwvtepNodeHACache hwvtepNodeHACache) {
-        super(Managers.class, ManagerListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier().child(Node.class)
+                        .augmentation(HwvtepGlobalAugmentation.class).child(Managers.class),
+                Executors.newListeningSingleThreadExecutor("ManagerListener", LOG));
         this.dataBroker = dataBroker;
         this.hwvtepNodeHACache = hwvtepNodeHACache;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<Managers> getWildCardPath() {
-        return HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier()
-                .child(Node.class)
-                .augmentation(HwvtepGlobalAugmentation.class)
-                .child(Managers.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Managers> key, Managers managers) {
+    public void remove(InstanceIdentifier<Managers> key, Managers managers) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<Managers> key, Managers before, Managers after) {
+    public void update(InstanceIdentifier<Managers> key, Managers before, Managers after) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<Managers> key, Managers managers) {
+    public void add(InstanceIdentifier<Managers> key, Managers managers) {
         InstanceIdentifier<Node> parent = key.firstIdentifierOf(Node.class);
         if (managers.key().getTarget().getValue().contains(HwvtepHAUtil.MANAGER_KEY)
                 && managers.getManagerOtherConfigs() != null) {
@@ -72,9 +74,4 @@ public final class ManagerListener extends AsyncClusteredDataTreeChangeListenerB
                 .forEach(childIid -> hwvtepNodeHACache.addChild(parent, childIid));
         }
     }
-
-    @Override
-    protected ManagerListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 3203bc8d2f14463825e34ce807a841a21bb4539f..489c3e8ce16917ec61e5335d04c29c1dccb447b5 100644 (file)
@@ -7,24 +7,23 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.merge;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.function.BiPredicate;
-
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.utils.SuperTypeUtil;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalMcastCmd;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalUcastCmd;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.MergeCommand;
index 8529a5016070839dcfcf6505584b8a6e1f59978d..3698b7a25f12a7b61b6aa68bfc75823ac72b834a 100644 (file)
@@ -7,15 +7,18 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.jobs;
 
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
@@ -34,7 +37,7 @@ import org.slf4j.LoggerFactory;
 /**
 * Created by ekvsver on 4/15/2016.
 */
-public class AssociateHwvtepToElanJob implements Callable<List<ListenableFuture<Void>>> {
+public class AssociateHwvtepToElanJob implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(AssociateHwvtepToElanJob.class);
 
     private final DataBroker broker;
@@ -69,7 +72,7 @@ public class AssociateHwvtepToElanJob implements Callable<List<ListenableFuture<
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() {
+    public List<ListenableFuture<?>> call() {
         String hwvtepNodeId = l2GatewayDevice.getHwvtepNodeId();
         String elanInstanceName = elanInstance.getElanInstanceName();
         LOG.debug("running assosiate l2gw connection job for {} {} ", elanInstanceName, hwvtepNodeId);
@@ -89,7 +92,7 @@ public class AssociateHwvtepToElanJob implements Callable<List<ListenableFuture<
         return logicalSwitchAddedJob.call();
     }
 
-    private ListenableFuture<Void> createLogicalSwitch() {
+    private FluentFuture<? extends @NonNull CommitInfo> createLogicalSwitch() {
         final String logicalSwitchName = ElanL2GatewayUtils.getLogicalSwitchFromElan(
                 elanInstance.getElanInstanceName());
         String segmentationId = ElanUtils.getVxlanSegmentationId(elanInstance).toString();
@@ -98,7 +101,12 @@ public class AssociateHwvtepToElanJob implements Callable<List<ListenableFuture<
         LOG.trace("logical switch {} is created on {} with VNI {}", logicalSwitchName,
                 l2GatewayDevice.getHwvtepNodeId(), segmentationId);
         NodeId hwvtepNodeId = new NodeId(l2GatewayDevice.getHwvtepNodeId());
-        String dbVersion = HwvtepUtils.getDbVersion(broker,hwvtepNodeId);
+        String dbVersion = null;
+        try {
+            dbVersion = HwvtepUtils.getDbVersion(broker,hwvtepNodeId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("createLogicalSwitch: Exception while reading DB version for the node {}", hwvtepNodeId, e);
+        }
         if (SouthboundUtils.compareDbVersionToMinVersion(dbVersion, "1.6.0")) {
             replicationMode = "source_node";
         }
@@ -109,10 +117,11 @@ public class AssociateHwvtepToElanJob implements Callable<List<ListenableFuture<
         LogicalSwitches logicalSwitch = HwvtepSouthboundUtils.createLogicalSwitch(logicalSwitchName,
                 elanInstance.getDescription(), segmentationId, replicationMode);
 
-        ListenableFuture<Void> lsCreateFuture = HwvtepUtils.addLogicalSwitch(broker, hwvtepNodeId, logicalSwitch);
-        Futures.addCallback(lsCreateFuture, new FutureCallback<Void>() {
+        FluentFuture<? extends @NonNull CommitInfo> lsCreateFuture = HwvtepUtils.addLogicalSwitch(broker, hwvtepNodeId,
+                logicalSwitch);
+        lsCreateFuture.addCallback(new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(Void noarg) {
+            public void onSuccess(CommitInfo noarg) {
                 // Listener will be closed after all configuration completed
                 // on hwvtep by
                 // listener itself
index 48c13ffcc9eb013b2445b9a44afebda9714eae31..36d7b1b6f597d8f69fb8414ec5161289a09b000e 100644 (file)
@@ -9,16 +9,14 @@ package org.opendaylight.netvirt.elan.l2gw.jobs;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.ListenableFuture;
-
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanRefUtil;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
@@ -26,7 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BcGroupUpdateJob implements Callable<List<ListenableFuture<Void>>> {
+public class BcGroupUpdateJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger("HwvtepEventLogger");
 
index cf17b1fab845408cc89d2c860f324d244cf0ec7f..c6a5f3e7da0b4ceb1cbaca0b018d42f740bb85e3 100644 (file)
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
  * The Job class to delete L2 gateway device local ucast macs from other Elan L2
  * gateway devices.
  */
-public class DeleteL2GwDeviceMacsFromElanJob implements Callable<List<ListenableFuture<Void>>> {
+public class DeleteL2GwDeviceMacsFromElanJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     /** The Constant JOB_KEY_PREFIX. */
     private static final String JOB_KEY_PREFIX = "hwvtep:";
index aa50730fcadfcd0b49fae0ba7969f0eb85d4f210..c5d3b9139f8e9e274e25243114b94486c0ce5785 100644 (file)
@@ -8,14 +8,13 @@
 package org.opendaylight.netvirt.elan.l2gw.jobs;
 
 import com.google.common.util.concurrent.ListenableFuture;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
@@ -32,7 +31,7 @@ import org.slf4j.LoggerFactory;
 /**
  * The Class DeleteLogicalSwitchJob.
  */
-public class DeleteLogicalSwitchJob implements Callable<List<ListenableFuture<Void>>> {
+public class DeleteLogicalSwitchJob implements Callable<List<? extends ListenableFuture<?>>> {
     private DataBroker broker;
 
     /** The logical switch name. */
@@ -66,7 +65,7 @@ public class DeleteLogicalSwitchJob implements Callable<List<ListenableFuture<Vo
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() {
+    public List<ListenableFuture<?>> call() {
         if (cancelled) {
             LOG.info("Delete logical switch job cancelled ");
             return Collections.emptyList();
@@ -82,7 +81,7 @@ public class DeleteLogicalSwitchJob implements Callable<List<ListenableFuture<Vo
         L2GatewayDevice l2GatewayDevice = new L2GatewayDevice("");
         l2GatewayDevice.setHwvtepNodeId(hwvtepNodeId.getValue());
 
-        List<ListenableFuture<Void>> futures = new ArrayList<>();
+        List<ListenableFuture<?>> futures = new ArrayList<>();
         futures.add(HwvtepUtils.deleteLogicalSwitch(broker, hwvtepNodeId, logicalSwitchName));
         if (clearUcast) {
             LOG.trace("Clearing the local ucast macs of device {} macs ", hwvtepNodeId.getValue());
index 4f2b5fe1d5d955781f7ea8ff5a3b2500774647f7..053b171f6d6c742251cc188b256cd1735c9c8cea 100644 (file)
@@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory;
 /**
 * Created by ekvsver on 4/15/2016.
 */
-public class DisAssociateHwvtepFromElanJob implements Callable<List<ListenableFuture<Void>>> {
+public class DisAssociateHwvtepFromElanJob implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(DisAssociateHwvtepFromElanJob.class);
 
     private final ElanL2GatewayUtils elanL2GatewayUtils;
@@ -57,11 +57,11 @@ public class DisAssociateHwvtepFromElanJob implements Callable<List<ListenableFu
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() {
+    public List<ListenableFuture<?>> call() {
         String strHwvtepNodeId = hwvtepNodeId.getValue();
         LOG.info("running disassosiate l2gw connection job for {} {}", elanName, strHwvtepNodeId);
 
-        List<ListenableFuture<Void>> futures = new ArrayList<>();
+        List<ListenableFuture<?>> futures = new ArrayList<>();
 
         // Remove remote MACs and vlan mappings from physical port
         // Once all above configurations are deleted, delete logical
index 8e9e862da93656b631cbce1df5c7b3bcca496a7d..82301d85ac88dbfc6f73b69113dbfd32c48b4367 100644 (file)
@@ -27,7 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DpnDmacJob implements Callable<List<ListenableFuture<Void>>> {
+public class DpnDmacJob implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(DpnDmacJob.class);
 
     private String elanName;
@@ -61,7 +61,7 @@ public class DpnDmacJob implements Callable<List<ListenableFuture<Void>>> {
 
     @Override
     public List<ListenableFuture<Void>> call() throws Exception {
-        ElanInstance elan = elanRefUtil.getElanInstanceCache().get(elanName).orNull();
+        ElanInstance elan = elanRefUtil.getElanInstanceCache().get(elanName).orElse(null);
         if (elan == null) {
             LOG.error("failed.elan.not.found.{}", jobKey);
             return null;
index 4c2eee97ca533dd80355e0ccb4d18cc9e889c6d7..e638fb0d6e3e4af63f439f7ff5fa7cb08256824b 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class HwvtepDeviceMcastMacUpdateJob implements Callable<List<ListenableFuture<Void>>> {
+public class HwvtepDeviceMcastMacUpdateJob implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(HwvtepDeviceMcastMacUpdateJob.class);
 
     private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils;
index cba6adab15ecc581670e8754bd0e30c02b85636c..1d809906c03a6b2b11cbb6ccf395570fdb4f9349 100644 (file)
@@ -12,7 +12,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
@@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory;
 /**
  * The Class LogicalSwitchAddedWorker.
  */
-public class LogicalSwitchAddedJob implements Callable<List<ListenableFuture<Void>>> {
+public class LogicalSwitchAddedJob implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(LogicalSwitchAddedJob.class);
 
     /** The logical switch name. */
@@ -66,11 +66,11 @@ public class LogicalSwitchAddedJob implements Callable<List<ListenableFuture<Voi
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() {
+    public List<ListenableFuture<?>> call() {
         elanL2GatewayUtils.cancelDeleteLogicalSwitch(new NodeId(elanL2GwDevice.getHwvtepNodeId()), logicalSwitchName);
         LOG.debug("running logical switch added job for {} {}", logicalSwitchName,
                 elanL2GwDevice.getHwvtepNodeId());
-        List<ListenableFuture<Void>> futures = new ArrayList<>();
+        List<ListenableFuture<?>> futures = new ArrayList<>();
 
         LOG.info("creating vlan bindings for {} {}", logicalSwitchName, elanL2GwDevice.getHwvtepNodeId());
         futures.add(elanL2GatewayUtils.updateVlanBindingsInL2GatewayDevice(
index 7ca09f1472a6029979e1f7b17e343274bbf44e8c..e9dcd447a47c51fa60dfa472de0a0a34271bddf1 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yangtools.yang.common.Uint64;
 
-public class McastUpdateJob implements Callable<List<ListenableFuture<Void>>> {
+public class McastUpdateJob implements Callable<List<? extends ListenableFuture<?>>> {
     private String elanName;
     private String nodeId;
     private ElanL2GatewayMulticastUtils mcastUtils;
@@ -51,9 +51,9 @@ public class McastUpdateJob implements Callable<List<ListenableFuture<Void>>> {
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() throws Exception {
+    public List<ListenableFuture<?>> call() throws Exception {
         L2GatewayDevice device = ElanL2GwCacheUtils.getL2GatewayDeviceFromCache(elanName, nodeId);
-        ListenableFuture<Void> ft = null;
+        ListenableFuture<?> ft = null;
         //TODO: make prepareRemoteMcastMacUpdateOnDevice return a ListenableFuture<Void>
         if (add) {
             ft = mcastUtils.prepareRemoteMcastMacUpdateOnDevice(elanName, device, !dpnOrConnectionRemoved ,
@@ -61,7 +61,7 @@ public class McastUpdateJob implements Callable<List<ListenableFuture<Void>>> {
         } else {
             ft =  mcastUtils.deleteRemoteMcastMac(new NodeId(nodeId), elanName);
         }
-        List<ListenableFuture<Void>> fts = new ArrayList<ListenableFuture<Void>>();
+        List<ListenableFuture<?>> fts = new ArrayList<>();
         fts.add(ft);
         return fts;
     }
index ed19a0e3e741fd7af78602d106511f80596740cc..0b288d5944833951125f6cb57fb5bf697d1be385 100644 (file)
@@ -13,13 +13,13 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.PreDestroy;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.TaskRetryLooper;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -59,7 +59,7 @@ public abstract class ChildListener<P extends DataObject, C extends DataObject,
 
     protected ListenerRegistration<?> registerListener(final LogicalDatastoreType dsType,
                                                  final InstanceIdentifier wildCard) throws Exception {
-        DataTreeIdentifier<P> treeId = new DataTreeIdentifier<>(dsType, wildCard);
+        DataTreeIdentifier<P> treeId = DataTreeIdentifier.create(dsType, wildCard);
         TaskRetryLooper looper = new TaskRetryLooper(STARTUP_LOOP_TICK, STARTUP_LOOP_MAX_RETRIES);
         return looper.loopUntilNoException(() -> dataBroker.registerDataTreeChangeListener(treeId, this));
     }
index 38cadc021734ff5658e38e0d5c3daeea4e7f2141..a0f22ac4cbd60ab746b0a1c75c3f29c7ab20688c 100644 (file)
@@ -10,21 +10,23 @@ package org.opendaylight.netvirt.elan.l2gw.listeners;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.List;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
@@ -38,7 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase<Group, ElanGroupListener> {
+public class ElanGroupListener extends AbstractClusteredAsyncDataTreeChangeListener<Group> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanGroupListener.class);
     private final ManagedNewTransactionRunner txRunner;
@@ -50,24 +52,29 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase<
     @Inject
     public ElanGroupListener(DataBroker db, ElanClusterUtils elanClusterUtils, ElanUtils elanUtils,
             ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, ElanInstanceCache elanInstanceCache) {
-        super(Group.class, ElanGroupListener.class);
+        super(db, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class).child(Node.class)
+                .augmentation(FlowCapableNode.class).child(Group.class),
+                Executors.newListeningSingleThreadExecutor("ElanGroupListener", LOG));
         this.txRunner = new ManagedNewTransactionRunnerImpl(db);
         this.elanClusterUtils = elanClusterUtils;
         this.elanUtils = elanUtils;
         this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils;
         this.elanInstanceCache = elanInstanceCache;
-        registerListener(LogicalDatastoreType.CONFIGURATION, db);
         LOG.trace("ElanGroupListener registered");
     }
 
+    public void init() {
+        LOG.info("{} init", getClass().getSimpleName());
+    }
+
     @Override
-    protected InstanceIdentifier<Group> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class)
-                .augmentation(FlowCapableNode.class).child(Group.class);
+    @PreDestroy
+    public void close() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Group> identifier, Group del) {
+    public void remove(InstanceIdentifier<Group> identifier, Group del) {
         LOG.trace("received group removed {}", del.key().getGroupId());
     }
 
@@ -97,7 +104,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void update(InstanceIdentifier<Group> identifier, @Nullable Group original, Group update) {
+    public void update(InstanceIdentifier<Group> identifier, @Nullable Group original, Group update) {
         LOG.trace("received group updated {}", update.key().getGroupId());
         final Uint64 dpnId = getDpnId(identifier.firstKeyOf(Node.class).getId().getValue());
         if (dpnId == null) {
@@ -161,15 +168,10 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void add(InstanceIdentifier<Group> identifier, Group added) {
+    public void add(InstanceIdentifier<Group> identifier, Group added) {
         LOG.trace("received group add {}", added.key().getGroupId());
         update(identifier, null/*original*/, added);
     }
-
-    @Override
-    protected ElanGroupListener getDataTreeChangeListener() {
-        return this;
-    }
 }
 
 
index b71598bf1b0e685c492becfeafca90950a5764f3..c9f242919575fea85ffda4a4d6df38038623b429 100644 (file)
@@ -7,20 +7,19 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.listeners;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 import static org.opendaylight.netvirt.elan.utils.ElanConstants.ELAN_EOS_DELAY;
 
-import com.google.common.base.Optional;
-
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
@@ -106,7 +105,7 @@ public class ElanInstanceEntityOwnershipListener implements EntityOwnershipListe
                         LOG.info("Not the owner for Elan entity {}", ownershipChange);
                     }
                     ft = null;
-                } catch (Exception e) {
+                } catch (ExecutionException | InterruptedException e) {
                     LOG.error("Failed to read mdsal ", e);
                 }
             }, ELAN_EOS_DELAY, TimeUnit.MINUTES);
index 60d780fe75d8d11f206abd601b58582cdfbc5068..285b8a3f71eb5297e6e2e09ca43e2412205cc0e9 100644 (file)
@@ -12,20 +12,21 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayServiceRecoveryHandler;
 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.L2gatewayConnections;
@@ -36,7 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanInstanceListener extends AsyncClusteredDataTreeChangeListenerBase<ElanInstance, ElanInstanceListener>
+public class ElanInstanceListener extends AbstractClusteredAsyncDataTreeChangeListener<ElanInstance>
         implements RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(ElanInstanceListener.class);
@@ -49,31 +50,39 @@ public class ElanInstanceListener extends AsyncClusteredDataTreeChangeListenerBa
     public ElanInstanceListener(final DataBroker db, final ElanClusterUtils elanClusterUtils,
                                 final L2GatewayServiceRecoveryHandler l2GatewayServiceRecoveryHandler,
                                 final ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(ElanInstance.class, ElanInstanceListener.class);
+        super(db, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ElanInstances.class)
+                .child(ElanInstance.class),
+                Executors.newListeningSingleThreadExecutor("ElanInstanceListener", LOG));
         broker = db;
         this.txRunner = new ManagedNewTransactionRunnerImpl(db);
         this.elanClusterUtils = elanClusterUtils;
         serviceRecoveryRegistry.addRecoverableListener(l2GatewayServiceRecoveryHandler.buildServiceRegistryKey(), this);
     }
 
-    @PostConstruct
     public void init() {
         registerListener();
     }
 
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
     @Override
     public void registerListener() {
+        super.register();
         LOG.info("Registering ElanInstanceListener");
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
 
     public void deregisterListener() {
+        super.close();
         LOG.info("Deregistering ElanInstanceListener");
-        super.deregisterListener();
     }
 
     @Override
-    protected void remove(final InstanceIdentifier<ElanInstance> identifier,
+    public void remove(final InstanceIdentifier<ElanInstance> identifier,
                           final ElanInstance del) {
         elanClusterUtils.runOnlyInOwnerNode(del.getElanInstanceName(), "delete Elan instance",
             () -> {
@@ -101,22 +110,11 @@ public class ElanInstanceListener extends AsyncClusteredDataTreeChangeListenerBa
     }
 
     @Override
-    protected void update(InstanceIdentifier<ElanInstance> identifier, ElanInstance original, ElanInstance update) {
-
-    }
-
-    @Override
-    protected void add(InstanceIdentifier<ElanInstance> identifier, ElanInstance add) {
-    }
+    public void update(InstanceIdentifier<ElanInstance> identifier, ElanInstance original, ElanInstance update) {
 
-    @Override
-    protected ElanInstanceListener getDataTreeChangeListener() {
-        return ElanInstanceListener.this;
     }
 
     @Override
-    protected InstanceIdentifier<ElanInstance> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class);
+    public void add(InstanceIdentifier<ElanInstance> identifier, ElanInstance add) {
     }
-
 }
index 0df603c28d236091a76ffd09d161940f00d53da1..3f1b967ce503226ee603d2bd44ac876a6937d336 100644 (file)
 package org.opendaylight.netvirt.elan.l2gw.listeners;
 
 import java.util.concurrent.ConcurrentHashMap;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanForwardingTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.forwarding.tables.MacTable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -24,44 +24,42 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ElanMacTableCache extends AsyncClusteredDataTreeChangeListenerBase<MacTable, ElanMacTableCache> {
+public class ElanMacTableCache extends AbstractClusteredAsyncDataTreeChangeListener<MacTable> {
     private static final Logger LOG = LoggerFactory.getLogger(ElanMacTableCache.class);
     private final DataBroker dataBroker;
     private final ConcurrentHashMap<String, MacTable> macsByElan = new ConcurrentHashMap<>();
 
     @Inject
     public ElanMacTableCache(final DataBroker dataBroker) {
-        super(MacTable.class, ElanMacTableCache.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanForwardingTables.class)
+                .child(MacTable.class),
+                Executors.newListeningSingleThreadExecutor("ElanMacTableCache", LOG));
         this.dataBroker = dataBroker;
     }
 
-    @PostConstruct
     public void init() {
-        this.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<MacTable> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanForwardingTables.class).child(MacTable.class).build();
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected ElanMacTableCache getDataTreeChangeListener() {
-        return ElanMacTableCache.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<MacTable> key, MacTable mac) {
+    public void remove(InstanceIdentifier<MacTable> key, MacTable mac) {
         macsByElan.remove(mac.getElanInstanceName());
     }
 
     @Override
-    protected void update(InstanceIdentifier<MacTable> key, MacTable old, MacTable mac) {
+    public void update(InstanceIdentifier<MacTable> key, MacTable old, MacTable mac) {
         macsByElan.put(mac.getElanInstanceName(), mac);
     }
 
     @Override
-    protected void add(InstanceIdentifier<MacTable> key, MacTable mac) {
+    public void add(InstanceIdentifier<MacTable> key, MacTable mac) {
         macsByElan.put(mac.getElanInstanceName(), mac);
     }
 
index 401dee84d8a78af5b0a38385e34da4b7fb778d52..839d53b627383b5b9022853e0584e1b8fb11edb5 100644 (file)
@@ -12,62 +12,61 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
-public class HwvtepConfigNodeCache extends AsyncClusteredDataTreeChangeListenerBase<Node, HwvtepConfigNodeCache> {
+public class HwvtepConfigNodeCache extends AbstractClusteredAsyncDataTreeChangeListener<Node> {
+    private static final Logger LOG = LoggerFactory.getLogger(HwvtepConfigNodeCache.class);
+
     private final DataBroker dataBroker;
     private final Map<InstanceIdentifier<Node>, Node> cache = new ConcurrentHashMap<>();
     private final Map<InstanceIdentifier<Node>, List<Runnable>> waitList = new ConcurrentHashMap<>();
 
     @Inject
     public HwvtepConfigNodeCache(final DataBroker dataBroker) {
-        super(Node.class, HwvtepConfigNodeCache.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))
+                .child(Node.class), Executors.newListeningSingleThreadExecutor("HwvtepConfigNodeCache", LOG));
         this.dataBroker = dataBroker;
     }
 
-    @PostConstruct
     public void init() {
-        this.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))
-                .child(Node.class);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected HwvtepConfigNodeCache getDataTreeChangeListener() {
-        return HwvtepConfigNodeCache.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> key, Node deleted) {
+    public void remove(InstanceIdentifier<Node> key, Node deleted) {
         cache.remove(key);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> key, Node old, Node added) {
+    public void update(InstanceIdentifier<Node> key, Node old, Node added) {
         cache.put(key, added);
     }
 
     @Override
-    protected synchronized void add(InstanceIdentifier<Node> key, Node added) {
+    public synchronized void add(InstanceIdentifier<Node> key, Node added) {
         cache.put(key, added);
         if (waitList.containsKey(key)) {
             waitList.remove(key).stream().forEach(runnable -> runnable.run());
index 1a3f54ef3825a782d6e7f5767a5202f35d659522..c6ac8ac1ab62ff2ebd1501eaae093e2c209709f3 100644 (file)
@@ -10,21 +10,18 @@ package org.opendaylight.netvirt.elan.l2gw.listeners;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiPredicate;
 import java.util.function.Predicate;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.hwvtep.HwvtepAbstractDataTreeChangeListener;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -32,7 +29,12 @@ import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.listeners.HAOpClusteredListener;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayServiceRecoveryHandler;
@@ -124,7 +126,12 @@ public class HwvtepPhysicalSwitchListener
                                         HAOpClusteredListener haListener, L2GatewayCache l2GatewayCache,
                                         StaleVlanBindingsCleaner staleVlanBindingsCleaner,
                                         HwvtepNodeHACache hwvtepNodeHACache) {
-        super(PhysicalSwitchAugmentation.class, HwvtepPhysicalSwitchListener.class, hwvtepNodeHACache);
+        super(dataBroker,  DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class)
+                .augmentation(PhysicalSwitchAugmentation.class)),
+                Executors.newListeningSingleThreadExecutor("HwvtepPhysicalSwitchListener", LOG),
+                hwvtepNodeHACache);
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.itmRpcService = itmRpcService;
@@ -158,33 +165,26 @@ public class HwvtepPhysicalSwitchListener
                 this);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         registerListener();
     }
 
     @Override
     public void registerListener() {
+        super.register();
         LOG.info("Registering HwvtepPhysicalSwitchListener");
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     public void deregisterListener() {
+        super.close();
         LOG.info("Deregistering HwvtepPhysicalSwitchListener");
-        super.deregisterListener();
-    }
-
-    @Override
-    protected InstanceIdentifier<PhysicalSwitchAugmentation> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class)
-                .augmentation(PhysicalSwitchAugmentation.class);
     }
 
     @Override
-    protected HwvtepPhysicalSwitchListener getDataTreeChangeListener() {
-        return HwvtepPhysicalSwitchListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
index 58e1864c4fd670861c170bfcbd362da93801013f..1353813cc89919c22b07aa280dbd515ec6eafa3f 100644 (file)
@@ -7,18 +7,20 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.listeners;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.hwvtep.HwvtepClusteredDataTreeChangeListener;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
@@ -54,7 +56,7 @@ public class HwvtepRemoteMcastMacListener
 
     AtomicBoolean executeTask = new AtomicBoolean(true);
 
-    Callable<List<ListenableFuture<Void>>> taskToRun;
+    Callable<List<? extends ListenableFuture<?>>> taskToRun;
 
     private final JobCoordinator jobCoordinator;
 
@@ -72,10 +74,14 @@ public class HwvtepRemoteMcastMacListener
     public HwvtepRemoteMcastMacListener(DataBroker broker, ElanUtils elanUtils, String logicalSwitchName,
                                         L2GatewayDevice l2GatewayDevice,
                                         List<IpAddress> expectedPhyLocatorIps,
-                                        Callable<List<ListenableFuture<Void>>> task,
+                                        Callable<List<? extends ListenableFuture<?>>> task,
                                         JobCoordinator jobCoordinator, HwvtepNodeHACache hwvtepNodeHACache)
                                                 throws Exception {
-        super(RemoteMcastMacs.class, HwvtepRemoteMcastMacListener.class, hwvtepNodeHACache);
+        super(broker, DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+            HwvtepSouthboundUtils.createRemoteMcastMacsInstanceIdentifier(new NodeId(l2GatewayDevice.getHwvtepNodeId()),
+            logicalSwitchName, new MacAddress(ElanConstants.UNKNOWN_DMAC))),
+            Executors.newListeningSingleThreadExecutor("HwvtepRemoteMcastMacListener", LOG),
+            hwvtepNodeHACache);
         this.elanUtils = elanUtils;
         this.nodeId = new NodeId(l2GatewayDevice.getHwvtepNodeId());
         this.taskToRun = task;
@@ -83,8 +89,8 @@ public class HwvtepRemoteMcastMacListener
         this.expectedPhyLocatorIps = expectedPhyLocatorIps;
         this.jobCoordinator = jobCoordinator;
         LOG.info("registering the listener for mcast mac ");
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
-        LOG.info("registered the listener for mcast mac ");
+        //registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("registered the listener for mcast mac");
         if (isDataPresentInOpDs(getWildCardPath())) {
             LOG.info("mcast mac already present running the task ");
             if (executeTask.compareAndSet(true, false)) {
@@ -116,17 +122,11 @@ public class HwvtepRemoteMcastMacListener
         return true;
     }
 
-    @Override
     public InstanceIdentifier<RemoteMcastMacs> getWildCardPath() {
         return HwvtepSouthboundUtils.createRemoteMcastMacsInstanceIdentifier(nodeId,
                 logicalSwitchName, new MacAddress(ElanConstants.UNKNOWN_DMAC));
     }
 
-    @Override
-    protected HwvtepRemoteMcastMacListener getDataTreeChangeListener() {
-        return this;
-    }
-
     @Override
     protected void removed(InstanceIdentifier<RemoteMcastMacs> identifier, RemoteMcastMacs deleted) {
         LOG.trace("Received Remove DataChange Notification for identifier: {}, RemoteMcastMacs: {}", identifier,
index e3db1b6ddf70ff790f1721c1d49206c6dd3cc96f..b7f39d556a8646669f039cde1cafd128c7907c2f 100644 (file)
@@ -15,10 +15,9 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.hwvtep.HwvtepClusteredDataTreeChangeListener;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -26,6 +25,10 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
@@ -68,8 +71,14 @@ public class HwvtepTerminationPointListener
     public HwvtepTerminationPointListener(DataBroker broker, ElanL2GatewayUtils elanL2GatewayUtils,
             ElanClusterUtils elanClusterUtils, L2GatewayCache l2GatewayCache,
             HwvtepNodeHACache hwvtepNodeHACache) {
-        super(TerminationPoint.class, HwvtepTerminationPointListener.class, hwvtepNodeHACache);
+        //super(TerminationPoint.class, HwvtepTerminationPointListener.class, hwvtepNodeHACache);
 
+        super(broker, DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+            InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class)
+                .child(TerminationPoint.class)),
+            Executors.newListeningSingleThreadExecutor("HwvtepTerminationPointListener", LOG),
+            hwvtepNodeHACache);
         this.broker = broker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.elanL2GatewayUtils = elanL2GatewayUtils;
@@ -112,20 +121,13 @@ public class HwvtepTerminationPointListener
         LOG.trace("physical locator available {}", identifier);
     }
 
-    @Override
-    protected InstanceIdentifier<TerminationPoint> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class)
-                .child(TerminationPoint.class);
-    }
-
-    @Override
-    protected HwvtepTerminationPointListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private List<ListenableFuture<Void>> handlePortAdded(TerminationPoint portAdded, NodeId psNodeId) {
-        Node psNode = HwvtepUtils.getHwVtepNode(broker, LogicalDatastoreType.OPERATIONAL, psNodeId);
+        Node psNode = null;
+        try {
+            psNode = HwvtepUtils.getHwVtepNode(broker, LogicalDatastoreType.OPERATIONAL, psNodeId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while retriving HwVtepNode {}", psNodeId.getValue(), e);
+        }
         if (psNode != null) {
             String psName = psNode.augmentation(PhysicalSwitchAugmentation.class).getHwvtepNodeName().getValue();
             L2GatewayDevice l2GwDevice = l2GatewayCache.get(psName);
@@ -152,8 +154,7 @@ public class HwvtepTerminationPointListener
     private List<ListenableFuture<Void>> handlePortDeleted(InstanceIdentifier<TerminationPoint> identifier) {
         InstanceIdentifier<Node> psNodeIid = identifier.firstIdentifierOf(Node.class);
         return Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-            tx -> tx.read(psNodeIid).get().toJavaUtil().ifPresent(
-                node -> tx.delete(identifier))));
+            tx -> tx.read(psNodeIid).get().ifPresent(node -> tx.delete(identifier))));
     }
 
     private List<VlanBindings> getVlanBindings(List<L2gatewayConnection> l2GwConns, NodeId hwvtepNodeId, String psName,
index 395b11b509a57fb1bc99da2319a4d553cbc87c69..107752d606d3cc29b0186ea05bc9c586039c512e 100644 (file)
@@ -10,35 +10,35 @@ package org.opendaylight.netvirt.elan.l2gw.listeners;
 import static java.util.stream.Collectors.groupingBy;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiPredicate;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.infrautils.metrics.Counter;
 import org.opendaylight.infrautils.metrics.Labeled;
 import org.opendaylight.infrautils.metrics.MetricDescriptor;
 import org.opendaylight.infrautils.metrics.MetricProvider;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayConnectionInstanceRecoveryHandler;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayServiceRecoveryHandler;
@@ -48,6 +48,7 @@ import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.L2gatewayConnections;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnection;
@@ -62,8 +63,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeListenerBase<L2gatewayConnection,
-        L2GatewayConnectionListener> implements RecoverableListener {
+public class L2GatewayConnectionListener extends AbstractClusteredAsyncDataTreeChangeListener<L2gatewayConnection>
+        implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(L2GatewayConnectionListener.class);
     private static final int MAX_READ_TRIALS = 120;
 
@@ -103,7 +104,9 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
                                        final L2GatewayServiceRecoveryHandler l2GatewayServiceRecoveryHandler,
                                        final L2GatewayConnectionInstanceRecoveryHandler l2InstanceRecoveryHandler,
                                        final ServiceRecoveryRegistry serviceRecoveryRegistry) {
-        super(L2gatewayConnection.class, L2GatewayConnectionListener.class);
+        super(db, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(L2gatewayConnections.class).child(L2gatewayConnection.class),
+                Executors.newListeningSingleThreadExecutor("L2GatewayConnectionListener", LOG));
         this.broker = db;
         this.l2GatewayConnectionUtils = l2GatewayConnectionUtils;
         this.scheduler = scheduler;
@@ -114,29 +117,35 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
                 this);
         serviceRecoveryRegistry.addRecoverableListener(l2InstanceRecoveryHandler.buildServiceRegistryKey(),
                 this);
+        init();
     }
 
-    @PostConstruct
     public void init() {
         loadL2GwDeviceCache(1);
         LOG.trace("Loading l2gw connection cache");
         loadL2GwConnectionCache();
-        registerListener();
+    }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     public void registerListener() {
+        super.register();
         LOG.info("Registering L2GatewayConnectionListener");
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
 
     public void deregisterListener() {
+        super.close();
         LOG.info("Deregistering L2GatewayConnectionListener");
-        super.deregisterListener();
     }
 
     @Override
-    protected void add(final InstanceIdentifier<L2gatewayConnection> identifier, final L2gatewayConnection input) {
+    public void add(final InstanceIdentifier<L2gatewayConnection> identifier, final L2gatewayConnection input) {
         LOG.trace("Adding L2gatewayConnection: {}", input);
         elanConnectionsCounter
                 .label(DataObjectModification.ModificationType.WRITE.name())
@@ -149,7 +158,7 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
     }
 
     @Override
-    protected void remove(InstanceIdentifier<L2gatewayConnection> identifier, L2gatewayConnection input) {
+    public void remove(InstanceIdentifier<L2gatewayConnection> identifier, L2gatewayConnection input) {
         LOG.trace("Removing L2gatewayConnection: {}", input);
         elanConnectionsCounter
                 .label(DataObjectModification.ModificationType.DELETE.name())
@@ -158,22 +167,11 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
     }
 
     @Override
-    protected void update(InstanceIdentifier<L2gatewayConnection> identifier, L2gatewayConnection original,
+    public void update(InstanceIdentifier<L2gatewayConnection> identifier, L2gatewayConnection original,
             L2gatewayConnection update) {
         LOG.trace("Updating L2gatewayConnection : original value={}, updated value={}", original, update);
     }
 
-    @Override
-    protected InstanceIdentifier<L2gatewayConnection> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(L2gatewayConnections.class)
-            .child(L2gatewayConnection.class);
-    }
-
-    @Override
-    protected L2GatewayConnectionListener getDataTreeChangeListener() {
-        return this;
-    }
-
     @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "https://github.com/spotbugs/spotbugs/issues/811")
     private void loadL2GwDeviceCache(final int trialNo) {
@@ -182,7 +180,7 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
                 LOG.error("Failed to read config topology");
                 return;
             }
-            ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
+            ReadTransaction tx = broker.newReadOnlyTransaction();
             InstanceIdentifier<Topology> topoIid = HwvtepSouthboundUtils.createHwvtepTopologyInstanceIdentifier();
             Futures.addCallback(tx.read(CONFIGURATION, topoIid), new FutureCallback<Optional<Topology>>() {
                 @Override
@@ -190,7 +188,7 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
                     if (topologyOptional != null && topologyOptional.isPresent()) {
                         loadL2GwDeviceCache(topologyOptional.get().getNode());
                     }
-                    registerListener(CONFIGURATION, broker);
+                    registerListener();
                 }
 
                 @Override
@@ -248,7 +246,13 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis
                 .create(Neutron.class)
                 .child(L2gatewayConnections.class);
 
-        Optional<L2gatewayConnections> optional = MDSALUtil.read(broker, CONFIGURATION, parentIid);
+        Optional<L2gatewayConnections> optional = Optional.empty();
+        try {
+            optional = SingleTransactionDataBroker.syncReadOptional(broker, CONFIGURATION,
+                    parentIid);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("loadL2GwConnectionCache: Exception while reading L2gatewayConnections DS", e);
+        }
         if (optional.isPresent() && optional.get().getL2gatewayConnection() != null) {
             LOG.trace("Found some connections to fill in l2gw connection cache");
             optional.get().getL2gatewayConnection()
index c4acf7f7927b78ff3b3e313a9a8aa906398b158e..6ca606379963d6314e3cf53360e4d9c81a0f46e7 100644 (file)
@@ -21,12 +21,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
@@ -36,6 +33,9 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.netvirt.elan.l2gw.recovery.impl.L2GatewayInstanceRecoveryHandler;
 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayUtils;
@@ -44,6 +44,7 @@ import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.Devices;
@@ -59,7 +60,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<L2gateway, L2GatewayListener>
+public class L2GatewayListener extends AbstractClusteredAsyncDataTreeChangeListener<L2gateway>
         implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(L2GatewayListener.class);
     private final DataBroker dataBroker;
@@ -76,6 +77,9 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<
                              final JobCoordinator jobCoordinator, final L2GatewayCache l2GatewayCache,
                              L2GatewayInstanceRecoveryHandler l2GatewayInstanceRecoveryHandler,
                              ServiceRecoveryRegistry serviceRecoveryRegistry) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(L2gateways.class).child(L2gateway.class),
+                Executors.newListeningSingleThreadExecutor("L2GatewayListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.entityOwnershipUtils = new EntityOwnershipUtils(entityOwnershipService);
@@ -85,31 +89,32 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<
         this.l2GatewayCache = l2GatewayCache;
         serviceRecoveryRegistry.addRecoverableListener(l2GatewayInstanceRecoveryHandler.buildServiceRegistryKey(),
                 this);
+        init();
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener();
+    }
+
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     public void registerListener() {
+        super.register();
         LOG.info("Registering L2Gateway Listener");
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     public void deregisterListener() {
+        super.close();
         LOG.info("Deregistering L2GatewayListener");
-        super.deregisterListener();
     }
 
     @Override
-    protected InstanceIdentifier<L2gateway> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(L2gateways.class).child(L2gateway.class);
-    }
-
-    @Override
-    protected void add(final InstanceIdentifier<L2gateway> identifier, final L2gateway input) {
+    public void add(final InstanceIdentifier<L2gateway> identifier, final L2gateway input) {
         LOG.info("Adding L2gateway with ID: {}", input.getUuid());
 
         for (Devices l2Device : input.nonnullDevices()) {
@@ -119,7 +124,7 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void remove(final InstanceIdentifier<L2gateway> identifier, final L2gateway input) {
+    public void remove(final InstanceIdentifier<L2gateway> identifier, final L2gateway input) {
         LOG.info("Removing L2gateway with ID: {}", input.getUuid());
         List<L2gatewayConnection> connections = l2gwService
                 .getL2GwConnectionsByL2GatewayId(input.getUuid());
@@ -147,7 +152,7 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void update(InstanceIdentifier<L2gateway> identifier, L2gateway original, L2gateway update) {
+    public void update(InstanceIdentifier<L2gateway> identifier, L2gateway original, L2gateway update) {
         LOG.trace("Updating L2gateway : key: {}, original value={}, update value={}", identifier, original, update);
         List<L2gatewayConnection> connections = l2gwService.getAssociatedL2GwConnections(
                 Sets.newHashSet(update.getUuid()));
@@ -278,11 +283,6 @@ public class L2GatewayListener extends AsyncClusteredDataTreeChangeListenerBase<
         }
     }
 
-    @Override
-    protected L2GatewayListener getDataTreeChangeListener() {
-        return this;
-    }
-
     static class DeviceInterfaces {
         Map<String, Map<String, Interfaces>> deviceInterfacesMap = new HashMap<>();
 
index 58fd551aa1c19b9b435b5d48b019dbc4dc3555e7..817dfb4f6e3c37946b3de8df5c63da8581fdaf02 100644 (file)
@@ -21,11 +21,6 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.utils.batching.ResourceBatchingManager;
@@ -33,6 +28,11 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.listeners.HAOpClusteredListener;
@@ -156,7 +156,7 @@ public class LocalUcastMacListener extends ChildListener<Node, LocalUcastMacs, S
                 }
 
                 elanL2GwDevice.removeUcastLocalMac(macRemoved);
-                ElanInstance elanInstance = elanInstanceCache.get(elanName).orNull();
+                ElanInstance elanInstance = elanInstanceCache.get(elanName).orElse(null);
                 elanL2GatewayUtils.unInstallL2GwUcastMacFromL2gwDevices(elanName, elanL2GwDevice,
                         Collections.singletonList(macAddress));
                 elanL2GatewayUtils.unInstallL2GwUcastMacFromElanDpns(elanInstance, elanL2GwDevice,
@@ -175,7 +175,7 @@ public class LocalUcastMacListener extends ChildListener<Node, LocalUcastMacs, S
 
         LOG.trace("LocalUcastMacs {} added to {}", macAddress, hwvtepNodeId);
 
-        ElanInstance elan = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elan = elanInstanceCache.get(elanName).orElse(null);
         if (elan == null) {
             LOG.warn("Could not find ELAN for mac {} being added", macAddress);
             return;
@@ -234,7 +234,7 @@ public class LocalUcastMacListener extends ChildListener<Node, LocalUcastMacs, S
             LoggingFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
                 LOG.trace("On parent add {}", nodeIid);
                 Node operNode = modification.getRootNode().getDataAfter();
-                Set<LocalUcastMacs> configMacs = getMacs(tx.read(nodeIid).get().orNull());
+                Set<LocalUcastMacs> configMacs = getMacs(tx.read(nodeIid).get().orElse(null));
                 Set<LocalUcastMacs> operMacs = getMacs(operNode);
                 Set<LocalUcastMacs> staleMacs = Sets.difference(configMacs, operMacs);
                 staleMacs.forEach(staleMac -> removed(getMacIid(nodeIid, staleMac), staleMac));
index 2e249477a63c6ca2412cac78a8a725b27a78b815..e6be95734d375501d11e46a38fd82b0abca977f7 100644 (file)
@@ -7,18 +7,17 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.recovery.impl;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
@@ -71,22 +70,29 @@ public class L2GatewayConnectionInstanceRecoveryHandler implements ServiceRecove
                 .child(L2gatewayConnections.class)
                 .child(L2gatewayConnection.class, new L2gatewayConnectionKey(uuid));
 
-        Optional<L2gatewayConnection> l2gatewayConnectionOptional = MDSALUtil
-                .read(dataBroker, LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier);
+        Optional<L2gatewayConnection> l2gatewayConnectionOptional = Optional.empty();
+        try {
+            l2gatewayConnectionOptional = SingleTransactionDataBroker.syncReadOptional(
+                    dataBroker, LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("recoverService: Exception while reading L2gatewayConnection DS", e);
+        }
         //l2GatewayConnectionUtils.addL2GatewayConnection(l2gatewayConnectionOptional.get());
 
-        L2gatewayConnection l2gatewayConnection = l2gatewayConnectionOptional.get();
+        if (l2gatewayConnectionOptional.isPresent()) {
+            L2gatewayConnection l2gatewayConnection = l2gatewayConnectionOptional.get();
 
-        try {
-            LOG.info("deleting l2 gateway connection {}",l2gatewayConnection.key());
-            txRunner.callWithNewWriteOnlyTransactionAndSubmit(
-                tx -> tx.delete(LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier)).get();
-            LOG.info("recreating l2 gateway connection {}, {}",entityId, l2gatewayConnection.key());
-            txRunner.callWithNewWriteOnlyTransactionAndSubmit(
-                tx -> tx.put(LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier,
-                        l2gatewayConnection)).get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Service recovery failed for l2gw connection {}", entityId);
+            try {
+                LOG.info("deleting l2 gateway connection {}",l2gatewayConnection.key());
+                txRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                    tx -> tx.delete(LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier)).get();
+                LOG.info("recreating l2 gateway connection {}, {}",entityId, l2gatewayConnection.key());
+                txRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                    tx -> tx.put(LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier,
+                            l2gatewayConnection)).get();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("Service recovery failed for l2gw connection {}", entityId);
+            }
         }
     }
 
index 8a4728aac0b5a87dd5f9e62056c3a3dc01e024c6..cf417d1f01ee8c16ca2eb46927d57f692588e423 100644 (file)
@@ -7,17 +7,16 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.recovery.impl;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
@@ -61,30 +60,43 @@ public class L2GatewayInstanceRecoveryHandler implements ServiceRecoveryInterfac
         InstanceIdentifier<L2gateway> l2gatewayInstanceIdentifier = InstanceIdentifier.create(Neutron.class)
                 .child(L2gateways.class).child(L2gateway.class, new L2gatewayKey(uuid));
 
-        Optional<L2gateway> l2gatewayOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                l2gatewayInstanceIdentifier);
-        L2gateway l2gateway = l2gatewayOptional.get();
+        Optional<L2gateway> l2gatewayOptional = Optional.empty();
+        try {
+            l2gatewayOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, l2gatewayInstanceIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("recoverService: Exception while reading L2gateway DS for the entity {}", entityId, e);
+        }
+
+        if (l2gatewayOptional.isPresent()) {
+            L2gateway l2gateway = l2gatewayOptional.get();
 
-        List<L2gatewayConnection> l2gatewayConnections = l2GatewayConnectionUtils.getL2GwConnectionsByL2GatewayId(uuid);
-        // Do a delete of l2 gateway connection instances.
-        //No null check required since l2gatewayConnections is known to be non-null.
-        LOG.info("Deleting all l2 gateway connections of l2 gateway instance {}", l2gateway.key());
-        for (L2gatewayConnection l2gatewayConnection: l2gatewayConnections) {
-            InstanceIdentifier<L2gatewayConnection> identifier = InstanceIdentifier.create(Neutron.class)
+            List<L2gatewayConnection> l2gatewayConnections = l2GatewayConnectionUtils
+                .getL2GwConnectionsByL2GatewayId(uuid);
+            // Do a delete of l2 gateway connection instances.
+            //No null check required since l2gatewayConnections is known to be non-null.
+            LOG.info("Deleting all l2 gateway connections of l2 gateway instance {}",
+                l2gateway.key());
+            for (L2gatewayConnection l2gatewayConnection : l2gatewayConnections) {
+                InstanceIdentifier<L2gatewayConnection> identifier = InstanceIdentifier
+                    .create(Neutron.class)
                     .child(L2gatewayConnections.class)
                     .child(L2gatewayConnection.class, l2gatewayConnection.key());
-            try {
-                LOG.info("Deleting l2 gateway connection {}",l2gatewayConnection.key());
-                managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
-                    tx -> tx.delete(LogicalDatastoreType.CONFIGURATION, identifier)).get();
-                LOG.info("Recreating l2 gateway connection {}",l2gatewayConnection.key());
-                managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
-                    tx -> tx.put(LogicalDatastoreType.CONFIGURATION, identifier, l2gatewayConnection)).get();
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Service recovery failed for l2gw {}", entityId);
+                try {
+                    LOG.info("Deleting l2 gateway connection {}", l2gatewayConnection.key());
+                    managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                        tx -> tx.delete(LogicalDatastoreType.CONFIGURATION, identifier)).get();
+                    LOG.info("Recreating l2 gateway connection {}", l2gatewayConnection.key());
+                    managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                        tx -> tx.put(LogicalDatastoreType.CONFIGURATION, identifier,
+                            l2gatewayConnection)).get();
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("Service recovery failed for l2gw {}", entityId);
+                }
             }
+            LOG.info("Finished recreation of all l2 gateway connections of l2 gateway instance {}",
+                l2gateway.key());
         }
-        LOG.info("Finished recreation of all l2 gateway connections of l2 gateway instance {}", l2gateway.key());
     }
 
     public String buildServiceRegistryKey() {
index d43253e50814377eecd5f0ba339f38a3bf0843b0..c68a1d747d4cc907dbb2d899306909e4bffe7fee 100644 (file)
@@ -11,7 +11,7 @@ import static java.util.Collections.emptyList;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment;
 
-import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
@@ -20,14 +20,13 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -42,6 +41,10 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elan.l2gw.jobs.HwvtepDeviceMcastMacUpdateJob;
 import org.opendaylight.netvirt.elan.l2gw.jobs.McastUpdateJob;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
@@ -404,8 +407,8 @@ public class ElanL2GatewayMulticastUtils {
             operElanInstance = new SingleTransactionDataBroker(broker).syncReadOptional(
                 LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class, elanInfo.key())
-                    .build()).orNull();
-        } catch (ReadFailedException e) {
+                    .build()).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read elan instance operational path {}", elanInfo, e);
             return emptyList();
         }
@@ -635,13 +638,13 @@ public class ElanL2GatewayMulticastUtils {
      *            the l2 gateway device
      * @return the listenable future
      */
-    public List<ListenableFuture<Void>> handleMcastForElanL2GwDeviceDelete(String elanName,
+    public List<FluentFuture<?>> handleMcastForElanL2GwDeviceDelete(String elanName,
                                                                            L2GatewayDevice l2GatewayDevice) {
-        ListenableFuture<Void> deleteTepFuture =
+        FluentFuture<?> deleteTepFuture =
             txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
                 tx -> tx.delete(buildExternalTepPath(elanName, l2GatewayDevice.getTunnelIp())));
         updateMcastMacsForAllElanDevices(elanName, l2GatewayDevice, false/* updateThisDevice */);
-        ListenableFuture<Void> deleteRemoteMcastMacFuture = deleteRemoteMcastMac(
+        FluentFuture<?> deleteRemoteMcastMacFuture = deleteRemoteMcastMac(
                 new NodeId(l2GatewayDevice.getHwvtepNodeId()), elanName);
         return Arrays.asList(deleteRemoteMcastMacFuture, deleteTepFuture);
     }
@@ -655,7 +658,7 @@ public class ElanL2GatewayMulticastUtils {
      *            the logical switch name
      * @return the listenable future
      */
-    public ListenableFuture<Void> deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) {
+    public FluentFuture<? extends @NonNull CommitInfo> deleteRemoteMcastMac(NodeId nodeId, String logicalSwitchName) {
         InstanceIdentifier<LogicalSwitches> logicalSwitch = HwvtepSouthboundUtils
                 .createLogicalSwitchesInstanceIdentifier(nodeId, new HwvtepNodeName(logicalSwitchName));
         RemoteMcastMacsKey remoteMcastMacsKey = new RemoteMcastMacsKey(new HwvtepLogicalSwitchRef(logicalSwitch),
@@ -702,11 +705,22 @@ public class ElanL2GatewayMulticastUtils {
      */
     public DesignatedSwitchForTunnel getDesignatedSwitchForExternalTunnel(IpAddress tunnelIp,
             String elanInstanceName) {
-        InstanceIdentifier<DesignatedSwitchForTunnel> instanceIdentifier = InstanceIdentifier
+        try {
+            InstanceIdentifier<DesignatedSwitchForTunnel> instanceIdentifier = InstanceIdentifier
                 .builder(DesignatedSwitchesForExternalTunnels.class)
-                .child(DesignatedSwitchForTunnel.class, new DesignatedSwitchForTunnelKey(elanInstanceName, tunnelIp))
+                .child(DesignatedSwitchForTunnel.class,
+                    new DesignatedSwitchForTunnelKey(elanInstanceName, tunnelIp))
                 .build();
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier).orNull();
+            return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, instanceIdentifier)
+                .orElse(null);
+        } catch (ExecutionException e) {
+            LOG.error("Exception while retriving DesignatedSwitch for elan {} and tunnel {}",
+                elanInstanceName, tunnelIp, e);
+        } catch (InterruptedException e) {
+            LOG.error("Exception while retriving DesignatedSwitch for elan {} and tunnel {}",
+                elanInstanceName, tunnelIp, e);
+        }
+        return null;
     }
 
 }
index e2ecee811154598b6f6ba20e4764b5024cef0200..9fea57d0c2dda7fe9fc4042546be589df4e5433d 100644 (file)
@@ -9,8 +9,8 @@ package org.opendaylight.netvirt.elan.l2gw.utils;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -22,6 +22,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -38,19 +39,18 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceDpnsCache;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
@@ -236,7 +236,13 @@ public class ElanL2GatewayUtils {
                 .createLogicalSwitchesInstanceIdentifier(nodeId, new HwvtepNodeName(logicalSwitchName));
         RemoteMcastMacsKey remoteMcastMacsKey = new RemoteMcastMacsKey(new HwvtepLogicalSwitchRef(logicalSwitch),
                 new MacAddress(ElanConstants.UNKNOWN_DMAC));
-        return HwvtepUtils.getRemoteMcastMac(broker, datastoreType, nodeId, remoteMcastMacsKey);
+        try {
+            return HwvtepUtils.getRemoteMcastMac(broker, datastoreType, nodeId, remoteMcastMacsKey);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("readRemoteMcastMac: Exception while reading LogicalSwitches DS for the nodeId {}, "
+                    + "logicalSwitchName {}", nodeId.getValue(), logicalSwitch, e);
+        }
+        return null;
     }
 
     /**
@@ -264,8 +270,9 @@ public class ElanL2GatewayUtils {
      *            the mac addresses
      * @return the listenable future
      */
-    private ListenableFuture<Void> removeRemoteUcastMacsFromExternalDevice(String deviceNodeId,
-            String logicalSwitchName, List<PhysAddress> macAddresses) {
+    private FluentFuture<? extends CommitInfo> removeRemoteUcastMacsFromExternalDevice(String deviceNodeId,
+                                                                                       String logicalSwitchName,
+                                                                                       List<PhysAddress> macAddresses) {
         NodeId nodeId = new NodeId(deviceNodeId);
 
         // TODO (eperefr)
@@ -374,8 +381,8 @@ public class ElanL2GatewayUtils {
                                 && !areMLAGDevices(extL2GwDevice, otherDevice)) {
                             final String hwvtepId = otherDevice.getHwvtepNodeId();
                             final String logicalSwitchName = elanInstanceName;
-                            futures.add(HwvtepUtils.installUcastMacs(
-                                    broker, hwvtepId, macList, logicalSwitchName, extL2GwDeviceTepIp));
+                            HwvtepUtils.installUcastMacs(broker, hwvtepId, macList, logicalSwitchName,
+                                    extL2GwDeviceTepIp);
                         }
                     }
                     return futures;
@@ -474,7 +481,7 @@ public class ElanL2GatewayUtils {
             LOG.trace("No L2 gateway devices in Elan [{}] cache.", elanName);
             return;
         }
-        final ElanInstance elan = elanInstanceCache.get(elanName).orNull();
+        final ElanInstance elan = elanInstanceCache.get(elanName).orElse(null);
         if (elan == null) {
             LOG.error("Could not find Elan by name: {}", elanName);
             return;
@@ -550,17 +557,17 @@ public class ElanL2GatewayUtils {
      *            the elan name
      * @return the listenable future
      */
-    public ListenableFuture<Void> deleteElanMacsFromL2GatewayDevice(String hwvtepNodeId, String elanName) {
+    public FluentFuture<? extends CommitInfo> deleteElanMacsFromL2GatewayDevice(String hwvtepNodeId, String elanName) {
         String logicalSwitch = getLogicalSwitchFromElan(elanName);
 
         List<MacAddress> lstElanMacs = getRemoteUcastMacs(new NodeId(hwvtepNodeId), logicalSwitch,
                 LogicalDatastoreType.CONFIGURATION);
-        ListenableFuture<Void> future = HwvtepUtils.deleteRemoteUcastMacs(broker, new NodeId(hwvtepNodeId),
+        FluentFuture<? extends CommitInfo> future = HwvtepUtils.deleteRemoteUcastMacs(broker, new NodeId(hwvtepNodeId),
                 logicalSwitch, lstElanMacs);
 
-        Futures.addCallback(future, new FutureCallback<Void>() {
+        Futures.addCallback(future, new FutureCallback<CommitInfo>() {
             @Override
-            public void onSuccess(Void noarg) {
+            public void onSuccess(CommitInfo noarg) {
                 LOG.trace("Successful in batch deletion of elan [{}] macs from l2gw device [{}]", elanName,
                         hwvtepNodeId);
             }
@@ -599,7 +606,14 @@ public class ElanL2GatewayUtils {
     public List<MacAddress> getRemoteUcastMacs(NodeId hwvtepNodeId, String logicalSwitch,
             LogicalDatastoreType datastoreType) {
         List<MacAddress> lstMacs = Collections.emptyList();
-        Node hwvtepNode = HwvtepUtils.getHwVtepNode(broker, datastoreType, hwvtepNodeId);
+        Node hwvtepNode;
+        try {
+            hwvtepNode = HwvtepUtils.getHwVtepNode(broker, datastoreType, hwvtepNodeId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getRemoteUcastMacs: Exception while reading hwvtepNodeId DS for the hwvtepNodeId {}",
+                    hwvtepNodeId.getValue(), e);
+            return Collections.emptyList();
+        }
         if (hwvtepNode != null) {
             List<RemoteUcastMacs> remoteUcastMacs = hwvtepNode.augmentation(HwvtepGlobalAugmentation.class)
                     .getRemoteUcastMacs();
@@ -626,8 +640,8 @@ public class ElanL2GatewayUtils {
      *            the l2 gateway device which has to be configured
      * @return the listenable future
      */
-    public ListenableFuture<Void> installElanMacsInL2GatewayDevice(String elanName,
-            L2GatewayDevice l2GatewayDevice) {
+    public FluentFuture<? extends CommitInfo> installElanMacsInL2GatewayDevice(String elanName,
+                                                                               L2GatewayDevice l2GatewayDevice) {
         String logicalSwitchName = getLogicalSwitchFromElan(elanName);
         NodeId hwVtepNodeId = new NodeId(l2GatewayDevice.getHwvtepNodeId());
 
@@ -639,7 +653,8 @@ public class ElanL2GatewayUtils {
         List<RemoteUcastMacs> lstRemoteUcastMacs = new ArrayList<>(lstL2GatewayDevicesMacs);
         lstRemoteUcastMacs.addAll(lstElanMacTableEntries);
 
-        ListenableFuture<Void> future = HwvtepUtils.addRemoteUcastMacs(broker, hwVtepNodeId, lstRemoteUcastMacs);
+        FluentFuture<? extends CommitInfo> future = HwvtepUtils.addRemoteUcastMacs(broker, hwVtepNodeId,
+                lstRemoteUcastMacs);
 
         LOG.info("Added RemoteUcastMacs entries [{}] in config DS. NodeID: {}, LogicalSwitch: {}",
                 lstRemoteUcastMacs.size(), hwVtepNodeId.getValue(), logicalSwitchName);
@@ -908,8 +923,8 @@ public class ElanL2GatewayUtils {
         InstanceIdentifier<Interface> interfaceId = getInterfaceIdentifier(interfaceKey);
         try {
             return SingleTransactionDataBroker
-                    .syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, interfaceId).orNull();
-        } catch (ReadFailedException e) {
+                    .syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, interfaceId).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             // TODO remove this, and propagate ReadFailedException instead of re-throw RuntimeException
             LOG.error("getInterfaceFromConfigDS({}) failed", interfaceKey, e);
             throw new RuntimeException(e);
@@ -932,7 +947,7 @@ public class ElanL2GatewayUtils {
         LOG.info("Deleting L2GatewayDevice [{}] UcastLocalMacs from elan [{}]", l2GatewayDevice.getHwvtepNodeId(),
                 elanName);
 
-        ElanInstance elan = elanInstanceCache.get(elanName).orNull();
+        ElanInstance elan = elanInstanceCache.get(elanName).orElse(null);
         if (elan == null) {
             LOG.error("Could not find Elan by name: {}", elanName);
             return;
@@ -980,17 +995,19 @@ public class ElanL2GatewayUtils {
                 .filter(deviceVteps -> !Objects.equals(psNodeId, deviceVteps.getNodeId())
                         || !Objects.equals(tunnelIp, deviceVteps.getIpAddress()))//node id or tunnel ip is changed
                 .forEach(deviceVteps -> deleteStaleL2gwTep(dataBroker, itmRpcService, deviceVteps));
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("Failed delete stale tunnels for {}", globalNodeId);
         }
     }
 
-    private static Optional<TransportZones> readTransportZone(DataBroker dataBroker) throws ReadFailedException {
+    private static Optional<TransportZones> readTransportZone(DataBroker dataBroker) throws ExecutionException,
+            InterruptedException {
         return new SingleTransactionDataBroker(dataBroker).syncReadOptional(LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.builder(TransportZones.class).build());
     }
 
-    private static Optional<ElanInstances> readElanInstances(DataBroker dataBroker) throws ReadFailedException {
+    private static Optional<ElanInstances> readElanInstances(DataBroker dataBroker) throws ExecutionException,
+            InterruptedException {
         return new SingleTransactionDataBroker(dataBroker).syncReadOptional(LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.builder(ElanInstances.class).build());
     }
@@ -1023,7 +1040,7 @@ public class ElanL2GatewayUtils {
                         .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) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("Failed to delete stale l2gw tep {}", deviceVteps, e);
         }
     }
@@ -1108,8 +1125,15 @@ public class ElanL2GatewayUtils {
                     .map(mac -> new MacAddress(mac.getMacEntryKey().getValue().toLowerCase(Locale.ENGLISH)))
                     .collect(Collectors.toList()));
         }
-        Optional<Node> configNode = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION,
-                HwvtepSouthboundUtils.createInstanceIdentifier(new NodeId(l2gwDevice.getHwvtepNodeId())));
+        Optional<Node> configNode;
+        try {
+            configNode = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    HwvtepSouthboundUtils.createInstanceIdentifier(new NodeId(l2gwDevice.getHwvtepNodeId())));
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getL2GwDeviceLocalMacs: Exception while reading l2gwDevice DS for the elan {}, l2gwDevice {}",
+                    elanName, l2gwDevice, e);
+            return Collections.emptyList();
+        }
         if (configNode.isPresent()) {
             HwvtepGlobalAugmentation augmentation = configNode.get().augmentation(HwvtepGlobalAugmentation.class);
             if (augmentation != null && augmentation.getLocalUcastMacs() != null) {
index 86d4027591b905fa549d714b87cf1f9e53e14860..caa37a6fa0840b801d1176df185d88b56ac27c80 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.elan.l2gw.utils;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.cache.ConfigMcastCache;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceDpnsCache;
index 2042f7134b7df3ba2395bd8df223192643cd7480..d9c7f1aaef7fb297553c0d2875d7958e9e3f4d0b 100644 (file)
@@ -11,28 +11,32 @@ package org.opendaylight.netvirt.elan.l2gw.utils;
 import static java.util.Collections.emptyList;
 import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlanNetworkOrVxlanSegment;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.FluentFuture;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
+import org.opendaylight.mdsal.binding.util.RetryingManagedNewTransactionRunner;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.l2gw.ha.listeners.HAOpClusteredListener;
 import org.opendaylight.netvirt.elan.l2gw.jobs.AssociateHwvtepToElanJob;
@@ -79,6 +83,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable {
     private final ElanRefUtil elanRefUtil;
     private final L2GatewayServiceRecoveryHandler l2GatewayServiceRecoveryHandler;
     private final ServiceRecoveryRegistry serviceRecoveryRegistry;
+    private final ManagedNewTransactionRunner txRunner;
 
     @Inject
     public L2GatewayConnectionUtils(DataBroker dataBroker, ElanClusterUtils elanClusterUtils,
@@ -101,6 +106,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable {
         this.elanRefUtil = elanRefUtil;
         this.l2GatewayServiceRecoveryHandler = l2GatewayServiceRecoveryHandler;
         this.serviceRecoveryRegistry = serviceRecoveryRegistry;
+        this.txRunner = new RetryingManagedNewTransactionRunner(dataBroker);
     }
 
     @Override
@@ -125,22 +131,38 @@ public class L2GatewayConnectionUtils implements AutoCloseable {
         LOG.debug("getNeutronL2gateway for {}", l2GatewayId.getValue());
         InstanceIdentifier<L2gateway> inst = InstanceIdentifier.create(Neutron.class).child(L2gateways.class)
                 .child(L2gateway.class, new L2gatewayKey(l2GatewayId));
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst).orNull();
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, inst)
+                    .orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNeutronL2gateway: Exception while reading L2gateway DS for the ID {}", l2GatewayId, e);
+        }
+        return null;
     }
 
     @NonNull
     public static List<L2gateway> getL2gatewayList(DataBroker broker) {
         InstanceIdentifier<L2gateways> inst = InstanceIdentifier.create(Neutron.class).child(L2gateways.class);
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst).toJavaUtil().map(
-                L2gateways::getL2gateway).orElse(emptyList());
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, inst).map(
+                    L2gateways::getL2gateway).orElse(emptyList());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNeutronL2gateway: Exception while reading L2gateway DS", e);
+        }
+        return null;
     }
 
     @NonNull
     public static List<L2gatewayConnection> getAllL2gatewayConnections(DataBroker broker) {
         InstanceIdentifier<L2gatewayConnections> inst = InstanceIdentifier.create(Neutron.class)
                 .child(L2gatewayConnections.class);
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst).toJavaUtil().map(
-                L2gatewayConnections::getL2gatewayConnection).orElse(emptyList());
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, inst).map(
+                    L2gatewayConnections::getL2gatewayConnection).orElse(emptyList());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNeutronL2gateway: Exception while reading L2gateway DS", e);
+        }
+        return null;
     }
 
     /**
@@ -207,7 +229,7 @@ public class L2GatewayConnectionUtils implements AutoCloseable {
         // comes we need to wait for elaninstance to resolve. Hence updating the map with the runnable .
         // When elanInstance add comes , it look in to the map and run the associated runnable associated with it.
         ElanInstance elanInstance = elanInstanceCache.get(networkUuid.getValue(),
-            () -> addL2GatewayConnection(input, l2GwDeviceName)).orNull();
+            () -> addL2GatewayConnection(input, l2GwDeviceName)).orElse(null);
         if (elanInstance == null) {
             return;
         }
@@ -372,36 +394,38 @@ public class L2GatewayConnectionUtils implements AutoCloseable {
         final InstanceIdentifier<Node> nodeIid = HwvtepSouthboundUtils.createInstanceIdentifier(
                 new NodeId(l2GatewayDevice.getHwvtepNodeId()));
         jobCoordinator.enqueueJob(elanName + ":" + l2GatewayDevice.getDeviceName(), () -> {
-            final SettableFuture settableFuture = SettableFuture.create();
-            Futures.addCallback(broker.newReadOnlyTransaction().read(LogicalDatastoreType.OPERATIONAL,
-                    nodeIid), new SettableFutureCallback<Optional<Node>>(settableFuture) {
-                        @Override
-                        public void onSuccess(@NonNull Optional<Node> resultNode) {
+            FluentFuture<Optional<Node>> fluentFuture = broker.newReadOnlyTransaction().read(
+                    LogicalDatastoreType.OPERATIONAL, nodeIid);
+            Futures.addCallback(fluentFuture, new FutureCallback<Optional<Node>>() {
+                @Override
+                public void onSuccess(Optional<Node> nodeOptional) {
+                    if (nodeOptional.isPresent()) {
+                        Node node = nodeOptional.get();
+                        if (node.augmentation(HwvtepGlobalAugmentation.class) != null) {
+                            List<LocalUcastMacs> localUcastMacs =
+                                    node.augmentation(HwvtepGlobalAugmentation.class).getLocalUcastMacs();
+                            if (localUcastMacs == null) {
+                                return;
+                            }
                             LocalUcastMacListener localUcastMacListener =
                                     new LocalUcastMacListener(broker, haOpClusteredListener,
                                             elanL2GatewayUtils, jobCoordinator, elanInstanceCache, hwvtepNodeHACache,
                                             l2GatewayServiceRecoveryHandler, serviceRecoveryRegistry);
-                            settableFuture.set(resultNode);
-                            Optional<Node> nodeOptional = resultNode;
-                            if (nodeOptional.isPresent()) {
-                                Node node = nodeOptional.get();
-                                if (node.augmentation(HwvtepGlobalAugmentation.class) != null) {
-                                    List<LocalUcastMacs> localUcastMacs =
-                                            node.augmentation(HwvtepGlobalAugmentation.class).getLocalUcastMacs();
-                                    if (localUcastMacs == null) {
-                                        return;
-                                    }
-                                    localUcastMacs.stream()
-                                            .filter((mac) -> macBelongsToLogicalSwitch(mac, elanName))
-                                            .forEach((mac) -> {
-                                                InstanceIdentifier<LocalUcastMacs> macIid = getMacIid(nodeIid, mac);
-                                                localUcastMacListener.added(macIid, mac);
-                                            });
-                                }
-                            }
+                            localUcastMacs.stream()
+                                    .filter((mac) -> macBelongsToLogicalSwitch(mac, elanName))
+                                    .forEach((mac) -> {
+                                        InstanceIdentifier<LocalUcastMacs> macIid = getMacIid(nodeIid, mac);
+                                        localUcastMacListener.added(macIid, mac);
+                                    });
                         }
-                    }, MoreExecutors.directExecutor());
-            return Lists.newArrayList(settableFuture);
+                    }
+                }
+
+                @Override
+                public void onFailure(Throwable throwable) {
+                }
+            }, MoreExecutors.directExecutor());
+            return Lists.newArrayList(fluentFuture);
         } , 5);
     }
 
index 1d1c1c72a1b811c6b797e20e4fd534363b3818ab..7dbaaad76c9bd8cc1859fb6f7b589c50d17a480a 100644 (file)
@@ -13,8 +13,8 @@ import java.util.List;
 import java.util.Set;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.infrautils.inject.AbstractLifecycle;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
 import org.opendaylight.netvirt.elanmanager.api.IL2gwService;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
index 4688f95700eba5ca2db77848ab6cbcc6c90fc60b..b44ec27322a5c38d875c28af305386b54df24e66 100644 (file)
@@ -15,6 +15,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiPredicate;
@@ -23,13 +24,13 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.utils.Scheduler;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
@@ -108,12 +109,18 @@ public class StaleVlanBindingsCleaner {
                 () -> {
                     L2GatewayDevice l2GwDevice = l2GatewayCache.get(deviceName);
                     NodeId globalNodeId = globalNodeIid.firstKeyOf(Node.class).getNodeId();
-                    Node configNode = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, globalNodeIid)
-                            .or(defaultNode(globalNodeId));
-                    Node configPsNode =
-                        MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, psNodeIid).or(defaultNode(psNodeId));
-                    cleanupStaleLogicalSwitches(l2GwDevice, configNode, configPsNode);
-                    cleanupTasks.remove(psNodeIid.firstKeyOf(Node.class).getNodeId());
+                    try {
+                        Node configNode = SingleTransactionDataBroker.syncReadOptional(broker,
+                                LogicalDatastoreType.CONFIGURATION, globalNodeIid).orElse(defaultNode(globalNodeId));
+                        Node configPsNode = SingleTransactionDataBroker.syncReadOptional(broker,
+                                LogicalDatastoreType.CONFIGURATION, psNodeIid)
+                                        .orElse(defaultNode(psNodeId));
+                        cleanupStaleLogicalSwitches(l2GwDevice, configNode, configPsNode);
+                        cleanupTasks.remove(psNodeIid.firstKeyOf(Node.class).getNodeId());
+                    } catch (ExecutionException | InterruptedException e) {
+                        LOG.error("scheduleStaleCleanup: Exception while reading globalNodeIid/psNodeIid DS for "
+                                + "the globalNodeIid {} psNodeIid {}", globalNodeId, psNodeId, e);
+                    }
                 }, getCleanupDelay(), TimeUnit.SECONDS);
         });
     }
index bf349fd62f9355f4cd689d4cf6de0de5c3dbba37..bb538fdd4cb2a717414825e9b9144e49e9fb96f6 100644 (file)
@@ -12,11 +12,11 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.internal.ElanServiceProvider;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
index ceb575a0bff45d92959e3234f5cd3192898d9814..9201e973062e0fd49fd1b3e945e109812cdba3d5 100755 (executable)
@@ -7,9 +7,9 @@
  */
 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 java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
index 5d3e8ff396e23687072a33e71fda1a115685292f..0b628921f40ad39c93528fc624b78612e9182d32 100644 (file)
@@ -32,7 +32,7 @@ public final class ElanClusterUtils {
             HwvtepSouthboundConstants.ELAN_ENTITY_NAME, jobCoordinator, jobDesc, job);
     }
 
-    public void runOnlyInOwnerNode(String jobKey, String jobDesc, Callable<List<ListenableFuture<Void>>> job) {
+    public void runOnlyInOwnerNode(String jobKey, String jobDesc, Callable<List<? extends ListenableFuture<?>>> job) {
         entityOwnershipUtils.runOnlyInOwnerNode(HwvtepSouthboundConstants.ELAN_ENTITY_TYPE,
             HwvtepSouthboundConstants.ELAN_ENTITY_NAME, jobCoordinator, jobKey, jobDesc, job);
     }
index 7b6bddc04f499841f600b6cfbc473bb34d53b766..cf1b273569d40684d675ac07f0ac091f4fbfeb01 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netvirt.elan.utils;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -15,6 +14,7 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
index 16a33b7a1bc9008f0755051d5139e7e09c1fdb94..548493e608718983cec421b17d5f058f8d5bea8a 100644 (file)
@@ -7,12 +7,12 @@
  */
 package org.opendaylight.netvirt.elan.utils;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeLeafTagName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.tag.name.map.ElanTagName;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
index 524c533ddc0a5f116a2696d7a53fdb7a6654080f..24f5e2b5635b2b872f15a3784d5b9701ab70cc92 100644 (file)
@@ -7,24 +7,24 @@
  */
 package org.opendaylight.netvirt.elan.utils;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
index a319c94e04ba71c9729bc9458f4c171752c7be70..7dabac216a7225b8477951e2200ee92668885180 100644 (file)
@@ -14,8 +14,8 @@ import java.util.concurrent.Future;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
 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.interfaces.rev140508.interfaces.Interface;
index cef193f43982413206446267ce114d1c6d3945f2..b52dd2ad77b14dece962848ee5f5c31fd80b5ac9 100755 (executable)
@@ -8,15 +8,14 @@
 package org.opendaylight.netvirt.elan.utils;
 
 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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.primitives.Ints;
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -30,6 +29,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -42,12 +42,7 @@ import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -83,6 +78,12 @@ import org.opendaylight.genius.mdsalutil.packet.IPv4;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
 import org.opendaylight.infrautils.utils.concurrent.NamedLocks;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.internal.ElanGroupCache;
@@ -260,9 +261,9 @@ public class ElanUtils {
             .setBucketId(new BucketId(id.incrementAndGet()))
             .build();
 
-    public static final FutureCallback<Void> DEFAULT_CALLBACK = new FutureCallback<Void>() {
+    public static final FutureCallback<CommitInfo> DEFAULT_CALLBACK = new FutureCallback<CommitInfo>() {
         @Override
-        public void onSuccess(Void result) {
+        public void onSuccess(CommitInfo result) {
             LOG.debug("Success in Datastore operation");
         }
 
@@ -344,27 +345,28 @@ public class ElanUtils {
     @SuppressWarnings("checkstyle:IllegalCatch")
     public static <T extends DataObject> Optional<T> read(@NonNull DataBroker broker,
             LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
-        } catch (Exception e) {
+        } catch (ExecutionException | InterruptedException  e) {
             throw new RuntimeException(e);
         }
     }
 
     public <T extends DataObject> Optional<T> read2(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path)
-            throws ReadFailedException {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
-            CheckedFuture<Optional<T>, ReadFailedException> checkedFuture = tx.read(datastoreType, path);
-            return checkedFuture.checkedGet();
+            throws InterruptedException, ExecutionException {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
+            FluentFuture<Optional<T>> checkedFuture = tx.read(datastoreType, path);
+            return checkedFuture.get();
         }
     }
 
     @SuppressWarnings("checkstyle:ForbidCertainMethod")
     public static <T extends DataObject> void delete(DataBroker broker, LogicalDatastoreType datastoreType,
-            InstanceIdentifier<T> path) {
+                                                            InstanceIdentifier<T> path) {
         WriteTransaction tx = broker.newWriteOnlyTransaction();
         tx.delete(datastoreType, path);
-        Futures.addCallback(tx.submit(), DEFAULT_CALLBACK, MoreExecutors.directExecutor());
+        FluentFuture<? extends @NonNull CommitInfo> future = tx.commit();
+        future.addCallback(DEFAULT_CALLBACK, MoreExecutors.directExecutor());
     }
 
     public static InstanceIdentifier<ElanInterface> getElanInterfaceConfigurationDataPathId(String interfaceName) {
@@ -376,13 +378,20 @@ public class ElanUtils {
     @Nullable
     public static Elan getElanByName(DataBroker broker, String elanInstanceName) {
         InstanceIdentifier<Elan> elanIdentifier = getElanInstanceOperationalDataPath(elanInstanceName);
-        return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).orNull();
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    elanIdentifier).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getElanByName: Exception while reading elan-instance DS for the elan instance {}",
+                    elanInstanceName, e);
+            return null;
+        }
     }
 
     @Nullable
     public static Elan getElanByName(TypedReadTransaction<Operational> tx, String elanInstanceName)
             throws ExecutionException, InterruptedException {
-        return tx.read(getElanInstanceOperationalDataPath(elanInstanceName)).get().orNull();
+        return tx.read(getElanInstanceOperationalDataPath(elanInstanceName)).get().orElse(null);
     }
 
     public static InstanceIdentifier<Elan> getElanInstanceOperationalDataPath(String elanInstanceName) {
@@ -394,13 +403,13 @@ public class ElanUtils {
     public MacEntry getInterfaceMacEntriesOperationalDataPath(String interfaceName, PhysAddress physAddress) {
         InstanceIdentifier<MacEntry> existingMacEntryId = getInterfaceMacEntriesIdentifierOperationalDataPath(
                 interfaceName, physAddress);
-        return read(broker, LogicalDatastoreType.OPERATIONAL, existingMacEntryId).orNull();
+        return read(broker, LogicalDatastoreType.OPERATIONAL, existingMacEntryId).orElse(null);
     }
 
     @Nullable
     public MacEntry getInterfaceMacEntriesOperationalDataPathFromId(TypedReadTransaction<Operational> tx,
             InstanceIdentifier<MacEntry> identifier) throws ExecutionException, InterruptedException {
-        return tx.read(identifier).get().orNull();
+        return tx.read(identifier).get().orElse(null);
     }
 
     public static InstanceIdentifier<MacEntry> getInterfaceMacEntriesIdentifierOperationalDataPath(String interfaceName,
@@ -426,7 +435,7 @@ public class ElanUtils {
     @Nullable
     public MacEntry getMacEntryFromElanMacId(TypedReadTransaction<Operational> tx,
             InstanceIdentifier<MacEntry> identifier) throws ExecutionException, InterruptedException {
-        return tx.read(identifier).get().orNull();
+        return tx.read(identifier).get().orElse(null);
     }
 
     public static InstanceIdentifier<MacEntry> getMacEntryOperationalDataPath(String elanName,
@@ -449,7 +458,7 @@ public class ElanUtils {
     public static ElanInterfaceMac getElanInterfaceMacByInterfaceName(DataBroker dataBroker, String interfaceName) {
         InstanceIdentifier<ElanInterfaceMac> elanInterfaceId = getElanInterfaceMacEntriesOperationalDataPath(
                 interfaceName);
-        return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanInterfaceId).orNull();
+        return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanInterfaceId).orElse(null);
     }
 
     public static InstanceIdentifier<ElanInterfaceMac> getElanInterfaceMacEntriesOperationalDataPath(
@@ -472,7 +481,7 @@ public class ElanUtils {
     public DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, Uint64 dpId) {
         InstanceIdentifier<DpnInterfaces> elanDpnInterfacesId = getElanDpnInterfaceOperationalDataPath(elanInstanceName,
                 dpId);
-        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfacesId).orNull();
+        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfacesId).orElse(null);
     }
 
     /**
@@ -499,7 +508,7 @@ public class ElanUtils {
         InstanceIdentifier<ElanTagName> elanId = getElanInfoEntriesOperationalDataPath(elanTag);
         Optional<ElanTagName> existingElanInfo = read(broker,
                 LogicalDatastoreType.OPERATIONAL, elanId);
-        return existingElanInfo.orNull();
+        return existingElanInfo.orElse(null);
     }
 
     public static InstanceIdentifier<ElanTagName> getElanInfoEntriesOperationalDataPath(Uint32 elanTag) {
@@ -527,14 +536,14 @@ public class ElanUtils {
     @Nullable
     public ElanDpnInterfacesList getElanDpnInterfacesList(String elanName) {
         InstanceIdentifier<ElanDpnInterfacesList> elanDpnInterfaceId = getElanDpnOperationDataPath(elanName);
-        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orNull();
+        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orElse(null);
     }
 
     @Nullable
     public ElanDpnInterfaces getElanDpnInterfacesList() {
         InstanceIdentifier<ElanDpnInterfaces> elanDpnInterfaceId = InstanceIdentifier.builder(ElanDpnInterfaces.class)
                 .build();
-        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orNull();
+        return read(broker, LogicalDatastoreType.OPERATIONAL, elanDpnInterfaceId).orElse(null);
     }
 
     /**
@@ -581,7 +590,7 @@ public class ElanUtils {
     @Nullable
     public static MacTable getElanMacTable(DataBroker dataBroker, String elanName) {
         InstanceIdentifier<MacTable> elanMacTableId = getElanMacTableOperationalDataPath(elanName);
-        return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanMacTableId).orNull();
+        return read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanMacTableId).orElse(null);
     }
 
     public static long getElanLocalBCGId(long elanTag) {
@@ -686,7 +695,8 @@ public class ElanUtils {
     }
 
     private Uint32 getElanTag(ElanInstance elanInfo, InterfaceInfo interfaceInfo) {
-        EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceInfo.getInterfaceName()).orNull();
+        EtreeInterface etreeInterface = elanInterfaceCache
+            .getEtreeInterface(interfaceInfo.getInterfaceName()).orElse(null);
         if (etreeInterface == null || etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) {
             return elanInfo.getElanTag();
         } else { // Leaf
@@ -865,8 +875,14 @@ public class ElanUtils {
     @NonNull
     public List<DpnInterfaces> getElanDPNByName(String elanInstanceName) {
         InstanceIdentifier<ElanDpnInterfacesList> elanIdentifier = getElanDpnOperationDataPath(elanInstanceName);
-        return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).toJavaUtil().map(
-                ElanDpnInterfacesList::getDpnInterfaces).orElse(emptyList());
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    elanIdentifier).map(ElanDpnInterfacesList::getDpnInterfaces).orElse(emptyList());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getElanDPNByName: Exception while reading elanDpnInterfaceList DS for the elan "
+                    + "instance {}", elanInstanceName, e);
+            return emptyList();
+        }
     }
 
     private void setupLocalDmacFlow(Uint32 elanTag, Uint64 dpId, String ifName, String macAddress,
@@ -879,7 +895,7 @@ public class ElanUtils {
 
     private void installEtreeLocalDmacFlow(Uint32 elanTag, Uint64 dpId, String ifName, String macAddress,
             ElanInstance elanInfo, long ifTag, TypedWriteTransaction<Configuration> writeFlowGroupTx) {
-        EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(ifName).orNull();
+        EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(ifName).orElse(null);
         if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) {
             EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag.longValue());
             if (etreeTagName == null) {
@@ -968,7 +984,7 @@ public class ElanUtils {
                                           TypedWriteTransaction<Configuration> writeFlowGroupTx,
                                           ElanInstance elanInstance) {
         Flow flowEntity;
-        EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName).orNull();
+        EtreeInterface etreeInterface = elanInterfaceCache.getEtreeInterface(interfaceName).orElse(null);
         if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) {
             EtreeLeafTagName etreeTagName = elanEtreeUtils.getEtreeLeafTagByElanTag(elanTag.longValue());
             if (etreeTagName == null) {
@@ -1298,7 +1314,7 @@ public class ElanUtils {
         Class<? extends TunnelTypeBase> tunType = TunnelTypeVxlan.class;
         InstanceIdentifier<ExternalTunnel> iid = InstanceIdentifier.builder(ExternalTunnelList.class)
                 .child(ExternalTunnel.class, new ExternalTunnelKey(destinationDevice, sourceDevice, tunType)).build();
-        return read(broker, datastoreType, iid).orNull();
+        return read(broker, datastoreType, iid).orElse(null);
     }
 
     /**
@@ -1332,7 +1348,7 @@ public class ElanUtils {
      */
     public List<ExternalTunnel> getAllExternalTunnels(LogicalDatastoreType datastoreType) {
         InstanceIdentifier<ExternalTunnelList> iid = InstanceIdentifier.builder(ExternalTunnelList.class).build();
-        return read(broker, datastoreType, iid).toJavaUtil().map(ExternalTunnelList::getExternalTunnel).orElse(
+        return read(broker, datastoreType, iid).map(ExternalTunnelList::getExternalTunnel).orElse(
                 emptyList());
     }
 
@@ -1375,8 +1391,14 @@ public class ElanUtils {
      */
     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state
             .@Nullable Interface getInterfaceStateFromOperDS(String interfaceName, DataBroker dataBroker) {
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-            createInterfaceStateInstanceIdentifier(interfaceName)).orNull();
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    createInterfaceStateInstanceIdentifier(interfaceName)).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getInterfaceStateFromOperDS: Exception while reading interface DS for the interface {}",
+                    interfaceName, e);
+            return null;
+        }
     }
 
     /**
@@ -1589,7 +1611,7 @@ public class ElanUtils {
     }
 
     public Optional<IpAddress> getSourceIpAddress(Ethernet ethernet) {
-        Optional<IpAddress> srcIpAddress = Optional.absent();
+        Optional<IpAddress> srcIpAddress = Optional.empty();
         if (ethernet.getPayload() == null) {
             return srcIpAddress;
         }
index 21eda00fa64d4bc0cb60c7fcd0bce25616ac1313..330a09c92f7576c029558e0ee34f0dda94258108 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.netvirt.elan.utils;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.MapDifference;
 import com.google.common.collect.MapDifference.ValueDifference;
 import com.google.common.collect.Maps;
@@ -19,6 +18,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
@@ -26,9 +26,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -37,6 +34,9 @@ import org.opendaylight.genius.infra.TypedReadTransaction;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.internal.ElanBridgeManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
@@ -113,7 +113,7 @@ public class TransportZoneNotificationUtil {
             }
 
             if (ElanUtils.isVxlanNetworkOrVxlanSegment(
-                    elanInstanceCache.get(elanInt.getElanInstanceName()).orNull())) {
+                    elanInstanceCache.get(elanInt.getElanInstanceName()).orElse(null))) {
                 return true;
             } else {
                 LOG.debug("Non-VXLAN elanInstance: {}", elanInt.getElanInstanceName());
@@ -164,7 +164,7 @@ public class TransportZoneNotificationUtil {
                 .child(TransportZone.class, new TransportZoneKey(zoneName));
 
         // FIXME: Read this through a cache
-        TransportZone zone = tx.read(inst).get().orNull();
+        TransportZone zone = tx.read(inst).get().orElse(null);
 
         if (zone == null) {
             zone = createZone(ALL_SUBNETS, zoneName);
@@ -210,7 +210,7 @@ public class TransportZoneNotificationUtil {
                 .child(TransportZone.class, new TransportZoneKey(zoneName));
 
         // FIXME: Read this through a cache
-        TransportZone zone = tx.read(inst).get().orNull();
+        TransportZone zone = tx.read(inst).get().orElse(null);
         if (zone != null) {
             try {
                 deleteTransportZone(zone, dpnId, tx);
@@ -372,7 +372,7 @@ public class TransportZoneNotificationUtil {
             return tx.read(identifier).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to read DPNTEPsInfo for DPN id {}", dpId);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
@@ -427,7 +427,7 @@ public class TransportZoneNotificationUtil {
     private Map<String, String> getDpnLocalIps(Uint64 dpId) throws ReadFailedException {
         // Example of local IPs from other_config:
         // local_ips="10.0.43.159:MPLS,11.11.11.11:DSL,ip:underlay-network"
-        return getPortsNode(dpId).toJavaUtil().map(
+        return getPortsNode(dpId).map(
             node -> elanBridgeManager.getOpenvswitchOtherConfigMap(node, LOCAL_IPS)).orElse(Collections.emptyMap());
     }
 
@@ -436,23 +436,31 @@ public class TransportZoneNotificationUtil {
         InstanceIdentifier<BridgeRefEntry> bridgeRefInfoPath = InstanceIdentifier.create(BridgeRefInfo.class)
                 .child(BridgeRefEntry.class, new BridgeRefEntryKey(dpnId));
 
-        // FIXME: Read this through a cache
-        Optional<BridgeRefEntry> optionalBridgeRefEntry =
-            singleTxBroker.syncReadOptional(LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath);
-        if (!optionalBridgeRefEntry.isPresent()) {
-            LOG.error("no bridge ref entry found for dpnId {}", dpnId);
-            return Optional.absent();
-        }
+        try {
+            // FIXME: Read this through a cache
+            Optional<BridgeRefEntry> optionalBridgeRefEntry =
+                singleTxBroker
+                    .syncReadOptional(LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath);
+            if (!optionalBridgeRefEntry.isPresent()) {
+                LOG.error("no bridge ref entry found for dpnId {}", dpnId);
+                return Optional.empty();
+            }
 
-        InstanceIdentifier<Node> nodeId =
-                optionalBridgeRefEntry.get().getBridgeReference().getValue().firstIdentifierOf(Node.class);
+            InstanceIdentifier<Node> nodeId =
+                optionalBridgeRefEntry.get().getBridgeReference().getValue()
+                    .firstIdentifierOf(Node.class);
 
-        // FIXME: Read this through a cache
-        Optional<Node> optionalNode = singleTxBroker.syncReadOptional(LogicalDatastoreType.OPERATIONAL, nodeId);
-        if (!optionalNode.isPresent()) {
-            LOG.error("missing node for dpnId {}", dpnId);
+            // FIXME: Read this through a cache
+            Optional<Node> optionalNode = singleTxBroker
+                .syncReadOptional(LogicalDatastoreType.OPERATIONAL, nodeId);
+            if (!optionalNode.isPresent()) {
+                LOG.error("missing node for dpnId {}", dpnId);
+            }
+            return optionalNode;
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Exception while getting ports for Node {}", dpnId, e);
         }
-        return optionalNode;
+        return Optional.empty();
     }
 
     private static String getTzNameForUnderlayNetwork(String zoneNamePrefix, String underlayNetworkName) {
@@ -461,6 +469,6 @@ public class TransportZoneNotificationUtil {
 
     private static Optional<String> getZonePrefixForUnderlayNetwork(String zoneName, String underlayNetworkName) {
         String[] zoneParts = zoneName.split(IP_NETWORK_ZONE_NAME_DELIMITER + underlayNetworkName);
-        return zoneParts.length == 2 ? Optional.of(zoneParts[0]) : Optional.absent();
+        return zoneParts.length == 2 ? Optional.of(zoneParts[0]) : Optional.empty();
     }
 }
index 9b0739d6050b3a10b994204227cd626c82a6bf68..7e038977092019363a1dbd5b72042e54e531d8b7 100644 (file)
@@ -4,10 +4,10 @@
   odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-    interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
-    odl:type="pingpong" />
+    interface="org.opendaylight.mdsal.binding.api.DataBroker"
+    odl:type="default" />
   <reference id="notificationService"
-    interface="org.opendaylight.controller.md.sal.binding.api.NotificationService" />
+    interface="org.opendaylight.mdsal.binding.api.NotificationService" />
   <reference id="entityOwnershipService"
     interface="org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService" />
   <reference id="iMdsalApiManager"
index de2b3f2364f39823f05c2f34ee369015ecb44489..2dc166f56f0a399593deea0b58e44f85b1f34869 100644 (file)
@@ -15,9 +15,9 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LogicalSwitchesCmd;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
index 95bc6119d1c9ff3c6e56e556b82d709d7ae6777b..fdebbd4c89b7e2750bc9fd9d610500e91c10a554 100644 (file)
@@ -10,18 +10,18 @@ package org.opendaylight.netvirt.elan.l2gw.nodehandlertest;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.util.UUID;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.handlers.NodeConnectedHandler;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -164,7 +164,7 @@ public class NodeConnectedHandlerTest extends AbstractConcurrentDataBrokerTest {
     }
 
     public void readNodes() throws Exception {
-        ReadOnlyTransaction tx = getDataBroker().newReadOnlyTransaction();
+        ReadTransaction tx = getDataBroker().newReadOnlyTransaction();
         d1GlobalOpNode = TestUtil.readNode(LogicalDatastoreType.OPERATIONAL, d1NodePath, tx);
         d2GlobalOpNode = TestUtil.readNode(LogicalDatastoreType.OPERATIONAL, d2NodePath, tx);
         haGlobalOpNode = TestUtil.readNode(LogicalDatastoreType.OPERATIONAL, haNodePath, tx);
index bc78b6cbb94df10f81d188d271b4fc7150cd1deb..1a3816d105e23f4a44298d0a2bff02f72d035557 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.nodehandlertest;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import java.util.ArrayList;
 import java.util.Arrays;
index 01600dc695077adfa63a5837084218c69287c7a9..2df02347a7b51007cab74c2bbebdb73626e198f9 100644 (file)
@@ -15,9 +15,9 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalMcastCmd;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalUcastCmd;
 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LogicalSwitchesCmd;
@@ -261,7 +261,9 @@ public final class TestComparators {
                                                InstanceIdentifier<Node> d2psnodePath,
                                                InstanceIdentifier<Node> haPsnodePath,
                                                ReadWriteTransaction readWriteTransaction, String switchName,
-                                               Node d1, Node d2, Node ha) throws ReadFailedException {
+                                               Node d1, Node d2, Node ha)
+        throws ExecutionException, InterruptedException {
+
         PhysicalSwitchAugmentation d1PsAug = d1ps.augmentation(PhysicalSwitchAugmentation.class);
         PhysicalSwitchAugmentation d2PsAug = d2ps.augmentation(PhysicalSwitchAugmentation.class);
         PhysicalSwitchAugmentation haPsAug = haps.augmentation(PhysicalSwitchAugmentation.class);
@@ -300,7 +302,8 @@ public final class TestComparators {
     public static void comparePhysicalSwitches(Node d1ps, Node haps, InstanceIdentifier<Node> d1psnodePath,
                                                InstanceIdentifier<Node> haPsnodePath,
                                                ReadWriteTransaction readWriteTransaction,
-                                               String switchName, Node d1, Node ha) throws ReadFailedException {
+                                               String switchName, Node d1, Node ha)
+        throws ExecutionException, InterruptedException {
         //Compare Physical Augmentation data
         PhysicalSwitchAugmentation d1PsAug = d1ps.augmentation(PhysicalSwitchAugmentation.class);
         PhysicalSwitchAugmentation haPsAug = haps.augmentation(PhysicalSwitchAugmentation.class);
@@ -327,19 +330,19 @@ public final class TestComparators {
 
     public static void assertTerminationPoint(List<String> terminationPointNames, InstanceIdentifier<Node> d1ps,
                                               InstanceIdentifier<Node> haPsa, ReadWriteTransaction readWriteTransaction,
-                                              Node nodeD, Node nodeHa) throws ReadFailedException {
+                                              Node nodeD, Node nodeHa) throws ExecutionException, InterruptedException {
         for (String portName : terminationPointNames) {
             InstanceIdentifier<TerminationPoint> tpPathd = d1ps.child(TerminationPoint.class,
                     new TerminationPointKey(new TpId(portName)));
             TerminationPoint tpNoded = readWriteTransaction.read(LogicalDatastoreType.OPERATIONAL, tpPathd)
-                    .checkedGet().get();
+                    .get().get();
             HwvtepPhysicalPortAugmentation hwvtepPhysicalPortAugmentationD =
                     tpNoded.augmentation(HwvtepPhysicalPortAugmentation.class);
 
             InstanceIdentifier<TerminationPoint> tpPathha = haPsa.child(TerminationPoint.class,
                     new TerminationPointKey(new TpId(portName)));
             TerminationPoint tpNodeha = readWriteTransaction.read(LogicalDatastoreType.OPERATIONAL, tpPathha)
-                    .checkedGet().get();
+                    .get().get();
             HwvtepPhysicalPortAugmentation hwvtepPhysicalPortAugmentationHa =
                     tpNodeha.augmentation(HwvtepPhysicalPortAugmentation.class);
             assertEquals("Termination point hwvtep-node-name should be same",
index 9e3cb90fe5340383322c242c34316ce2384c8ecf..73088427f6464ddb59064f163cdca0773d45ecca 100644 (file)
@@ -9,12 +9,12 @@ package org.opendaylight.netvirt.elan.l2gw.nodehandlertest;
 
 import static org.junit.Assert.assertEquals;
 
-import com.google.common.base.Optional;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import java.util.Optional;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -44,8 +44,8 @@ final class TestUtil {
     }
 
     static Optional<Node> readNode(LogicalDatastoreType datastoreType, InstanceIdentifier<Node> id,
-        ReadOnlyTransaction tx) throws Exception {
-        return tx.read(datastoreType, id).checkedGet();
+        ReadTransaction tx) throws Exception {
+        return tx.read(datastoreType, id).get();
     }
 
 
index 17e67e5067e4efd00fedc7fa080c790c47afe7e0..bcbf0847e43c1143364900d7c9adf8376fb54233 100644 (file)
@@ -8,11 +8,11 @@
 package org.opendaylight.netvirt.elanmanager.tests;
 
 import static java.util.Arrays.asList;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
 import javax.inject.Inject;
 import org.junit.After;
 import org.junit.Before;
@@ -21,9 +21,6 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.MethodRule;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorTestModule;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
@@ -41,6 +38,9 @@ import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.metrics.testimpl.TestMetricProviderImpl;
 import org.opendaylight.infrautils.testutils.LogRule;
 import org.opendaylight.mdsal.binding.testutils.AssertDataObjects;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceDpnsCache;
index 16436d3c664172e76cdba1d6e19ee72fa9c49a5f..24d0ab340a2267b564805fd6703f68a6233e39bc 100644 (file)
@@ -14,21 +14,22 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.awaitility.Awaitility;
 import org.awaitility.core.ConditionFactory;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.testutils.TestInterfaceManager;
 import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
 import org.opendaylight.genius.testutils.itm.ItmRpcTestImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.internal.ElanInstanceManager;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
@@ -319,7 +320,7 @@ public class ElanServiceTestBase {
     }
 
 
-    protected void setupItm() throws TransactionCommitFailedException {
+    protected void setupItm() throws ExecutionException, InterruptedException {
         /*Add tap port and tunnel ports in DPN1 and DPN2*/
         interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft());
         interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC2).getLeft());
@@ -401,7 +402,7 @@ public class ElanServiceTestBase {
     }
 
     public void addElanInterface(String elanInstanceName, InterfaceInfo interfaceInfo, String prefix) {
-        ElanInstance existingElanInstance = elanInstanceCache.get(elanInstanceName).orNull();
+        ElanInstance existingElanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
         String interfaceName = interfaceInfo.getInterfaceName();
 
         if (existingElanInstance != null) {
index 901e3df960897815fe389adec3c220685c648f3c..9ce65d924ebc4536842fda6efe1f4a5c687f3e7c 100644 (file)
@@ -10,10 +10,11 @@ package org.opendaylight.netvirt.elanmanager.tests;
 import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.mock;
 
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Optional;
+import java.util.concurrent.Executors;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.test.DataBrokerTestModule;
 import org.opendaylight.daexim.DataImportBootReady;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
@@ -33,6 +34,9 @@ import org.opendaylight.infrautils.diagstatus.DiagStatusService;
 import org.opendaylight.infrautils.inject.guice.testutils.AbstractGuiceJsr250Module;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.metrics.testimpl.TestMetricProviderImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractBaseDataBrokerTest;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTestCustomizer;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
@@ -68,8 +72,20 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.Pa
 public class ElanServiceTestModule extends AbstractGuiceJsr250Module {
 
     @Override
-    protected void configureBindings() {
-        DataBroker dataBroker = DataBrokerTestModule.dataBroker();
+    protected void configureBindings() throws Exception {
+        AbstractBaseDataBrokerTest test = new AbstractBaseDataBrokerTest() {
+            @Override
+            protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
+                return new AbstractDataBrokerTestCustomizer() {
+                    @Override
+                    public ListeningExecutorService getCommitCoordinatorExecutor() {
+                        return MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
+                    }
+                };
+            }
+        };
+        test.setup();
+        DataBroker dataBroker = test.getDataBroker();
         EntityOwnershipService mockedEntityOwnershipService = mock(EntityOwnershipService.class);
         EntityOwnershipState mockedEntityOwnershipState = EntityOwnershipState.IS_OWNER;
         Mockito.when(mockedEntityOwnershipService.getOwnershipState(Mockito.any()))
index e0d1dcd143f94264b1405eae82819b7b6e9ab98b..e39db9ad72bf7d86148373be27305e5e7e225eef 100644 (file)
@@ -12,9 +12,9 @@ import static org.opendaylight.netvirt.elan.l2gw.nodehandlertest.NodeConnectedHa
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elan.l2gw.nodehandlertest.GlobalAugmentationHelper;
 import org.opendaylight.netvirt.elan.l2gw.nodehandlertest.TestBuilders;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
index 432a29d774ee2b22abf7e18b7d66855592a07bed..4946d88404aaef289f3f0710cc4cb863af423f4c 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.elanmanager.tests;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
@@ -20,15 +20,15 @@ import java.util.function.BiPredicate;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.awaitility.core.ConditionFactory;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
 import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
 import org.opendaylight.mdsal.binding.testutils.AssertDataObjects;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
index e79e947fd296ff4d271d02991ce8182dab8c9546..ad8ee04508586fadd20afbdef6238cd8a06a01e1 100644 (file)
@@ -12,9 +12,9 @@ import static org.opendaylight.yangtools.testutils.mockito.MoreAnswers.realOrExc
 import java.util.Collections;
 import java.util.List;
 import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.BgpControlPlaneType;
index d65a8451c81c5041dc3cb8a97448be40f1ce75e9..7231213d237670a9ff7028c2fae68a817049bb2c 100644 (file)
@@ -19,10 +19,10 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.netvirt.elanmanager.tests.ExpectedObjects;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
index b2416e2b376c241b55d9d251a21c263085b3c8ee..361276740d838dce57c0ef121ebce624777d824d 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.elanmanager.tests.utils;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
 
 public abstract class VpnManagerTestImpl implements IVpnManager {
index 8d6e822072be7531792e50e03387a8328926dd19..e5c1754c826749ba8b38706b9966269615b2bb71 100644 (file)
@@ -16,12 +16,13 @@ import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
@@ -121,16 +122,16 @@ public final class FibHelper {
                 .collect(Collectors.toList());
     }
 
-    public static com.google.common.base.Optional<VrfEntry> getVrfEntry(DataBroker broker, String rd, String ipPrefix) {
+    public static Optional<VrfEntry> getVrfEntry(DataBroker broker, String rd, String ipPrefix) {
         InstanceIdentifier<VrfEntry> vrfEntryId = InstanceIdentifier.builder(FibEntries.class)
             .child(VrfTables.class, new VrfTablesKey(rd))
             .child(VrfEntry.class, new VrfEntryKey(ipPrefix)).build();
         return read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
     }
 
-    private static <T extends DataObject> com.google.common.base.Optional<T> read(DataBroker broker,
+    private static <T extends DataObject> Optional<T> read(DataBroker broker,
             LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
index 0b687463f56f3f172c14e86d08a3f1ee87b4ec5a..e0a929e048530b6e19cf48580cd3a4be8ef309b1 100644 (file)
@@ -9,14 +9,12 @@
 package org.opendaylight.netvirt.fibmanager.api;
 
 import com.google.common.util.concurrent.FutureCallback;
-
 import java.util.List;
-
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.RouterInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
@@ -71,8 +69,8 @@ public interface IFibManager {
     void removeFibEntry(String rd, String prefix, String eventSource,
                         @Nullable TypedWriteTransaction<Configuration> writeConfigTxn);
 
-    void updateRoutePathForFibEntry(String rd, String prefix, String nextHop,
-                                    Uint32 label, boolean nextHopAdd, WriteTransaction writeConfigTxn);
+    void updateRoutePathForFibEntry(String rd, String prefix, String nextHop, Uint32 label, boolean nextHopAdd,
+                                    TypedWriteTransaction<Configuration> writeConfigTxn);
 
     void addVrfTable(String rd, WriteTransaction writeConfigTxn);
 
index 83e88cb3b49fd8ca81fd99db5cd55ad3600900cd..c502c0f6292428b07aa75abaa43fdc8cb8634243 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.fibmanager;
 import static java.util.stream.Collectors.toList;
 import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address;
 
-import com.google.common.base.Optional;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -19,13 +18,13 @@ import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -59,6 +58,9 @@ import org.opendaylight.genius.utils.batching.SubTransaction;
 import org.opendaylight.genius.utils.batching.SubTransactionImpl;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.NexthopManager.AdjacencyResult;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -553,9 +555,14 @@ public class BaseVrfEntryHandler implements AutoCloseable {
     public Routes getVpnToExtraroute(Uint32 vpnId, String vpnRd, String destPrefix) {
         String optVpnName = fibUtil.getVpnNameFromId(vpnId);
         if (optVpnName != null) {
-            InstanceIdentifier<Routes> vpnExtraRoutesId = getVpnToExtrarouteIdentifier(
-                    optVpnName, vpnRd, destPrefix);
-            return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId).orNull();
+            InstanceIdentifier<Routes> vpnExtraRoutesId = getVpnToExtrarouteIdentifier(optVpnName, vpnRd, destPrefix);
+            try {
+                return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                        vpnExtraRoutesId).orElse(null);
+            } catch (ExecutionException | InterruptedException e) {
+                LOG.error("getVpnToExtraroute: Exception while reading vpn-to-extraroute DS for the prefix {} "
+                        + "rd {} vpnId {} ", destPrefix, vpnRd, vpnId, e);
+            }
         }
         return null;
     }
index 1747f1fdabcd9f83f2c16ca1740bd69fcfd40a47..758915fc89938601ea09cc6188b6f562945fbdd4 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.netvirt.fibmanager;
 
 import static java.util.stream.Collectors.toList;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.function.Consumer;
@@ -20,9 +20,6 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -43,6 +40,9 @@ import org.opendaylight.genius.utils.batching.ResourceBatchingManager;
 import org.opendaylight.genius.utils.batching.ResourceHandler;
 import org.opendaylight.genius.utils.batching.SubTransaction;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
@@ -130,6 +130,11 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler implements Reso
         }
     }
 
+    @Override
+    public void updateContainer(WriteTransaction tx, LogicalDatastoreType datastoreType, InstanceIdentifier identifier,
+                                Object original, Object update, List<SubTransaction> transactionObjects) {
+    }
+
     @Override
     public void create(WriteTransaction tx, LogicalDatastoreType datastoreType, InstanceIdentifier identifier,
                        Object vrfEntry, List<SubTransaction> subTxns) {
@@ -233,7 +238,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler implements Reso
                             usedRds.get(0), vrfEntry.getDestPrefix());
                 }
             } else {
-                extraRouteOptional = Optional.absent();
+                extraRouteOptional = Optional.empty();
             }
             for (VpnToDpnList curDpn : vpnToDpnList) {
                 if (curDpn.getDpnState() == VpnToDpnList.DpnState.Active) {
@@ -393,7 +398,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler implements Reso
                 .ifPresent(routes -> {
                     LOG.trace(" deleting remote FIB entry {}", vrfEntry);
                     deleteRemoteRoute(null, dpnId, vpnId, vrfTable.get().key(), vrfEntry,
-                            Optional.absent(), writeCfgTxn, subTxns);
+                            Optional.empty(), writeCfgTxn, subTxns);
                 });
     }
 
index a23c54d1477d37e684e109b1144208233bbd01fd..cd5fe82f8c3e335f233cacbac1d657cc5a637902 100644 (file)
@@ -9,15 +9,12 @@ package org.opendaylight.netvirt.fibmanager;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import java.util.Optional;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -30,6 +27,9 @@ import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldTunnelId;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
 import org.opendaylight.genius.utils.batching.SubTransaction;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
@@ -287,7 +287,7 @@ public class EvpnVrfEntryHandler extends BaseVrfEntryHandler {
         if (vpnToDpnList != null) {
             jobCoordinator.enqueueJob("FIB" + rd + vrfEntry.getDestPrefix(),
                 () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
-                    final Optional<Routes> extraRouteOptional = Optional.absent();
+                    final Optional<Routes> extraRouteOptional = Optional.empty();
                     if (localDpnIdList.size() <= 0) {
                         for (VpnToDpnList curDpn1 : vpnToDpnList) {
                             if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) {
index 2e668bad84930a40cc5f0833837a267edf5cb800..6a139bd54d56358881146a485dfbb6405c147ad5 100755 (executable)
@@ -7,18 +7,18 @@
  */
 package org.opendaylight.netvirt.fibmanager;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import io.netty.util.concurrent.GlobalEventExecutor;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
@@ -166,7 +166,7 @@ public class FibManagerImpl implements IFibManager {
 
     @Override
     public void updateRoutePathForFibEntry(String rd, String prefix, String nextHop,
-            Uint32 label, boolean nextHopAdd, WriteTransaction writeConfigTxn) {
+            Uint32 label, boolean nextHopAdd, TypedWriteTransaction<Configuration> writeConfigTxn) {
         fibUtil.updateRoutePathForFibEntry(rd, prefix, nextHop, label, nextHopAdd, writeConfigTxn);
     }
 
index 89bd6dda4fdfc4622e1f04ac2a9d4e38f6083cbc..2d48dab4b3748eb9d77584b73306810fbe0f5e8c 100644 (file)
@@ -12,12 +12,12 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MatchInfo;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
@@ -26,6 +26,8 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
@@ -214,8 +216,13 @@ public class FibRpcServiceImpl implements FibRpcService {
     @Nullable
     public static String getVpnRd(DataBroker broker, String vpnName) {
         InstanceIdentifier<VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
-                VpnInstance::getVrfId).orElse(null);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, id)
+                    .map(VpnInstance::getVrfId).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnRd: Exception while reading VpnInstance DS for the vpn {}", vpnName, e);
+        }
+        return null;
     }
 
     static InstanceIdentifier<VpnInstance> getVpnInstanceToVpnIdIdentifier(String vpnName) {
@@ -226,7 +233,12 @@ public class FibRpcServiceImpl implements FibRpcService {
 
     static Uint32 getVpnId(DataBroker broker, String vpnName) {
         InstanceIdentifier<VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
-                VpnInstance::getVpnId).orElse(Uint32.ZERO);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, id)
+                    .map(VpnInstance::getVpnId).orElse(Uint32.ZERO);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnId: Exception while reading VpnInstance DS for the vpn {}", vpnName, e);
+        }
+        return Uint32.ZERO;
     }
 }
index 41ca0e553807d7a75306ea3e23e21fe0ce79737e..8531ed324716330bf65ce784a1d71147e5f608b7 100644 (file)
@@ -10,9 +10,8 @@ package org.opendaylight.netvirt.fibmanager;
 
 import static java.util.stream.Collectors.joining;
 import static java.util.stream.Collectors.toList;
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
 import java.net.InetAddress;
@@ -20,16 +19,14 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -42,6 +39,10 @@ import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NWUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.fibmanager.NexthopManager.AdjacencyResult;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -183,7 +184,12 @@ public class FibUtil {
 
     Optional<VpnInstanceOpDataEntry> getVpnInstanceOpData(String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = getVpnInstanceOpDataIdentifier(rd);
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnInstance: Exception while reading the VpnInstanceOpData DS for the rd {} ", rd, e);
+        }
+        return Optional.empty();
     }
 
     static Optional<VpnInstanceOpDataEntry> getVpnInstanceOpData(TypedReadTransaction<Operational> operTx, String rd)
@@ -196,8 +202,13 @@ public class FibUtil {
         InstanceIdentifier<VpnInstanceOpDataEntry> id =
                 InstanceIdentifier.create(VpnInstanceOpData.class)
                         .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd));
-        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData = Optional.empty();
+        try {
+            vpnInstanceOpData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnInstance: Exception while reading the VpnInstanceOpData DS for the rd {} ", rd, e);
+        }
         return vpnInstanceOpData.isPresent() ? vpnInstanceOpData.get() : null;
     }
 
@@ -207,21 +218,35 @@ public class FibUtil {
 
     @Nullable
     Prefixes getPrefixToInterface(Uint32 vpnId, String ipPrefix) {
-        Optional<Prefixes> localNextHopInfoData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-            getPrefixToInterfaceIdentifier(vpnId, ipPrefix));
+        Optional<Prefixes> localNextHopInfoData = Optional.empty();
+        try {
+            localNextHopInfoData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL,
+                getPrefixToInterfaceIdentifier(vpnId, ipPrefix));
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getPrefixToInterface: Exception while reading the prefixToInterface DS for the "
+                    + "prefix {} vpnId {}", ipPrefix, vpnId, e);
+        }
         return localNextHopInfoData.isPresent() ? localNextHopInfoData.get() : null;
     }
 
     @Nullable
     static Prefixes getPrefixToInterface(TypedReadTransaction<Operational> operTx, Uint32 vpnId, String ipPrefix)
             throws ExecutionException, InterruptedException {
-        return operTx.read(getPrefixToInterfaceIdentifier(vpnId, ipPrefix)).get().orNull();
+        return operTx.read(getPrefixToInterfaceIdentifier(vpnId, ipPrefix)).get().orElse(null);
     }
 
     @Nullable
     String getMacAddressFromPrefix(String ifName, String vpnName, String ipPrefix) {
-        Optional<Adjacency> adjacencyData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                       getAdjacencyIdentifierOp(ifName, vpnName, ipPrefix));
+        Optional<Adjacency> adjacencyData;
+        try {
+            adjacencyData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, getAdjacencyIdentifierOp(ifName, vpnName, ipPrefix));
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getMacAddressFromPrefix: Exception while reading adj-op DS for the interface {} prefix {} "
+                    + "vpn {}", ifName, ipPrefix, vpnName, e);
+            return null;
+        }
         return adjacencyData.isPresent() ? adjacencyData.get().getMacAddress() : null;
     }
 
@@ -247,10 +272,14 @@ public class FibUtil {
     }
 
     public Uint32 getVpnId(String vpnName) {
-
         InstanceIdentifier<VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
-                VpnInstance::getVpnId).orElse(Uint32.ZERO);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, id)
+                    .map(VpnInstance::getVpnId).orElse(Uint32.ZERO);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnNameFromId: Exception while reading vpnInstanceToVpnId DS for the vpn {}", vpnName, e);
+        }
+        return Uint32.ZERO;
     }
 
     /**
@@ -260,15 +289,20 @@ public class FibUtil {
      * @return The vpn instance
      */
     public Optional<String> getVpnNameFromRd(String rd) {
-        return Optional.fromJavaUtil(
-                getVpnInstanceOpData(rd).toJavaUtil().map(VpnInstanceOpDataEntry::getVpnInstanceName));
+        return Optional.ofNullable(getVpnInstanceOpData(rd).map(VpnInstanceOpDataEntry::getVpnInstanceName)
+                .orElse(null));
     }
 
     @Nullable
     public String getVpnNameFromId(Uint32 vpnId) {
         InstanceIdentifier<VpnIds> id = getVpnIdToVpnInstanceIdentifier(vpnId);
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
-                VpnIds::getVpnInstanceName).orElse(null);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, id)
+                    .map(VpnIds::getVpnInstanceName).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnNameFromId: Exception while reading vpnIdToVpnInstance DS for the vpnId {}", vpnId, e);
+        }
+        return null;
     }
 
     static InstanceIdentifier<VpnIds> getVpnIdToVpnInstanceIdentifier(Uint32 vpnId) {
@@ -419,7 +453,14 @@ public class FibUtil {
         InstanceIdentifier<VrfEntry> vrfEntryId =
             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
                 .child(VrfEntry.class, new VrfEntryKey(prefix)).build();
-        Optional<VrfEntry> entry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> entry = Optional.empty();
+        try {
+            entry = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeOrUpdateFibEntry: Exception while reading vrfEntry for the prefix {} rd {} nexthop {}",
+                    prefix, rd, nextHopToRemove, e);
+        }
         if (entry.isPresent()) {
             final List<RoutePaths> routePaths = entry.get().getRoutePaths();
             if (routePaths == null || routePaths.isEmpty()) {
@@ -461,7 +502,7 @@ public class FibUtil {
      * Adds or removes nextHop from routePath based on the flag nextHopAdd.
      */
     public void updateRoutePathForFibEntry(String rd, String prefix, String nextHop, Uint32 label,
-            boolean nextHopAdd, WriteTransaction writeConfigTxn) {
+            boolean nextHopAdd, TypedWriteTransaction<Configuration> writeConfigTxn) {
 
         LOG.debug("Updating fib entry for prefix {} with nextHop {} for rd {}.", prefix, nextHop, rd);
 
@@ -474,22 +515,28 @@ public class FibUtil {
             if (nextHopAdd) {
                 RoutePaths routePaths = FibHelper.buildRoutePath(nextHop, label);
                 if (writeConfigTxn != null) {
-                    writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION, routePathId, routePaths,
-                            CREATE_MISSING_PARENTS);
+                    writeConfigTxn.put(routePathId, routePaths, CREATE_MISSING_PARENTS);
                 } else {
                     MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, routePathId, routePaths);
                 }
                 LOG.debug("Added routepath with nextHop {} for prefix {} and label {}.", nextHop, prefix, label);
             } else {
-                Optional<RoutePaths> routePath = MDSALUtil.read(dataBroker,
-                        LogicalDatastoreType.CONFIGURATION, routePathId);
+                Optional<RoutePaths> routePath;
+                try {
+                    routePath = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                            LogicalDatastoreType.CONFIGURATION, routePathId);
+                } catch (ExecutionException | InterruptedException e) {
+                    LOG.error("updateRoutePathForFibEntry: Exception while reading the RoutePath with rd {}, "
+                                    + "prefix {} and nh {}", rd, prefix, nextHop, e);
+                    return;
+                }
                 if (!routePath.isPresent()) {
                     LOG.warn("Couldn't find RoutePath with rd {}, prefix {} and nh {} for deleting",
                             rd, prefix, nextHop);
                     return;
                 }
                 if (writeConfigTxn != null) {
-                    writeConfigTxn.delete(LogicalDatastoreType.CONFIGURATION, routePathId);
+                    writeConfigTxn.delete(routePathId);
                 } else {
                     MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, routePathId);
                 }
@@ -524,8 +571,14 @@ public class FibUtil {
         if (writeConfigTxn != null) {
             writeConfigTxn.delete(vrfTableId);
         } else {
-            Optional<VrfTables> ifStateOptional = MDSALUtil.read(dataBroker,
-                    LogicalDatastoreType.CONFIGURATION, vrfTableId);
+            Optional<VrfTables> ifStateOptional;
+            try {
+                ifStateOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                        LogicalDatastoreType.CONFIGURATION, vrfTableId);
+            } catch (ExecutionException | InterruptedException e) {
+                LOG.error("removeVrfTable: Exception while reading vrfTable for the rd {}", rd, e);
+                return;
+            }
             if (ifStateOptional.isPresent()) {
                 MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfTableId);
             }
@@ -584,11 +637,18 @@ public class FibUtil {
         .@Nullable Interface getInterfaceStateFromOperDS(String interfaceName) {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
             .interfaces.state.Interface> ifStateId = buildStateInterfaceId(interfaceName);
-        Optional<Interface> ifStateOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, ifStateId);
+        Optional<Interface> ifStateOptional;
+        try {
+            ifStateOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, ifStateId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getInterfaceStateFromOperDS: Exception while reading interface-state for the interface {}",
+                    interfaceName, e);
+            return null;
+        }
         if (ifStateOptional.isPresent()) {
             return ifStateOptional.get();
         }
-
         return null;
     }
 
@@ -648,7 +708,14 @@ public class FibUtil {
         String nextHopIp = null;
         InstanceIdentifier<DPNTEPsInfo> tunnelInfoId =
             InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class, new DPNTEPsInfoKey(dpnId)).build();
-        Optional<DPNTEPsInfo> tunnelInfo = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, tunnelInfoId);
+        Optional<DPNTEPsInfo> tunnelInfo;
+        try {
+            tunnelInfo = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, tunnelInfoId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getEndpointIpAddressForDPN: Exception while reading DPN {} TEP info", dpnId, e);
+            return null;
+        }
         if (tunnelInfo.isPresent()) {
             List<TunnelEndPoints> nexthopIpList = tunnelInfo.get().getTunnelEndPoints();
             if (nexthopIpList != null && !nexthopIpList.isEmpty()) {
@@ -677,7 +744,15 @@ public class FibUtil {
 
     public List<String> getNextHopAddresses(String rd, String prefix) {
         InstanceIdentifier<VrfEntry> vrfEntryId = getNextHopIdentifier(rd, prefix);
-        Optional<VrfEntry> vrfEntry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> vrfEntry;
+        try {
+            vrfEntry = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNextHopAddresses: Exception while reading vrfEntry DS for the prefix {} rd {}",
+                    prefix, rd, e);
+            return Collections.emptyList();
+        }
         if (vrfEntry.isPresent()) {
             return FibHelper.getNextHopListFromRoutePaths(vrfEntry.get());
         } else {
@@ -758,13 +833,26 @@ public class FibUtil {
     public Optional<Nexthops> getNexthops(String nextHopKey) {
         InstanceIdentifier<Nexthops> nextHopsId = InstanceIdentifier.builder(L3vpnLbNexthops.class)
                 .child(Nexthops.class, new NexthopsKey(nextHopKey)).build();
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, nextHopsId);
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    nextHopsId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNexthops: Exception while reading L3-vpn-nexthop DS for the nexthop {}", nextHopKey, e);
+        }
+        return Optional.empty();
     }
 
     public List<String> getL3VpnDcGateWays() {
         InstanceIdentifier<L3vpnDcGws> id = InstanceIdentifier.builder(L3vpnDcGws.class)
                 .build();
-        Optional<L3vpnDcGws> dcGwsOpt = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<L3vpnDcGws> dcGwsOpt;
+        try {
+            dcGwsOpt = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNexthops: Exception while reading L3vpnDcGws DS", e);
+            return Collections.emptyList();
+        }
         if (!dcGwsOpt.isPresent()) {
             return Collections.emptyList();
         }
@@ -892,7 +980,7 @@ public class FibUtil {
                     && !vpnToDpnList.getVpnInterfaces().isEmpty()) {
                 return true;
             }
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.warn("Failed to read interfaces with error {}", e.getMessage());
         }
         return false;
@@ -902,7 +990,15 @@ public class FibUtil {
         InstanceIdentifier<VrfEntry> vrfEntryId =
                 InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
                         .child(VrfEntry.class, new VrfEntryKey(prefix)).build();
-        Optional<VrfEntry> entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> entry;
+        try {
+            entry = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("checkFibEntryExist: Exception while reading vrfEntry DS for the prefix {} rd {} nexthop {}",
+                    prefix, rd, nextHopIp, e);
+            return false;
+        }
         if (entry.isPresent()) {
             List<RoutePaths> paths = entry.get().getRoutePaths();
             for (RoutePaths path: paths) {
index fb001c31f442dbd4df3a783e8223c68643c562de..8aeb0183e0200a0feee09453847d775ab22ebfed 100644 (file)
@@ -12,10 +12,8 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.ListenableFuture;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -24,6 +22,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -32,11 +31,8 @@ import java.util.concurrent.TimeoutException;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -59,6 +55,9 @@ import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldTunnelId;
 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldVlanVid;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.L3VPNTransportTypes;
@@ -555,7 +554,15 @@ public class NexthopManager implements AutoCloseable {
             InstanceIdentifier.builder(L3nexthop.class).child(VpnNexthops.class,
                 new VpnNexthopsKey(vpnId));
         InstanceIdentifier<VpnNexthops> id = idBuilder.build();
-        Optional<VpnNexthops> vpnNexthops = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnNexthops> vpnNexthops;
+        try {
+            vpnNexthops = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnNexthop: Exception while reading VpnNexthops DS for the address {} vpn {}", ipAddress,
+                    vpnId, e);
+            return null;
+        }
         if (vpnNexthops.isPresent()) {
             // get nexthops list for vpn
             List<VpnNexthop> nexthops = vpnNexthops.get().nonnullVpnNexthop();
@@ -678,9 +685,14 @@ public class NexthopManager implements AutoCloseable {
              * if the value is Unset, cache value as VxLAN.
              */
             LOG.trace("configureTransportType is not yet set.");
-            Optional<ConfTransportTypeL3vpn> configuredTransTypeFromConfig =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getConfTransportTypeIdentifier());
-
+            Optional<ConfTransportTypeL3vpn> configuredTransTypeFromConfig;
+            try {
+                configuredTransTypeFromConfig = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                        LogicalDatastoreType.CONFIGURATION, getConfTransportTypeIdentifier());
+            } catch (ExecutionException | InterruptedException e) {
+                LOG.error("getReqTransType: Exception while reading ConfTransportTypeL3vpn DS", e);
+                return null;
+            }
             if (configuredTransTypeFromConfig.isPresent()) {
                 if (TunnelTypeGre.class.equals(configuredTransTypeFromConfig.get().getTransportType())) {
                     configuredTransportTypeL3VPN = L3VPNTransportTypes.GRE;
@@ -1124,8 +1136,14 @@ public class NexthopManager implements AutoCloseable {
     private List<String> getDcGwIps() {
         InstanceIdentifier<DcGatewayIpList> dcGatewayIpListid =
                 InstanceIdentifier.builder(DcGatewayIpList.class).build();
-        DcGatewayIpList dcGatewayIpListConfig =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, dcGatewayIpListid).orNull();
+        DcGatewayIpList dcGatewayIpListConfig;
+        try {
+            dcGatewayIpListConfig = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, dcGatewayIpListid).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getDcGwIps: Exception while reading DcGatewayIpList DS", e);
+            return Collections.emptyList();
+        }
         if (dcGatewayIpListConfig == null) {
             return Collections.emptyList();
         }
@@ -1142,9 +1160,15 @@ public class NexthopManager implements AutoCloseable {
             InstanceIdentifier<StateTunnelList> tunnelStateId =
                     InstanceIdentifier.builder(TunnelsState.class).child(
                             StateTunnelList.class, new StateTunnelListKey(tunnelName)).build();
-            return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, tunnelStateId)
-                    .toJavaUtil().map(StateTunnelList::getOperState)
-                    .orElse(TunnelOperStatus.Down) == TunnelOperStatus.Up;
+            try {
+                return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                        tunnelStateId).map(StateTunnelList::getOperState)
+                        .orElse(TunnelOperStatus.Down) == TunnelOperStatus.Up;
+            } catch (ExecutionException | InterruptedException e) {
+                LOG.error("isTunnelUp: Exception while reading StateTunnelList DS for tunnel {} tunnelType {}",
+                        tunnelName, tunnelType, e);
+                return false;
+            }
         }
         return false;
     }
index b3e3a6dc9ed1e76ba46f66e892e48818ed5234c0..0ca13284996a19afcb88ce43ba5874b1a626004d 100644 (file)
@@ -14,12 +14,12 @@ import java.util.Collection;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
index 51a62e5a111bcb6d5abd3f991ee2797ed3d30a82..45e5dbad60bf54cdf04708fed75dbcd02d06c4df 100644 (file)
@@ -7,12 +7,11 @@
  */
 package org.opendaylight.netvirt.fibmanager;
 
-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.genius.mdsalutil.NWUtil.isIpv4Address;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.FutureCallback;
@@ -29,18 +28,16 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -74,7 +71,10 @@ import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.genius.utils.batching.SubTransaction;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.NexthopManager.AdjacencyResult;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
@@ -83,6 +83,7 @@ import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -124,9 +125,8 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 @Singleton
-public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry, VrfEntryListener> {
+public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener<VrfEntry> {
 
     private static final Logger LOG = LoggerFactory.getLogger(VrfEntryListener.class);
     private static final String FLOWID_PREFIX = "L3.";
@@ -166,7 +166,9 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                             final InterVpnLinkCache interVpnLinkCache,
                             final UpgradeState upgradeState,
                             final DataTreeEventCallbackRegistrar eventCallbacks) {
-        super(VrfEntry.class, VrfEntryListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(FibEntries.class)
+                .child(VrfTables.class).child(VrfEntry.class),
+                Executors.newListeningSingleThreadExecutor("VrfEntryListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.retryingTxRunner = new RetryingManagedNewTransactionRunner(dataBroker, MAX_RETRIES);
@@ -183,11 +185,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         this.eventCallbacks = eventCallbacks;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
@@ -200,20 +199,11 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                 LOG.warn("Error closing {}", c, e);
             }
         });
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected VrfEntryListener getDataTreeChangeListener() {
-        return VrfEntryListener.this;
-    }
-
-    @Override
-    protected InstanceIdentifier<VrfEntry> getWildCardPath() {
-        return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class);
-    }
-
-    @Override
-    protected void add(final InstanceIdentifier<VrfEntry> identifier, final VrfEntry vrfEntry) {
+    public void add(final InstanceIdentifier<VrfEntry> identifier, final VrfEntry vrfEntry) {
         Preconditions.checkNotNull(vrfEntry, "VrfEntry should not be null or empty.");
         String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
         LOG.debug("ADD: Adding Fib Entry rd {} prefix {} route-paths {}",
@@ -251,7 +241,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     }
 
     @Override
-    protected void remove(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry) {
+    public void remove(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry) {
         Preconditions.checkNotNull(vrfEntry, "VrfEntry should not be null or empty.");
         String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
         LOG.debug("REMOVE: Removing Fib Entry rd {} prefix {} route-paths {}",
@@ -292,7 +282,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     // "Redundant nullcheck of originalRoutePath, which is known to be non-null" - the null checking for
     // originalRoutePath is a little dicey - safest to keep the checking even if not needed.
     @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")
-    protected void update(InstanceIdentifier<VrfEntry> identifier, VrfEntry original, VrfEntry update) {
+    public void update(InstanceIdentifier<VrfEntry> identifier, VrfEntry original, VrfEntry update) {
         Preconditions.checkNotNull(update, "VrfEntry should not be null or empty.");
         final String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
         LOG.debug("UPDATE: Updating Fib Entries to rd {} prefix {} route-paths {} origin {} old-origin {}", rd,
@@ -451,8 +441,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                         if (RouteOrigin.BGP.getValue().equals(vrfEntry.getOrigin())) {
                                             bgpRouteVrfEntryHandler.createRemoteFibEntry(vpnDpn.getDpnId(),
                                                     vpnId, vrfTableKey.getRouteDistinguisher(), vrfEntry,
-                                                    TransactionAdapter.toWriteTransaction(tx),
-                                                    txnObjects);
+                                                    TransactionAdapter.toWriteTransaction(tx), txnObjects);
                                         } else {
                                             createRemoteFibEntry(vpnDpn.getDpnId(),
                                                     vpnInstance.getVpnId(),
@@ -474,7 +463,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         Optional<String> optVpnUuid = fibUtil.getVpnNameFromRd(rd);
         if (optVpnUuid.isPresent()) {
             String vpnUuid = optVpnUuid.get();
-            InterVpnLinkDataComposite interVpnLink = interVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid).orNull();
+            InterVpnLinkDataComposite interVpnLink = interVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid).orElse(null);
             if (interVpnLink != null) {
                 LOG.debug("InterVpnLink {} found in Cache linking Vpn {}", interVpnLink.getInterVpnLinkName(), vpnUuid);
                 FibUtil.getFirstNextHopAddress(vrfEntry).ifPresent(routeNexthop -> {
@@ -493,7 +482,14 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         InstanceIdentifier<VrfEntry> vrfEntryId =
                 InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
                         .child(VrfEntry.class, new VrfEntryKey(prefix)).build();
-        Optional<VrfEntry> vrfEntry = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> vrfEntry;
+        try {
+            vrfEntry = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("refreshFibTables: Exception while reading VrfEntry Ds for the prefix {} rd {}", prefix, rd, e);
+            return;
+        }
         if (vrfEntry.isPresent()) {
             createFibEntries(vrfEntryId, vrfEntry.get());
         }
@@ -709,7 +705,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         // After having received a static route, we should check if the vpn is part of an inter-vpn-link.
         // In that case, we should populate the FIB table of the VPN pointing to LPortDisptacher table
         // using as metadata the LPortTag associated to that vpn in the inter-vpn-link.
-        if (interVpnLink.getState().or(State.Error) != State.Active) {
+        if (interVpnLink.getState().orElse(State.Error) != State.Active) {
             LOG.warn("Route to {} with nexthop={} cannot be installed because the interVpnLink {} is not active",
                 destination, nextHop, interVpnLinkName);
             return;
@@ -961,9 +957,16 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         return Uint64.ZERO;
     }
 
-    private boolean isVpnPresentInDpn(String rd, Uint64 dpnId)  {
+    private boolean isVpnPresentInDpn(String rd, Uint64 dpnId) {
         InstanceIdentifier<VpnToDpnList> id = VpnHelper.getVpnToDpnListIdentifier(rd, dpnId);
-        Optional<VpnToDpnList> dpnInVpn = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnToDpnList> dpnInVpn;
+        try {
+            dpnInVpn = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("isVpnPresentInDpn: Exception while reading VpnToDpnList Ds for the rd {} dpnId {}", rd,
+                    dpnId, e);
+            return false;
+        }
         return dpnInVpn.isPresent();
     }
 
@@ -976,7 +979,14 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     private LabelRouteInfo getLabelRouteInfo(LabelRouteInfoKey label) {
         InstanceIdentifier<LabelRouteInfo> lriIid = InstanceIdentifier.builder(LabelRouteMap.class)
             .child(LabelRouteInfo.class, label).build();
-        Optional<LabelRouteInfo> opResult = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, lriIid);
+        Optional<LabelRouteInfo> opResult = null;
+        try {
+            opResult = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    lriIid);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("refreshFibTables: Exception while reading LabelRouteInfo Ds for the label {}", label, e);
+            return null;
+        }
         if (opResult.isPresent()) {
             return opResult.get();
         }
@@ -1347,7 +1357,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             new CleanupVpnInterfaceWorker(prefixInfo, vpnId, rd, vrfEntry, extraRoute));
     }
 
-    private class CleanupVpnInterfaceWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class CleanupVpnInterfaceWorker implements Callable<List<? extends ListenableFuture<?>>> {
         Prefixes prefixInfo;
         Uint32 vpnId;
         String rd;
@@ -1530,8 +1540,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
 
                                 baseVrfEntryHandler.makeConnectedRoute(curDpn.getDpnId(),
                                     vpnInstance.getVpnId(),
-                                    vrfEntry, vrfTableKey.getRouteDistinguisher(), null, NwConstants.DEL_FLOW,
-                                    TransactionAdapter.toWriteTransaction(tx), null);
+                                    vrfEntry, vrfTableKey.getRouteDistinguisher(), null,
+                                        NwConstants.DEL_FLOW, TransactionAdapter.toWriteTransaction(tx), null);
                                 if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
                                     optionalLabel.ifPresent(label -> makeLFibTableEntry(curDpn.getDpnId(),
                                         label, null, DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx));
@@ -1596,7 +1606,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                             .getVpnExtraroutes(dataBroker, vpnName, usedRds.get(0), vrfEntry.getDestPrefix());
                 }
             } else {
-                extraRouteOptional = Optional.absent();
+                extraRouteOptional = Optional.empty();
             }
 
             jobCoordinator.enqueueJob(FibUtil.getJobKeyForRdPrefix(rd, vrfEntry.getDestPrefix()),
@@ -1605,7 +1615,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                         for (VpnToDpnList curDpn : vpnToDpnList) {
                             baseVrfEntryHandler.deleteRemoteRoute(Uint64.ZERO, curDpn.getDpnId(),
                                 vpnInstance.getVpnId(), vrfTableKey, vrfEntry, extraRouteOptional,
-                                TransactionAdapter.toWriteTransaction(tx));
+                                    TransactionAdapter.toWriteTransaction(tx));
                         }
                     } else {
                         for (Uint64 localDpnId : localDpnIdList) {
@@ -1613,7 +1623,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                 if (!Objects.equals(curDpn.getDpnId(), localDpnId)) {
                                     baseVrfEntryHandler.deleteRemoteRoute(localDpnId, curDpn.getDpnId(),
                                         vpnInstance.getVpnId(), vrfTableKey, vrfEntry, extraRouteOptional,
-                                        TransactionAdapter.toWriteTransaction(tx));
+                                            TransactionAdapter.toWriteTransaction(tx));
                                 }
                             }
                         }
@@ -1786,7 +1796,13 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         InstanceIdentifier<VrfTables> id = buildVrfId(rd);
         final VpnInstanceOpDataEntry vpnInstance = fibUtil.getVpnInstance(rd);
         List<SubTransaction> txnObjects =  new ArrayList<>();
-        final Optional<VrfTables> vrfTable = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        final Optional<VrfTables> vrfTable;
+        try {
+            vrfTable = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("populateExternalRoutesOnDpn: Exception while reading the VrfTable for the rd {}", rd, e);
+            return;
+        }
         if (vrfTable.isPresent()) {
             jobCoordinator.enqueueJob(FibUtil.getJobKeyForVpnIdDpnId(vpnId, dpnId),
                 () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
@@ -1854,7 +1870,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                         }
                         //Is this fib route an extra route? If yes, get the nexthop which would be
                         //an adjacency in the vpn
-                        Optional<Routes> extraRouteOptional = Optional.absent();
+                        Optional<Routes> extraRouteOptional = Optional.empty();
                         if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.STATIC && usedRds.size() != 0) {
                             extraRouteOptional = VpnExtraRouteHelper.getVpnExtraroutes(dataBroker,
                                     fibUtil.getVpnNameFromId(vpnInstance.getVpnId()),
@@ -1963,7 +1979,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
 
                                 }
                             } else {
-                                extraRouteOptional = Optional.absent();
+                                extraRouteOptional = Optional.empty();
                             }
                             if (RouteOrigin.BGP.getValue().equals(vrfEntry.getOrigin())) {
                                 bgpRouteVrfEntryHandler.deleteRemoteRoute(null, dpnId, vpnId,
@@ -1998,7 +2014,13 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         InstanceIdentifier<VrfTables> id = buildVrfId(rd);
         final VpnInstanceOpDataEntry vpnInstance = fibUtil.getVpnInstance(rd);
         List<SubTransaction> txnObjects =  new ArrayList<>();
-        final Optional<VrfTables> vrfTable = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        final Optional<VrfTables> vrfTable;
+        try {
+            vrfTable = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVrfEntry: Exception while reading VrfTable for the rd {} vpnId {}", rd, vpnId, e);
+            return;
+        }
         if (vrfTable.isPresent()) {
             jobCoordinator.enqueueJob(FibUtil.getJobKeyForVpnIdDpnId(vpnId, dpnId),
                 () -> {
@@ -2011,7 +2033,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                     .filter(vrfEntry -> RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP)
                                     .forEach(bgpRouteVrfEntryHandler.getConsumerForDeletingRemoteFib(dpnId, vpnId,
                                         remoteNextHopIp, vrfTable, TransactionAdapter.toWriteTransaction(tx),
-                                        txnObjects))));
+                                            txnObjects))));
                     } finally {
                         lock.unlock();
                     }
@@ -2040,7 +2062,14 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         InstanceIdentifier<VrfEntry> vrfEntryId = InstanceIdentifier.builder(FibEntries.class)
             .child(VrfTables.class, new VrfTablesKey(rd))
             .child(VrfEntry.class, new VrfEntryKey(ipPrefix)).build();
-        Optional<VrfEntry> vrfEntry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> vrfEntry;
+        try {
+            vrfEntry = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION,
+                    vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVrfEntry: Exception while reading VrfEntry for the prefix {} rd {}", ipPrefix, rd, e);
+            return null;
+        }
         if (vrfEntry.isPresent()) {
             return vrfEntry.get();
         }
index 58cb064ccab6d3f2f4446a31870bbdad81bf17ca..0d79bee7ed59319f1491870c09da40b7ac104aa5 100644 (file)
@@ -4,7 +4,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default"/>
   <reference id="iMdsalApiManager"
              interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager"/>
index cc5b6adeca7f34ceb4bde55ca7b9490e7827bde7..474b7c5fe97966ecb1f9e315292d6c03bb77a7f5 100644 (file)
@@ -13,10 +13,10 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.netvirt.fibmanager.VrfEntryListener;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -36,7 +36,7 @@ public class FibManagerTest {
     @Mock
     DataBroker dataBroker;
     @Mock
-    ReadOnlyTransaction mockReadTx;
+    ReadTransaction mockReadTx;
     @Mock
     WriteTransaction mockWriteTx;
     @Mock
index a8ed8d0159e937bdcbb8c950a2ac2ff9b6e72191..194f822c2616528662aed24418c43d1194960688 100644 (file)
@@ -20,11 +20,11 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.VrfEntryBase.EncapType;
index 8eb01deb3892a026a38b1e06871376480799bbbe..3bcfe1a47fd8a5b38ed7255870dc794f4794037a 100644 (file)
@@ -10,7 +10,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="fibManagerRef" interface="org.opendaylight.netvirt.fibmanager.api.IFibManager" />
-  <reference id="dataBrokerRef" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" />
+  <reference id="dataBrokerRef" interface="org.opendaylight.mdsal.binding.api.DataBroker" />
   <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
 
     <command>
index 25d81489a15103e38e4c96703afd936ee461bf50..b53b7102811c915b180ba6b361ad0633359eea05 100644 (file)
@@ -27,10 +27,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>javax.inject</artifactId>
             <optional>true</optional>
         </dependency>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>org.opendaylight.genius</groupId>
             <artifactId>interfacemanager-api</artifactId>
index a5888dc11c1abffcaf9fb2e7400b7da56f897980..3a28efafaba7848b70489ead144d11b9d0915754 100644 (file)
@@ -28,12 +28,12 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.ipv6util.api.Ipv6Constants.Ipv6RouterAdvertisementType;
 import org.opendaylight.genius.ipv6util.api.Ipv6Util;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.ipv6service.api.ElementCache;
 import org.opendaylight.netvirt.ipv6service.api.IVirtualNetwork;
index dc7133fcdd8d2b25e68851969150ed42749c2191..26e78b4ea0bcba2946f64934cb74ee723ec7ec92 100644 (file)
@@ -9,12 +9,9 @@ package org.opendaylight.netvirt.ipv6service;
 
 import java.util.ArrayList;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
@@ -24,6 +21,10 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -34,7 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class Ipv6NodeListener extends AsyncClusteredDataTreeChangeListenerBase<FlowCapableNode, Ipv6NodeListener> {
+public class Ipv6NodeListener extends AbstractClusteredAsyncDataTreeChangeListener<FlowCapableNode> {
     private static final Logger LOG = LoggerFactory.getLogger(Ipv6NodeListener.class);
     private final DataBroker dataBroker;
     private final IMdsalApiManager mdsalUtil;
@@ -43,30 +44,33 @@ public class Ipv6NodeListener extends AsyncClusteredDataTreeChangeListenerBase<F
     @Inject
     public Ipv6NodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalUtil,
                             final Ipv6ServiceEosHandler ipv6ServiceEosHandler) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class)
+                .augmentation(FlowCapableNode.class),
+                Executors.newListeningSingleThreadExecutor("Ipv6NodeListener", LOG));
         this.dataBroker = dataBroker;
         this.mdsalUtil = mdsalUtil;
         this.ipv6ServiceEosHandler = ipv6ServiceEosHandler;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<FlowCapableNode> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
+    public void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
                           FlowCapableNode dataObjectModificationAfter) {
         // do nothing
     }
 
     @Override
-    protected void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         LOG.trace("FlowCapableNode Added: key: {}", key);
 
         NodeKey nodeKey = key.firstKeyOf(Node.class);
@@ -92,16 +96,7 @@ public class Ipv6NodeListener extends AsyncClusteredDataTreeChangeListenerBase<F
     }
 
     @Override
-    protected void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         // do nothing
     }
-
-    /* (non-Javadoc)
-     * @see org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase#getDataTreeChangeListener()
-     */
-    @Override
-    protected Ipv6NodeListener getDataTreeChangeListener() {
-        return Ipv6NodeListener.this;
-    }
-
 }
index 25dc4821438359414d80ed024442b57b65032442..04d02853e1891e69116075cbfc4ba8485f272ae5 100644 (file)
@@ -9,18 +9,19 @@ package org.opendaylight.netvirt.ipv6service;
 
 import java.util.Collections;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceConstants;
 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class Ipv6ServiceInterfaceEventListener
-        extends AsyncClusteredDataTreeChangeListenerBase<Interface, Ipv6ServiceInterfaceEventListener> {
+        extends AbstractClusteredAsyncDataTreeChangeListener<Interface> {
     private static final Logger LOG = LoggerFactory.getLogger(Ipv6ServiceInterfaceEventListener.class);
     private final DataBroker dataBroker;
     private final IfMgr ifMgr;
@@ -48,7 +49,9 @@ public class Ipv6ServiceInterfaceEventListener
     @Inject
     public Ipv6ServiceInterfaceEventListener(DataBroker broker, IfMgr ifMgr, Ipv6ServiceUtils ipv6ServiceUtils,
             final JobCoordinator jobCoordinator, Ipv6ServiceEosHandler ipv6ServiceEosHandler) {
-        super(Interface.class, Ipv6ServiceInterfaceEventListener.class);
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                        .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("Ipv6ServiceInterfaceEventListener", LOG));
         this.dataBroker = broker;
         this.ifMgr = ifMgr;
         this.ipv6ServiceUtils = ipv6ServiceUtils;
@@ -56,19 +59,19 @@ public class Ipv6ServiceInterfaceEventListener
         this.ipv6ServiceEosHandler = ipv6ServiceEosHandler;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> key, Interface del) {
+    public void remove(InstanceIdentifier<Interface> key, Interface del) {
         LOG.debug("Port removed {}, {}", key, del);
         if (!L2vlan.class.equals(del.getType())) {
             return;
@@ -106,7 +109,7 @@ public class Ipv6ServiceInterfaceEventListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> key, Interface before, Interface after) {
+    public void update(InstanceIdentifier<Interface> key, Interface before, Interface after) {
         if (before.getType() == null && L2vlan.class.equals(after.getType())) {
             add(key, after);
         }
@@ -123,7 +126,7 @@ public class Ipv6ServiceInterfaceEventListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> key, Interface add) {
+    public void add(InstanceIdentifier<Interface> key, Interface add) {
         List<String> ofportIds = add.getLowerLayerIf();
 
         if (!L2vlan.class.equals(add.getType())) {
@@ -178,9 +181,4 @@ public class Ipv6ServiceInterfaceEventListener
             }
         }
     }
-
-    @Override
-    protected Ipv6ServiceInterfaceEventListener getDataTreeChangeListener() {
-        return Ipv6ServiceInterfaceEventListener.this;
-    }
 }
index 72803408860e3caf9753bd4cc5e2b53e6ac63787..fa2ba1ceaa5624dca641e20f6cc352775312ddc8 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.netvirt.ipv6service;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.mtu.ext.rev181114.NetworkMtuExtension;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
@@ -22,8 +23,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronNetworkChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Network,
-        NeutronNetworkChangeListener> {
+public class NeutronNetworkChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Network> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkChangeListener.class);
 
@@ -32,23 +32,26 @@ public class NeutronNetworkChangeListener extends AsyncClusteredDataTreeChangeLi
 
     @Inject
     public NeutronNetworkChangeListener(final DataBroker dataBroker, IfMgr ifMgr) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Networks.class).child(Network.class),
+                Executors.newListeningSingleThreadExecutor("NeutronNetworkChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.ifMgr = ifMgr;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Network> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Network> identifier, Network input) {
+    public void add(InstanceIdentifier<Network> identifier, Network input) {
         int mtu = 0;
         LOG.debug("Add Network notification handler is invoked {} ", input);
         if (input.augmentation(NetworkMtuExtension.class) != null) {
@@ -58,22 +61,13 @@ public class NeutronNetworkChangeListener extends AsyncClusteredDataTreeChangeLi
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Network> identifier, Network input) {
+    public void remove(InstanceIdentifier<Network> identifier, Network input) {
         LOG.debug("Remove Network notification handler is invoked {} ", input);
         ifMgr.removeNetwork(input.getUuid());
     }
 
     @Override
-    protected void update(InstanceIdentifier<Network> identifier, Network original, Network update) {
+    public void update(InstanceIdentifier<Network> identifier, Network original, Network update) {
         LOG.debug("Update Network notification handler is invoked...");
     }
-
-    /* (non-Javadoc)
-     * @see org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase#getDataTreeChangeListener()
-     */
-    @Override
-    protected NeutronNetworkChangeListener getDataTreeChangeListener() {
-        return NeutronNetworkChangeListener.this;
-    }
-
 }
index 8f241eaae301ddf95a89e16257d0b717c9ff3561..d90c1ff9b7fe2ffadaae64813344ea5249857b71 100644 (file)
@@ -12,14 +12,15 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
@@ -30,31 +31,33 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronPortChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Port,
-        NeutronPortChangeListener> {
+public class NeutronPortChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Port> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortChangeListener.class);
     private final DataBroker dataBroker;
     private final IfMgr ifMgr;
 
     @Inject
     public NeutronPortChangeListener(final DataBroker dataBroker, IfMgr ifMgr) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Ports.class).child(Port.class),
+                Executors.newListeningSingleThreadExecutor("NeutronPortChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.ifMgr = ifMgr;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Port> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Port> identifier, Port port) {
+    public void add(InstanceIdentifier<Port> identifier, Port port) {
         if (Ipv6ServiceConstants.NETWORK_ROUTER_GATEWAY.equalsIgnoreCase(port.getDeviceOwner())) {
             // Todo: revisit when IPv6 north-south support is implemented.
             LOG.info("IPv6Service (TODO): Skipping router_gateway port {} for add event", port);
@@ -75,7 +78,7 @@ public class NeutronPortChangeListener extends AsyncClusteredDataTreeChangeListe
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Port> identifier, Port port) {
+    public void remove(InstanceIdentifier<Port> identifier, Port port) {
         if (Ipv6ServiceConstants.NETWORK_ROUTER_GATEWAY.equalsIgnoreCase(port.getDeviceOwner())) {
             // Todo: revisit when IPv6 north-south support is implemented.
             LOG.info("IPv6Service (TODO): Skipping router_gateway port {} for remove event", port);
@@ -91,7 +94,7 @@ public class NeutronPortChangeListener extends AsyncClusteredDataTreeChangeListe
     }
 
     @Override
-    protected void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
+    public void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
         if (Ipv6ServiceConstants.NETWORK_ROUTER_GATEWAY.equalsIgnoreCase(update.getDeviceOwner())) {
             // Todo: revisit when IPv6 north-south support is implemented.
             LOG.info("IPv6Service (TODO): Skipping router_gateway port {} for update event", update);
@@ -169,9 +172,4 @@ public class NeutronPortChangeListener extends AsyncClusteredDataTreeChangeListe
     private Set<FixedIps> getFixedIpSet(@Nullable List<FixedIps> fixedIps) {
         return fixedIps != null ? new HashSet<>(fixedIps) : Collections.emptySet();
     }
-
-    @Override
-    protected NeutronPortChangeListener getDataTreeChangeListener() {
-        return NeutronPortChangeListener.this;
-    }
 }
index c01d91866755b5fa73692d740fbf50d64c61ee08..47c5b2f6b39169f6cc7840834ec54a762353db93 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.netvirt.ipv6service;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
@@ -21,49 +22,45 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronRouterChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Router,
-        NeutronRouterChangeListener> {
+public class NeutronRouterChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Router> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronRouterChangeListener.class);
     private final DataBroker dataBroker;
     private final IfMgr ifMgr;
 
     @Inject
     public NeutronRouterChangeListener(final DataBroker dataBroker, IfMgr ifMgr) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Routers.class).child(Router.class),
+                Executors.newListeningSingleThreadExecutor("NeutronRouterChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.ifMgr = ifMgr;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Router> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Routers.class).child(Router.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Router> identifier, Router input) {
+    public void add(InstanceIdentifier<Router> identifier, Router input) {
         LOG.info("Add Router notification handler is invoked {}.", input.getUuid());
         ifMgr.addRouter(input.getUuid(), input.getName(), input.getTenantId());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Router> identifier, Router input) {
+    public void remove(InstanceIdentifier<Router> identifier, Router input) {
         LOG.info("Remove Router notification handler is invoked {}.", input.getUuid());
         ifMgr.removeRouter(input.getUuid());
     }
 
     @Override
-    protected void update(InstanceIdentifier<Router> identifier, Router original, Router update) {
+    public void update(InstanceIdentifier<Router> identifier, Router original, Router update) {
         LOG.debug("Update Router notification handler is invoked. Original: {}, Updated: {}.", original, update);
     }
-
-    @Override
-    protected NeutronRouterChangeListener getDataTreeChangeListener() {
-        return NeutronRouterChangeListener.this;
-    }
-
 }
index d1620cd93cb70a73a9fa33107a7ea23edb8fdad3..16631db81455c98155417191ce6eb348e186aac4 100644 (file)
@@ -8,13 +8,14 @@
 package org.opendaylight.netvirt.ipv6service;
 
 import com.google.common.collect.ImmutableBiMap;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Base;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Off;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.Dhcpv6Slaac;
@@ -31,8 +32,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronSubnetChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Subnet,
-        NeutronSubnetChangeListener> {
+public class NeutronSubnetChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Subnet> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSubnetChangeListener.class);
     private final DataBroker dataBroker;
     private final IfMgr ifMgr;
@@ -53,23 +53,26 @@ public class NeutronSubnetChangeListener extends AsyncClusteredDataTreeChangeLis
 
     @Inject
     public NeutronSubnetChangeListener(final DataBroker dataBroker, IfMgr ifMgr) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Subnets.class).child(Subnet.class),
+                Executors.newListeningSingleThreadExecutor("NeutronSubnetChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.ifMgr = ifMgr;
     }
 
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Subnet> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Subnet> identifier, Subnet input) {
+    public void add(InstanceIdentifier<Subnet> identifier, Subnet input) {
         if (IPV_MAP.get(input.getIpVersion()).equals(Ipv6ServiceConstants.IP_VERSION_V6)) {
             LOG.info("Add Subnet notification handler is invoked {} ", input);
             String ipv6AddrMode = "";
@@ -87,18 +90,12 @@ public class NeutronSubnetChangeListener extends AsyncClusteredDataTreeChangeLis
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnet> identifier, Subnet input) {
+    public void remove(InstanceIdentifier<Subnet> identifier, Subnet input) {
         ifMgr.removeSubnet(input.getUuid());
     }
 
     @Override
-    protected void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
+    public void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
         LOG.debug("Update Subnet notification handler is invoked Original: {}, Update: {}", original, update);
     }
-
-    @Override
-    protected NeutronSubnetChangeListener getDataTreeChangeListener() {
-        return NeutronSubnetChangeListener.this;
-    }
-
 }
index da50b15ede864b66e59fb73d06d1956b43bfa206..eee8ff2c4b1b93b2d56aaf0630af8609b870183b 100644 (file)
@@ -8,20 +8,17 @@
 
 package org.opendaylight.netvirt.ipv6service.utils;
 
-import com.google.common.base.Optional;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -51,6 +48,9 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.packet.IPProtocols;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.ipv6service.VirtualSubnet;
 import org.opendaylight.netvirt.ipv6service.api.IVirtualPort;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
@@ -114,7 +114,7 @@ public class Ipv6ServiceUtils {
      * @return the required object.
      */
     public <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
@@ -128,7 +128,7 @@ public class Ipv6ServiceUtils {
      */
     public org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
         .@Nullable Interface getInterface(String interfaceName) {
-        return read(LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName)).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, getInterfaceIdentifier(interfaceName)).orElse(null);
     }
 
     /**
@@ -167,7 +167,8 @@ public class Ipv6ServiceUtils {
      */
     public org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state
             .@Nullable Interface getInterfaceStateFromOperDS(String interfaceName) {
-        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, buildStateInterfaceId(interfaceName), broker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, buildStateInterfaceId(interfaceName), broker)
+                .orElse(null);
     }
 
     private static List<MatchInfo> getIcmpv6RSMatch(Long elanTag) {
index d69c904a73b5e9e8f0215359fc24fb00ba5eae43..661b5f0f6e0cc131605cfa353cd0ff5a3174196f 100644 (file)
@@ -4,7 +4,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default" />
   <reference id="iMdsalApiManager"
              interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
index e6c572dbe1e9245b32af0289d6313e00428849de..c383b288c694f7839e25010ecf5452d1cdde2ea5 100644 (file)
@@ -39,6 +39,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.karaf.shell</groupId>
             <artifactId>org.apache.karaf.shell.commands</artifactId>
index 1327f5cf15ada5c57e033a58610597215bcfbfc5..894031fca561b253e3bfed5412bffa262a462a02 100644 (file)
@@ -8,16 +8,16 @@
 
 package org.opendaylight.netvirt.natservice.cli;
 
-import com.google.common.base.Optional;
 import java.io.PrintStream;
 import java.math.BigInteger;
+import java.util.Optional;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.internal.NatUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeRefInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
@@ -66,7 +66,7 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                         LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath);
         if (!bridgeRefEntry.isPresent()) {
-            return Optional.absent();
+            return Optional.empty();
         }
 
         InstanceIdentifier<Node> nodeId =
@@ -78,7 +78,7 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
 
     @Nullable
     private String getDpnLocalIp(BigInteger dpId) {
-        return getPortsNode(dpId).toJavaUtil().map(node -> getOpenvswitchOtherConfig(node, LOCAL_IP)).orElse(null);
+        return getPortsNode(dpId).map(node -> getOpenvswitchOtherConfig(node, LOCAL_IP)).orElse(null);
     }
 
     @Nullable
@@ -111,7 +111,7 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
             return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, ovsdbNodeIid);
         }
-        return Optional.absent();
+        return Optional.empty();
 
     }
 
index 72ff00b1434e411a65a67bf3efee51c29ca55a6d..2ac428347c56398da101fc33b142d02eeada2d0d 100644 (file)
@@ -16,7 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCacheListener;
 import org.opendaylight.netvirt.natservice.api.SwitchInfo;
index 764b416d9320786a1db59d5386d82858c91e1d39..f0a92e4834f72f34e1fa974ee6f76afc44de2202 100644 (file)
@@ -13,21 +13,22 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import java.time.Duration;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
 import org.opendaylight.netvirt.natservice.internal.NatConstants;
 import org.opendaylight.netvirt.natservice.internal.NatUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig.NatMode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
@@ -45,7 +46,7 @@ import org.slf4j.LoggerFactory;
  */
 @Singleton
 public class SnatCentralizedSwitchChangeListener
-        extends AsyncDataTreeChangeListenerBase<RouterToNaptSwitch, SnatCentralizedSwitchChangeListener> {
+        extends AbstractAsyncDataTreeChangeListener<RouterToNaptSwitch> {
 
     private static final Logger LOG = LoggerFactory.getLogger(SnatCentralizedSwitchChangeListener.class);
     private final DataBroker dataBroker;
@@ -59,7 +60,9 @@ public class SnatCentralizedSwitchChangeListener
     public SnatCentralizedSwitchChangeListener(final DataBroker dataBroker,
             final SnatServiceManager snatServiceManger, NatDataUtil natDataUtil, final NatserviceConfig config,
             final DataTreeEventCallbackRegistrar dataTreeEventCallbackRegistrar) {
-        super(RouterToNaptSwitch.class, SnatCentralizedSwitchChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NaptSwitches.class)
+                .child(RouterToNaptSwitch.class),
+                Executors.newListeningSingleThreadExecutor("SnatCentralizedSwitchChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.snatServiceManger = snatServiceManger;
@@ -73,20 +76,19 @@ public class SnatCentralizedSwitchChangeListener
         }
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<RouterToNaptSwitch> getWildCardPath() {
-        return InstanceIdentifier.create(NaptSwitches.class).child(RouterToNaptSwitch.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
+    public void remove(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Deleting {}", routerToNaptSwitch);
         if (natMode == NatMode.Controller) {
             LOG.info("Do Not Processing this remove() event for (routerName:designatedDpn) {}:{}"
@@ -106,7 +108,7 @@ public class SnatCentralizedSwitchChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch origRouterToNaptSwitch,
+    public void update(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch origRouterToNaptSwitch,
             RouterToNaptSwitch updatedRouterToNaptSwitch) {
         LOG.debug("Updating old {} new {}", origRouterToNaptSwitch, updatedRouterToNaptSwitch);
         if (natMode == NatMode.Controller) {
@@ -162,7 +164,7 @@ public class SnatCentralizedSwitchChangeListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
+    public void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Adding {}", routerToNaptSwitch);
         if (natMode == NatMode.Controller) {
             LOG.info("Do Not Processing this add() event for (routerName:designatedDpn) {}:{}"
@@ -214,9 +216,4 @@ public class SnatCentralizedSwitchChangeListener
             LOG.error("Router {} not found for primarySwitch {}", routerName, primarySwitchId);
         }
     }
-
-    @Override
-    protected SnatCentralizedSwitchChangeListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index d9206d99d1c3948562e98f1bf70d4753eb0f2740..f7060b1818d4b5a3937aa6b02a334b0d88b1f4b5 100644 (file)
@@ -8,16 +8,15 @@
 package org.opendaylight.netvirt.natservice.ha;
 
 import java.util.concurrent.Executors;
-
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
-
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
-import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredAsyncDataTreeChangeListener;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
@@ -39,12 +38,19 @@ public class SnatNodeEventListener  extends AbstractClusteredAsyncDataTreeChange
     public SnatNodeEventListener(final DataBroker dataBroker,
             final NatSwitchCache centralizedSwitchCache) {
 
-        super(dataBroker,new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
+        super(dataBroker, DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
                 .create(Nodes.class).child(Node.class)),
                 Executors.newSingleThreadExecutor());
         this.centralizedSwitchCache = centralizedSwitchCache;
     }
 
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        org.opendaylight.infrautils.utils.concurrent.Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
     @Override
     public void remove(Node dataObjectModification) {
         NodeKey nodeKey = dataObjectModification.key();
index 4669980941ebb3c4903456ad8f56ba92e8b35385..8454a8492dbbb906ecf4e7308eed8398c8a884ab 100644 (file)
@@ -11,26 +11,26 @@ package org.opendaylight.netvirt.natservice.ha;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.natservice.api.CentralizedSwitchScheduler;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCacheListener;
@@ -142,7 +142,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
                 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
                         getNaptSwitchesIdentifier(routerName), routerToNaptSwitchBuilder.build());
             }
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.error("updateCentralizedSwitch ReadFailedException for {}", routerName);
         } catch (TransactionCommitFailedException e) {
             LOG.error("updateCentralizedSwitch TransactionCommitFailedException for {}", routerName);
@@ -182,7 +182,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
         try {
             String primaryRd = txRunner.applyWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
                 for (Uuid subnetUuid : addedSubnetIds) {
-                    Subnetmap subnetMapEntry = tx.read(getSubnetMapIdentifier(subnetUuid)).get().orNull();
+                    Subnetmap subnetMapEntry = tx.read(getSubnetMapIdentifier(subnetUuid)).get().orElse(null);
                     subnetMapEntries.put(subnetUuid, subnetMapEntry);
                     Uuid routerPortUuid = subnetMapEntry.getRouterInterfacePortId();
                     subnetIdToRouterPortMap.put(subnetUuid.getValue(), routerPortUuid.getValue());
@@ -259,7 +259,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
             try {
                 optRouters = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                         LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ExtRouters.class));
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("addSwitch: Error reading external routers", e);
                 return;
             }
@@ -290,7 +290,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
             if (dpnId == null || dpnId.equals(Uint64.ZERO)) {
                 return false;
             }
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.error("isPrimarySwitchAllocatedForRouter: Error reading RouterToNaptSwitch model", e);
             return false;
         }
@@ -322,8 +322,13 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
 
     private NaptSwitches getNaptSwitches() {
         InstanceIdentifier<NaptSwitches> id = InstanceIdentifier.builder(NaptSwitches.class).build();
-        return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id).orNull();
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getNaptSwitches: Exception while reading Napt-Switch DS", e);
+        }
+        return null;
     }
 
     private Uint64 getSwitchWithLowestWeight(String providerNet) {
@@ -368,7 +373,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
                 return null;
             }
             return naptSwitches.get().getPrimarySwitchId();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading RouterToNaptSwitch model", e);
             return null;
         }
index cf2e8628346cdc33bf8939dc6b6145209e198849..7f262fa0e9d91cf46f527c4c7a076d3abe791015 100644 (file)
@@ -15,10 +15,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
@@ -48,6 +45,9 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
@@ -639,7 +639,7 @@ public abstract class AbstractSnatService implements SnatServiceListener {
 
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
                     vpnInterfacesId, vpnInterfacesBuilder.build());
-        } catch (ReadFailedException e) {
+        } catch (ExpectedDataObjectNotFoundException e) {
             LOG.warn("Failed to read removeMipAdjacencies with error {}", e.getMessage());
         } catch (TransactionCommitFailedException e) {
             LOG.warn("Failed to remove removeMipAdjacencies with error {}", e.getMessage());
index ab3e0a16b472b6b4bd32072c9b1b2b0e0178bf34..d57a305141725b04db1b6a8252f5bedd03f603b0 100644 (file)
@@ -7,13 +7,12 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
@@ -39,6 +38,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
index fab8244712b48b3f08ce9f1a99adae78103f5bda..864fd2c2f34d422f2ce248b7850f1f311af1a68c 100644 (file)
@@ -8,11 +8,10 @@
 
 package org.opendaylight.netvirt.natservice.internal;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -22,12 +21,11 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -45,6 +43,8 @@ import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
index a197b618d97cc8f88175381a72c3c0cd4db0c749..509b591428802b914b75737226135b6285e086e3 100644 (file)
@@ -11,12 +11,12 @@ package org.opendaylight.netvirt.natservice.internal;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint64;
index ecc38de53a351e8ee48f900b23bb08f968c60735..c65acf3bb688fd2a899128ac6a779ab4cdc41108 100644 (file)
@@ -21,7 +21,6 @@ import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -34,6 +33,7 @@ import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
index efa7ed3a3d6b0586b6481e8d989b19d04cae4fc0..52878b14a25bd985033cefacab3fbd7e57ec99f0 100644 (file)
@@ -17,7 +17,6 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.BucketInfo;
@@ -27,6 +26,7 @@ import org.opendaylight.genius.mdsalutil.actions.ActionDrop;
 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldEthernetDestination;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
index 5f4be360db84043e88a052ae687c57a60b0e4bcc..9f75bdb3046f3bcbd61d4049fb0d48ab9d79c5d9 100644 (file)
@@ -9,21 +9,24 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
@@ -44,8 +47,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ExternalNetworksChangeListener
-        extends AsyncDataTreeChangeListenerBase<Networks, ExternalNetworksChangeListener> {
+public class ExternalNetworksChangeListener extends AbstractAsyncDataTreeChangeListener<Networks> {
     private static final Logger LOG = LoggerFactory.getLogger(ExternalNetworksChangeListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -61,7 +63,9 @@ public class ExternalNetworksChangeListener
                                           final OdlInterfaceRpcService interfaceManager,
                                           final NatserviceConfig config,
                                           final JobCoordinator coordinator) {
-        super(Networks.class, ExternalNetworksChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ExternalNetworks.class)
+                .child(Networks.class),
+                Executors.newListeningSingleThreadExecutor("ExternalNetworksChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.floatingIpListener = floatingIpListener;
@@ -75,30 +79,24 @@ public class ExternalNetworksChangeListener
         }
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Networks> getWildCardPath() {
-        return InstanceIdentifier.create(ExternalNetworks.class).child(Networks.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Networks> identifier, Networks networks) {
-
-    }
+    public void add(InstanceIdentifier<Networks> identifier, Networks networks) {
 
-    @Override
-    protected ExternalNetworksChangeListener getDataTreeChangeListener() {
-        return ExternalNetworksChangeListener.this;
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Networks> identifier, Networks networks) {
+    public void remove(InstanceIdentifier<Networks> identifier, Networks networks) {
         if (identifier == null || networks == null || networks.getRouterIds() == null
                 || networks.getRouterIds().isEmpty()) {
             LOG.warn("remove : returning without processing since networks/identifier is null: "
@@ -119,7 +117,7 @@ public class ExternalNetworksChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Networks> identifier, Networks original, Networks update) {
+    public void update(InstanceIdentifier<Networks> identifier, Networks original, Networks update) {
         //Check for VPN disassociation
         Uuid originalVpn = original.getVpnid();
         Uuid updatedVpn = update.getVpnid();
@@ -161,8 +159,15 @@ public class ExternalNetworksChangeListener
                 //long router = NatUtil.getVpnId(dataBroker, routerId.getValue());
 
                 InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerId.getValue());
-                Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                    routerPortsId);
+                Optional<RouterPorts> optRouterPorts = null;
+                try {
+                    optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                            LogicalDatastoreType.CONFIGURATION, routerPortsId);
+                } catch (ExecutionException | InterruptedException e) {
+                    LOG.error("associateExternalNetworkWithVPN: Exception while reading RouterPorts DS for the "
+                            + "router {} network {} ", routerId, network.getId().getValue(), e);
+                    continue;
+                }
                 if (!optRouterPorts.isPresent()) {
                     LOG.debug("associateExternalNetworkWithVPN : Could not read Router Ports data object with id: {} "
                         + "to handle associate ext nw {}", routerId, network.getId());
@@ -206,8 +211,14 @@ public class ExternalNetworksChangeListener
                 Uint64 dpnId = Uint64.valueOf("0");
                 InstanceIdentifier<RouterToNaptSwitch> routerToNaptSwitch =
                     NatUtil.buildNaptSwitchRouterIdentifier(routerId.getValue());
-                Optional<RouterToNaptSwitch> rtrToNapt =
-                    MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routerToNaptSwitch);
+                Optional<RouterToNaptSwitch> rtrToNapt = Optional.empty();
+                try {
+                    rtrToNapt = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                            LogicalDatastoreType.CONFIGURATION, routerToNaptSwitch);
+                } catch (ExecutionException | InterruptedException e) {
+                    LOG.error("associateExternalNetworkWithVPN: Exception while reading routerToNaptSwitch DS for the "
+                            + "router {}", routerId, e);
+                }
                 if (rtrToNapt.isPresent()) {
                     dpnId = rtrToNapt.get().getPrimarySwitchId();
                 }
@@ -273,8 +284,14 @@ public class ExternalNetworksChangeListener
         if (network.getRouterIds() != null) {
             for (Uuid routerId : network.getRouterIds()) {
                 InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerId.getValue());
-                Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                    routerPortsId);
+                Optional<RouterPorts> optRouterPorts = Optional.empty();
+                try {
+                    optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                            LogicalDatastoreType.CONFIGURATION, routerPortsId);
+                } catch (ExecutionException | InterruptedException e) {
+                    LOG.error("disassociateExternalNetworkFromVPN: Exception while reading RouterPorts DS for the "
+                            + "router {} network {} vpn {}", routerId, network.getId().getValue(), vpnName, e);
+                }
                 if (!optRouterPorts.isPresent()) {
                     LOG.debug(
                         "disassociateExternalNetworkFromVPN : Could not read Router Ports data object with id: {} "
index bbaebf4ed9482a30098b8710f9e215d5ede33a67..f32704a5bca24012f3feb5e8376eee2adeb881e6 100644 (file)
@@ -7,16 +7,14 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.math.BigInteger;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -30,18 +28,15 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -79,11 +74,15 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchMplsLabel;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 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.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -153,7 +152,7 @@ import org.slf4j.LoggerFactory;
 
 
 @Singleton
-public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Routers, ExternalRoutersListener> {
+public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener<Routers> {
     private static final Logger LOG = LoggerFactory.getLogger(ExternalRoutersListener.class);
 
     private static final Uint64 COOKIE_TUNNEL = Uint64.valueOf("9000000", 16).intern();
@@ -204,7 +203,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                                    final JobCoordinator coordinator,
                                    final NatOverVxlanUtil natOverVxlanUtil,
                                    final IInterfaceManager interfaceManager) {
-        super(Routers.class, ExternalRoutersListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ExtRouters.class)
+                .child(Routers.class),
+                Executors.newListeningSingleThreadExecutor("ExternalRoutersListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
@@ -233,29 +234,32 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             this.natMode = NatMode.Controller;
             this.snatPuntTimeout = 0;
         }
+        init();
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
         // This class handles ExternalRouters for Controller SNAT mode.
         // For Conntrack SNAT mode, its handled in SnatExternalRoutersListener.java
         if (natMode == NatMode.Controller) {
-            registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
             NatUtil.createGroupIdPool(idManager);
         }
     }
 
     @Override
-    protected InstanceIdentifier<Routers> getWildCardPath() {
-        return InstanceIdentifier.create(ExtRouters.class).child(Routers.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Routers> identifier, Routers routers) {
+    public void add(InstanceIdentifier<Routers> identifier, Routers routers) {
+        if (natMode != NatMode.Controller) {
+            return;
+        }
         // Populate the router-id-name container
         String routerName = routers.getRouterName();
         LOG.info("add : external router event for {}", routerName);
@@ -423,9 +427,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             try {
                 sn = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                 LogicalDatastoreType.CONFIGURATION, subnetmapId);
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Failed to read SubnetMap for  subnetmap Id {}", subnetmapId, e);
-                sn = Optional.absent();
+                sn = Optional.empty();
             }
             if (sn.isPresent()) {
                 // subnets
@@ -1260,7 +1264,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
     }
 
     @Override
-    protected void update(InstanceIdentifier<Routers> identifier, Routers original, Routers update) {
+    public void update(InstanceIdentifier<Routers> identifier, Routers original, Routers update) {
+        if (natMode != NatMode.Controller) {
+            return;
+        }
         LOG.trace("update : origRouter: {} updatedRouter: {}", original, update);
         String routerName = original.getRouterName();
         Uint32 routerId = NatUtil.getVpnId(dataBroker, routerName);
@@ -1422,9 +1429,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                                 ipPortMapping = SingleTransactionDataBroker
                                             .syncReadOptional(dataBroker,
                                                     LogicalDatastoreType.CONFIGURATION, ipPortMappingId);
-                            } catch (ReadFailedException e) {
+                            } catch (InterruptedException | ExecutionException e) {
                                 LOG.error("Failed to read ipPortMapping for router id {}", routerId, e);
-                                ipPortMapping = Optional.absent();
+                                ipPortMapping = Optional.empty();
                             }
 
                             if (ipPortMapping.isPresent()) {
@@ -1644,9 +1651,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         try {
             externalCountersData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                         LogicalDatastoreType.OPERATIONAL, id);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read external counters data for ExternalIp {}", externalIp, e);
-            externalCountersData = Optional.absent();
+            externalCountersData = Optional.empty();
         }
         if (externalCountersData.isPresent()) {
             ExternalIpsCounter externalIpsCounters = externalCountersData.get();
@@ -1747,7 +1754,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Routers> identifier, Routers router) {
+    public void remove(InstanceIdentifier<Routers> identifier, Routers router) {
+        if (natMode != NatMode.Controller) {
+            return;
+        }
         LOG.trace("remove : Router delete method");
         /*
         ROUTER DELETE SCENARIO
@@ -1882,9 +1892,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             try {
                 rtrToNapt = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                 LogicalDatastoreType.CONFIGURATION, routerToNaptSwitch);
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Failed to read NAPT switch for router {}", routerName, e);
-                rtrToNapt = Optional.absent();
+                rtrToNapt = Optional.empty();
             }
             if (rtrToNapt.isPresent()) {
                 naptSwitchDpnId = rtrToNapt.get().getPrimarySwitchId();
@@ -2693,7 +2703,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                     .syncReadOptional(dataBroker,
                             LogicalDatastoreType.CONFIGURATION, routerInstanceIndentifier);
             return routerData.isPresent() && routerData.get().isEnableSnat();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read data for router id {}", routerUuid, e);
             return false;
         }
@@ -3005,11 +3015,6 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         return flowEntity;
     }
 
-    @Override
-    protected ExternalRoutersListener getDataTreeChangeListener() {
-        return ExternalRoutersListener.this;
-    }
-
     protected void installNaptPfibEntriesForExternalSubnets(String routerName, Uint64 dpnId,
                                                         @Nullable TypedWriteTransaction<Configuration> writeFlowInvTx) {
         Collection<Uuid> externalSubnetIdsForRouter = NatUtil.getExternalSubnetIdsForRouter(dataBroker,
index b070371e9f47974a19862404b5ea4482de624ab7..e8f3f8ae968ca742db72896c34592c221ad6736a 100644 (file)
@@ -7,16 +7,17 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalSubnets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.Subnets;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -25,8 +26,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ExternalSubnetChangeListener extends AsyncDataTreeChangeListenerBase<Subnets,
-    ExternalSubnetChangeListener> {
+public class ExternalSubnetChangeListener extends AbstractAsyncDataTreeChangeListener<Subnets> {
     private static final Logger LOG = LoggerFactory.getLogger(ExternalSubnetChangeListener.class);
     private final DataBroker dataBroker;
     private final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer;
@@ -36,24 +36,26 @@ public class ExternalSubnetChangeListener extends AsyncDataTreeChangeListenerBas
                      final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer,
                      final IElanService elanService, final IVpnManager vpnManager,
                      DataTreeEventCallbackRegistrar dataTreeEventCallbackRegistrar) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ExternalSubnets.class)
+                .child(Subnets.class),
+                Executors.newListeningSingleThreadExecutor("ExternalSubnetChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.snatDefaultRouteProgrammer = snatDefaultRouteProgrammer;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Subnets> getWildCardPath() {
-        return InstanceIdentifier.create(ExternalSubnets.class).child(Subnets.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnets> key, Subnets subnet) {
+    public void remove(InstanceIdentifier<Subnets> key, Subnets subnet) {
         LOG.info("remove : External Subnet remove mapping method - key:{}. value={}",
                 subnet.key(), subnet);
         String extSubnetUuid = subnet.getId().getValue();
@@ -68,16 +70,11 @@ public class ExternalSubnetChangeListener extends AsyncDataTreeChangeListenerBas
     }
 
     @Override
-    protected void update(InstanceIdentifier<Subnets> key, Subnets orig,
+    public void update(InstanceIdentifier<Subnets> key, Subnets orig,
             Subnets update) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<Subnets> key, Subnets subnet) {
-    }
-
-    @Override
-    protected ExternalSubnetChangeListener getDataTreeChangeListener() {
-        return ExternalSubnetChangeListener.this;
+    public void add(InstanceIdentifier<Subnets> key, Subnets subnet) {
     }
 }
index fa6bf575bd318b1b2390e5ce25386327057ecb02..49cc3810edeac37386b970d5e63503c7334b9841 100644 (file)
@@ -7,16 +7,17 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
@@ -28,8 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class ExternalSubnetVpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInstance,
-    ExternalSubnetVpnInstanceListener> {
+public class ExternalSubnetVpnInstanceListener extends AbstractAsyncDataTreeChangeListener<VpnInstance> {
     private static final Logger LOG = LoggerFactory.getLogger(ExternalSubnetVpnInstanceListener.class);
     private final DataBroker dataBroker;
     private final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer;
@@ -40,26 +40,28 @@ public class ExternalSubnetVpnInstanceListener extends AsyncDataTreeChangeListen
     public ExternalSubnetVpnInstanceListener(final DataBroker dataBroker,
                      final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer,
                      final IElanService elanService, final IVpnManager vpnManager) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(VpnInstanceToVpnId.class)
+                .child(VpnInstance.class),
+                Executors.newListeningSingleThreadExecutor("ExternalSubnetVpnInstanceListener", LOG));
         this.dataBroker = dataBroker;
         this.snatDefaultRouteProgrammer = snatDefaultRouteProgrammer;
         this.elanService = elanService;
         this.vpnManager = vpnManager;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VpnInstance> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInstanceToVpnId.class).child(VpnInstance.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
+    public void remove(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
         LOG.trace("remove : External Subnet VPN Instance remove mapping method - key:{}. value={}",
                 vpnInstance.key(), vpnInstance);
         String possibleExtSubnetUuid = vpnInstance.getVpnInstanceName();
@@ -72,14 +74,14 @@ public class ExternalSubnetVpnInstanceListener extends AsyncDataTreeChangeListen
     }
 
     @Override
-    protected void update(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstanceOrig,
+    public void update(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstanceOrig,
             VpnInstance vpnInstanceNew) {
         LOG.trace("update : External Subnet VPN Instance update mapping method - key:{} original:{} new:{}",
                 vpnInstanceNew.key(), vpnInstanceOrig, vpnInstanceNew);
     }
 
     @Override
-    protected void add(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
+    public void add(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
         LOG.trace("add : External Subnet VPN Instance OP Data Entry add mapping method - key:{}. value={}",
                 vpnInstance.key(), vpnInstance);
         String possibleExtSubnetUuid = vpnInstance.getVpnInstanceName();
@@ -124,9 +126,4 @@ public class ExternalSubnetVpnInstanceListener extends AsyncDataTreeChangeListen
         snatDefaultRouteProgrammer.addOrDelDefaultFibRouteToSNATForSubnet(subnet,
                 subnet.getExternalNetworkId().getValue(), flowAction, vpnInstance.getVpnId());
     }
-
-    @Override
-    protected ExternalSubnetVpnInstanceListener getDataTreeChangeListener() {
-        return ExternalSubnetVpnInstanceListener.this;
-    }
 }
index 7d4526355def1eb0d37c84ee571dca5ec88a3224..c4fd80a00adcaf0f13f37d33fe6f9cc515eac14a 100644 (file)
@@ -8,12 +8,12 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
index 16e337d7fd0269c966b17af4d6e2329a9e6d2cbd..443126f769b8f50ed94ffc1ee7e732f2379f1653 100644 (file)
@@ -9,21 +9,18 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -51,9 +48,13 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Source;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.api.CentralizedSwitchScheduler;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
@@ -77,7 +78,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<InternalToExternalPortMap, FloatingIPListener> {
+public class FloatingIPListener extends AbstractAsyncDataTreeChangeListener<InternalToExternalPortMap> {
     private static final Logger LOG = LoggerFactory.getLogger(FloatingIPListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -97,7 +98,9 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
                               final JobCoordinator coordinator,
                               final CentralizedSwitchScheduler centralizedSwitchScheduler,
                               final NatSwitchCache natSwitchCache) {
-        super(InternalToExternalPortMap.class, FloatingIPListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(FloatingIpInfo.class)
+                .child(RouterPorts.class).child(Ports.class).child(InternalToExternalPortMap.class),
+                Executors.newListeningSingleThreadExecutor("FloatingIPListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
@@ -109,39 +112,32 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
         this.natSwitchCache = natSwitchCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<InternalToExternalPortMap> getWildCardPath() {
-        return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class).child(Ports.class)
-                .child(InternalToExternalPortMap.class);
     }
 
     @Override
-    protected FloatingIPListener getDataTreeChangeListener() {
-        return FloatingIPListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(final InstanceIdentifier<InternalToExternalPortMap> identifier,
+    public void add(final InstanceIdentifier<InternalToExternalPortMap> identifier,
                        final InternalToExternalPortMap mapping) {
         LOG.trace("FloatingIPListener add ip mapping method - key: {} value: {}",mapping.key(), mapping);
         processFloatingIPAdd(identifier, mapping);
     }
 
     @Override
-    protected void remove(InstanceIdentifier<InternalToExternalPortMap> identifier, InternalToExternalPortMap mapping) {
+    public void remove(InstanceIdentifier<InternalToExternalPortMap> identifier, InternalToExternalPortMap mapping) {
         LOG.trace("FloatingIPListener remove ip mapping method - kkey: {} value: {}",mapping.key(), mapping);
         processFloatingIPDel(identifier, mapping);
     }
 
     @Override
-    protected void update(InstanceIdentifier<InternalToExternalPortMap> identifier, InternalToExternalPortMap
+    public void update(InstanceIdentifier<InternalToExternalPortMap> identifier, InternalToExternalPortMap
             original, InternalToExternalPortMap update) {
         LOG.trace("FloatingIPListener update ip mapping method - key: {}, original: {}, update: {}",
                 update.key(), original, update);
@@ -788,7 +784,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
         InstanceIdentifier<InternalToExternalPortMap> intExtPortMapIdentifier =
             NatUtil.getIntExtPortMapIdentifier(routerId, interfaceName, internalIp);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.OPERATIONAL, intExtPortMapIdentifier).toJavaUtil().map(
+                LogicalDatastoreType.OPERATIONAL, intExtPortMapIdentifier).map(
                 InternalToExternalPortMap::getLabel).orElse(NatConstants.INVALID_ID);
     }
 
index b177cd920404a9cfc96be668bbac8decc5644f0e..1366dbcfd9690dd868b7c18733c13820c7fba9f2 100644 (file)
@@ -16,7 +16,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -41,6 +40,7 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
index 22945dd33666228189927f2b9dc731637aa161de..b812f0adaa348db037787b9e11cc955b0445205f 100644 (file)
@@ -13,11 +13,8 @@ import static org.opendaylight.netvirt.natservice.internal.AbstractSnatService.L
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
@@ -40,6 +37,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv6Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchIpv6Source;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
index 24ad45bc6650bb399af1b2dcc1691173abae1b7c..0fa5117f970a9ba126910266e4cbd27b4dd2bb52 100644 (file)
@@ -7,20 +7,22 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.cloudscaler.api.TombstonedNodeManager;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.napt.switches.RouterToNaptSwitch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.napt.switches.RouterToNaptSwitchBuilder;
@@ -97,8 +99,13 @@ public class NAPTSwitchSelector {
     }
 
     private Map<Uint64, Integer> constructNAPTSwitches() {
-        Optional<NaptSwitches> optNaptSwitches =
-            MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getNaptSwitchesIdentifier());
+        Optional<NaptSwitches> optNaptSwitches = Optional.empty();
+        try {
+            optNaptSwitches = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, getNaptSwitchesIdentifier());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("constructNAPTSwitches: Exception while reading the NaptSwitches DS", e);
+        }
         Map<Uint64, Integer> switchWeights = new HashMap<>();
 
         if (optNaptSwitches.isPresent()) {
index 9630fb6cf1d88375f1cbfa32ee8bfe7d70b27d36..127ffd79bf6802185f33f96837f721714904e4fd 100644 (file)
@@ -25,7 +25,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.common.util.Arguments;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -66,6 +65,7 @@ import org.opendaylight.genius.mdsalutil.packet.IPv4;
 import org.opendaylight.genius.mdsalutil.packet.TCP;
 import org.opendaylight.genius.mdsalutil.packet.UDP;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.openflowplugin.libraries.liblldp.PacketException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
index 07605ca385c28f7c16e0332d85220ba17deadf61..b90d8e70033f6acc8c7dfd966b012434377aac37 100644 (file)
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.locks.ReentrantLock;
@@ -27,11 +27,11 @@ import org.apache.commons.net.util.SubnetUtils;
 import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolOutput;
@@ -184,8 +184,14 @@ public class NaptManager {
         InstanceIdentifier<ExternalIpCounter> id = InstanceIdentifier.builder(ExternalIpsCounter.class)
             .child(ExternalCounters.class, new ExternalCountersKey(segmentId))
             .child(ExternalIpCounter.class, new ExternalIpCounterKey(externalIp)).build();
-        Optional<ExternalIpCounter> externalIpCounter =
-            MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<ExternalIpCounter> externalIpCounter = Optional.empty();
+        try {
+            externalIpCounter = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("updateCounter: Exception while reading ExternalIpCounter DS for the segmentId {} externalIp {} ",
+                    segmentId, externalIp, e);
+        }
         if (externalIpCounter.isPresent()) {
             counter = externalIpCounter.get().getCounter().toJava();
             if (isAdd) {
@@ -435,7 +441,7 @@ public class NaptManager {
     public static List<IpMap> getIpMapList(DataBroker broker, Uint32 routerId) {
         InstanceIdentifier<IpMapping> id = getIpMapList(routerId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.OPERATIONAL, id).toJavaUtil().map(IpMapping::getIpMap).orElse(
+                LogicalDatastoreType.OPERATIONAL, id).map(IpMapping::getIpMap).orElse(
                 Collections.emptyList());
     }
 
@@ -466,8 +472,14 @@ public class NaptManager {
                 .child(IntextIpProtocolType.class, new IntextIpProtocolTypeKey(protocolType))
                 .child(IpPortMap.class, new IpPortMapKey(internalIpPort));
         InstanceIdentifier<IpPortMap> id = idBuilder.build();
-        Optional<IpPortMap> ipPortMapType =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<IpPortMap> ipPortMapType = Optional.empty();
+        try {
+            ipPortMapType = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("checkIpPortMap: Exception while reading IpMap DS for the segmentId {} "
+                    + "internalIpPort {} protocol {}", segmentId, internalIpPort, protocol, e);
+        }
         if (ipPortMapType.isPresent()) {
             LOG.debug("checkIpPortMap : {}", ipPortMapType.get());
             SessionAddress externalIpPort = new SessionAddress(ipPortMapType.get().getIpPortExternal().getIpAddress(),
@@ -490,7 +502,14 @@ public class NaptManager {
         InstanceIdentifierBuilder<IpMapping> idBuilder =
             InstanceIdentifier.builder(IntextIpMap.class).child(IpMapping.class, new IpMappingKey(segmentId));
         InstanceIdentifier<IpMapping> id = idBuilder.build();
-        Optional<IpMapping> ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<IpMapping> ipMapping = Optional.empty();
+        try {
+            ipMapping = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("checkIpMap: Exception while reading IpMapping DS for the segmentId {} internalIp {}",
+                    segmentId, internalIp, e);
+        }
         if (ipMapping.isPresent()) {
             for (IpMap ipMap : ipMapping.get().nonnullIpMap()) {
                 if (Objects.equals(ipMap.getInternalIp(), internalIp)) {
@@ -580,7 +599,14 @@ public class NaptManager {
         InstanceIdentifier<IpMap> id = idBuilder.build();
         // Get externalIp and decrement the counter
         String externalIp = null;
-        Optional<IpMap> ipMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<IpMap> ipMap = Optional.empty();
+        try {
+            ipMap = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeFromIpMapDS: Exception while reading IpMap DS for the segmentId {} "
+                    + "internalIp {}", segmentId, internalIp, e);
+        }
         if (ipMap.isPresent()) {
             externalIp = ipMap.get().getExternalIp();
             LOG.debug("removeFromIpMapDS : externalIP is {}", externalIp);
@@ -615,7 +641,15 @@ public class NaptManager {
             .child(IpMap.class, new IpMapKey(internalIp));
         InstanceIdentifier<IpMap> id = idBuilder.build();
 
-        Optional<IpMap> ipMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<IpMap> ipMap;
+        try {
+            ipMap = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getExternalIpAllocatedForSubnet: Exception while reading IpMap DS for the segmentId {} "
+                            + "internalIp {}", segmentId, internalIp, e);
+            return null;
+        }
         if (ipMap.isPresent()) {
             return ipMap.get().getExternalIp();
         }
@@ -627,7 +661,14 @@ public class NaptManager {
             .child(IpMapping.class, new IpMappingKey(segmentId));
         InstanceIdentifier<IpMapping> id = idBuilder.build();
         // Get all externalIps and decrement their counters before deleting the ipmap
-        Optional<IpMapping> ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<IpMapping> ipMapping = Optional.empty();
+        try {
+            ipMapping = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeIpMappingForRouterID: Exception while reading IpMapping DS for the segmentId {} ",
+                    segmentId, e);
+        }
         if (ipMapping.isPresent()) {
             for (IpMap ipMap : ipMapping.get().nonnullIpMap()) {
                 String externalIp = ipMap.getExternalIp();
@@ -645,8 +686,14 @@ public class NaptManager {
     void removeIpPortMappingForRouterID(Uint32 segmentId) {
         InstanceIdentifier<IpPortMapping> idBuilder = InstanceIdentifier.builder(IntextIpPortMap.class)
             .child(IpPortMapping.class, new IpPortMappingKey(segmentId)).build();
-        Optional<IpPortMapping> ipPortMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                idBuilder);
+        Optional<IpPortMapping> ipPortMapping = Optional.empty();
+        try {
+            ipPortMapping = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, idBuilder);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeIpPortMappingForRouterID: Exception while reading IpPortMapping DS for the segmentId {} ",
+                    segmentId, e);
+        }
         if (ipPortMapping.isPresent()) {
             // remove from IntExtIpPortmap DS
             LOG.debug("removeIpPortMappingForRouterID : Removing IntExtIpPort map for router {} from datastore",
@@ -658,7 +705,14 @@ public class NaptManager {
     void removeIntIpPortMappingForRouterID(Uint32 segmentId) {
         InstanceIdentifier<IntipPortMap> intIp = InstanceIdentifier.builder(SnatintIpPortMap.class)
             .child(IntipPortMap.class, new IntipPortMapKey(segmentId)).build();
-        Optional<IntipPortMap> intIpPortMap = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, intIp);
+        Optional<IntipPortMap> intIpPortMap = Optional.empty();
+        try {
+            intIpPortMap = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, intIp);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeIntIpPortMappingForRouterID: Exception while reading IntipPortMap DS for the "
+                            + "segmentId {} ", segmentId, e);
+        }
         if (intIpPortMap.isPresent()) {
             // remove from SnatIntIpPortmap DS
             LOG.debug("removeIntIpPortMappingForRouterID : Removing SnatIntIpPort from datastore : {}", intIp);
index 9b07e4f99c3d469f76d762748bfca46e5cbf368a..0227b9746f1d53d00afefb048a2455d3dfb6afb6 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -15,6 +14,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -22,8 +22,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
@@ -44,6 +42,8 @@ import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
@@ -1053,7 +1053,14 @@ public class NaptSwitchHA {
             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
                 .child(VrfEntry.class, new VrfEntryKey(prefix));
         InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
-        Optional<VrfEntry> ent = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        Optional<VrfEntry> ent;
+        try {
+            ent = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeFibEntry: Exception while reading the VrfEntry for the prefix {} rd {}", prefix, rd, e);
+            return;
+        }
         if (ent.isPresent()) {
             LOG.debug("removeFibEntry : Removing Fib entry rd {} prefix {}", rd, prefix);
             fibManager.removeFibEntry(rd, prefix, null, null);
index a622baea1ae8946107ea5f8e3b8cfb0f740e30c3..0f127a7d2432ff3e9ff26096bc0c5c8c8e266230 100644 (file)
@@ -11,8 +11,8 @@ 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;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.ArpRequestReceived;
@@ -102,7 +102,7 @@ public class NatArpNotificationHandler implements OdlArputilListener {
             notification.getDpnId(), targetIfc.getName());
         VipState cachedState = null;
         try {
-            cachedState = this.vipStateTracker.get(newVipState.getIp()).orNull();
+            cachedState = this.vipStateTracker.get(newVipState.getIp()).orElse(null);
         } catch (ReadFailedException e) {
             LOG.warn("NatArpNotificationHandler failed to read vip state {}", notification, e);
         }
index cbc8146a9dd14dd47d0c39adc7bec85ff10d3aac..0a1d53f0355de406f4285d190bc6e02b0aa68946 100644 (file)
@@ -12,8 +12,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
@@ -27,6 +25,8 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetDestination;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetSource;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -103,7 +103,7 @@ public final class NatEvpnUtil {
     private static VpnInstanceOpDataEntry getVpnInstanceOpData(DataBroker broker, String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = NatUtil.getVpnInstanceOpDataIdentifier(rd);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.OPERATIONAL, id).orNull();
+                LogicalDatastoreType.OPERATIONAL, id).orElse(null);
     }
 
     private static boolean isL3VpnOverVxLan(Uint32 l3Vni) {
@@ -220,7 +220,7 @@ public final class NatEvpnUtil {
         InstanceIdentifier<FloatingIpIdToPortMapping> id =
                 NatUtil.buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 FloatingIpIdToPortMapping::getFloatingIpPortId).orElse(null);
     }
 }
index ceb53d3601e8e4713ed1724f88e78d3a9172d9f9..9835ce66426ed4bd6dfe51d2f85ef75c6993695e 100644 (file)
@@ -7,14 +7,15 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -29,7 +30,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class NatInterfaceStateChangeListener
-    extends AsyncDataTreeChangeListenerBase<Interface, NatInterfaceStateChangeListener> {
+    extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NatInterfaceStateChangeListener.class);
     private final DataBroker dataBroker;
@@ -38,32 +39,28 @@ public class NatInterfaceStateChangeListener
     @Inject
     public NatInterfaceStateChangeListener(final DataBroker dataBroker,
                                            final NatSouthboundEventHandlers southboundEventHandlers) {
-        super(Interface.class, NatInterfaceStateChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("NatInterfaceStateChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.southboundEventHandlers = southboundEventHandlers;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
     }
 
     @Override
-    protected NatInterfaceStateChangeListener getDataTreeChangeListener() {
-        return NatInterfaceStateChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("add : Interface {} up event received", intrf);
         if (!L2vlan.class.equals(intrf.getType())) {
             LOG.debug("add : Interface {} is not Vlan Interface.Ignoring", intrf.getName());
@@ -95,7 +92,7 @@ public class NatInterfaceStateChangeListener
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("remove : Interface {} removed event received", intrf);
         if (!L2vlan.class.equals(intrf.getType())) {
             LOG.debug("remove : Interface {} is not Vlan Interface.Ignoring", intrf.getName());
@@ -143,7 +140,7 @@ public class NatInterfaceStateChangeListener
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
+    public void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
         LOG.trace("update : Operation Interface update event - Old: {}, New: {}", original, update);
         if (!L2vlan.class.equals(update.getType())) {
             LOG.debug("update : Interface {} is not Vlan Interface.Ignoring", update.getName());
index 5a72127f1b595e1fa50113469e49b8e017d464d8..a009d12ad68ec305a68a905805f3acbc3d697de3 100644 (file)
@@ -11,17 +11,18 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces.RouterInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces.RouterInterfaceBuilder;
@@ -36,8 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NatRouterInterfaceListener
-    extends AsyncDataTreeChangeListenerBase<Interfaces, NatRouterInterfaceListener> {
+public class NatRouterInterfaceListener extends AbstractAsyncDataTreeChangeListener<Interfaces> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NatRouterInterfaceListener.class);
     private final DataBroker dataBroker;
@@ -51,7 +51,9 @@ public class NatRouterInterfaceListener
     public NatRouterInterfaceListener(final DataBroker dataBroker, final OdlInterfaceRpcService interfaceManager,
         final IMdsalApiManager mdsalManager,final NaptManager naptManager,
         final NeutronvpnService neutronvpnService) {
-        super(Interfaces.class, NatRouterInterfaceListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(RouterInterfacesMap.class)
+                .child(RouterInterfaces.class).child(Interfaces.class),
+                Executors.newListeningSingleThreadExecutor("NatRouterInterfaceListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.interfaceManager = interfaceManager;
@@ -60,28 +62,21 @@ public class NatRouterInterfaceListener
         this.neutronVpnService = neutronvpnService;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected NatRouterInterfaceListener getDataTreeChangeListener() {
-        return NatRouterInterfaceListener.this;
     }
 
     @Override
-    protected InstanceIdentifier<Interfaces> getWildCardPath() {
-        return InstanceIdentifier.create(RouterInterfacesMap.class)
-            .child(RouterInterfaces.class).child(Interfaces.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
+    public void add(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
         LOG.trace("add : Add event - key: {}, value: {}", interfaceInfo.key(), interfaceInfo);
         final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();
         final String interfaceName = interfaceInfo.getInterfaceId();
@@ -124,7 +119,7 @@ public class NatRouterInterfaceListener
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
+    public void remove(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
         LOG.trace("remove : Remove event - key: {}, value: {}", interfaceInfo.key(), interfaceInfo);
         final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();
         final String interfaceName = interfaceInfo.getInterfaceId();
@@ -167,7 +162,7 @@ public class NatRouterInterfaceListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interfaces> identifier, Interfaces original, Interfaces update) {
+    public void update(InstanceIdentifier<Interfaces> identifier, Interfaces original, Interfaces update) {
         LOG.trace("update key: {}, original: {}, update: {}", update.key(), original, update);
     }
 
index f6202bf3e004c206c07779e0ce3e902c33a17a0d..d8d8ad4dbff7eaca0e1b137e93325129406ea0a0 100644 (file)
@@ -9,23 +9,20 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
-
 import java.util.ArrayList;
 import java.util.List;
-
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.cloudscaler.api.TombstonedNodeManager;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
index 8fb44aaea3e0ebb6d562248c3b9ae27dc3d4837b..478dd32c2ba37eb634591569d2ef5e8e11772e2a 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.natservice.internal;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
 import com.google.common.util.concurrent.FluentFuture;
@@ -20,6 +19,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
@@ -27,9 +27,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -37,6 +34,9 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces.RouterInterface;
@@ -194,7 +194,7 @@ public class NatSouthboundEventHandlers {
         return transitionState;
     }
 
-    private class NatInterfaceStateAddWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatInterfaceStateAddWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final String interfaceName;
         private final String routerName;
         private final Uint64 intfDpnId;
@@ -225,7 +225,7 @@ public class NatSouthboundEventHandlers {
         }
     }
 
-    private class NatInterfaceStateRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatInterfaceStateRemoveWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final String interfaceName;
         private final String routerName;
         private final Uint64 intfDpnId;
@@ -255,7 +255,7 @@ public class NatSouthboundEventHandlers {
         }
     }
 
-    private class NatInterfaceStateUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatInterfaceStateUpdateWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final Interface original;
         private final Interface update;
         private final Uint64 intfDpnId;
@@ -373,7 +373,7 @@ public class NatSouthboundEventHandlers {
         }
     }
 
-    private class NatFlowAddWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatFlowAddWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final String interfaceName;
         private final String routerName;
         private final Uint64 dpnId;
@@ -402,7 +402,7 @@ public class NatSouthboundEventHandlers {
         }
     }
 
-    private class NatFlowUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatFlowUpdateWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final Interface original;
         private final Interface update;
         private final String routerName;
@@ -441,7 +441,7 @@ public class NatSouthboundEventHandlers {
         }
     }
 
-    private class NatFlowRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class NatFlowRemoveWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final String interfaceName;
         private final String routerName;
         private final Uint64 intfDpnId;
index a7b85c2843c1de4394cff6b639a9d9b17c19bbc5..638a43b9b49ced28b0ea928c19a09ca35d979c18 100644 (file)
@@ -9,9 +9,8 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCacheListener;
 import org.opendaylight.netvirt.natservice.api.SwitchInfo;
index 317ea36df1e47012f3b51827f05e3dc71abb3887..35d2a5ba7c7941ec7218a261ae3a8ca3e1be9670 100644 (file)
@@ -9,33 +9,31 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
@@ -63,8 +61,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NatTepChangeListener extends
-    AsyncDataTreeChangeListenerBase<TunnelEndPoints, NatTepChangeListener> {
+public class NatTepChangeListener extends AbstractAsyncDataTreeChangeListener<TunnelEndPoints> {
 
     private static final Logger LOG = LoggerFactory
         .getLogger(NatTepChangeListener.class);
@@ -98,7 +95,9 @@ public class NatTepChangeListener extends
         final SnatServiceManager natServiceManager,
         final JobCoordinator coordinator,
         final NatOverVxlanUtil natOverVxlanUtil) {
-        super(TunnelEndPoints.class, NatTepChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(DpnEndpoints.class)
+                .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build(),
+                Executors.newListeningSingleThreadExecutor("NatTepChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.defaultRouteProgrammer = defaultRouteProgrammer;
@@ -120,21 +119,19 @@ public class NatTepChangeListener extends
         }
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<TunnelEndPoints> getWildCardPath() {
-        return InstanceIdentifier.builder(DpnEndpoints.class)
-            .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<TunnelEndPoints> key,
+    public void remove(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints tep) {
         /*
          * Whenever the TEP on a given DPNID is removed, this API take care
@@ -153,14 +150,14 @@ public class NatTepChangeListener extends
     }
 
     @Override
-    protected void update(InstanceIdentifier<TunnelEndPoints> key,
+    public void update(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints origTep, TunnelEndPoints updatedTep) {
         // Will be handled in NatTunnelInterfaceStateListener.add()
         LOG.debug("NO ACTION duing update event : {}", updatedTep.key());
     }
 
     @Override
-    protected void add(InstanceIdentifier<TunnelEndPoints> key,
+    public void add(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints tep) {
         LOG.debug("NO ACTION duing add event : {}", tep.key());
     }
@@ -238,8 +235,15 @@ public class NatTepChangeListener extends
             + "associated to the router {}", routerName);
 
         InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerName);
-        Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType
-            .CONFIGURATION, routerPortsId);
+        Optional<RouterPorts> optRouterPorts;
+        try {
+            optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, routerPortsId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("hndlTepDelForDnatInEachRtr: Exception while reading RouterPorts DS for the router {}",
+                    routerName, e);
+            return isFipExists;
+        }
         if (!optRouterPorts.isPresent()) {
             LOG.debug(
                 "hndlTepDelForDnatInEachRtr : DNAT -> Could not read Router Ports data object with id: {} "
@@ -366,7 +370,7 @@ public class NatTepChangeListener extends
 
         // Check if this is externalRouter else ignore
         InstanceIdentifier<Routers> extRoutersId = NatUtil.buildRouterIdentifier(routerName);
-        Optional<Routers> routerData = Optional.absent();
+        Optional<Routers> routerData = Optional.empty();
         try {
             routerData = confTx.read(extRoutersId).get();
         } catch (InterruptedException | ExecutionException e) {
@@ -458,9 +462,4 @@ public class NatTepChangeListener extends
             }
         }
     }
-
-    @Override
-    protected NatTepChangeListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index ee8daa1119e8d5ca0a4039fc3a41868f22de2141..e4fa49ffebbc6201c993cbc8d4bd0522768eab27 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -19,14 +18,12 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -36,17 +33,20 @@ import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.BucketInfo;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionWriteMetadata;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
@@ -82,8 +82,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NatTunnelInterfaceStateListener
-    extends AsyncDataTreeChangeListenerBase<StateTunnelList, NatTunnelInterfaceStateListener> {
+public class NatTunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener<StateTunnelList> {
 
     private static final Logger LOG = LoggerFactory.getLogger(NatTunnelInterfaceStateListener.class);
     private final DataBroker dataBroker;
@@ -147,7 +146,9 @@ public class NatTunnelInterfaceStateListener
                                            final IElanService elanManager,
                                            final IInterfaceManager interfaceManager,
                                            final NatOverVxlanUtil natOverVxlanUtils) {
-        super(StateTunnelList.class, NatTunnelInterfaceStateListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(TunnelsState.class)
+                .child(StateTunnelList.class),
+                Executors.newListeningSingleThreadExecutor("NatTunnelInterfaceStateListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.bgpManager = bgpManager;
@@ -171,37 +172,31 @@ public class NatTunnelInterfaceStateListener
         }
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<StateTunnelList> getWildCardPath() {
-        return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
     }
 
     @Override
-    protected NatTunnelInterfaceStateListener getDataTreeChangeListener() {
-        return NatTunnelInterfaceStateListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<StateTunnelList> instanceIdentifier, StateTunnelList add) {
+    public void add(InstanceIdentifier<StateTunnelList> instanceIdentifier, StateTunnelList add) {
         LOG.trace("add : TEP addtion---- {}", add);
         hndlTepEvntsForDpn(add, TunnelAction.TUNNEL_EP_ADD);
     }
 
     @Override
-    protected void remove(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList del) {
+    public void remove(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList del) {
         LOG.trace("remove : TEP deletion---- {}", del);
         // Moved the remove implementation logic to NatTepChangeLister.remove()
     }
 
     @Override
-    protected void update(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList original,
+    public void update(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList original,
                           StateTunnelList update) {
         LOG.trace("update : Tunnel updation---- {}", update);
         //UPDATE IS A SEQUENCE OF DELETE AND ADD EVENTS . DELETE MIGHT HAVE CHANGED THE PRIMARY AND ADVERTISED. SO
@@ -346,7 +341,7 @@ public class NatTunnelInterfaceStateListener
             routerData = writeFlowInvTx.read(extRoutersId).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading router data for {}", extRoutersId, e);
-            routerData = Optional.absent();
+            routerData = Optional.empty();
         }
         if (!routerData.isPresent()) {
             LOG.warn("hndlTepAddForSnatInEachRtr : SNAT->Ignoring TEP add for router {} since its not External Router",
@@ -648,8 +643,15 @@ public class NatTunnelInterfaceStateListener
         final String routerName = router.getRouter();
 
         InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerName);
-        Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType
-            .CONFIGURATION, routerPortsId);
+        Optional<RouterPorts> optRouterPorts;
+        try {
+            optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, routerPortsId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("hndlTepAddForDnatInEachRtr: Exception while reading RouterPorts DS for the router {}",
+                    routerName, e);
+            return;
+        }
         if (!optRouterPorts.isPresent()) {
             LOG.debug("hndlTepAddForDnatInEachRtr : DNAT -> Could not read Router Ports data object with id: {} "
                     + "from DNAT FloatinIpInfo", routerName);
index 5d99bb22fd75ff459732619e6a0640a579f1be89..2a50c7fa437206d0f3a4cef4d3b5ed9302e0a9dd 100644 (file)
@@ -8,10 +8,9 @@
 package org.opendaylight.netvirt.natservice.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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -28,6 +27,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -36,11 +36,8 @@ import java.util.stream.Collectors;
 import org.apache.commons.net.util.SubnetUtils;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.sal.common.util.Arguments;
+import org.opendaylight.genius.datastoreutils.ExpectedDataObjectNotFoundException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -73,6 +70,9 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -339,7 +339,7 @@ public final class NatUtil {
         }
 
         try {
-            return confTx.read(getVpnInstanceToVpnIdIdentifier(vpnName)).get().toJavaUtil().map(
+            return confTx.read(getVpnInstanceToVpnIdIdentifier(vpnName)).get().map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
                     .VpnInstance::getVpnId).orElse(NatConstants.INVALID_ID);
         } catch (InterruptedException | ExecutionException e) {
@@ -377,9 +377,9 @@ public final class NatUtil {
         try {
             routerInterfacesData = SingleTransactionDataBroker.syncReadOptional(broker,
                 LogicalDatastoreType.CONFIGURATION, vmInterfaceIdentifier);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Read Failed Exception While read RouterInterface data for router {}", routerName, e);
-            routerInterfacesData = Optional.absent();
+            routerInterfacesData = Optional.empty();
         }
         if (routerInterfacesData.isPresent()) {
             return Boolean.TRUE;
@@ -449,7 +449,7 @@ public final class NatUtil {
         InstanceIdentifier<VpnIds> id = InstanceIdentifier.builder(VpnIdToVpnInstance.class)
             .child(VpnIds.class, new VpnIdsKey(vpnId)).build();
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(VpnIds::getVpnInstanceName).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, id).map(VpnIds::getVpnInstanceName).orElse(null);
     }
 
     /*
@@ -493,7 +493,7 @@ public final class NatUtil {
         }
         InstanceIdentifier<Routers> id = buildRouterIdentifier(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Routers::getNetworkId).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, id).map(Routers::getNetworkId).orElse(null);
     }
 
     static InstanceIdentifier<Routers> buildRouterIdentifier(String routerId) {
@@ -518,20 +518,20 @@ public final class NatUtil {
     static boolean isSnatEnabledForRouterId(DataBroker broker, String routerId) {
         InstanceIdentifier<Routers> id = buildRouterIdentifier(routerId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Routers::isEnableSnat).orElse(false);
+                LogicalDatastoreType.CONFIGURATION, id).map(Routers::isEnableSnat).orElse(false);
     }
 
     @Nullable
     public static Uuid getVpnIdfromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Networks::getVpnid).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, id).map(Networks::getVpnid).orElse(null);
     }
 
     @Nullable
     public static Uuid getVpnIdfromNetworkId(TypedReadTransaction<Configuration> tx, Uuid networkId) {
         try {
-            return tx.read(buildNetworkIdentifier(networkId)).get().toJavaUtil().map(Networks::getVpnid).orElse(null);
+            return tx.read(buildNetworkIdentifier(networkId)).get().map(Networks::getVpnid).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading network VPN id for {}", networkId, e);
             return null;
@@ -542,14 +542,14 @@ public final class NatUtil {
     public static ProviderTypes getProviderTypefromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Networks::getProviderNetworkType).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, id).map(Networks::getProviderNetworkType).orElse(null);
     }
 
     @Nullable
     public static ProviderTypes getProviderTypefromNetworkId(TypedReadTransaction<Configuration> tx, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         try {
-            return tx.read(id).get().toJavaUtil().map(Networks::getProviderNetworkType).orElse(null);
+            return tx.read(id).get().map(Networks::getProviderNetworkType).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error retrieving provider type for {}", networkId, e);
             return null;
@@ -596,7 +596,7 @@ public final class NatUtil {
         }
         InstanceIdentifier<RouterToNaptSwitch> id = buildNaptSwitchIdentifier(routerName);
         return (SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(RouterToNaptSwitch::getPrimarySwitchId).orElse(
+                LogicalDatastoreType.CONFIGURATION, id).map(RouterToNaptSwitch::getPrimarySwitchId).orElse(
                 Uint64.valueOf(0L)));
     }
 
@@ -660,7 +660,7 @@ public final class NatUtil {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
             .instance.to.vpn.id.VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
                         .VpnInstance::getVrfId).orElse(null);
     }
@@ -668,7 +668,7 @@ public final class NatUtil {
     @Nullable
     public static String getVpnRd(TypedReadTransaction<Configuration> tx, String vpnName) {
         try {
-            return tx.read(getVpnInstanceToVpnIdIdentifier(vpnName)).get().toJavaUtil().map(
+            return tx.read(getVpnInstanceToVpnIdIdentifier(vpnName)).get().map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
                     .VpnInstance::getVrfId).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
@@ -684,7 +684,7 @@ public final class NatUtil {
         InstanceIdentifier<IpPortMap> ipPortMapId =
             buildIpToPortMapIdentifier(routerId, internalIpAddress, internalPort, protocolType);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, ipPortMapId).toJavaUtil().map(IpPortMap::getIpPortExternal).orElse(
+                LogicalDatastoreType.CONFIGURATION, ipPortMapId).map(IpPortMap::getIpPortExternal).orElse(
                 null);
     }
 
@@ -795,7 +795,7 @@ public final class NatUtil {
     static Uint32 getAssociatedVpn(DataBroker broker, String routerName) {
         InstanceIdentifier<Routermapping> routerMappingId = NatUtil.getRouterVpnMappingId(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.OPERATIONAL, routerMappingId).toJavaUtil().map(Routermapping::getVpnId).orElse(
+                LogicalDatastoreType.OPERATIONAL, routerMappingId).map(Routermapping::getVpnId).orElse(
                 NatConstants.INVALID_ID);
     }
 
@@ -914,7 +914,7 @@ public final class NatUtil {
         List<Uint16> portList = SingleTransactionDataBroker
                 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                 LogicalDatastoreType.CONFIGURATION,
-                        buildSnatIntIpPortIdentifier(routerId, internalIpAddress, protocolType)).toJavaUtil().map(
+                        buildSnatIntIpPortIdentifier(routerId, internalIpAddress, protocolType)).map(
                 IntIpProtoType::getPorts).orElse(emptyList());
 
         if (!portList.isEmpty()) {
@@ -948,7 +948,7 @@ public final class NatUtil {
                                                           String internalIpAddress) {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                 LogicalDatastoreType.CONFIGURATION,
-                buildSnatIntIpPortIdentifier(routerId, internalIpAddress)).orNull();
+                buildSnatIntIpPortIdentifier(routerId, internalIpAddress)).orElse(null);
     }
 
     public static ProtocolTypes getProtocolType(NAPTEntryEvent.Protocol protocol) {
@@ -1021,7 +1021,7 @@ public final class NatUtil {
     @Nullable
     public static IpPortMapping getIportMapping(DataBroker broker, Uint32 routerId) {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, getIportMappingIdentifier(routerId)).orNull();
+                LogicalDatastoreType.CONFIGURATION, getIportMappingIdentifier(routerId)).orElse(null);
     }
 
     public static InstanceIdentifier<IpPortMapping> getIportMappingIdentifier(Uint32 routerId) {
@@ -1085,8 +1085,15 @@ public final class NatUtil {
         InstanceIdentifier<ExternalCounters> id =
             InstanceIdentifier.builder(ExternalIpsCounter.class)
                 .child(ExternalCounters.class, new ExternalCountersKey(segmentId)).build();
-        Optional<ExternalCounters> externalCountersData =
-            MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<ExternalCounters> externalCountersData;
+        try {
+            externalCountersData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getLeastLoadedExternalIp: Exception while reading ExternalCounters DS for the segmentId {}",
+                    segmentId, e);
+            return leastLoadedExternalIp;
+        }
         if (externalCountersData.isPresent()) {
             ExternalCounters externalCounter = externalCountersData.get();
             short countOfLstLoadExtIp = 32767;
@@ -1131,7 +1138,7 @@ public final class NatUtil {
             .child(Subnetmap.class, new SubnetmapKey(subnetId))
             .build();
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, subnetmapId).toJavaUtil().map(Subnetmap::getSubnetIp).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, subnetmapId).map(Subnetmap::getSubnetIp).orElse(null);
     }
 
     public static String[] getExternalIpAndPrefix(String leastLoadedExtIpAddr) {
@@ -1172,7 +1179,7 @@ public final class NatUtil {
     static org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces
             .@Nullable RouterInterface getConfiguredRouterInterface(DataBroker broker, String interfaceName) {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, NatUtil.getRouterInterfaceId(interfaceName)).orNull();
+                LogicalDatastoreType.CONFIGURATION, NatUtil.getRouterInterfaceId(interfaceName)).orElse(null);
     }
 
     static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
@@ -1291,7 +1298,7 @@ public final class NatUtil {
             optionalRouterDpnList = operTx.read(routerDpnListIdentifier).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading the router DPN list for {}", routerDpnListIdentifier, e);
-            optionalRouterDpnList = Optional.absent();
+            optionalRouterDpnList = Optional.empty();
         }
         if (optionalRouterDpnList.isPresent()) {
             List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns
@@ -1567,7 +1574,7 @@ public final class NatUtil {
         InstanceIdentifier<Subnetmap> subnetmapId = InstanceIdentifier.builder(Subnetmaps.class)
             .child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, subnetmapId).orNull();
+                LogicalDatastoreType.CONFIGURATION, subnetmapId).orElse(null);
     }
 
     @NonNull
@@ -1576,7 +1583,7 @@ public final class NatUtil {
             .child(NetworkMap.class, new NetworkMapKey(networkId)).build();
         List<Uuid> subnetIdList = SingleTransactionDataBroker
                 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                        LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(NetworkMap::getSubnetIdList).orElse(
+                        LogicalDatastoreType.CONFIGURATION, id).map(NetworkMap::getSubnetIdList).orElse(
                 emptyList());
         if (!subnetIdList.isEmpty()) {
             subnetIdList = new ArrayList<>(subnetIdList);
@@ -1660,7 +1667,7 @@ public final class NatUtil {
     protected static String getFloatingIpPortMacFromFloatingIpId(DataBroker broker, Uuid floatingIpId) {
         InstanceIdentifier<FloatingIpIdToPortMapping> id = buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 FloatingIpIdToPortMapping::getFloatingIpPortMacAddress).orElse(null);
     }
 
@@ -1668,7 +1675,7 @@ public final class NatUtil {
     protected static String getFloatingIpPortMacFromFloatingIpId(TypedReadTransaction<Configuration> confTx,
         Uuid floatingIpId) {
         try {
-            return confTx.read(buildfloatingIpIdToPortMappingIdentifier(floatingIpId)).get().toJavaUtil().map(
+            return confTx.read(buildfloatingIpIdToPortMappingIdentifier(floatingIpId)).get().map(
                 FloatingIpIdToPortMapping::getFloatingIpPortMacAddress).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading the floating IP port MAC for {}", floatingIpId, e);
@@ -1680,7 +1687,7 @@ public final class NatUtil {
     protected static Uuid getFloatingIpPortSubnetIdFromFloatingIpId(DataBroker broker, Uuid floatingIpId) {
         InstanceIdentifier<FloatingIpIdToPortMapping> id = buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 FloatingIpIdToPortMapping::getFloatingIpPortSubnetId).orElse(null);
     }
 
@@ -1688,7 +1695,7 @@ public final class NatUtil {
     protected static Uuid getFloatingIpPortSubnetIdFromFloatingIpId(TypedReadTransaction<Configuration> confTx,
         Uuid floatingIpId) {
         try {
-            return confTx.read(buildfloatingIpIdToPortMappingIdentifier(floatingIpId)).get().toJavaUtil().map(
+            return confTx.read(buildfloatingIpIdToPortMappingIdentifier(floatingIpId)).get().map(
                 FloatingIpIdToPortMapping::getFloatingIpPortSubnetId).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading the floating IP port subnet for {}", floatingIpId, e);
@@ -1706,7 +1713,7 @@ public final class NatUtil {
         InstanceIdentifier<Interface> ifStateId =
             buildStateInterfaceId(interfaceName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.OPERATIONAL, ifStateId).orNull();
+                LogicalDatastoreType.OPERATIONAL, ifStateId).orElse(null);
     }
 
     static InstanceIdentifier<Interface> buildStateInterfaceId(String interfaceName) {
@@ -1723,13 +1730,13 @@ public final class NatUtil {
     public static Routers getRoutersFromConfigDS(DataBroker dataBroker, String routerName) {
         InstanceIdentifier<Routers> routerIdentifier = NatUtil.buildRouterIdentifier(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, routerIdentifier).orNull();
+                LogicalDatastoreType.CONFIGURATION, routerIdentifier).orElse(null);
     }
 
     @Nullable
     public static Routers getRoutersFromConfigDS(TypedReadTransaction<Configuration> confTx, String routerName) {
         try {
-            return confTx.read(NatUtil.buildRouterIdentifier(routerName)).get().orNull();
+            return confTx.read(NatUtil.buildRouterIdentifier(routerName)).get().orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error reading router {}", routerName, e);
             return null;
@@ -1793,13 +1800,13 @@ public final class NatUtil {
     static String getExtGwMacAddFromRouterName(DataBroker broker, String routerName) {
         InstanceIdentifier<Routers> id = buildRouterIdentifier(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Routers::getExtGwMacAddress).orElse(null);
+                LogicalDatastoreType.CONFIGURATION, id).map(Routers::getExtGwMacAddress).orElse(null);
     }
 
     @Nullable
     static String getExtGwMacAddFromRouterName(TypedReadTransaction<Configuration> tx, String routerName) {
         try {
-            return tx.read(buildRouterIdentifier(routerName)).get().toJavaUtil().map(
+            return tx.read(buildRouterIdentifier(routerName)).get().map(
                 Routers::getExtGwMacAddress).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error retrieving external gateway MAC address for router {}", routerName, e);
@@ -1818,7 +1825,7 @@ public final class NatUtil {
     public static String getNeutronRouterNamebyUuid(DataBroker broker, Uuid routerUuid) {
         InstanceIdentifier<Router> neutronRouterIdentifier = NatUtil.buildNeutronRouterIdentifier(routerUuid);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, neutronRouterIdentifier).toJavaUtil().map(Router::getName).orElse(
+                LogicalDatastoreType.CONFIGURATION, neutronRouterIdentifier).map(Router::getName).orElse(
                 null);
     }
 
@@ -1827,7 +1834,7 @@ public final class NatUtil {
         InstanceIdentifier<RouterPorts> routerPortsIdentifier = getRouterPortsId(routerUuid.getValue());
         List<Ports> portsList = SingleTransactionDataBroker
                 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, LogicalDatastoreType.CONFIGURATION,
-                routerPortsIdentifier).toJavaUtil().map(RouterPorts::getPorts).orElse(emptyList());
+                routerPortsIdentifier).map(RouterPorts::getPorts).orElse(emptyList());
         if (!portsList.isEmpty()) {
             portsList = new ArrayList<>(portsList);
         }
@@ -1897,7 +1904,7 @@ public final class NatUtil {
         .subnets.Subnets> getOptionalExternalSubnets(DataBroker dataBroker, Uuid subnetId) {
         if (subnetId == null) {
             LOG.warn("getOptionalExternalSubnets : subnetId is null");
-            return Optional.absent();
+            return Optional.empty();
         }
 
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice
@@ -1914,7 +1921,7 @@ public final class NatUtil {
         .subnets.Subnets> getOptionalExternalSubnets(TypedReadTransaction<Configuration> tx, Uuid subnetId) {
         if (subnetId == null) {
             LOG.warn("getOptionalExternalSubnets : subnetId is null");
-            return Optional.absent();
+            return Optional.empty();
         }
 
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice
@@ -1926,7 +1933,7 @@ public final class NatUtil {
             return tx.read(subnetsIdentifier).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error retrieving external subnets on {}", subnetId, e);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
@@ -1999,13 +2006,13 @@ public final class NatUtil {
     public static ElanInstance getElanInstanceByName(String elanInstanceName, DataBroker broker) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
-                LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orNull();
+                LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orElse(null);
     }
 
     @Nullable
     public static ElanInstance getElanInstanceByName(TypedReadTransaction<Configuration> tx, String elanInstanceName) {
         try {
-            return tx.read(getElanInstanceConfigurationDataPath(elanInstanceName)).get().orNull();
+            return tx.read(getElanInstanceConfigurationDataPath(elanInstanceName)).get().orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error retrieving ELAN instance by name {}", elanInstanceName, e);
             return null;
@@ -2066,7 +2073,15 @@ public final class NatUtil {
                                                     String vpnName, String externalIp,
                                                     Boolean isMoreThanOneFipCheckOnDpn) {
         InstanceIdentifier<VpnToDpnList> id = getVpnToDpnListIdentifier(rd, dpnId);
-        Optional<VpnToDpnList> dpnInVpn = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnToDpnList> dpnInVpn;
+        try {
+            dpnInVpn = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("isFloatingIpPresentForDpn: Exception while reading VpnToDpnList DS for the rd {} dpnId {}",
+                    rd, dpnId, e);
+            return false;
+        }
         if (dpnInVpn.isPresent()) {
             LOG.debug("isFloatingIpPresentForDpn : vpn-to-dpn-list is not empty for vpnName {}, dpn id {}, "
                     + "rd {} and floatingIp {}", vpnName, dpnId, rd, externalIp);
@@ -2111,7 +2126,7 @@ public final class NatUtil {
     @Nullable
     public static String getPrimaryRd(String vpnName, TypedReadTransaction<Configuration> tx)
         throws ExecutionException, InterruptedException {
-        return tx.read(getVpnInstanceIdentifier(vpnName)).get().toJavaUtil().map(NatUtil::getPrimaryRd).orElse(null);
+        return tx.read(getVpnInstanceIdentifier(vpnName)).get().map(NatUtil::getPrimaryRd).orElse(null);
     }
 
     @Nullable
@@ -2147,8 +2162,15 @@ public final class NatUtil {
     public static boolean checkForRoutersWithSameExtNetAndNaptSwitch(DataBroker broker, Uuid networkId,
                                                                      String routerName, Uint64 dpnId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
-        Optional<Networks> networkData = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
-
+        Optional<Networks> networkData = null;
+        try {
+            networkData = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, id);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("checkForRoutersWithSameExtNetAndNaptSwitch: Exception while reading Networks DS for the "
+                            + "network {} router {} dpnId {}", networkId.getValue(), routerName, dpnId, e);
+            return false;
+        }
         if (networkData != null && networkData.isPresent()) {
             List<Uuid> routerUuidList = networkData.get().getRouterIds();
             if (routerUuidList != null && !routerUuidList.isEmpty()) {
@@ -2171,8 +2193,8 @@ public final class NatUtil {
 
     public static boolean checkForRoutersWithSameExtSubnetAndNaptSwitch(DataBroker broker, Uuid externalSubnetId,
                                                                         String routerName, Uint64 dpnId) {
-        List<Uuid> routerUuidList = getOptionalExternalSubnets(broker, externalSubnetId).toJavaUtil()
-            .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external
+        List<Uuid> routerUuidList = getOptionalExternalSubnets(broker, externalSubnetId)
+                .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external
                 .subnets.Subnets::getRouterIds).orElse(emptyList());
         if (!routerUuidList.isEmpty()) {
             for (Uuid routerUuid : routerUuidList) {
@@ -2454,7 +2476,7 @@ public final class NatUtil {
                 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     elanDpnInterfaceId, dpnInterface);
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to read elanDpnInterface with error {}", e.getMessage());
         } catch (TransactionCommitFailedException e) {
             LOG.warn("Failed to add elanDpnInterface with error {}", e.getMessage());
@@ -2492,7 +2514,7 @@ public final class NatUtil {
                     .withKey(new DpnInterfacesKey(dpnId)).build();
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     elanDpnInterfaceId, dpnInterface);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to read elanDpnInterface with error {}", e.getMessage());
         } catch (TransactionCommitFailedException e) {
             LOG.warn("Failed to remove elanDpnInterface with error {}", e.getMessage());
@@ -2518,7 +2540,7 @@ public final class NatUtil {
             return SingleTransactionDataBroker.syncRead(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, getLearntVpnVipToPortDataId());
         }
-        catch (ReadFailedException e) {
+        catch (ExpectedDataObjectNotFoundException e) {
             LOG.warn("Failed to read LearntVpnVipToPortData with error {}", e.getMessage());
             return null;
         }
@@ -2627,7 +2649,7 @@ public final class NatUtil {
                         LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath);
         if (!bridgeRefEntry.isPresent()) {
             LOG.info("getBridgeRefInfo : bridgeRefEntry is not present for {}", dpnId);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         InstanceIdentifier<Node> nodeId =
@@ -2639,7 +2661,7 @@ public final class NatUtil {
 
     @Nullable
     public static String getProviderMappings(Uint64 dpId, DataBroker dataBroker) {
-        return getBridgeRefInfo(dpId, dataBroker).toJavaUtil().map(node -> getOpenvswitchOtherConfigs(node,
+        return getBridgeRefInfo(dpId, dataBroker).map(node -> getOpenvswitchOtherConfigs(node,
                 PROVIDER_MAPPINGS, dataBroker)).orElse(null);
     }
 
@@ -2673,7 +2695,7 @@ public final class NatUtil {
             return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, ovsdbNodeIid);
         }
-        return Optional.absent();
+        return Optional.empty();
 
     }
 
@@ -2699,7 +2721,7 @@ public final class NatUtil {
             if (optionalExternalSubnets.isPresent()) {
                 return optionalExternalSubnets.get();
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read the subnets from the datastore.");
         }
         return null;
@@ -2782,9 +2804,9 @@ public final class NatUtil {
         try {
             portsOptional = SingleTransactionDataBroker
                 .syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, portsIdentifier);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Read Failed Exception While Reading Neutron Port for {}", ifaceName, e);
-            portsOptional = Optional.absent();
+            portsOptional = Optional.empty();
         }
         if (!portsOptional.isPresent()) {
             LOG.error("getNeutronPort : No neutron ports found for interface {}", ifaceName);
@@ -2802,10 +2824,10 @@ public final class NatUtil {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
             .vpn.instance.to.vpn.id.VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
-            .vpn.instance.to.vpn.id.VpnInstance> vpnInstance = Optional.absent();
+            .vpn.instance.to.vpn.id.VpnInstance> vpnInstance = Optional.empty();
         try {
             vpnInstance = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.CONFIGURATION, id);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to read VpnInstance {}", vpnInstance, e);
         }
         if (vpnInstance.isPresent()) {
index 6d71511c30e1e4ee94b5d125d8a003905e946211..a66b2baa87786283a0fe4d4952b1c50c0555121e 100644 (file)
@@ -9,20 +9,21 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
@@ -39,7 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<VpnMap, NatVpnMapsChangeListener> {
+public class NatVpnMapsChangeListener extends AbstractAsyncDataTreeChangeListener<VpnMap> {
     private static final Logger LOG = LoggerFactory.getLogger(NatVpnMapsChangeListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -52,7 +53,9 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<Vp
                                final FloatingIPListener floatingIpListener,
                                final OdlInterfaceRpcService interfaceManager,
                                final ExternalRoutersListener externalRoutersListener) {
-        super(VpnMap.class, NatVpnMapsChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(VpnMaps.class)
+                .child(VpnMap.class),
+                Executors.newListeningSingleThreadExecutor("NatVpnMapsChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.floatingIpListener = floatingIpListener;
@@ -60,20 +63,19 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<Vp
         this.externalRoutersListener = externalRoutersListener;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VpnMap> getWildCardPath() {
-        return InstanceIdentifier.create(VpnMaps.class).child(VpnMap.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<VpnMap> identifier, VpnMap vpnMap) {
+    public void add(InstanceIdentifier<VpnMap> identifier, VpnMap vpnMap) {
         Uuid vpnUuid = vpnMap.getVpnId();
         String vpnName = vpnUuid.getValue();
         if (vpnMap.getRouterIds() != null) {
@@ -88,7 +90,7 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<Vp
     }
 
     @Override
-    protected void remove(InstanceIdentifier<VpnMap> identifier, VpnMap vpnMap) {
+    public void remove(InstanceIdentifier<VpnMap> identifier, VpnMap vpnMap) {
         Uuid vpnUuid = vpnMap.getVpnId();
         String vpnName = vpnUuid.getValue();
         if (vpnMap.getRouterIds() != null) {
@@ -103,7 +105,7 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<Vp
     }
 
     @Override
-    protected void update(InstanceIdentifier<VpnMap> identifier, VpnMap original, VpnMap updated) {
+    public void update(InstanceIdentifier<VpnMap> identifier, VpnMap original, VpnMap updated) {
         Uuid vpnUuid = updated.getVpnId();
         String vpnName = vpnUuid.getValue();
 
@@ -147,11 +149,6 @@ public class NatVpnMapsChangeListener extends AsyncDataTreeChangeListenerBase<Vp
         }
     }
 
-    @Override
-    protected NatVpnMapsChangeListener getDataTreeChangeListener() {
-        return this;
-    }
-
     public void onRouterAssociatedToVpn(String vpnName, String routerName) {
 
         //check router is associated to external network
index 2ba021bf51c1648cc4fe3434e9e216ce3503f210..d14dd3ef8b2433a3f281b7998f65e0aaa44af9aa 100644 (file)
@@ -9,24 +9,25 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collection;
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
@@ -44,8 +45,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class RouterDpnChangeListener
-        extends AsyncDataTreeChangeListenerBase<DpnVpninterfacesList, RouterDpnChangeListener> {
+public class RouterDpnChangeListener extends AbstractAsyncDataTreeChangeListener<DpnVpninterfacesList> {
 
     private static final Logger LOG = LoggerFactory.getLogger(RouterDpnChangeListener.class);
     private final DataBroker dataBroker;
@@ -72,7 +72,9 @@ public class RouterDpnChangeListener
                                    final NatserviceConfig config,
                                    final JobCoordinator coordinator,
                                    final UpgradeState upgradeState) {
-        super(DpnVpninterfacesList.class, RouterDpnChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NeutronRouterDpns.class)
+                .child(RouterDpnList.class).child(DpnVpninterfacesList.class),
+                Executors.newListeningSingleThreadExecutor("RouterDpnChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
@@ -87,26 +89,19 @@ public class RouterDpnChangeListener
         this.upgradeState = upgradeState;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
-    }
-
-    @Override
-    protected RouterDpnChangeListener getDataTreeChangeListener() {
-        return RouterDpnChangeListener.this;
     }
 
     @Override
-    protected InstanceIdentifier<DpnVpninterfacesList> getWildCardPath() {
-        return InstanceIdentifier.create(NeutronRouterDpns.class).child(RouterDpnList.class)
-            .child(DpnVpninterfacesList.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(final InstanceIdentifier<DpnVpninterfacesList> identifier, final DpnVpninterfacesList dpnInfo) {
+    public void add(final InstanceIdentifier<DpnVpninterfacesList> identifier, final DpnVpninterfacesList dpnInfo) {
         LOG.trace("add : key: {}, value: {}", dpnInfo.key(), dpnInfo);
         final String routerUuid = identifier.firstKeyOf(RouterDpnList.class).getRouterId();
         Uint64 dpnId = dpnInfo.getDpnId();
@@ -214,7 +209,7 @@ public class RouterDpnChangeListener
     }
 
     @Override
-    protected void remove(InstanceIdentifier<DpnVpninterfacesList> identifier, DpnVpninterfacesList dpnInfo) {
+    public void remove(InstanceIdentifier<DpnVpninterfacesList> identifier, DpnVpninterfacesList dpnInfo) {
         LOG.trace("remove : key: {}, value: {}", dpnInfo.key(), dpnInfo);
         final String routerUuid = identifier.firstKeyOf(RouterDpnList.class).getRouterId();
         Uint32 routerId = NatUtil.getVpnId(dataBroker, routerUuid);
@@ -311,7 +306,7 @@ public class RouterDpnChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<DpnVpninterfacesList> identifier, DpnVpninterfacesList original,
+    public void update(InstanceIdentifier<DpnVpninterfacesList> identifier, DpnVpninterfacesList original,
                           DpnVpninterfacesList update) {
         LOG.trace("Update key: {}, original: {}, update: {}", update.key(), original, update);
     }
index ce48e4e0cf4b8efef8701d0303190d05fcff091d..b9edf240dc9fdda7506f3cb52d065b3b48934b28 100644 (file)
@@ -7,15 +7,16 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
@@ -30,37 +31,32 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class RouterPortsListener
-    extends AsyncDataTreeChangeListenerBase<RouterPorts, RouterPortsListener> {
+public class RouterPortsListener extends AbstractAsyncDataTreeChangeListener<RouterPorts> {
 
     private static final Logger LOG = LoggerFactory.getLogger(RouterPortsListener.class);
     private final DataBroker dataBroker;
 
     @Inject
     public RouterPortsListener(final DataBroker dataBroker) {
-        super(RouterPorts.class, RouterPortsListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(FloatingIpInfo.class)
+                .child(RouterPorts.class),
+                Executors.newListeningSingleThreadExecutor("RouterPortsListener", LOG));
         this.dataBroker = dataBroker;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<RouterPorts> getWildCardPath() {
-        return InstanceIdentifier.create(FloatingIpInfo.class).child(RouterPorts.class);
     }
 
     @Override
-    protected RouterPortsListener getDataTreeChangeListener() {
-        return RouterPortsListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
+    public void add(final InstanceIdentifier<RouterPorts> identifier, final RouterPorts routerPorts) {
         LOG.trace("add : key:{}  value:{}",routerPorts.key(), routerPorts);
         Optional<RouterPorts> optRouterPorts =
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
@@ -96,7 +92,7 @@ public class RouterPortsListener
     }
 
     @Override
-    protected void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
+    public void remove(InstanceIdentifier<RouterPorts> identifier, RouterPorts routerPorts) {
         LOG.trace("remove : key:{}  value:{}",routerPorts.key(), routerPorts);
         //MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
         //Remove the router to vpn association mapping entry if at all present
@@ -109,7 +105,7 @@ public class RouterPortsListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
+    public void update(InstanceIdentifier<RouterPorts> identifier, RouterPorts original, RouterPorts update) {
         LOG.trace("Update : key: {}, original:{}, update:{}",update.key(), original, update);
     }
 }
index 9f9aa0fc38ba1848a970a9eb4ca85a2839166d20..81e28f8160360fd509496aff270267552d4f04cd 100644 (file)
@@ -17,7 +17,6 @@ import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
@@ -32,6 +31,7 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.natservice.api.NatSwitchCache;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
index 2be87f8a1af9b9e46fd835c84394dc49efaf9ff7..73013b7ae27984d75a4c71e937351a8bb0ab200c 100644 (file)
@@ -10,18 +10,18 @@ package org.opendaylight.netvirt.natservice.internal;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.Objects;
-
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.natservice.api.CentralizedSwitchScheduler;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
@@ -35,7 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Routers, SnatExternalRoutersListener> {
+public class SnatExternalRoutersListener extends AbstractAsyncDataTreeChangeListener<Routers> {
     private static final Logger LOG = LoggerFactory.getLogger(SnatExternalRoutersListener.class);
 
     private final DataBroker dataBroker;
@@ -53,7 +53,9 @@ public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase
                                        final NatserviceConfig config,
                                        final SnatServiceManager natServiceManager,
                                        final UpgradeState upgradeState) {
-        super(Routers.class, SnatExternalRoutersListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(ExtRouters.class)
+                .child(Routers.class),
+                Executors.newListeningSingleThreadExecutor("SnatExternalRoutersListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.idManager = idManager;
@@ -65,28 +67,31 @@ public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase
         } else {
             this.natMode = NatMode.Conntrack;
         }
+        init();
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
         // This class handles ExternalRouters for Conntrack SNAT mode.
         // For Controller SNAT mode, its handled in ExternalRoutersListeners.java
         if (natMode == NatMode.Conntrack) {
-            registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
             NatUtil.createGroupIdPool(idManager);
         }
     }
 
     @Override
-    protected InstanceIdentifier<Routers> getWildCardPath() {
-        return InstanceIdentifier.create(ExtRouters.class).child(Routers.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Routers> identifier, Routers routers) {
+    public void add(InstanceIdentifier<Routers> identifier, Routers routers) {
+        if (natMode != NatMode.Conntrack) {
+            return;
+        }
         String routerName = routers.getRouterName();
         if (upgradeState.isUpgradeInProgress()) {
             LOG.warn("add event for ext-router {}, but upgrade is in progress.", routerName);
@@ -106,7 +111,10 @@ public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void update(InstanceIdentifier<Routers> identifier, Routers original, Routers update) {
+    public void update(InstanceIdentifier<Routers> identifier, Routers original, Routers update) {
+        if (natMode != NatMode.Conntrack) {
+            return;
+        }
         String routerName = original.getRouterName();
         Uint32 routerId = NatUtil.getVpnId(dataBroker, routerName);
         if (routerId == NatConstants.INVALID_ID) {
@@ -128,7 +136,10 @@ public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Routers> identifier, Routers router) {
+    public void remove(InstanceIdentifier<Routers> identifier, Routers router) {
+        if (natMode != NatMode.Conntrack) {
+            return;
+        }
         if (identifier == null || router == null) {
             LOG.error("remove : returning without processing since ext-router is null");
             return;
@@ -137,9 +148,4 @@ public class SnatExternalRoutersListener extends AsyncDataTreeChangeListenerBase
         LOG.info("remove : external router event for {}", router.getRouterName());
         centralizedSwitchScheduler.releaseCentralizedSwitch(router);
     }
-
-    @Override
-    protected SnatExternalRoutersListener getDataTreeChangeListener() {
-        return SnatExternalRoutersListener.this;
-    }
 }
index 7da7b391a8d8ad3eb5b5a43cc4cf2248892a6aa6..ec8881f79fa2891f7fcce363a0aa7da24ac2cfa1 100644 (file)
@@ -10,11 +10,11 @@ package org.opendaylight.netvirt.natservice.internal;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.inject.AbstractLifecycle;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
index 8c4435d3d444a164c10f07fe7f572113cf490c54..4f219ee13bbb7242d2be442d878ff7f997f935cf 100644 (file)
@@ -11,13 +11,14 @@ package org.opendaylight.netvirt.natservice.internal;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 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.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -28,8 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class SubnetGwMacChangeListener
-    extends AsyncDataTreeChangeListenerBase<LearntVpnVipToPort, SubnetGwMacChangeListener> {
+public class SubnetGwMacChangeListener extends AbstractAsyncDataTreeChangeListener<LearntVpnVipToPort> {
     private static final Logger LOG = LoggerFactory.getLogger(SubnetGwMacChangeListener.class);
 
     private final DataBroker broker;
@@ -39,42 +39,40 @@ public class SubnetGwMacChangeListener
     @Inject
     public SubnetGwMacChangeListener(final DataBroker broker, final INeutronVpnManager nvpnManager,
                                      final ExternalNetworkGroupInstaller extNetworkInstaller) {
-        super(LearntVpnVipToPort.class, SubnetGwMacChangeListener.class);
+        super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(LearntVpnVipToPortData.class)
+                .child(LearntVpnVipToPort.class),
+                Executors.newListeningSingleThreadExecutor("SubnetGwMacChangeListener", LOG));
         this.broker = broker;
         this.nvpnManager = nvpnManager;
         this.extNetworkInstaller = extNetworkInstaller;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<LearntVpnVipToPort> getWildCardPath() {
-        return InstanceIdentifier.builder(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class).build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort learntVpnVipToPort) {
+    public void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort learntVpnVipToPort) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort origLearntVpnVipToPort,
+    public void update(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort origLearntVpnVipToPort,
                           LearntVpnVipToPort updatedLearntVpnVipToPort) {
         handleSubnetGwIpChange(updatedLearntVpnVipToPort);
     }
 
     @Override
-    protected void add(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort learntVpnVipToPort) {
+    public void add(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort learntVpnVipToPort) {
         handleSubnetGwIpChange(learntVpnVipToPort);
     }
 
-    @Override
-    protected SubnetGwMacChangeListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private void handleSubnetGwIpChange(LearntVpnVipToPort learntVpnVipToPort) {
         String macAddress = learntVpnVipToPort.getMacAddress();
         if (macAddress == null) {
index 39b2fdace35da2832555753924023796548a6262..485bceb816beb0e54f2c1766de83c6e44107eadd 100644 (file)
@@ -8,12 +8,13 @@
 
 package org.opendaylight.netvirt.natservice.internal;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.Subnetmaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -21,7 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class SubnetmapListener extends AsyncDataTreeChangeListenerBase<Subnetmap, SubnetmapListener> {
+public class SubnetmapListener extends AbstractAsyncDataTreeChangeListener<Subnetmap> {
     private static final Logger LOG = LoggerFactory.getLogger(SubnetmapListener.class);
     private final DataBroker dataBroker;
     private final ExternalNetworkGroupInstaller externalNetworkGroupInstaller;
@@ -31,32 +32,34 @@ public class SubnetmapListener extends AsyncDataTreeChangeListenerBase<Subnetmap
     public SubnetmapListener(final DataBroker dataBroker,
                              final ExternalNetworkGroupInstaller externalNetworkGroupInstaller,
                              NatServiceCounters natServiceCounters) {
-        super(Subnetmap.class, SubnetmapListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(Subnetmaps.class).child(Subnetmap.class),
+                Executors.newListeningSingleThreadExecutor("SubnetmapListener", LOG));
         this.dataBroker = dataBroker;
         this.externalNetworkGroupInstaller = externalNetworkGroupInstaller;
         this.natServiceCounters = natServiceCounters;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        LOG.info("{} init", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<Subnetmap> getWildCardPath() {
-        return InstanceIdentifier.create(Subnetmaps.class).child(Subnetmap.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
+    public void remove(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.trace("remove key: {} value: {}", subnetmap.key(), subnetmap);
         natServiceCounters.subnetmapRemove();
         externalNetworkGroupInstaller.removeExtNetGroupEntries(subnetmap);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Subnetmap> identifier,
+    public void update(InstanceIdentifier<Subnetmap> identifier,
                           Subnetmap subnetmapBefore, Subnetmap subnetmapAfter) {
         LOG.trace("update key: {}, original: {}, update: {}", subnetmapAfter.key(), subnetmapBefore, subnetmapAfter);
         natServiceCounters.subnetmapUpdate();
@@ -64,14 +67,9 @@ public class SubnetmapListener extends AsyncDataTreeChangeListenerBase<Subnetmap
     }
 
     @Override
-    protected void add(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
+    public void add(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.trace("add key: {} value: {}", subnetmap.key(), subnetmap);
         natServiceCounters.subnetmapAdd();
         externalNetworkGroupInstaller.installExtNetGroupEntries(subnetmap);
     }
-
-    @Override
-    protected SubnetmapListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 29de7588e4bb4b1195c334c9576f7e03de99ec1c..929240e855cf097c203db85968052001ef997f51 100644 (file)
@@ -10,17 +10,13 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -28,8 +24,12 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.natservice.api.CentralizedSwitchScheduler;
-import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredSyncDataTreeChangeListener;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredSyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
@@ -68,7 +68,7 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
                                 final IdManagerService idManager,
                                 final NaptSwitchHA naptSwitchHA,
                                 final NatserviceConfig config, final JobCoordinator coordinator) {
-        super(dataBroker, new DataTreeIdentifier<>(
+        super(dataBroker, DataTreeIdentifier.create(
                 LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(UpgradeConfig.class)));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
index 55933e79837db87ffa69597d1ccabe640be4c07d..da28854d8ba186b3368a4280239f3eb4db0829c5 100644 (file)
@@ -12,12 +12,12 @@ import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 import com.google.common.util.concurrent.FluentFuture;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.cache.DataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NeutronVipStates;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.neutron.vip.states.VipState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.neutron.vip.states.VipStateBuilder;
index 8d1d8a7ff24715c3fa10254ab5e4648876943d30..075cbfe9415398efa5d2a5213ff39686cf1b2a4f 100644 (file)
@@ -10,24 +10,21 @@ package org.opendaylight.netvirt.natservice.internal;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.netvirt.natservice.internal.NatUtil.buildfloatingIpIdToPortMappingIdentifier;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -49,6 +46,8 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMplsLabel;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
index 40509c4abee161c204d5ee225309d3ca43fd46d3..e2e1c310ae75d18fafdc174a97a773d4bcf3d1a9 100644 (file)
@@ -11,7 +11,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
@@ -40,6 +39,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
index 2aad5b35398efb26d4e2cfbba95c4a73e1e8d25a..8d182d7b3edc6f1d56be0f05f4d53ad96d0a7ad9 100644 (file)
@@ -13,8 +13,8 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.natservice.internal.NatConstants;
 import org.opendaylight.netvirt.natservice.internal.NatUtil;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
index b7bc4d20cdf323b04298b33f3c773848b432e3be..c0bba272f8ac5ecede4915dcf922beb7341bafa0 100644 (file)
@@ -2,8 +2,8 @@
            xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
 
     <reference id="dataBrokerRef"
-               interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
-               odl:type="pingpong"/>
+               interface="org.opendaylight.mdsal.binding.api.DataBroker"
+               odl:type="default"/>
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
         <command>
             <action class="org.opendaylight.netvirt.natservice.cli.DisplayNaptSwithcesCli">
index 32adc3a828587eef6c0bf0f9f08128c1ce9396df..8e0195dc0e534aa2e23cedefb3346de8fcf4bd44 100644 (file)
@@ -5,7 +5,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default" />
   <reference id="iBgpManager"
              interface="org.opendaylight.netvirt.bgpmanager.api.IBgpManager" />
index 94e8258172896373f1de4a16d9e979b035507735..cdd60e212ca4b9a85a7b627f956e8e45322aee4a 100644 (file)
@@ -22,10 +22,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <modelVersion>4.0.0</modelVersion>
 
     <dependencies>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>org.opendaylight.genius</groupId>
             <artifactId>mdsalutil-api</artifactId>
@@ -48,5 +48,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.genius</groupId>
+            <artifactId>mdsalutil-api</artifactId>
+            <version>0.9.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 </project>
index b72758e989acdd32466ac745d4487594616e04a5..0e064a29e1bb5dee0035beeec2ac8e0be5d11727 100644 (file)
@@ -17,8 +17,8 @@ import java.util.Map.Entry;
 import java.util.Queue;
 import java.util.Set;
 import java.util.function.Predicate;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
index 315731bc712683451d00237c049471b587f50ec7..32ae19b5daf342118282702940689a5ade99f60f 100644 (file)
@@ -15,10 +15,10 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.vpnmaps.vpnmap.RouterIds;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
index a8ce8d8092941567c453d6e7030d87c737df9820..81c353796667909a4c9267a339daaa7d45b42be2 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.netvirt.neutronvpn.interfaces;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
@@ -22,7 +21,7 @@ public interface INeutronVpnManager {
 
     List<String> showVpnConfigCLI(Uuid vuuid) throws InterruptedException, ExecutionException;
 
-    List<String> showNeutronPortsCLI() throws ReadFailedException;
+    List<String> showNeutronPortsCLI() throws ExecutionException, InterruptedException;
 
     Network getNeutronNetwork(Uuid networkId);
 
index 5e6e824aafa1e96ff7518707061c10128d7d775a..b2f5186d3dc6bf0ec8cc3aa86ec3c6e63c0b35f3 100644 (file)
@@ -8,15 +8,15 @@
 
 package org.opendaylight.netvirt.neutronvpn;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.mdsalutil.cache.InstanceIdDataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.Hostconfigs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.hostconfigs.Hostconfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.hostconfigs.HostconfigKey;
index 32322245c360d94a85bcba5762c049a52fe37b8b..887c937c92b80406c02866cc310413c53ddbbb6f 100644 (file)
@@ -17,13 +17,14 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
@@ -44,7 +45,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase<Bgpvpn, NeutronBgpvpnChangeListener> {
+public class NeutronBgpvpnChangeListener extends AbstractAsyncDataTreeChangeListener<Bgpvpn> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronBgpvpnChangeListener.class);
     private final DataBroker dataBroker;
     private final NeutronvpnManager nvpnManager;
@@ -55,31 +56,28 @@ public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase
     @Inject
     public NeutronBgpvpnChangeListener(final DataBroker dataBroker, final NeutronvpnManager neutronvpnManager,
                                        final IdManagerService idManager, final NeutronvpnUtils neutronvpnUtils) {
-        super(Bgpvpn.class, NeutronBgpvpnChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Bgpvpns.class).child(Bgpvpn.class), Executors.newSingleThreadExecutor(
+                        "NeutronBgpvpnChangeListener", LOG));
         this.dataBroker = dataBroker;
         nvpnManager = neutronvpnManager;
         this.idManager = idManager;
         this.neutronvpnUtils = neutronvpnUtils;
         BundleContext bundleContext = FrameworkUtil.getBundle(NeutronBgpvpnChangeListener.class).getBundleContext();
         adminRDValue = bundleContext.getProperty(NeutronConstants.RD_PROPERTY_KEY);
+        init();
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
         createIdPool();
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Bgpvpn> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Bgpvpns.class).child(Bgpvpn.class);
     }
 
     @Override
-    protected NeutronBgpvpnChangeListener getDataTreeChangeListener() {
-        return NeutronBgpvpnChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     private boolean isBgpvpnTypeL3(Class<? extends BgpvpnTypeBase> bgpvpnType) {
@@ -94,7 +92,7 @@ public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn input) {
+    public void add(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn input) {
         LOG.trace("Adding Bgpvpn : key: {}, value={}", identifier, input);
         String vpnName = input.getUuid().getValue();
         if (isBgpvpnTypeL3(input.getType())) {
@@ -172,7 +170,7 @@ public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn input) {
+    public void remove(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn input) {
         LOG.trace("Removing Bgpvpn : key: {}, value={}", identifier, input);
         Uuid vpnId = input.getUuid();
         if (isBgpvpnTypeL3(input.getType())) {
@@ -197,7 +195,7 @@ public class NeutronBgpvpnChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void update(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn original, Bgpvpn update) {
+    public void update(InstanceIdentifier<Bgpvpn> identifier, Bgpvpn original, Bgpvpn update) {
         LOG.trace("Update Bgpvpn : key: {}, value={}", identifier, update);
         Uuid vpnId = update.getUuid();
         if (isBgpvpnTypeL3(update.getType())) {
index 79767de0b5050a1270e083dae927988ffbc7cdd7..a0ed08914bf3d8b0a67c6112608fd6ad3a348e25 100644 (file)
@@ -9,23 +9,24 @@ package org.opendaylight.netvirt.neutronvpn;
 
 import static org.opendaylight.netvirt.neutronvpn.NeutronvpnUtils.buildfloatingIpIdToPortMappingIdentifier;
 
-import com.google.common.base.Optional;
 import edu.umd.cs.findbugs.annotations.CheckReturnValue;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.NamedLocks;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.AcquireResult;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
@@ -48,8 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTreeChangeListenerBase<Floatingip,
-        NeutronFloatingToFixedIpMappingChangeListener> {
+public class NeutronFloatingToFixedIpMappingChangeListener extends AbstractAsyncDataTreeChangeListener<Floatingip> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronFloatingToFixedIpMappingChangeListener.class);
     private static final long LOCK_WAIT_TIME = 10L;
 
@@ -58,29 +58,25 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
 
     @Inject
     public NeutronFloatingToFixedIpMappingChangeListener(final DataBroker dataBroker) {
-        super(Floatingip.class, NeutronFloatingToFixedIpMappingChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                        .child(Floatingips.class).child(Floatingip.class),
+                Executors.newSingleThreadExecutor("NeutronFloatingToFixedIpMappingChangeListener", LOG));
         this.dataBroker = dataBroker;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Floatingip> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Floatingips.class).child(Floatingip.class);
     }
 
     @Override
-    protected NeutronFloatingToFixedIpMappingChangeListener getDataTreeChangeListener() {
-        return NeutronFloatingToFixedIpMappingChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Floatingip> identifier, Floatingip input) {
+    public void add(InstanceIdentifier<Floatingip> identifier, Floatingip input) {
         LOG.trace("Neutron Floating IP created: key: {}, value={}", identifier, input);
         IpAddress fixedIp = input.getFixedIpAddress();
         String floatingIp = input.getFloatingIpAddress().getIpv4Address().getValue();
@@ -91,7 +87,7 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Floatingip> identifier, Floatingip input) {
+    public void remove(InstanceIdentifier<Floatingip> identifier, Floatingip input) {
         LOG.trace("Neutron Floating IP deleted : key: {}, value={}", identifier, input);
         IpAddress fixedIp = input.getFixedIpAddress();
         if (fixedIp != null) {
@@ -108,7 +104,7 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
 
     // populate the floating to fixed ip map upon association/dissociation from fixed ip
     @Override
-    protected void update(InstanceIdentifier<Floatingip> identifier, Floatingip original, Floatingip update) {
+    public void update(InstanceIdentifier<Floatingip> identifier, Floatingip original, Floatingip update) {
         LOG.trace("Handling FloatingIptoFixedIp mapping : key: {}, original value={}, update value={}", identifier,
                 original, update);
         IpAddress oldFixedIp = original.getFixedIpAddress();
@@ -191,7 +187,7 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
                     routerPortsBuilder.build());
                 LOG.debug("FloatingIpInfo DS updated for floating IP {} ", floatingIpAddress);
             }
-        } catch (ReadFailedException | RuntimeException e) {
+        } catch (RuntimeException | ExecutionException | InterruptedException e) {
             LOG.error("addToFloatingIpInfo failed for floating IP: {} ", floatingIpAddress, e);
         }
     }
@@ -248,7 +244,7 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
             } else {
                 LOG.warn("routerPorts for router {} - fixedIp {} not found", routerName, fixedIpAddress);
             }
-        } catch (RuntimeException | ReadFailedException e) {
+        } catch (RuntimeException | ExecutionException | InterruptedException e) {
             LOG.error("Failed to delete internal-to-external-port-map from FloatingIpInfo DS for fixed Ip {}",
                     fixedIpAddress, e);
         }
@@ -289,7 +285,7 @@ public class NeutronFloatingToFixedIpMappingChangeListener extends AsyncDataTree
                 LOG.debug("FloatingIPInfo DS empty. Hence, no router present containing fixed to floating IP "
                     + "association(s)");
             }
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("Failed to dissociate fixedIP from FloatingIpInfo DS for neutron port {}",
                     fixedNeutronPortName, e);
         }
index 77bc810854259ca20e50412e2861498326eee892..cb118ce9c7be83261d3f05ae6df2543feeb1ad24 100644 (file)
@@ -10,15 +10,16 @@ package org.opendaylight.netvirt.neutronvpn;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
-import org.opendaylight.ovsdb.utils.mdsal.utils.ControllerMdsalUtils;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.Hostconfigs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.hostconfigs.Hostconfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.hostconfig.rev150712.hostconfig.attributes.hostconfigs.HostconfigBuilder;
@@ -34,8 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronHostConfigChangeListener
-        extends AsyncDataTreeChangeListenerBase<Node,NeutronHostConfigChangeListener> {
+public class NeutronHostConfigChangeListener extends AbstractAsyncDataTreeChangeListener<Node> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronHostConfigChangeListener.class);
     private static final String OS_HOST_CONFIG_HOST_ID_KEY = "odl_os_hostconfig_hostid";
     private static final String OS_HOST_CONFIG_CONFIG_KEY_PREFIX = "odl_os_hostconfig_config_odl_";
@@ -49,49 +49,41 @@ public class NeutronHostConfigChangeListener
 
     private final DataBroker dataBroker;
     private final SouthboundUtils southboundUtils;
-    private final ControllerMdsalUtils mdsalUtils;
+    private final MdsalUtils mdsalUtils;
 
     @Inject
     public NeutronHostConfigChangeListener(final DataBroker dataBroker) {
-        super(Node.class,NeutronHostConfigChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class,new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID)).child(Node.class),
+                Executors.newSingleThreadExecutor("NeutronHostConfigChangeListener", LOG));
         this.dataBroker = dataBroker;
-        this.mdsalUtils = new ControllerMdsalUtils(dataBroker);
+        this.mdsalUtils = new MdsalUtils(dataBroker);
         this.southboundUtils = new SouthboundUtils(mdsalUtils);
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier
-                .create(NetworkTopology.class)
-                .child(Topology.class,new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID))
-                .child(Node.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected NeutronHostConfigChangeListener getDataTreeChangeListener() {
-        return NeutronHostConfigChangeListener.this;
-    }
-
-
-    @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node del) {
+    public void remove(InstanceIdentifier<Node> identifier, Node del) {
         updateHostConfig(del, Action.DELETE);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
         updateHostConfig(update, Action.UPDATE);
     }
 
     @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node add) {
+    public void add(InstanceIdentifier<Node> identifier, Node add) {
         updateHostConfig(add, Action.ADD);
 
     }
index aa2964fba2a7a1e82e21b7c82605cd6056c6d0e6..cf2511e745cbfaaa8f783684ec31adac069baae5 100644 (file)
@@ -7,22 +7,24 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.SegmentTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.SegmentTypeFlat;
@@ -49,8 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronNetworkChangeListener
-        extends AsyncDataTreeChangeListenerBase<Network, NeutronNetworkChangeListener> {
+public class NeutronNetworkChangeListener extends AbstractAsyncDataTreeChangeListener<Network> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkChangeListener.class);
     private final DataBroker dataBroker;
     private final NeutronvpnManager nvpnManager;
@@ -62,7 +63,9 @@ public class NeutronNetworkChangeListener
     public NeutronNetworkChangeListener(final DataBroker dataBroker, final NeutronvpnManager neutronvpnManager,
                                         final NeutronvpnNatManager neutronvpnNatManager,
                                         final IElanService elanService, final NeutronvpnUtils neutronvpnUtils) {
-        super(Network.class, NeutronNetworkChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Networks.class).child(Network.class), Executors.newSingleThreadExecutor(
+                        "NeutronNetworkChangeListener", LOG));
         this.dataBroker = dataBroker;
         nvpnManager = neutronvpnManager;
         nvpnNatManager = neutronvpnNatManager;
@@ -70,26 +73,19 @@ public class NeutronNetworkChangeListener
         this.neutronvpnUtils = neutronvpnUtils;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Network> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected NeutronNetworkChangeListener getDataTreeChangeListener() {
-        return NeutronNetworkChangeListener.this;
-    }
-
-
-    @Override
-    protected void add(InstanceIdentifier<Network> identifier, Network input) {
+    public void add(InstanceIdentifier<Network> identifier, Network input) {
         LOG.trace("Adding Network : key: {}, value={}", identifier, input);
         String networkId = input.getUuid().getValue();
         if (!NeutronvpnUtils.isNetworkTypeSupported(input)) {
@@ -127,7 +123,7 @@ public class NeutronNetworkChangeListener
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Network> identifier, Network input) {
+    public void remove(InstanceIdentifier<Network> identifier, Network input) {
         LOG.trace("Removing Network : key: {}, value={}", identifier, input);
         if (NeutronvpnUtils.getIsExternal(input)) {
             if (NeutronvpnUtils.isFlatOrVlanNetwork(input)) {
@@ -147,7 +143,7 @@ public class NeutronNetworkChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Network> identifier, Network original, Network update) {
+    public void update(InstanceIdentifier<Network> identifier, Network original, Network update) {
         LOG.trace("Updating Network : key: {}, original value={}, update value={}", identifier, original, update);
         neutronvpnUtils.addToNetworkCache(update);
         String elanInstanceName = original.getUuid().getValue();
@@ -235,10 +231,15 @@ public class NeutronNetworkChangeListener
     private ElanInstance createElanInstance(Network input) {
         String elanInstanceName = input.getUuid().getValue();
         InstanceIdentifier<ElanInstance> id = createElanInstanceIdentifier(elanInstanceName);
-        Optional<ElanInstance> existingElanInstance = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                id);
-        if (existingElanInstance.isPresent()) {
-            return existingElanInstance.get();
+        Optional<ElanInstance> existingElanInstance = null;
+        try {
+            existingElanInstance = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    id);
+            if (existingElanInstance.isPresent()) {
+                return existingElanInstance.get();
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("createElanInstance: failed to read elanInstance {} due to exception ", elanInstanceName, e);
         }
         Class<? extends SegmentTypeBase> segmentType = NeutronvpnUtils.getSegmentTypeFromNeutronNetwork(input);
         String segmentationId = NeutronvpnUtils.getSegmentationIdFromNeutronNetwork(input);
index 5a9c7378482e5bb5207e20c86ea7a55f11283c42..5f4f768338c53dcc3c6d6df101fc187db3938d2b 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.netvirt.neutronvpn;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.gson.Gson;
@@ -24,16 +23,15 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.ObjectUtils;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore;
@@ -42,11 +40,16 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.enums.IpVersionChoice;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
@@ -86,7 +89,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<Port, NeutronPortChangeListener> {
+public class NeutronPortChangeListener extends AbstractAsyncDataTreeChangeListener<Port> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortChangeListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -100,6 +103,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
     private final DataTreeEventCallbackRegistrar eventCallbacks;
     private final NeutronvpnConfig neutronvpnConfig;
 
+    @Inject
     public NeutronPortChangeListener(final DataBroker dataBroker,
                                      final NeutronvpnManager neutronvpnManager,
                                      final NeutronvpnNatManager neutronvpnNatManager,
@@ -110,7 +114,9 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
                                      final HostConfigCache hostConfigCache,
                                      final DataTreeEventCallbackRegistrar dataTreeEventCallbackRegistrar,
                                      final NeutronvpnConfig neutronvpnConfig) {
-        super(Port.class, NeutronPortChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Ports.class).child(Port.class),
+                Executors.newSingleThreadExecutor("NeutronPortChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         nvpnManager = neutronvpnManager;
@@ -125,26 +131,19 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
 
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Port> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class);
     }
 
     @Override
-    protected NeutronPortChangeListener getDataTreeChangeListener() {
-        return NeutronPortChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-
     @Override
-    protected void add(InstanceIdentifier<Port> identifier, Port input) {
+    public void add(InstanceIdentifier<Port> identifier, Port input) {
         LOG.trace("Received port add event: port={}", input);
         String portName = input.getUuid().getValue();
         LOG.trace("Adding Port : key: {}, value={}", identifier, input);
@@ -183,7 +182,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Port> identifier, Port input) {
+    public void remove(InstanceIdentifier<Port> identifier, Port input) {
         LOG.trace("Removing Port : key: {}, value={}", identifier, input);
         Network network = neutronvpnUtils.getNeutronNetwork(input.getNetworkId());
         // need to proceed with deletion in case network is null for a case where v2 sync happens and a read for
@@ -215,7 +214,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
     }
 
     @Override
-    protected void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
+    public void update(InstanceIdentifier<Port> identifier, Port original, Port update) {
         LOG.trace("Received port update event: original={}, update={}", original, update);
         // Switchdev ports need to be bounded to a host before creation
         // in order to validate the supported vnic types from the hostconfig
@@ -522,19 +521,25 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
         // the MAC of the router's gw port is not available to be set when the
         // router is written. We catch that here.
         InstanceIdentifier<Routers> routersId = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
-        Optional<Routers> optionalRouter = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routersId);
-        if (!optionalRouter.isPresent()) {
-            return;
-        }
+        Optional<Routers> optionalRouter = null;
+        try {
+            optionalRouter = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routersId);
+            if (!optionalRouter.isPresent()) {
+                return;
+            }
+            Routers extRouters = optionalRouter.get();
+            if (extRouters.getExtGwMacAddress() != null) {
+                return;
+            }
 
-        Routers extRouters = optionalRouter.get();
-        if (extRouters.getExtGwMacAddress() != null) {
-            return;
+            RoutersBuilder builder = new RoutersBuilder(extRouters);
+            builder.setExtGwMacAddress(routerGwPort.getMacAddress().getValue());
+            MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, routersId, builder.build());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("setExternalGwMac: failed to read EXT-Routers for router Id {} rout-Gw port {} due to exception",
+                    routerId, routerGwPort, e);
         }
 
-        RoutersBuilder builder = new RoutersBuilder(extRouters);
-        builder.setExtGwMacAddress(routerGwPort.getMacAddress().getValue());
-        MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, routersId, builder.build());
     }
 
     @Nullable
@@ -561,7 +566,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
             LOG.error("failed to read host config from host {}", hostId, e);
             return null;
         }
-        return hostConfig.orNull();
+        return hostConfig.orElse(null);
     }
 
     private boolean isPortBound(final Port port) {
@@ -915,7 +920,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
             } else {
                 LOG.warn("Interface {} is already present", infName);
             }
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("failed to create interface {}", infName, e);
         }
         return infName;
@@ -995,7 +1000,7 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
             } else {
                 LOG.warn("deleteOfPortInterface: Interface {} is not present", name);
             }
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("deleteOfPortInterface: Failed to delete interface {}", name, e);
         }
     }
index 0d6cbd59448987b34836042d64c3ecd8f3b82d2f..13b41af15c00bb8e72c8bccb1d95a575d5b2cadb 100644 (file)
@@ -7,20 +7,21 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.l3.attributes.Routes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
@@ -34,7 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase<Router, NeutronRouterChangeListener> {
+public class NeutronRouterChangeListener extends AbstractAsyncDataTreeChangeListener<Router> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronRouterChangeListener.class);
     private final DataBroker dataBroker;
     private final NeutronvpnManager nvpnManager;
@@ -49,7 +50,9 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
                                        final NeutronSubnetGwMacResolver gwMacResolver,
                                        final NeutronvpnUtils neutronvpnUtils,
                                        final JobCoordinator jobCoordinator) {
-        super(Router.class, NeutronRouterChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Routers.class).child(Router.class),
+                Executors.newSingleThreadExecutor("NeutronRouterChangeListener", LOG));
         this.dataBroker = dataBroker;
         nvpnManager = neutronvpnManager;
         nvpnNatManager = neutronvpnNatManager;
@@ -58,26 +61,19 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
         this.jobCoordinator = jobCoordinator;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Router> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Routers.class).child(Router.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected NeutronRouterChangeListener getDataTreeChangeListener() {
-        return NeutronRouterChangeListener.this;
-    }
-
-
-    @Override
-    protected void add(InstanceIdentifier<Router> identifier, Router input) {
+    public void add(InstanceIdentifier<Router> identifier, Router input) {
         LOG.trace("Adding Router : key: {}, value={}", identifier, input);
         neutronvpnUtils.addToRouterCache(input);
         // Create internal VPN
@@ -90,7 +86,7 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Router> identifier, Router input) {
+    public void remove(InstanceIdentifier<Router> identifier, Router input) {
         LOG.trace("Removing router : key: {}, value={}", identifier, input);
         Uuid routerId = input.getUuid();
         // Handle router deletion for the NAT service
@@ -114,7 +110,7 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void update(InstanceIdentifier<Router> identifier, Router original, Router update) {
+    public void update(InstanceIdentifier<Router> identifier, Router original, Router update) {
         LOG.trace("Updating Router : key: {}, original value={}, update value={}", identifier, original, update);
         neutronvpnUtils.addToRouterCache(update);
         Uuid routerId = update.getUuid();
index d6c0b30c46e01480571eec8859ee091bb6e342c9..0453ed8a94249127579ecac580f2dbfb89327e2e 100644 (file)
@@ -7,22 +7,23 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import java.util.ArrayList;
 import java.util.Collections;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclBuilder;
@@ -38,8 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronSecurityGroupListener
-        extends AsyncDataTreeChangeListenerBase<SecurityGroup, NeutronSecurityGroupListener> {
+public class NeutronSecurityGroupListener extends AbstractAsyncDataTreeChangeListener<SecurityGroup> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityGroupListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -49,28 +49,30 @@ public class NeutronSecurityGroupListener
     @Inject
     public NeutronSecurityGroupListener(DataBroker dataBroker, JobCoordinator jobCoordinator,
             final NeutronSecurityGroupUtils neutronSecurityGroupUtils) {
-        super(SecurityGroup.class, NeutronSecurityGroupListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(SecurityGroups.class).child(SecurityGroup.class),
+                Executors.newSingleThreadExecutor("NeutronSecurityGroupListener", LOG));
         this.dataBroker = dataBroker;
         this.jobCoordinator = jobCoordinator;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.neutronSecurityGroupUtils = neutronSecurityGroupUtils;
+        init();
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
         neutronSecurityGroupUtils.createAclIdPool();
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<SecurityGroup> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(SecurityGroups.class).child(SecurityGroup.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<SecurityGroup> key, SecurityGroup securityGroup) {
+    public void remove(InstanceIdentifier<SecurityGroup> key, SecurityGroup securityGroup) {
         LOG.trace("Removing securityGroup: {}", securityGroup);
         InstanceIdentifier<Acl> identifier = getAclInstanceIdentifier(securityGroup);
         String securityGroupId = securityGroup.key().getUuid().getValue();
@@ -82,13 +84,13 @@ public class NeutronSecurityGroupListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<SecurityGroup> key, SecurityGroup dataObjectModificationBefore,
+    public void update(InstanceIdentifier<SecurityGroup> key, SecurityGroup dataObjectModificationBefore,
         SecurityGroup dataObjectModificationAfter) {
         LOG.debug("Do nothing");
     }
 
     @Override
-    protected void add(InstanceIdentifier<SecurityGroup> instanceIdentifier, SecurityGroup securityGroup) {
+    public void add(InstanceIdentifier<SecurityGroup> instanceIdentifier, SecurityGroup securityGroup) {
         LOG.trace("Adding securityGroup: {}", securityGroup);
         String securityGroupId = securityGroup.key().getUuid().getValue();
         InstanceIdentifier<Acl> identifier = getAclInstanceIdentifier(securityGroup);
@@ -100,11 +102,6 @@ public class NeutronSecurityGroupListener
         });
     }
 
-    @Override
-    protected NeutronSecurityGroupListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private InstanceIdentifier<Acl> getAclInstanceIdentifier(SecurityGroup securityGroup) {
         return InstanceIdentifier
             .builder(AccessLists.class).child(Acl.class,
index fc50f6281564867709ab5d15e6b41d5103d9faad..5035ffd0fbf66a768b9f33644fb348dda026d6c4 100644 (file)
@@ -13,9 +13,9 @@ import java.util.concurrent.Future;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
@@ -155,6 +155,6 @@ public final class NeutronSecurityGroupUtils {
     }
 
     public Acl getAcl(DataBroker broker, InstanceIdentifier<Acl> aclInstanceIdentifier) {
-        return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, aclInstanceIdentifier, broker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, aclInstanceIdentifier, broker).orElse(null);
     }
 }
index dbdafa2c8ec210f7dd082b16ff9fdab03b4815d3..b9edd8d8626f3dd8ce0eadc90a5c8c60440ecac7 100644 (file)
@@ -7,22 +7,23 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import com.google.common.collect.ImmutableBiMap;
 
 import java.util.Collections;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclKey;
@@ -60,8 +61,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronSecurityRuleListener
-        extends AsyncDataTreeChangeListenerBase<SecurityRule, NeutronSecurityRuleListener> {
+public class NeutronSecurityRuleListener extends AbstractAsyncDataTreeChangeListener<SecurityRule> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityRuleListener.class);
     private static final ImmutableBiMap<Class<? extends DirectionBase>,
         Class<?extends org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.DirectionBase>>
@@ -80,28 +80,29 @@ public class NeutronSecurityRuleListener
 
     @Inject
     public NeutronSecurityRuleListener(final DataBroker dataBroker, JobCoordinator jobCoordinator) {
-        super(SecurityRule.class, NeutronSecurityRuleListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(SecurityRules.class).child(SecurityRule.class),
+                Executors.newSingleThreadExecutor("NeutronSecurityRuleListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.jobCoordinator = jobCoordinator;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<SecurityRule> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(SecurityRules.class).child(SecurityRule.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<SecurityRule> instanceIdentifier, SecurityRule securityRule) {
+    public void add(InstanceIdentifier<SecurityRule> instanceIdentifier, SecurityRule securityRule) {
         LOG.trace("added securityRule: {}", securityRule);
         try {
             Ace ace = toAceBuilder(securityRule, false).build();
@@ -232,7 +233,7 @@ public class NeutronSecurityRuleListener
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void remove(InstanceIdentifier<SecurityRule> instanceIdentifier, SecurityRule securityRule) {
+    public void remove(InstanceIdentifier<SecurityRule> instanceIdentifier, SecurityRule securityRule) {
         LOG.trace("removed securityRule: {}", securityRule);
         InstanceIdentifier<Ace> identifier = getAceInstanceIdentifier(securityRule);
         try {
@@ -253,14 +254,9 @@ public class NeutronSecurityRuleListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<SecurityRule> instanceIdentifier,
+    public void update(InstanceIdentifier<SecurityRule> instanceIdentifier,
                           SecurityRule oldSecurityRule, SecurityRule updatedSecurityRule) {
         // security rule updation is not supported from openstack, so no need to handle update.
         LOG.trace("updates on security rules not supported.");
     }
-
-    @Override
-    protected NeutronSecurityRuleListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 0087e1c466def64aec3cfb2a6b2c77dd2f2f2e2f..71fb1ae2547013de6fb9d7e7fe7d61b0a075bc9f 100644 (file)
@@ -7,20 +7,21 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
-import javax.annotation.PostConstruct;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.vpn.instance.vpntargets.VpnTarget;
@@ -38,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase<Subnet, NeutronSubnetChangeListener> {
+public class NeutronSubnetChangeListener extends AbstractAsyncDataTreeChangeListener<Subnet> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSubnetChangeListener.class);
     private final DataBroker dataBroker;
     private final NeutronvpnManager nvpnManager;
@@ -50,7 +51,9 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
     public NeutronSubnetChangeListener(final DataBroker dataBroker, final NeutronvpnManager neutronvpnManager,
             final NeutronExternalSubnetHandler externalSubnetHandler, final NeutronvpnUtils neutronvpnUtils,
                                        final IVpnManager vpnManager) {
-        super(Subnet.class, NeutronSubnetChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Subnets.class).child(Subnet.class),
+                Executors.newSingleThreadExecutor("NeutronSubnetChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.nvpnManager = neutronvpnManager;
         this.externalSubnetHandler = externalSubnetHandler;
@@ -58,26 +61,19 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
         this.vpnManager = vpnManager;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Subnet> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Subnets.class).child(Subnet.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected NeutronSubnetChangeListener getDataTreeChangeListener() {
-        return NeutronSubnetChangeListener.this;
-    }
-
-
-    @Override
-    protected void add(InstanceIdentifier<Subnet> identifier, Subnet input) {
+    public void add(InstanceIdentifier<Subnet> identifier, Subnet input) {
         LOG.trace("Adding Subnet : key: {}, value={}", identifier, input);
         Uuid networkId = input.getNetworkId();
         Uuid subnetId = input.getUuid();
@@ -94,7 +90,7 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnet> identifier, Subnet input) {
+    public void remove(InstanceIdentifier<Subnet> identifier, Subnet input) {
         LOG.trace("Removing subnet : key: {}, value={}", identifier, input);
         Uuid networkId = input.getNetworkId();
         Uuid subnetId = input.getUuid();
@@ -111,7 +107,7 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
     }
 
     @Override
-    protected void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
+    public void update(InstanceIdentifier<Subnet> identifier, Subnet original, Subnet update) {
         LOG.trace("Updating Subnet : key: {}, original value={}, update value={}", identifier, original, update);
         neutronvpnUtils.addToSubnetCache(update);
     }
@@ -173,7 +169,7 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
                     .build());
             LOG.debug("Created subnet-network mapping for subnet {} network {}", subnetId.getValue(),
                     networkId.getValue());
-        } catch (ReadFailedException | RuntimeException e) {
+        } catch (RuntimeException | ExecutionException | InterruptedException e) {
             LOG.error("Create subnet-network mapping failed for subnet {} network {}", subnetId.getValue(),
                     networkId.getValue());
         }
@@ -207,7 +203,7 @@ public class NeutronSubnetChangeListener extends AsyncDataTreeChangeListenerBase
             } else {
                 LOG.error("network {} not present for subnet {} ", networkId, subnetId);
             }
-        } catch (ReadFailedException | RuntimeException e) {
+        } catch (RuntimeException | ExecutionException | InterruptedException e) {
             LOG.error("Delete subnet-network mapping failed for subnet {} network {}", subnetId.getValue(),
                     networkId.getValue());
         }
index 3a479e93a98a90463d999229232780ef8bdbcdff..ca9308891be5b3b763bf6cb68b31bd614c9e3f34 100644 (file)
@@ -14,17 +14,18 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
@@ -48,7 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase<Trunk, NeutronTrunkChangeListener> {
+public class NeutronTrunkChangeListener extends AbstractAsyncDataTreeChangeListener<Trunk> {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronTrunkChangeListener.class);
 
     private final DataBroker dataBroker;
@@ -59,31 +60,28 @@ public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase<
     @Inject
     public NeutronTrunkChangeListener(final DataBroker dataBroker, final IInterfaceManager ifMgr,
             final JobCoordinator jobCoordinator) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(Neutron.class).child(Trunks.class).child(Trunk.class),
+                Executors.newSingleThreadExecutor("NeutronTrunkChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.ifMgr = ifMgr;
         this.jobCoordinator = jobCoordinator;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
-    }
-
-    @Override
-    protected InstanceIdentifier<Trunk> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Trunks.class).child(Trunk.class);
     }
 
     @Override
-    protected NeutronTrunkChangeListener getDataTreeChangeListener() {
-        return NeutronTrunkChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void add(InstanceIdentifier<Trunk> identifier, Trunk input) {
+    public void add(InstanceIdentifier<Trunk> identifier, Trunk input) {
         Preconditions.checkNotNull(input.getPortId());
         LOG.trace("Adding Trunk : key: {}, value={}", identifier, input);
         List<SubPorts> subPorts = input.getSubPorts();
@@ -93,7 +91,7 @@ public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Trunk> identifier, Trunk input) {
+    public void remove(InstanceIdentifier<Trunk> identifier, Trunk input) {
         Preconditions.checkNotNull(input.getPortId());
         LOG.trace("Removing Trunk : key: {}, value={}", identifier, input);
         List<SubPorts> subPorts = input.getSubPorts();
@@ -103,7 +101,7 @@ public class NeutronTrunkChangeListener extends AsyncDataTreeChangeListenerBase<
     }
 
     @Override
-    protected void update(InstanceIdentifier<Trunk> identifier, Trunk original, Trunk update) {
+    public void update(InstanceIdentifier<Trunk> identifier, Trunk original, Trunk update) {
         List<SubPorts> updatedSubPorts = update.getSubPorts();
         if (updatedSubPorts == null) {
             updatedSubPorts = Collections.emptyList();
index 11124a99e8e433ff805b8919c48c3d44cc5fc018..ede78d728cc67d6a9c9ba848e1a4a39d82c645fe 100644 (file)
@@ -11,7 +11,6 @@ import static java.util.Collections.singletonList;
 import static org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker.syncReadOptional;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -31,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
@@ -43,11 +43,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -59,6 +54,10 @@ import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
 import org.opendaylight.infrautils.utils.concurrent.NamedLocks;
 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.AcquireResult;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.OptimisticLockFailedException;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.alarm.NeutronvpnAlarms;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
@@ -291,7 +290,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             } finally {
                 lock.unlock();
             }
-        } catch (TransactionCommitFailedException | ReadFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("createSubnetmapNode: Creating subnetmap node failed for subnet {}", subnetId.getValue());
         }
         // check if there are ports to update for already created Subnetmap node
@@ -334,7 +333,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             LOG.debug("Creating/Updating subnetMap node: {} ", subnetId.getValue());
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, id, subnetmap);
             return subnetmap;
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Subnet map update failed for node {}", subnetId.getValue(), e);
             return null;
         } finally {
@@ -371,7 +370,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             LOG.debug("WithRouterFixedIP Creating/Updating subnetMap node for Router FixedIp: {} ",
                 subnetId.getValue());
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, id, subnetmap);
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("updateSubnetNodeWithFixedIp: subnet map for Router FixedIp failed for node {}",
                 subnetId.getValue(), e);
         } finally {
@@ -423,7 +422,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                         + "cache ", subnetId.getValue(), portId.getValue());
                 unprocessedPortsMap.put(portId, subnetId);
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Updating port list of a given subnetMap failed for node: {}", subnetId.getValue(), e);
         } finally {
             lock.unlock();
@@ -468,7 +467,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             } else {
                 LOG.warn("removing from non-existing subnetmap node: {} ", subnetId.getValue());
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Removal from subnetmap failed for node: {}", subnetId.getValue());
         } finally {
             lock.unlock();
@@ -511,7 +510,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             } else {
                 LOG.info("Trying to remove port from non-existing subnetmap node {}", subnetId.getValue());
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Removing a port from port list of a subnetmap failed for node: {}",
                     subnetId.getValue(), e);
         } finally {
@@ -556,7 +555,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                     + "Updating Config vpn-instance: {} with the list of RDs: {}", vpnInstanceId, rds);
             SingleTransactionDataBroker.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIdentifier,
                     updateVpnInstanceBuilder.build());
-        } catch (ReadFailedException | TransactionCommitFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.warn("updateVpnInstanceWithRDs: Error configuring vpn-instance: {} with "
                     + "the list of RDs: {}", vpnInstanceId, rds, ex);
         }
@@ -573,7 +572,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
         try {
             optionalVpn = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
                 vpnIdentifier);
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("Update VPN Instance node failed for node: {} {} {} {}", vpnName, rd, irt, ert);
             return;
         }
@@ -711,7 +710,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                         builder.build());
                 LOG.debug("VPNMaps DS updated for VPN {} ", vpnId.getValue());
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("UpdateVpnMaps failed for node: {} ", vpnId.getValue());
         }
     }
@@ -725,7 +724,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             optionalVpnMap =
                     SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
                             vpnMapIdentifier);
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("Error reading the VPN map for {}", vpnMapIdentifier, e);
             return;
         }
@@ -891,7 +890,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             optionalVpnInterface = SingleTransactionDataBroker
                     .syncReadOptional(dataBroker, LogicalDatastoreType
                     .CONFIGURATION, vpnIfIdentifier);
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("withdrawPortIpFromVpnIface: Error reading the VPN interface for {}", vpnIfIdentifier, e);
             return;
         }
@@ -978,7 +977,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             optionalVpnInterface =
                 SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
                             vpnIfIdentifier);
-        } catch (ReadFailedException ex) {
+        } catch (ExecutionException | InterruptedException ex) {
             LOG.error("Error during deletion of vpninterface {}", infName, ex);
             return;
         }
@@ -1073,7 +1072,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             } else {
                 LOG.info("removeVpnFromVpnInterface: VPN Interface {} not found", infName);
             }
-        } catch (ReadFailedException ex) {
+        } catch (ExecutionException | InterruptedException ex) {
             LOG.error("Update of vpninterface {} failed", infName, ex);
         }
     }
@@ -1167,7 +1166,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                 } else {
                     LOG.error("VPN Interface {} not found", infName);
                 }
-            } catch (ReadFailedException ex) {
+            } catch (ExecutionException | InterruptedException ex) {
                 LOG.error("Updation of vpninterface {} failed", infName, ex);
             }
         }
@@ -1526,7 +1525,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             opBuilder.setL3vpnInstances(l3vpnList);
             result.set(RpcResultBuilder.<GetL3VPNOutput>success().withResult(opBuilder.build()).build());
 
-        } catch (ReadFailedException ex) {
+        } catch (ExecutionException | InterruptedException ex) {
             result.set(RpcResultBuilder.<GetL3VPNOutput>failed().withError(ErrorType.APPLICATION,
                     formatAndLog(LOG::error, "GetVPN failed due to {}", ex.getMessage())).build());
         }
@@ -1562,7 +1561,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                             formatAndLog(LOG::warn, "VPN with vpnid: {} does not exist", vpn.getValue())));
                     warningcount++;
                 }
-            } catch (ReadFailedException ex) {
+            } catch (ExecutionException | InterruptedException ex) {
                 errorList.add(RpcResultBuilder.newError(ErrorType.APPLICATION,
                         formatAndLog(LOG::error, "Deletion of L3VPN failed when deleting for uuid {}", vpn.getValue()),
                         ex.getMessage()));
@@ -1904,7 +1903,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
                     routerInterfacesId, builder.setInterfaces(interfaces).build());
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Error reading router interfaces for {}", routerInterfacesId, e);
         } finally {
             lock.unlock();
@@ -1934,7 +1933,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                     }
                 }
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Error reading the router interfaces for {}", routerInterfacesId, e);
         } finally {
             lock.unlock();
@@ -2109,7 +2108,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                     } catch (TransactionCommitFailedException e) {
                         LOG.error("exception in adding extra route with destination: {}, next hop: {}",
                             destination, nextHop, e);
-                    } catch (ReadFailedException e) {
+                    } catch (ExecutionException | InterruptedException e) {
                         LOG.error("Exception on reading data-store ", e);
                     }
                 } else {
@@ -2280,7 +2279,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                             LOG.trace("extra route {} deleted successfully", route);
                         }
                     }
-                } catch (TransactionCommitFailedException | ReadFailedException e) {
+                } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
                     LOG.error("exception in deleting extra route with destination {} for interface {}",
                             destination, infName, e);
                 }
@@ -2493,7 +2492,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                 }
                 passedNwList.add(nw);
             }
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("associateNetworksToVpn: Failed to associate VPN {} with networks {}: ", vpnId.getValue(),
                     networkList, e);
             failedNwList.add(String.format("Failed to associate VPN %s with networks %s: %s", vpnId.getValue(),
@@ -3011,9 +3010,9 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
      * Implementation of the "vpnservice:neutron-ports-show" Karaf CLI command.
      *
      * @return a List of String to be printed on screen
-     * @throws ReadFailedException if there was a problem reading from the data store
+     * @throws ExecutionException or InterruptedException   if there was a problem reading from the data store
      */
-    public List<String> showNeutronPortsCLI() throws ReadFailedException {
+    public List<String> showNeutronPortsCLI() throws ExecutionException, InterruptedException {
         List<String> result = new ArrayList<>();
         result.add(String.format(" %-36s  %-19s  %-13s  %-20s ", "Port ID", "Mac Address", "Prefix Length",
             "IP Address"));
@@ -3264,7 +3263,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                     LOG.info("Updating vpn interface {} with new adjacencies", infName);
                     wrtConfigTxn.put(vpnIfIdentifier, vpnIfBuilder.build());
                 }
-            } catch (IllegalStateException | ReadFailedException ex) {
+            } catch (IllegalStateException | ExecutionException | InterruptedException ex) {
                 // FIXME: why are we catching IllegalStateException here?
                 LOG.error("Update of vpninterface {} failed", infName, ex);
             }
@@ -3319,7 +3318,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, extNetIdentifier,
                                                   networks);
             return true;
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("addExternalNetworkToVpn: Failed to set VPN Id {} to Provider Network {}: ", vpnId.getValue(),
                       extNetId.getValue(), ex);
         }
@@ -3348,7 +3347,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                     extNetId.getValue());
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, extNetsId, networks);
             return true;
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("removeExternalNetworkFromVpn: Failed to withdraw VPN Id from Provider Network node {}: ",
                     extNetId.getValue(), ex);
         }
@@ -3359,10 +3358,9 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
         Optional<String> existingVpnName = Optional.of(primaryRd);
         Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataOptional;
         try {
-            vpnInstanceOpDataOptional = SingleTransactionDataBroker
-                .syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+            vpnInstanceOpDataOptional = syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     neutronvpnUtils.getVpnOpDataIdentifier(primaryRd));
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             LOG.error("getExistingOperationalVpn: Exception while checking operational status of vpn with rd {}",
                     primaryRd, e);
             /*Read failed. We don't know if a VPN exists or not.
@@ -3372,7 +3370,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
         if (vpnInstanceOpDataOptional.isPresent()) {
             existingVpnName = Optional.of(vpnInstanceOpDataOptional.get().getVpnInstanceName());
         } else {
-            existingVpnName = Optional.absent();
+            existingVpnName = Optional.empty();
         }
         return existingVpnName;
     }
index afc5eb8102cefc8500c24fdab8747dbcacd5d8d3..11347beef5231558c039b8dc3345cde215a41e7d 100644 (file)
@@ -12,7 +12,6 @@ import java.util.List;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 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;
@@ -33,7 +32,7 @@ public class NeutronvpnManagerImpl implements INeutronVpnManager {
     }
 
     @Override
-    public List<String> showNeutronPortsCLI() throws ReadFailedException {
+    public List<String> showNeutronPortsCLI() throws ExecutionException, InterruptedException {
         return nvManager.showNeutronPortsCLI();
     }
 
index fa51a32a1158b84335724f5314f15912a50207f5..97fe21e36d0ea8e7f74c5d883b31f655c2c2ed8f 100644 (file)
@@ -7,23 +7,23 @@
  */
 package org.opendaylight.netvirt.neutronvpn;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -266,7 +266,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier,
                     networkss);
             LOG.trace("Wrote externalnetwork successfully to CONFIG Datastore");
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Creation of External Network {} failed", extNetId.getValue(), ex);
         }
     }
@@ -292,7 +292,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
             SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier);
             LOG.trace("Deleted External Network {} successfully from CONFIG Datastore", extNetId.getValue());
 
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Deletion of External Network {} failed", extNetId.getValue(), ex);
         }
     }
@@ -341,7 +341,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier,
                     networkss);
             LOG.trace("Updated externalnetworks successfully to CONFIG Datastore");
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Creation of externalnetworks failed for {}",
                 extNetId.getValue(), ex);
         }
@@ -367,7 +367,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
         try {
             optionalNets = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                             LogicalDatastoreType.CONFIGURATION, netsIdentifier);
-        } catch (ReadFailedException ex) {
+        } catch (ExecutionException | InterruptedException ex) {
             LOG.error("removeExternalNetworkFromRouter: Failed to remove provider network {} from router {}",
                       origExtNetId.getValue(), routerId.getValue(), ex);
             return;
@@ -449,7 +449,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                     builder.build());
             LOG.trace("Wrote successfully Routers to CONFIG Datastore");
 
-        } catch (ReadFailedException | TransactionCommitFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Creation of extrouters failed for router {} failed",
                 routerId.getValue(), ex);
         }
@@ -475,7 +475,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                         routersIdentifier);
                 LOG.trace("Removed router {} from extrouters", routerId.getValue());
             }
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Removing extrouter {} from extrouters failed", routerId.getValue(), ex);
         }
     }
@@ -517,7 +517,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                 SingleTransactionDataBroker.syncDelete(broker, LogicalDatastoreType.CONFIGURATION,
                         routerPortsIdentifierBuilder.build());
             }
-        } catch (ReadFailedException | TransactionCommitFailedException e) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
             LOG.error("Failed to read from FloatingIpInfo DS for routerid {}", routerId, e);
         }
     }
@@ -549,7 +549,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                         routerss);
                 LOG.trace("Added External Fixed IPs successfully for Routers to CONFIG Datastore");
             }
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Updating extfixedips for {} in extrouters failed", routerId.getValue(), ex);
         }
     }
@@ -577,7 +577,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
             SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
                     routersIdentifier, routerss);
             LOG.trace("Updated successfully Routers to CONFIG Datastore");
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Updation of internal subnets for extrouters failed for router {}",
                 routerId.getValue(), ex);
         }
@@ -608,7 +608,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                     routersIdentifier, routerss);
             LOG.trace("Updated successfully Routers to CONFIG Datastore");
 
-        } catch (TransactionCommitFailedException | ReadFailedException ex) {
+        } catch (TransactionCommitFailedException | ExecutionException | InterruptedException ex) {
             LOG.error("Updation of snat for extrouters failed for router {}", routerId.getValue(), ex);
         }
     }
@@ -803,7 +803,7 @@ public class NeutronvpnNatManager implements AutoCloseable {
                         }
                     }
                 }
-            } catch (TransactionCommitFailedException | ReadFailedException e) {
+            } catch (TransactionCommitFailedException | ExecutionException | InterruptedException e) {
                 LOG.error("exception in removeAdjacencyAndLearnedEntriesforExternalSubnet for interface {}",
                     infName, e);
             }
index 9ccdd3d85b13e009ed979118ed857016f1fb37e9..3231943ad0d2adf0a681f10d317883a5249a9aa9 100644 (file)
@@ -11,7 +11,6 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
@@ -29,6 +28,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -40,10 +40,6 @@ import javax.inject.Singleton;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -54,6 +50,9 @@ import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.api.enums.IpVersionChoice;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
@@ -427,7 +426,7 @@ public class NeutronvpnUtils {
         }
         LOG.debug("getNeutronNetwork for {}", networkId.getValue());
         InstanceIdentifier<Network> inst = NEUTRON_NETWORKS_IID.child(Network.class, new NetworkKey(networkId));
-        return read(LogicalDatastoreType.CONFIGURATION, inst).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, inst).orElse(null);
     }
 
     protected @Nullable Port getNeutronPort(Uuid portId) {
@@ -437,7 +436,7 @@ public class NeutronvpnUtils {
         }
         LOG.debug("getNeutronPort for {}", portId.getValue());
         InstanceIdentifier<Port> inst = NEUTRON_PORTS_IID.child(Port.class, new PortKey(portId));
-        return read(LogicalDatastoreType.CONFIGURATION, inst).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, inst).orElse(null);
     }
 
     public PortIdToSubport getPortIdToSubport(Uuid portId) {
@@ -1070,7 +1069,7 @@ public class NeutronvpnUtils {
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
         try {
             return SingleTransactionDataBroker.syncReadOptional(dataBroker, datastoreType, path);
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             throw new RuntimeException(e);
         }
     }
@@ -1144,17 +1143,23 @@ public class NeutronvpnUtils {
      */
     public Optional<InterVpnLink> getInterVpnLinkByEndpointIp(String endpointIp) {
         InstanceIdentifier<InterVpnLinks> interVpnLinksIid = InstanceIdentifier.builder(InterVpnLinks.class).build();
-        Optional<InterVpnLinks> interVpnLinksOpData = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                interVpnLinksIid);
-        if (interVpnLinksOpData.isPresent()) {
-            for (InterVpnLink interVpnLink : interVpnLinksOpData.get().nonnullInterVpnLink()) {
-                if (interVpnLink.getFirstEndpoint().getIpAddress().getValue().equals(endpointIp)
-                        || interVpnLink.getSecondEndpoint().getIpAddress().getValue().equals(endpointIp)) {
-                    return Optional.of(interVpnLink);
+        Optional<InterVpnLinks> interVpnLinksOpData = null;
+        try {
+            interVpnLinksOpData = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    interVpnLinksIid);
+            if (interVpnLinksOpData.isPresent()) {
+                for (InterVpnLink interVpnLink : interVpnLinksOpData.get().nonnullInterVpnLink()) {
+                    if (interVpnLink.getFirstEndpoint().getIpAddress().getValue().equals(endpointIp)
+                            || interVpnLink.getSecondEndpoint().getIpAddress().getValue().equals(endpointIp)) {
+                        return Optional.of(interVpnLink);
+                    }
                 }
             }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getInterVpnLinkByEndpointIp: Exception when reading intervpn Links for endpoint Ip {} ",
+                    endpointIp, e);
         }
-        return Optional.absent();
+        return Optional.empty();
     }
 
     protected Integer releaseId(String poolName, String idKey) {
@@ -1335,7 +1340,7 @@ public class NeutronvpnUtils {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
             .instance.to.vpn.id.VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
                         .VpnInstance::getVrfId).orElse(null);
     }
@@ -1738,7 +1743,7 @@ public class NeutronvpnUtils {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
                 .instance.to.vpn.id.VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
-                LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
+                LogicalDatastoreType.CONFIGURATION, id).map(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
                         .VpnInstance::getVpnId).orElse(null).toJava();
     }
@@ -1765,7 +1770,7 @@ public class NeutronvpnUtils {
         jobCoordinator.enqueueJob(jobKey, () -> {
             SettableFuture<Optional<T>> settableFuture = SettableFuture.create();
             List futures = Collections.singletonList(settableFuture);
-            try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+            try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
                 Futures.addCallback(tx.read(datastoreType, iid),
                         new SettableFutureCallback<Optional<T>>(settableFuture) {
                             @Override
index f0aef8d0f6305eca94f54461a218cc02889427d3..09cb264503a03e390ffc0110d2d0aa6ecbe2c198 100644 (file)
@@ -10,10 +10,9 @@ package org.opendaylight.netvirt.neutronvpn;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredSyncDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredSyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.upgrade.rev180702.UpgradeConfig;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -28,8 +27,7 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
     @Inject
     public UpgradeStateListener(final DataBroker dataBroker,
                                 final NeutronSubnetGwMacResolver neutronSubnetGwMacResolver) {
-        super(dataBroker, new DataTreeIdentifier<>(
-                LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(UpgradeConfig.class)));
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(UpgradeConfig.class));
         LOG.trace("UpgradeStateListener (neutronvpn) initialized");
         this.neutronSubnetGwMacResolver = neutronSubnetGwMacResolver;
     }
index afa3eb802feddad54ee27bb50cbbb3e2cc24dba7..749a6dc264584d8e6b63b8ee1e8e1ef8d046282c 100644 (file)
@@ -7,16 +7,16 @@
  */
 package org.opendaylight.netvirt.neutronvpn.evpn.manager;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.NeutronvpnManager;
 import org.opendaylight.netvirt.neutronvpn.NeutronvpnUtils;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
@@ -186,7 +186,7 @@ public class NeutronEvpnManager {
                     VpnMap vpnMap = optionalVpnMap.get();
                     evpn.setTenantId(vpnMap.getTenantId()).setName(vpnMap.getName());
                 }
-            } catch (ReadFailedException e) {
+            } catch (ExecutionException | InterruptedException e) {
                 LOG.error("Error reading the VPN map for {}", vpnMapIdentifier, e);
                 result.set(RpcResultBuilder.<GetEVPNOutput>failed().withError(RpcError.ErrorType.APPLICATION,
                         "Error reading the VPN map for " + vpnMapIdentifier, e).build());
index aade8be41ecc9424d2a54890e73f03209a7f9902..a43632c3478d25a13f619b1918cad216e72701d4 100644 (file)
@@ -9,17 +9,18 @@ package org.opendaylight.netvirt.neutronvpn.evpn.utils;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.EvpnAugmentation;
@@ -56,7 +57,8 @@ public class NeutronEvpnUtils {
         this.jobCoordinator = jobCoordinator;
     }
 
-    public boolean isVpnAssociatedWithNetwork(VpnInstance vpnInstance) throws ReadFailedException {
+    public boolean isVpnAssociatedWithNetwork(VpnInstance vpnInstance)
+            throws  InterruptedException, ExecutionException {
         String rd = vpnManager.getPrimaryRdFromVpnInstance(vpnInstance);
         InstanceIdentifier<EvpnRdToNetwork> id = InstanceIdentifier.builder(EvpnRdToNetworks.class)
                 .child(EvpnRdToNetwork.class, new EvpnRdToNetworkKey(rd)).build();
index 4a13fad86bbbb44fc56353c4bd7033914370a91e..a9ecf1827a87f690d5936c90de53517abfb8db9e 100644 (file)
@@ -22,7 +22,7 @@ import org.slf4j.LoggerFactory;
 /**
  * The Class AddL2GwDevicesToTransportZoneJob.
  */
-public class AddL2GwDevicesToTransportZoneJob implements Callable<List<ListenableFuture<Void>>> {
+public class AddL2GwDevicesToTransportZoneJob implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(AddL2GwDevicesToTransportZoneJob.class);
     private final ItmRpcService itmRpcService;
index c01289b612e18471dc243f790f6208744fb04fa3..d1ad6a6614c1b4de1ec1917096a9e95c37695a12 100644 (file)
@@ -8,14 +8,15 @@
 
 package org.opendaylight.netvirt.neutronvpn.l2gw;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
 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;
@@ -28,8 +29,7 @@ import org.slf4j.LoggerFactory;
  * The listener class for ITM transport zone updates.
  */
 @Singleton
-public class L2GwTransportZoneListener
-        extends AsyncDataTreeChangeListenerBase<TransportZone, L2GwTransportZoneListener> {
+public class L2GwTransportZoneListener extends AbstractAsyncDataTreeChangeListener<TransportZone> {
     private static final Logger LOG = LoggerFactory.getLogger(L2GwTransportZoneListener.class);
     private final DataBroker dataBroker;
     private final ItmRpcService itmRpcService;
@@ -45,29 +45,23 @@ public class L2GwTransportZoneListener
     @Inject
     public L2GwTransportZoneListener(final DataBroker dataBroker, final ItmRpcService itmRpcService,
             final JobCoordinator jobCoordinator, final L2GatewayCache l2GatewayCache) {
-        super(TransportZone.class, L2GwTransportZoneListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(TransportZones.class)
+                .child(TransportZone.class), Executors.newSingleThreadExecutor("L2GwTransportZoneListener", LOG));
         this.dataBroker = dataBroker;
         this.itmRpcService = itmRpcService;
         this.jobCoordinator = jobCoordinator;
         this.l2GatewayCache = l2GatewayCache;
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.opendaylight.vpnservice.datastoreutils.
-     * AsyncDataTreeChangeListenerBase#getWildCardPath()
-     */
     @Override
-    protected InstanceIdentifier<TransportZone> getWildCardPath() {
-        return InstanceIdentifier.create(TransportZones.class).child(TransportZone.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     /*
@@ -79,7 +73,7 @@ public class L2GwTransportZoneListener
      * org.opendaylight.yangtools.yang.binding.DataObject)
      */
     @Override
-    protected void remove(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModification) {
+    public void remove(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModification) {
         // do nothing
     }
 
@@ -93,7 +87,7 @@ public class L2GwTransportZoneListener
      * org.opendaylight.yangtools.yang.binding.DataObject)
      */
     @Override
-    protected void update(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModificationBefore,
+    public void update(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModificationBefore,
                           TransportZone dataObjectModificationAfter) {
         // do nothing
     }
@@ -107,7 +101,7 @@ public class L2GwTransportZoneListener
      * org.opendaylight.yangtools.yang.binding.DataObject)
      */
     @Override
-    protected void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
+    public void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
         LOG.trace("Received Transport Zone Add Event: {}", tzNew);
         if (TunnelTypeVxlan.class.equals(tzNew.getTunnelType())) {
             AddL2GwDevicesToTransportZoneJob job =
@@ -116,14 +110,4 @@ public class L2GwTransportZoneListener
         }
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.opendaylight.vpnservice.datastoreutils.
-     * AsyncDataTreeChangeListenerBase#getDataTreeChangeListener()
-     */
-    @Override
-    protected L2GwTransportZoneListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 4b02df85ff1b880e04241000891859b96fa9c841..793d850582d7f0fe179f05671f29ec7553005159 100644 (file)
@@ -4,7 +4,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default" />
   <reference id="iElanService"
              interface="org.opendaylight.netvirt.elanmanager.api.IElanService" />
index 6c08cdea5f8c1ad00b21fae72990f56a93d02200..2ac4da2b854b77749b4c94692cfae6edffd8130a 100644 (file)
@@ -12,26 +12,25 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.Futures;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.infrautils.caches.baseimpl.internal.CacheManagersRegistryImpl;
 import org.opendaylight.infrautils.caches.guava.internal.GuavaCacheProvider;
 import org.opendaylight.infrautils.jobcoordinator.internal.JobCoordinatorImpl;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.metrics.testimpl.TestMetricProviderImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 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.inet.types.rev130715.Ipv4Address;
@@ -48,6 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.por
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
+import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -64,7 +64,7 @@ public class NeutronPortChangeListenerTest {
     @Mock
     WriteTransaction mockWriteTx;
     @Mock
-    ReadOnlyTransaction mockReadTx;
+    ReadTransaction mockReadTx;
     @Mock
     Network mockNetwork;
     @Mock
@@ -91,7 +91,7 @@ public class NeutronPortChangeListenerTest {
     public void setUp() {
         doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
         when(mockReadTx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
-            .thenReturn(Futures.immediateCheckedFuture(Optional.of(mockNetwork)));
+            .thenReturn(FluentFutures.immediateFluentFuture(Optional.of(mockNetwork)));
         neutronPortChangeListener = new NeutronPortChangeListener(dataBroker, neutronvpnManager, neutronvpnNatManager,
                 gwMacResolver, elanService, jobCoordinator, new NeutronvpnUtils(dataBroker, idManager, jobCoordinator,
                         ipV6InternetDefRt),
index 62d8da89b54bd3da5098006685389d1eeffbbe35..b799cf72ca105c6ea432e513b5ae373067be7124 100644 (file)
@@ -8,15 +8,15 @@
 
 package org.opendaylight.netvirt.neutronvpn.shell;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
 import java.util.Collections;
 import java.util.List;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DhcpConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DhcpConfigBuilder;
index d44bbd8af6487c94d2e10c71a5c743fac90b460a..3f41ab4babb02dcd2e0ea73f2f79e656a04ad888 100644 (file)
@@ -8,12 +8,12 @@
 
 package org.opendaylight.netvirt.neutronvpn.shell;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DhcpConfig;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
index 25449f51cb248e8e0c93955f73d38f906b763d1a..4b6f8edae1df04146ca6fc0779ee649e560d120d 100644 (file)
@@ -7,23 +7,24 @@
  */
 package org.opendaylight.netvirt.neutronvpn.shell;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
 import static org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker.syncReadOptional;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.SubnetOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.SubnetOpDataEntry;
@@ -100,7 +101,7 @@ public class ShowSubnet extends OsgiCommandSupport {
             Optional<SubnetOpDataEntry> optionalSubnetOpDataEntries =
                 syncReadOptional(dataBroker, OPERATIONAL, subOpIdentifier);
             if (optionalSubnetOpDataEntries.isPresent()) {
-                optionalSubnetOpDataEntries.asSet().forEach(subnetOpDataEntry -> {
+                Collections.singleton(optionalSubnetOpDataEntries.get()).forEach(subnetOpDataEntry -> {
                     SubnetOpDataEntry data = subnetOpDataEntry;
                     System.out.println("Fetching subnetmapdataentry for given subnetId\n");
                     System.out.println("------------------------"
@@ -251,7 +252,7 @@ public class ShowSubnet extends OsgiCommandSupport {
     }
 
     @SuppressWarnings("checkstyle:RegexpSinglelineJava")
-    private void getSubnet() throws ReadFailedException {
+    private void getSubnet() throws ExecutionException, InterruptedException {
         List<SubnetOpDataEntry> subnetOpDataEntryList = new ArrayList<>();
         InstanceIdentifier<Subnetmaps> subnetmapsid = InstanceIdentifier.builder(Subnetmaps.class).build();
         InstanceIdentifier<SubnetOpData> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).build();
index c0f6b0b95d316442b1c291be8b6d3f844d6a8fca..d311a86cf6df602dc9e6ecc93a0d941080cd384a 100644 (file)
@@ -7,18 +7,19 @@
  */
 package org.opendaylight.netvirt.neutronvpn.shell;
 
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
-import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
 import static org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker.syncReadOptional;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
+import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPortKey;
@@ -116,7 +117,7 @@ public class ShowVpnIpToPort extends OsgiCommandSupport {
     }
 
     @SuppressWarnings("checkstyle:RegexpSinglelineJava")
-    private void getNeutronVpnPort() throws ReadFailedException {
+    private void getNeutronVpnPort() throws ExecutionException, InterruptedException {
         InstanceIdentifier<NeutronVpnPortipPortData> neutronVpnPortipPortDataIdentifier = InstanceIdentifier
                 .builder(NeutronVpnPortipPortData.class).build();
         Optional<NeutronVpnPortipPortData> optionalNeutronVpnPort = syncReadOptional(dataBroker, CONFIGURATION,
@@ -129,7 +130,7 @@ public class ShowVpnIpToPort extends OsgiCommandSupport {
     }
 
     @SuppressWarnings("checkstyle:RegexpSinglelineJava")
-    private void getLearntVpnVipPort() throws ReadFailedException {
+    private void getLearntVpnVipPort() throws ExecutionException, InterruptedException {
         InstanceIdentifier<LearntVpnVipToPortData> learntVpnVipPortDataIdentifier = InstanceIdentifier
                 .builder(LearntVpnVipToPortData.class).build();
         Optional<LearntVpnVipToPortData> optionalLearntVpnPort = syncReadOptional(dataBroker, OPERATIONAL,
index 87394b8ebb689066439bbe03fde3f5373d956cae..9352a0837eb61855e7f21ad059db2de176bda6b2 100644 (file)
@@ -14,7 +14,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
                availability="optional"/>
     <reference id="rpcRegistryRef" interface="org.opendaylight.mdsal.binding.api.RpcConsumerRegistry"
                availability="optional"/>
-    <reference id="dataBrokerRef" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+    <reference id="dataBrokerRef" interface="org.opendaylight.mdsal.binding.api.DataBroker"
                availability="optional"/>
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
 
index 1eeec5fae1889b82de0314b5e9ca6f7828e3c549..e0f9f0d8f3dbb789ea8e72be8210063900c0682a 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.netvirt.policyservice;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.Collections;
 import java.util.List;
@@ -18,8 +18,8 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
 import org.opendaylight.genius.mdsalutil.MatchInfoBase;
@@ -167,14 +167,14 @@ public class PolicyAceFlowProgrammer {
             }
         }
 
-        return Optional.absent();
+        return Optional.empty();
     }
 
     private Optional<PolicyAceFlowWrapper> getIngressInterfaceFlow(IngressInterface ingressInterface) {
         String interfaceName = ingressInterface.getName();
         if (interfaceName == null) {
             LOG.error("Invalid ingress interface augmentation. missing interface name");
-            return Optional.absent();
+            return Optional.empty();
         }
 
         String flowName = "INGRESS_INTERFACE_" + interfaceName;
@@ -209,7 +209,7 @@ public class PolicyAceFlowProgrammer {
         Class<? extends ServiceTypeBase> serviceType = service.getServiceType();
         if (serviceName == null || serviceType == null) {
             LOG.error("Invalid policy service augmentation {}", service);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         if (serviceType.isAssignableFrom(L2vpnServiceType.class)) {
@@ -234,6 +234,6 @@ public class PolicyAceFlowProgrammer {
                     PolicyServiceConstants.POLICY_ACL_L3VPN_FLOW_PRIOPITY));
         }
 
-        return Optional.absent();
+        return Optional.empty();
     }
 }
index 6945e60d6d9bc3a888161afa82b0a637c938b446..aedbe67410a9e4aa890a5f48041e80a5802e3bfb 100644 (file)
@@ -8,14 +8,14 @@
 
 package org.opendaylight.netvirt.policyservice;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.Collections;
 import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
 import org.opendaylight.genius.mdsalutil.MatchInfoBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
index 6b56bce8f55604262c502cd63ada2636e6e78fd3..0f9ec460918bd71bd963850ca7cbd3a66318bc91 100644 (file)
@@ -13,8 +13,8 @@ import java.util.Collections;
 import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.netvirt.policyservice.util.PolicyServiceFlowUtil;
 import org.opendaylight.netvirt.policyservice.util.PolicyServiceUtil;
index 2a1874f567038b0268babb276db69ea8500790a6..bac046dae90249ae83df7a00eecc352d4e61313b 100644 (file)
@@ -8,14 +8,14 @@
 
 package org.opendaylight.netvirt.policyservice.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.netvirt.policyservice.PolicyAceFlowProgrammer;
index 50d1615c08aea6b75f6ef8512f04bacb8055b8ee..a375d44efb92c8497591cea25323031156f6ea1a 100644 (file)
@@ -13,9 +13,9 @@ import java.util.Collections;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
index 918f144ab7f8a38ed3ba16aa728237c7f2077769..5eae4e22430684d8d595e4101985af28e57cfc0d 100644 (file)
@@ -8,15 +8,15 @@
 
 package org.opendaylight.netvirt.policyservice.listeners;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.netvirt.policyservice.PolicyAceFlowProgrammer;
index c360f1585486a4252e68eb03e30a330f7769d0ed..6209595e83a848874e81151ccd2308442634ae8c 100644 (file)
@@ -14,8 +14,8 @@ import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceServiceUtil;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
index 80d0507c890fdce702b5a9ab91ad9f75f2df6b45..bcffbbc529f5767babd5fc94b6ccd0f308169873 100644 (file)
@@ -20,8 +20,8 @@ import java.util.Optional;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
 import org.opendaylight.netvirt.elanmanager.api.IElanBridgeManager;
index c27a00f27d903f258b57ed4f14f50be157181297..c0e2de38f66a7775f6a9c6c3e8976dc15784410b 100644 (file)
@@ -15,8 +15,8 @@ import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.netvirt.policyservice.PolicyAceFlowProgrammer;
index 032617ff8168cd3103120005e4c7335de8abdfdd..adecf0041451a537462275406c4e408a1e232e55 100644 (file)
@@ -16,7 +16,7 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
index d4345af43dc8a2c9c170ec62181a377d01488242..ff98e53fdc281c47a4f0abadf9ff63c1f63baffa 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.netvirt.policyservice.util;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.Collections;
@@ -21,10 +21,10 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -106,7 +106,7 @@ public class PolicyServiceUtil {
         SetPolicyClassifier setPolicyClassifier = actions.augmentation(SetPolicyClassifier.class);
         if (setPolicyClassifier == null) {
             LOG.warn("No valid policy action found for ACE rule {}", ace.getRuleName());
-            return Optional.absent();
+            return Optional.empty();
         }
 
         Class<? extends DirectionBase> direction;
@@ -114,12 +114,12 @@ public class PolicyServiceUtil {
             direction = setPolicyClassifier.getDirection();
         } catch (IllegalArgumentException e) {
             LOG.warn("Failed to parse policy classifier direction");
-            return Optional.absent();
+            return Optional.empty();
         }
 
         if (direction == null || !direction.isAssignableFrom(DirectionEgress.class)) {
             LOG.trace("Ignoring non egress policy ACE rule {}", ace.getRuleName());
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return Optional.of(setPolicyClassifier.getPolicyClassifier());
@@ -130,9 +130,9 @@ public class PolicyServiceUtil {
         try {
             return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
                     identifier);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get policy ACE rule {} for ACL {}", ruleName, aclName);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
@@ -142,7 +142,7 @@ public class PolicyServiceUtil {
             Optional<PolicyProfiles> optProfiles = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.CONFIGURATION, identifier);
             return optProfiles.isPresent() ? optProfiles.get().getPolicyProfile() : Collections.emptyList();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get policy profiles");
             return Collections.emptyList();
         }
@@ -155,7 +155,7 @@ public class PolicyServiceUtil {
                     LogicalDatastoreType.CONFIGURATION, identifier);
             return optProfile.isPresent() ? getUnderlayNetworksFromPolicyRoutes(optProfile.get().getPolicyRoute())
                     : Collections.emptyList();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get policy routes for classifier {}", policyClassifier);
             return Collections.emptyList();
         }
@@ -168,7 +168,7 @@ public class PolicyServiceUtil {
             Optional<UnderlayNetwork> optUnderlayNet = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, identifier);
             return optUnderlayNet.isPresent() ? optUnderlayNet.get().getPolicyProfile() : Collections.emptyList();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get policy classifiers for underlay network {}", underlayNetwork);
             return Collections.emptyList();
         }
@@ -181,7 +181,7 @@ public class PolicyServiceUtil {
             Optional<PolicyProfile> optProfile = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, identifier);
             return optProfile.isPresent() ? optProfile.get().getPolicyAclRule() : Collections.emptyList();
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get policy rules for policy classifier {}", policyClassifier);
             return Collections.emptyList();
         }
@@ -375,7 +375,7 @@ public class PolicyServiceUtil {
                     .syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier)
                     .toJavaUtil().map(UnderlayNetwork::getDpnToInterface)
                     .orElse(Collections.emptyList());
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get DPNs for underlay network {}", underlayNetwork);
             return Collections.emptyList();
         }
@@ -387,9 +387,9 @@ public class PolicyServiceUtil {
             Optional<DpnToInterface> dpnToInterfaceOpt = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, identifier);
             return dpnToInterfaceOpt;
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to get DPN {} for underlay network {}", dpId, underlayNetwork);
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 
@@ -456,14 +456,14 @@ public class PolicyServiceUtil {
         Optional<String> logicalTunnelNameOpt = getLogicalTunnelName(srcDpId, dstDpId);
         if (!logicalTunnelNameOpt.isPresent()) {
             LOG.debug("Failed to get logical tunnel for source DPN {} dst DPN {}", srcDpId, dstDpId);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         String logicalTunnelName = logicalTunnelNameOpt.get();
         InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(logicalTunnelName);
         if (interfaceInfo == null) {
             LOG.debug("Failed to get interface info for logical tunnel {}", logicalTunnelName);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return Optional.of(interfaceInfo.getInterfaceTag());
@@ -481,7 +481,7 @@ public class PolicyServiceUtil {
             LOG.error("Error in RPC call getTunnelInterfaceName for source DPN {} dst DPN {}", srcDpId, dstDpId, e);
         }
 
-        return Optional.absent();
+        return Optional.empty();
     }
 
 
@@ -489,7 +489,7 @@ public class PolicyServiceUtil {
         List<Interface> vlanMemberInterfaces = interfaceManager.getChildInterfaces(trunkInterface);
         if (vlanMemberInterfaces == null || vlanMemberInterfaces.isEmpty()) {
             LOG.debug("No child interfaces found for trunk {}", trunkInterface);
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return vlanMemberInterfaces.stream()
index 722db1d1082fa1e1ab37bae173e9133885fe6809..1f610ce8cbd136eaab94e8dc771d193e2778bfd3 100644 (file)
@@ -5,7 +5,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-    interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" />
+    interface="org.opendaylight.mdsal.binding.api.DataBroker" />
   <reference id="iMdsalApiManager"
     interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
   <reference id="iInterfaceManager"
index 74bf2a302329a0de9538c4b0dcf708ee284f8a6f..bd45784052f9bd64d85988afe61959f7914caa09 100644 (file)
@@ -8,12 +8,13 @@
 
 package org.opendaylight.netvirt.qosservice;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.qosalert.config.rev170301.QosalertConfig;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -21,8 +22,7 @@ import org.slf4j.LoggerFactory;
 
 
 @Singleton
-public class QosAlertConfigListener  extends
-        AsyncClusteredDataTreeChangeListenerBase<QosalertConfig, QosAlertConfigListener> {
+public class QosAlertConfigListener  extends AbstractClusteredAsyncDataTreeChangeListener<QosalertConfig> {
 
     private static final Logger LOG = LoggerFactory.getLogger(QosAlertConfigListener.class);
     private final DataBroker dataBroker;
@@ -30,45 +30,40 @@ public class QosAlertConfigListener  extends
 
     @Inject
     public QosAlertConfigListener(final DataBroker dataBroker, final QosAlertManager qosAlertManager) {
-        super(QosalertConfig.class, QosAlertConfigListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(QosalertConfig.class),
+                Executors.newListeningSingleThreadExecutor("QosAlertConfigListener", LOG));
         this.dataBroker = dataBroker;
         this.qosAlertManager = qosAlertManager;
         LOG.trace("{} created",  getClass().getSimpleName());
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<QosalertConfig> getWildCardPath() {
-        return InstanceIdentifier.create(QosalertConfig.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig del) {
+    public void remove(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig del) {
         LOG.debug("QosalertConfig removed: {}", del);
         qosAlertManager.restoreDefaultConfig();
     }
 
     @Override
-    protected void update(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig original,
+    public void update(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig original,
                                                                                 QosalertConfig update) {
         LOG.debug("QosalertConfig changed to {}", update);
         qosAlertManager.setQosalertConfig(update);
     }
 
     @Override
-    protected void add(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig add) {
+    public void add(InstanceIdentifier<QosalertConfig> identifier, QosalertConfig add) {
         LOG.debug("QosalertConfig added {}", add);
         qosAlertManager.setQosalertConfig(add);
     }
-
-    @Override
-    protected QosAlertConfigListener getDataTreeChangeListener() {
-        return this;
-    }
-
 }
index 5f6232e94cf4c2454eb6f936f03342500e407e8d..2fe9cad325a9dfe56603c103ef605f1848fbe84e 100644 (file)
@@ -8,8 +8,8 @@
 
 package org.opendaylight.netvirt.qosservice;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import java.util.List;
 import java.util.Map.Entry;
@@ -23,13 +23,13 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetNodeConnectorStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService;
index 66a10fa313b41ce89c4eec7493dd4da2351d9dd9..fe6acdb814b42b5bc0fe8622ad1a2d8db1a190a2 100644 (file)
@@ -8,20 +8,21 @@
 
 package org.opendaylight.netvirt.qosservice;
 
-import com.google.common.base.Optional;
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -35,8 +36,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Interface,
-        QosInterfaceStateChangeListener> implements RecoverableListener {
+public class QosInterfaceStateChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Interface>
+        implements RecoverableListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(QosInterfaceStateChangeListener.class);
 
@@ -54,7 +55,9 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
                                            final ServiceRecoveryRegistry serviceRecoveryRegistry,
                                            final QosServiceRecoveryHandler qosServiceRecoveryHandler,
                                            final JobCoordinator jobCoordinator) {
-        super(Interface.class, QosInterfaceStateChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("QosInterfaceStateChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.uuidUtil = new UuidUtil();
         this.qosAlertManager = qosAlertManager;
@@ -66,30 +69,31 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
         LOG.trace("{} created",  getClass().getSimpleName());
     }
 
-    @PostConstruct
     public void init() {
-        registerListener();
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    public void registerListener() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    public void registerListener() {
+        super.register();
     }
 
     @Override
-    protected QosInterfaceStateChangeListener getDataTreeChangeListener() {
-        return QosInterfaceStateChangeListener.this;
+    public void deregisterListener() {
+        super.close();
     }
 
+
     @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         if (L2vlan.class.equals(intrf.getType())) {
             final String interfaceName = intrf.getName();
             getNeutronPort(interfaceName).ifPresent(port -> {
@@ -116,7 +120,6 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
 
     private java.util.Optional<Port> getNeutronPort(String portName) {
         return uuidUtil.newUuidIfValidPattern(portName)
-                .toJavaUtil()
                 .map(qosNeutronUtils::getNeutronPort);
     }
 
@@ -126,7 +129,7 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
         if (uuid.isPresent()) {
             Port port = qosNeutronUtils.getNeutronPort(portName);
             if (port != null) {
-                return Optional.fromJavaUtil(uuid.toJavaUtil().map(qosNeutronUtils::getNeutronPort));
+                return Optional.ofNullable(uuid.map(qosNeutronUtils::getNeutronPort).orElse(null));
             }
             if (qosNeutronUtils.isBindServiceDone(uuid)) {
                 LOG.trace("Qos Service : interface {} clearing stale flow entries if any", portName);
@@ -139,15 +142,15 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
                 });
             }
         }
-        return Optional.absent();
+        return Optional.empty();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         if (L2vlan.class.equals(intrf.getType())) {
             final String interfaceName = intrf.getName();
             // Guava Optional asSet().forEach() emulates Java 8 Optional ifPresent()
-            getNeutronPortForRemove(intrf).asSet().forEach(port -> {
+            getNeutronPortForRemove(intrf).stream().forEach(port -> {
                 LOG.trace("Qos Service : Received interface {} PORT DOWN event ", interfaceName);
 
                 String lowerLayerIf = intrf.getLowerLayerIf().get(0);
@@ -171,7 +174,7 @@ public class QosInterfaceStateChangeListener extends AsyncClusteredDataTreeChang
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
+    public void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
         if (original.getType() == null && L2vlan.class.equals(update.getType())) {
             // IfType was missing at creation, add it now
             add(identifier, update);
index 54ffb1558586f0638fa6209d46dd3c5a6c0b96d7..8febbe0a255977451dad774a640cb2be38e3c810 100644 (file)
@@ -8,15 +8,16 @@
 package org.opendaylight.netvirt.qosservice;
 
 import java.util.Objects;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtension;
@@ -26,8 +27,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Network,
-        QosNeutronNetworkChangeListener> implements RecoverableListener {
+public class QosNeutronNetworkChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Network>
+        implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(QosNeutronNetworkChangeListener.class);
     private final DataBroker dataBroker;
     private final QosNeutronUtils qosNeutronUtils;
@@ -37,7 +38,9 @@ public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChang
                                            final QosNeutronUtils qosNeutronUtils,
                                            final ServiceRecoveryRegistry serviceRecoveryRegistry,
                                            final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
-        super(Network.class, QosNeutronNetworkChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Networks.class).child(Network.class),
+                Executors.newListeningSingleThreadExecutor("QosNeutronNetworkChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.qosNeutronUtils = qosNeutronUtils;
         serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
@@ -45,34 +48,34 @@ public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChang
         LOG.trace("{} created",  getClass().getSimpleName());
     }
 
-    @PostConstruct
     public void init() {
-        registerListener();
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InstanceIdentifier<Network> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Networks.class).child(Network.class);
+    public void registerListener() {
+        super.register();
     }
 
     @Override
-    protected QosNeutronNetworkChangeListener getDataTreeChangeListener() {
-        return QosNeutronNetworkChangeListener.this;
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Network> instanceIdentifier, Network network) {
+    public void remove(InstanceIdentifier<Network> instanceIdentifier, Network network) {
         qosNeutronUtils.removeFromNetworkCache(network);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Network> instanceIdentifier, Network original, Network update) {
+    public void update(InstanceIdentifier<Network> instanceIdentifier, Network original, Network update) {
         qosNeutronUtils.addToNetworkCache(update);
 
         QosNetworkExtension updateQos = update.augmentation(QosNetworkExtension.class);
@@ -95,7 +98,7 @@ public class QosNeutronNetworkChangeListener extends AsyncClusteredDataTreeChang
     }
 
     @Override
-    protected void add(InstanceIdentifier<Network> instanceIdentifier, Network network) {
+    public void add(InstanceIdentifier<Network> instanceIdentifier, Network network) {
         qosNeutronUtils.addToNetworkCache(network);
 
         QosNetworkExtension networkQos = network.augmentation(QosNetworkExtension.class);
index 19f243e3d9207367a6089718d5f7e79400978cf8..08ba90b9f7db85143640eeaef365dc1eb888b2a0 100644 (file)
@@ -9,17 +9,18 @@ package org.opendaylight.netvirt.qosservice;
 
 import java.util.Collections;
 import java.util.Objects;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
@@ -32,8 +33,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeListenerBase<Port,
-                                             QosNeutronPortChangeListener> implements RecoverableListener {
+public class QosNeutronPortChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<Port>
+        implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(QosNeutronPortChangeListener.class);
     private final DataBroker dataBroker;
     private final QosNeutronUtils qosNeutronUtils;
@@ -46,7 +47,9 @@ public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeLi
                                         final ServiceRecoveryRegistry serviceRecoveryRegistry,
                                         final QosEosHandler qosEosHandler,
                                         final JobCoordinator jobCoordinator) {
-        super(Port.class, QosNeutronPortChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(Ports.class).child(Port.class),
+                Executors.newListeningSingleThreadExecutor("QosNeutronPortChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.qosNeutronUtils = qosNeutronUtils;
         this.qosEosHandler = qosEosHandler;
@@ -56,39 +59,39 @@ public class QosNeutronPortChangeListener extends AsyncClusteredDataTreeChangeLi
         LOG.trace("{} created",  getClass().getSimpleName());
     }
 
-    @PostConstruct
     public void init() {
-        registerListener();
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<Port> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        super.register();
     }
 
     @Override
-    protected QosNeutronPortChangeListener getDataTreeChangeListener() {
-        return QosNeutronPortChangeListener.this;
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void add(InstanceIdentifier<Port> instanceIdentifier, Port port) {
+    public void add(InstanceIdentifier<Port> instanceIdentifier, Port port) {
         qosNeutronUtils.addToPortCache(port);
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Port> instanceIdentifier, Port port) {
+    public void remove(InstanceIdentifier<Port> instanceIdentifier, Port port) {
         qosNeutronUtils.removeFromPortCache(port);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Port> instanceIdentifier, Port original, Port update) {
+    public void update(InstanceIdentifier<Port> instanceIdentifier, Port original, Port update) {
         qosNeutronUtils.addToPortCache(update);
         // check for QoS updates
         QosPortExtension updateQos = update.augmentation(QosPortExtension.class);
index 2b33946d479a9d4177727aa2016e04acfc3bab49..7ffe635a1eebb60fccb3f0a43933b41df3ec1adc 100644 (file)
@@ -10,12 +10,12 @@ package org.opendaylight.netvirt.qosservice;
 import static java.util.Collections.emptyList;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -25,8 +25,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -46,6 +45,8 @@ import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
@@ -643,12 +644,13 @@ public class QosNeutronUtils {
 
     @Nullable
     private BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier) {
-        return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker)
+                .orElse(null);
     }
 
     @Nullable
     private BridgeRefEntry getBridgeRefEntryFromOperDS(InstanceIdentifier<BridgeRefEntry> dpnBridgeEntryIid) {
-        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid, dataBroker).orNull();
+        return MDSALUtil.read(LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid, dataBroker).orElse(null);
     }
 
     @Nullable
@@ -728,8 +730,14 @@ public class QosNeutronUtils {
 
     public org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state
             .@Nullable Interface getInterfaceStateFromOperDS(String interfaceName) {
-        return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                createInterfaceStateInstanceIdentifier(interfaceName)).orNull();
+        try {
+            return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    createInterfaceStateInstanceIdentifier(interfaceName)).orElse(null);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getInterfaceStateFromOperDS: Exception while reading interface DS for the interface {}",
+                    interfaceName, e);
+        }
+        return null;
     }
 
     @NonNull
index 9ce569953026f995dcef5539323d4dcfc4a269e1..b7758a9e00c7bdca83c230b2345e23dda8198107 100644 (file)
@@ -9,12 +9,9 @@ package org.opendaylight.netvirt.qosservice;
 
 import java.util.ArrayList;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
@@ -24,9 +21,13 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -37,7 +38,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class QosNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapableNode, QosNodeListener>
+public class QosNodeListener extends AbstractAsyncDataTreeChangeListener<FlowCapableNode>
         implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(QosNodeListener.class);
 
@@ -48,7 +49,9 @@ public class QosNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapable
     public QosNodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalUtils,
                            final ServiceRecoveryRegistry serviceRecoveryRegistry,
                            final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
-        super(FlowCapableNode.class, QosNodeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Nodes.class).child(Node.class)
+                .augmentation(FlowCapableNode.class),
+                Executors.newListeningSingleThreadExecutor("QosNodeListener", LOG));
         this.dataBroker = dataBroker;
         this.mdsalUtils = mdsalUtils;
         serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
@@ -56,46 +59,45 @@ public class QosNodeListener extends AsyncDataTreeChangeListenerBase<FlowCapable
         LOG.trace("{} created",  getClass().getSimpleName());
     }
 
-    @Override
-    @PostConstruct
     public void init() {
-        registerListener();
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
+    @Override
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
     @Override
     public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        super.register();
     }
 
     @Override
-    protected InstanceIdentifier<FlowCapableNode> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class);
+    public void deregisterListener() {
+        super.close();
     }
 
     @Override
-    protected void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void remove(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         //do nothing
     }
 
     @Override
-    protected void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
+    public void update(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModificationBefore,
                           FlowCapableNode dataObjectModificationAfter) {
         //do nothing
     }
 
     @Override
-    protected void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
+    public void add(InstanceIdentifier<FlowCapableNode> key, FlowCapableNode dataObjectModification) {
         NodeKey nodeKey = key.firstKeyOf(Node.class);
         Uint64 dpId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
         createTableMissEntry(dpId);
     }
 
-    @Override
-    protected QosNodeListener getDataTreeChangeListener() {
-        return QosNodeListener.this;
-    }
-
     public void createTableMissEntry(Uint64 dpnId) {
         List<MatchInfo> matches = new ArrayList<>();
         List<InstructionInfo> instructions = new ArrayList<>();
index 28f2dc2ab13a8ad51ac87e693afc246c1ebbbab2..04878b80c5105666b3db918c3fca194ac957f7ef 100644 (file)
@@ -11,27 +11,23 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
-import org.opendaylight.netvirt.neutronvpn.api.utils.ChangeUtils;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.qosservice.recovery.QosServiceRecoveryHandler;
 import org.opendaylight.serviceutils.srm.RecoverableListener;
 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
@@ -40,19 +36,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.a
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.QosRuleTypesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.QosPolicy;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRules;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRulesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.DscpmarkingRules;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.rule.types.RuleTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.rule.types.RuleTypesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListenerBase<QosPolicy,
-                                                QosPolicyChangeListener> implements RecoverableListener {
+public class QosPolicyChangeListener extends AbstractClusteredAsyncDataTreeChangeListener<QosPolicy>
+        implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(QosPolicyChangeListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -64,7 +58,9 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
                                    final QosNeutronUtils qosNeutronUtils, final JobCoordinator jobCoordinator,
                                    final ServiceRecoveryRegistry serviceRecoveryRegistry,
                                    final QosServiceRecoveryHandler qosServiceRecoveryHandler) {
-        super(QosPolicy.class, QosPolicyChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Neutron.class)
+                .child(QosPolicies.class).child(QosPolicy.class),
+                Executors.newListeningSingleThreadExecutor("QosPolicyChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.qosNeutronUtils = qosNeutronUtils;
@@ -72,25 +68,31 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         serviceRecoveryRegistry.addRecoverableListener(qosServiceRecoveryHandler.buildServiceRegistryKey(),
                 this);
         LOG.trace("{} created",  getClass().getSimpleName());
+        init();
     }
 
-    @PostConstruct
     public void init() {
-        registerListener();
         supportedQoSRuleTypes();
         LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    public void registerListener() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InstanceIdentifier<QosPolicy> getWildCardPath() {
-        return InstanceIdentifier.create(Neutron.class).child(QosPolicies.class).child(QosPolicy.class);
+    public void registerListener() {
+        super.register();
     }
 
+    @Override
+    public void deregisterListener() {
+        super.close();
+    }
+/*
     @Override
     public void onDataTreeChanged(Collection<DataTreeModification<QosPolicy>> changes) {
         handleQosPolicyChanges(changes);
@@ -98,11 +100,6 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         handleDscpMarkingRulesChanges(changes);
     }
 
-    @Override
-    protected QosPolicyChangeListener getDataTreeChangeListener() {
-        return QosPolicyChangeListener.this;
-    }
-
     private void handleQosPolicyChanges(Collection<DataTreeModification<QosPolicy>> changes) {
         Map<InstanceIdentifier<QosPolicy>, QosPolicy> qosPolicyOriginalMap =
                 ChangeUtils.extractOriginal(changes, QosPolicy.class);
@@ -157,10 +154,10 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
                 ChangeUtils.extractRemoved(changes, DscpmarkingRules.class)) {
             remove(dscpMarkIid, dscpMarkOriginalMap.get(dscpMarkIid));
         }
-    }
+    }*/
 
     @Override
-    protected void add(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
+    public void add(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
         LOG.debug("Adding  QosPolicy : key: {}, value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(),input);
         qosNeutronUtils.addToQosPolicyCache(input);
@@ -182,7 +179,7 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         }
     }
 
-    private void add(InstanceIdentifier<DscpmarkingRules> identifier, DscpmarkingRules input) {
+/*    private void add(InstanceIdentifier<DscpmarkingRules> identifier, DscpmarkingRules input) {
         LOG.debug("Adding DscpMarkingRules : key: {}, value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), input);
 
@@ -198,16 +195,16 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
                 return Collections.emptyList();
             });
         }
-    }
+    }*/
 
     @Override
-    protected void remove(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
+    public void remove(InstanceIdentifier<QosPolicy> identifier, QosPolicy input) {
         LOG.debug("Removing QosPolicy : key: {}, value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), input);
         qosNeutronUtils.removeFromQosPolicyCache(input);
     }
 
-    private void remove(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
+/*    private void remove(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules input) {
         LOG.debug("Removing BandwidthLimitRules : key: {}, value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), input);
 
@@ -225,9 +222,9 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
                     txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
                         tx -> qosNeutronUtils.setPortBandwidthLimits(port, zeroBwLimitRule, tx))));
         }
-    }
+    }*/
 
-    private void remove(InstanceIdentifier<DscpmarkingRules> identifier,DscpmarkingRules input) {
+/*    private void remove(InstanceIdentifier<DscpmarkingRules> identifier,DscpmarkingRules input) {
         LOG.debug("Removing DscpMarkingRules : key: {}, value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), input);
 
@@ -243,7 +240,7 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
                 return Collections.emptyList();
             });
         }
-    }
+    }*/
 
     public void reapplyPolicy(String entityid) {
         Uuid policyUuid = Uuid.getDefaultInstance(entityid);
@@ -268,20 +265,20 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
     }
 
     @Override
-    protected void update(InstanceIdentifier<QosPolicy> identifier, QosPolicy original, QosPolicy update) {
+    public void update(InstanceIdentifier<QosPolicy> identifier, QosPolicy original, QosPolicy update) {
         LOG.debug("Updating QosPolicy : key: {}, original value={}, update value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), original, update);
         qosNeutronUtils.addToQosPolicyCache(update);
     }
 
-    private void update(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules original,
+/*    private void update(InstanceIdentifier<BandwidthLimitRules> identifier, BandwidthLimitRules original,
                         BandwidthLimitRules update) {
         LOG.debug("Updating BandwidthLimitRules : key: {}, original value={}, update value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), original,
                 update);
         Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
         update(qosUuid, update);
-    }
+    }*/
 
     private void update(Uuid qosUuid, BandwidthLimitRules update) {
         for (Network network : qosNeutronUtils.getQosNetworks(qosUuid)) {
@@ -295,13 +292,13 @@ public class QosPolicyChangeListener extends AsyncClusteredDataTreeChangeListene
         }
     }
 
-    private void update(InstanceIdentifier<DscpmarkingRules> identifier, DscpmarkingRules original,
+/*    private void update(InstanceIdentifier<DscpmarkingRules> identifier, DscpmarkingRules original,
                         DscpmarkingRules update) {
         LOG.debug("Updating DscpMarkingRules : key: {}, original value={}, update value={}",
                 identifier.firstKeyOf(QosPolicy.class).getUuid().getValue(), original, update);
         Uuid qosUuid = identifier.firstKeyOf(QosPolicy.class).getUuid();
         update(qosUuid, update);
-    }
+    }*/
 
     private void update(Uuid qosUuid, DscpmarkingRules update) {
         for (Network network : qosNeutronUtils.getQosNetworks(qosUuid)) {
index 4cea57824c641209dee7ac5ff6459cfabd70d91e..b8f6273a1ba739f08eaa12baaee417586ac490a2 100644 (file)
@@ -11,17 +11,18 @@ package org.opendaylight.netvirt.qosservice;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.Collections;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.QosPolicy;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRules;
@@ -39,7 +40,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class QosTerminationPointListener extends
-        AsyncClusteredDataTreeChangeListenerBase<OvsdbTerminationPointAugmentation, QosTerminationPointListener> {
+        AbstractClusteredAsyncDataTreeChangeListener<OvsdbTerminationPointAugmentation> {
     private static final Logger LOG = LoggerFactory.getLogger(QosTerminationPointListener.class);
     private static final String EXTERNAL_ID_INTERFACE_ID = "iface-id";
     private final DataBroker dataBroker;
@@ -55,7 +56,11 @@ public class QosTerminationPointListener extends
                                        final QosEosHandler qosEosHandler,
                                        final QosAlertManager qosAlertManager,
                                        final JobCoordinator jobCoordinator) {
-        super(OvsdbTerminationPointAugmentation.class, QosTerminationPointListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID))
+                .child(Node.class).child(TerminationPoint.class)
+                .augmentation(OvsdbTerminationPointAugmentation.class),
+                Executors.newListeningSingleThreadExecutor("QosTerminationPointListener", LOG));
         this.dataBroker = dataBroker;
         this.qosNeutronUtils = qosNeutronUtils;
         this.qosEosHandler = qosEosHandler;
@@ -64,21 +69,19 @@ public class QosTerminationPointListener extends
         this.jobCoordinator = jobCoordinator;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        LOG.trace("{} init and registerListener done", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<OvsdbTerminationPointAugmentation> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(SouthboundUtils.OVSDB_TOPOLOGY_ID))
-                .child(Node.class).child(TerminationPoint.class)
-                .augmentation(OvsdbTerminationPointAugmentation.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
+    public void remove(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
                           OvsdbTerminationPointAugmentation tp) {
         if (isBandwidthRuleApplied(tp)) {
             String ifaceId = getIfaceId(tp);
@@ -115,7 +118,7 @@ public class QosTerminationPointListener extends
     }
 
     @Override
-    protected void update(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
+    public void update(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
                           OvsdbTerminationPointAugmentation original,
                           OvsdbTerminationPointAugmentation update) {
         String ifaceId = getIfaceId(update);
@@ -149,7 +152,7 @@ public class QosTerminationPointListener extends
     }
 
     @Override
-    protected void add(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
+    public void add(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
                        OvsdbTerminationPointAugmentation tpAugment) {
         String ifaceId = getIfaceId(tpAugment);
         if ((ifaceId != null) && isBandwidthRuleApplied(tpAugment)) {
@@ -164,11 +167,6 @@ public class QosTerminationPointListener extends
         }
     }
 
-    @Override
-    protected QosTerminationPointListener getDataTreeChangeListener() {
-        return QosTerminationPointListener.this;
-    }
-
     private void setPortBandwidthRule(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
                                       OvsdbTerminationPointAugmentation update, Port port) {
         QosPolicy qosPolicy = qosNeutronUtils.getQosPolicy(port);
index bcea351e30eaf308cb6ff0da5839caddc0b5c656..5506d31da94397ebeb4e0c1820ef759bae0531e5 100644 (file)
@@ -7,8 +7,8 @@
  */
 package org.opendaylight.netvirt.qosservice;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import java.util.Optional;
 import java.util.regex.Pattern;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 
@@ -35,7 +35,7 @@ class UuidUtil {
         if (uuidPattern.matcher(possibleUuid).matches()) {
             return Optional.of(new Uuid(possibleUuid));
         } else {
-            return Optional.absent();
+            return Optional.empty();
         }
     }
 }
index d4a48c5b7e410bce9345ecf73bb1410d9930a738..def8d3ef87f03fb2d1c046d59464054725106241 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
            odl:use-default-for-reference-types="true">
 
     <reference id="dataBroker"
-               interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+               interface="org.opendaylight.mdsal.binding.api.DataBroker"
                odl:type="default" />
     <reference id="iMdsalApiManager"
                interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
index 960dec0e989d12439969b630ea43cd72b621a314..cdf11151e00a0bb36b3179077f5ef89339b0d248 100644 (file)
@@ -23,18 +23,19 @@ public class UuidUtilTest {
 
     @Test
     public void valid() {
-        assertThat(uuidUtil.newUuidIfValidPattern("f81d4fae-7dec-11d0-a765-00a0c91e6bf6"))
-                .hasValue(new Uuid("f81d4fae-7dec-11d0-a765-00a0c91e6bf6"));
+        assertThat(uuidUtil.newUuidIfValidPattern("f81d4fae-7dec-11d0-a765-00a0c91e6bf6").get())
+                .isEqualTo(new Uuid("f81d4fae-7dec-11d0-a765-00a0c91e6bf6"));
     }
 
     @Test
     public void invalid() {
-        assertThat(uuidUtil.newUuidIfValidPattern("tap61d7aec1-2c")).isAbsent();
+        assertThat(uuidUtil.newUuidIfValidPattern("tap61d7aec1-2c"))
+                .isNotEqualTo("tap61d7aec1-11");
     }
 
     @Test
     public void empty() {
-        assertThat(uuidUtil.newUuidIfValidPattern("")).isAbsent();
+        assertThat(uuidUtil.newUuidIfValidPattern("")).isNotNull();
     }
 
     @Test(expected = NullPointerException.class)
index 41ba195ca052d1dd7b13ce00de12b9fad14c821d..471b630bb0909ead64f060eca235de36a9ceb9bc 100644 (file)
@@ -31,10 +31,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <artifactId>javax.inject</artifactId>
             <optional>true</optional>
         </dependency>
-        <dependency>
+   <!--     <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-api</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>bgpmanager-api</artifactId>
index 4e4df67e164b8b5959c5872545a221e1e4e92b00..4149b6f049b8b0368d3105fb03f4d5d2fd249f74 100644 (file)
@@ -15,9 +15,9 @@ import java.util.concurrent.ExecutionException;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
index 4283ee5b8b4d1dde1947ebc0f093d4c7e605b007..4ed845e52b5ca0c10b458d4df97a5927ec10dc82 100644 (file)
@@ -4,7 +4,7 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" />
+             interface="org.opendaylight.mdsal.binding.api.DataBroker" />
 
   <reference id="iBgpManager"
              interface="org.opendaylight.netvirt.bgpmanager.api.IBgpManager" />
index 8597a928d82d0e802cd6a41d83e58acc2dc22f84..65182498bdedb4ec6854eb53a4c74b3fa15f0aee 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.netvirt.statistics;
 import java.math.BigInteger;
 import java.util.List;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
index 7944eed88340a252b4b5a96eb814c309b9ed8f94..2081e0c7624c03f14f50334231b589e4a96dd776 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.netvirt.statistics;
 
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.netvirt.statistics.api.ICountersInterfaceChangeHandler;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
index 1c4188fa152abf624cc15cc7431c56dbec8f77dc..1653f598ec7d85565db986d35dab87d552f510f6 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.statistics;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
index 674f7f8a68b715912d57820c7ac5e81caf5033ba..c87be66a123a41c704d84eb699ff195a490e5998 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.statistics;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
 import org.opendaylight.genius.mdsalutil.InstructionInfo;
index e56f1ff4efd96dce60d11627a47113240a18842c..197e6c13b17132bf8d0bb8361743887b13bc4697 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.netvirt.statistics;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -27,12 +27,12 @@ import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
@@ -240,7 +240,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
                 if (input.getIncomingTraffic() != null) {
                     Optional<EgressElementCountersRequestConfig> eecrcOpt =
                             transaction.read(LogicalDatastoreType.CONFIGURATION,
-                                    CountersServiceUtils.EECRC_IDENTIFIER).checkedGet();
+                                    CountersServiceUtils.EECRC_IDENTIFIER).get();
                     if (!eecrcOpt.isPresent()) {
                         LOG.warn("failed creating incoming traffic counter request data container in DB");
                         statisticsCounters.failedCreatingEgressCounterDataConfig();
@@ -268,7 +268,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
                 if (input.getOutgoingTraffic() != null) {
                     Optional<IngressElementCountersRequestConfig> iecrcOpt =
                             transaction.read(LogicalDatastoreType.CONFIGURATION,
-                                    CountersServiceUtils.IECRC_IDENTIFIER).checkedGet();
+                                    CountersServiceUtils.IECRC_IDENTIFIER).get();
                     if (!iecrcOpt.isPresent()) {
                         LOG.warn("failed creating outgoing traffc counter request data container in DB");
                         statisticsCounters.failedCreatingIngressCounterDataConfig();
@@ -312,9 +312,9 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
         SettableFuture<RpcResult<ReleaseElementCountersRequestHandlerOutput>> result = SettableFuture.create();
         ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(tx -> {
             Optional<IngressElementCountersRequestConfig> iecrcOpt =
-                    tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER).checkedGet();
+                    tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER).get();
             Optional<EgressElementCountersRequestConfig> eecrcOpt =
-                    tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.EECRC_IDENTIFIER).checkedGet();
+                    tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.EECRC_IDENTIFIER).get();
             if (!iecrcOpt.isPresent() || !eecrcOpt.isPresent()) {
                 LOG.warn("Couldn't read element counters config data from DB");
                 statisticsCounters.failedReadingCounterDataFromConfig();
@@ -324,9 +324,9 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
                 return;
             }
             Optional<CounterRequests> ingressRequestOpt =
-                    tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath).checkedGet();
+                    tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath).get();
             Optional<CounterRequests> egressRequestOpt =
-                    tx.read(LogicalDatastoreType.CONFIGURATION, egressPath).checkedGet();
+                    tx.read(LogicalDatastoreType.CONFIGURATION, egressPath).get();
             if (!ingressRequestOpt.isPresent() && !egressRequestOpt.isPresent()) {
                 LOG.warn("Handler does not exists");
                 statisticsCounters.unknownRequestHandler();
@@ -361,7 +361,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
                 InstanceIdentifier.builder(EgressElementCountersRequestConfig.class)
                         .child(CounterRequests.class, new CounterRequestsKey(input.getHandler())).build();
 
-        ReadOnlyTransaction tx = db.newReadOnlyTransaction();
+        ReadTransaction tx = db.newReadOnlyTransaction();
         CheckedFuture<Optional<CounterRequests>, ReadFailedException> ingressRequestData =
                 tx.read(LogicalDatastoreType.CONFIGURATION, ingressPath);
         CheckedFuture<Optional<CounterRequests>, ReadFailedException> egressRequestData =
@@ -413,7 +413,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
     public void handleInterfaceRemoval(String interfaceId) {
         CheckedFuture<Optional<IngressElementCountersRequestConfig>, ReadFailedException> iecrc;
         CheckedFuture<Optional<EgressElementCountersRequestConfig>, ReadFailedException> eecrc;
-        try (ReadOnlyTransaction tx = db.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = db.newReadOnlyTransaction()) {
             iecrc = tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER);
             eecrc = tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.EECRC_IDENTIFIER);
         }
@@ -438,7 +438,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
     @Override
     public ListenableFuture<RpcResult<CleanAllElementCounterRequestsOutput>> cleanAllElementCounterRequests(
             CleanAllElementCounterRequestsInput input) {
-        ReadOnlyTransaction tx = db.newReadOnlyTransaction();
+        ReadTransaction tx = db.newReadOnlyTransaction();
         CheckedFuture<Optional<IngressElementCountersRequestConfig>, ReadFailedException> iecrc =
                 tx.read(LogicalDatastoreType.CONFIGURATION, CountersServiceUtils.IECRC_IDENTIFIER);
         CheckedFuture<Optional<EgressElementCountersRequestConfig>, ReadFailedException> eecrc =
@@ -584,10 +584,10 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
             txRunner.callWithNewReadWriteTransactionAndSubmit(transaction -> {
                 Optional<IngressElementCountersRequestConfig> iecrcOpt =
                         transaction.read(LogicalDatastoreType.CONFIGURATION,
-                                CountersServiceUtils.IECRC_IDENTIFIER).checkedGet();
+                                CountersServiceUtils.IECRC_IDENTIFIER).get();
                 Optional<EgressElementCountersRequestConfig> eecrcOpt =
                         transaction.read(LogicalDatastoreType.CONFIGURATION,
-                                CountersServiceUtils.EECRC_IDENTIFIER).checkedGet();
+                                CountersServiceUtils.EECRC_IDENTIFIER).get();
                 if (!iecrcOpt.isPresent()) {
                     creatIngressEelementCountersContainerInConfig(transaction,
                             CountersServiceUtils.IECRC_IDENTIFIER);
@@ -991,7 +991,7 @@ public class StatisticsImpl implements StatisticsService, ICountersInterfaceChan
     }
 
     private boolean checkPoolExists() {
-        ReadOnlyTransaction roTransaction = db.newReadOnlyTransaction();
+        ReadTransaction roTransaction = db.newReadOnlyTransaction();
         InstanceIdentifier<IdPool> path = InstanceIdentifier.create(IdPools.class).child(IdPool.class,
                 new IdPoolKey(CountersServiceUtils.COUNTERS_PULL_NAME));
         CheckedFuture<Optional<IdPool>, ReadFailedException> pool =
index 4a6d24239675b8af5c515e0c594d2192a87e8f43..6a2b331d896f9093417fa79bc357b44ef93dac8d 100644 (file)
@@ -11,7 +11,7 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderService;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
index 9c68e7131d8fd652e8ed454e3157a6966a97e387..e20104d554c8abf75d79f5a726b5fd041a862655 100644 (file)
@@ -9,12 +9,12 @@
   odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-    interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+    interface="org.opendaylight.mdsal.binding.api.DataBroker"
     odl:type="default" />
   <reference id="rpcProviderRegistry"
-    interface="org.opendaylight.controller.sal.binding.api.RpcProviderService" />
+    interface="org.opendaylight.mdsal.binding.api.RpcProviderService" />
   <reference id="notificationService"
-    interface="org.opendaylight.controller.md.sal.binding.api.NotificationService" />
+    interface="org.opendaylight.mdsal.binding.api.NotificationService" />
   <reference id="iInterfaceManager"
     interface="org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager" />
   <reference id="iMdsalApiManager"
index 82c13668f85c0c9c146548c83f2cee6c28338c15..6a10ef4df0afec02034954dbc187cceebb54515c 100644 (file)
@@ -11,16 +11,15 @@ package org.opendaylight.netvirt.vpnmanager.api;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadTransaction;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
index 36d5a6cb3e6b561c9fc895ec0c3f25a6f5a3f8da..d848b3b48ced6f898c74894058f8a8dd03e64114 100644 (file)
@@ -7,15 +7,14 @@
  */
 package org.opendaylight.netvirt.vpnmanager.api;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
@@ -155,7 +154,7 @@ public final class InterfaceUtils {
     }
 
     public static Optional<String> getMacAddressForInterface(DataBroker dataBroker, String interfaceName) {
-        Optional<String> macAddressOptional = Optional.absent();
+        Optional<String> macAddressOptional = Optional.empty();
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
             .rev140508.interfaces.state.Interface>
             ifStateId =
@@ -171,7 +170,7 @@ public final class InterfaceUtils {
     }
 
     public static Optional<String> getMacAddressFromInterfaceState(Interface ifState) {
-        Optional<String> macAddressOptional = Optional.absent();
+        Optional<String> macAddressOptional = Optional.empty();
         PhysAddress macAddress = ifState.getPhysAddress();
         if (macAddress != null) {
             macAddressOptional = Optional.of(macAddress.getValue());
@@ -209,7 +208,7 @@ public final class InterfaceUtils {
             InstanceIdentifier<T> path) {
         try {
             return SingleTransactionDataBroker.syncReadOptional(broker, datastoreType, path);
-        } catch (ReadFailedException e) {
+        } catch (ExecutionException | InterruptedException e) {
             throw new RuntimeException(e);
         }
     }
index 4659d784d41b40bdf078c7772904cbe051d64e67..4a5b49d31a2a12713f3012e88a2a7b8744035ba2 100644 (file)
@@ -9,19 +9,20 @@ package org.opendaylight.netvirt.vpnmanager.api;
 
 import static java.util.stream.Collectors.toList;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.TypedReadTransaction;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.GetTunnelTypeInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.GetTunnelTypeOutput;
@@ -56,7 +57,15 @@ public final class VpnExtraRouteHelper {
     public static Optional<Routes> getVpnExtraroutes(DataBroker broker, String vpnName,
                                                      String vpnRd, String destPrefix) {
         InstanceIdentifier<Routes> vpnExtraRoutesId = getVpnToExtrarouteVrfIdIdentifier(vpnName, vpnRd, destPrefix);
-        return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, vpnExtraRoutesId);
+        Optional<Routes> extraRouteOptional = Optional.empty();
+        try {
+            extraRouteOptional = SingleTransactionDataBroker.syncReadOptional(broker, LogicalDatastoreType.OPERATIONAL,
+                    vpnExtraRoutesId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getVpnExtraroutes: failed to read VpnToExtraRoutes for vpn {} rd {} destprefix {} due "
+                    + "to exception", vpnName, vpnRd, destPrefix, e);
+        }
+        return extraRouteOptional;
     }
 
     public static Optional<Routes> getVpnExtraroutes(TypedReadTransaction<Operational> operTx, String vpnName,
@@ -80,11 +89,13 @@ public final class VpnExtraRouteHelper {
             List<String> usedRds, String destPrefix) {
         List<Routes> routes = new ArrayList<>();
         for (String rd : usedRds) {
-            Optional<Routes> extraRouteInfo =
-                    MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                            getVpnToExtrarouteVrfIdIdentifier(vpnName, rd, destPrefix));
-            if (extraRouteInfo.isPresent()) {
-                routes.add(extraRouteInfo.get());
+            try {
+                Optional<Routes> extraRouteInfo = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                                getVpnToExtrarouteVrfIdIdentifier(vpnName, rd, destPrefix));
+                extraRouteInfo.ifPresent(routes::add);
+            } catch (ExecutionException | InterruptedException e) {
+                LOG.error("getAllVpnExtraRoutes: failed to read VpnToExtraRouteVrf for vpn {} rd {} destprefix {} due "
+                       + "to exception", vpnName, rd, destPrefix, e);
             }
         }
         return routes;
@@ -92,7 +103,13 @@ public final class VpnExtraRouteHelper {
 
     public static  List<String> getUsedRds(DataBroker broker, Uint32 vpnId, String destPrefix) {
         InstanceIdentifier<DestPrefixes> usedRdsId = getUsedRdsIdentifier(vpnId, destPrefix);
-        Optional<DestPrefixes> usedRds = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId);
+        Optional<DestPrefixes> usedRds = Optional.empty();
+        try {
+            usedRds = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getUsedRds: failed to read Used Rds for vpn {} destprefix {} due to exception", vpnId,
+                    destPrefix, e);
+        }
         return usedRds.isPresent() && usedRds.get().getAllocatedRds() != null ? usedRds.get().getAllocatedRds().stream()
                 .map(AllocatedRds::getRd).distinct().collect(toList()) : new ArrayList<>();
     }
@@ -142,15 +159,25 @@ public final class VpnExtraRouteHelper {
     public static java.util.Optional<String> getRdAllocatedForExtraRoute(DataBroker broker,
             Uint32 vpnId, String destPrefix, String nextHop) {
         InstanceIdentifier<AllocatedRds> usedRdsId = getUsedRdsIdentifier(vpnId, destPrefix, nextHop);
-        return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId)
-                .toJavaUtil().map(AllocatedRds::getRd);
+        try {
+            return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, usedRdsId)
+                    .map(AllocatedRds::getRd);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getRdAllocatedForExtraRoute: failed to read Used Rds for vpn {} destprefix {} nexthop {} due "
+                    + "to exception", vpnId, destPrefix, nextHop, e);
+        }
+        return Optional.empty();
     }
 
     public static List<DestPrefixes> getExtraRouteDestPrefixes(DataBroker broker, Uint32 vpnId) {
-        Optional<ExtrarouteRds> optionalExtraRoutes = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION,
-                getUsedRdsIdentifier(vpnId));
-        List<DestPrefixes> prefixes =
-            optionalExtraRoutes.isPresent() ? optionalExtraRoutes.get().getDestPrefixes() : null;
-        return prefixes == null ? Collections.emptyList() : prefixes;
+        try {
+            Optional<ExtrarouteRds> optionalExtraRoutes = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION,
+                    getUsedRdsIdentifier(vpnId));
+            List<DestPrefixes> prefixes = optionalExtraRoutes.map(ExtrarouteRds::getDestPrefixes).orElse(null);
+            return prefixes == null ? Collections.emptyList() : prefixes;
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getExtraRouteDestPrefixes: failed to read ExRoutesRdsMap for vpn {} due to exception", vpnId, e);
+        }
+        return new ArrayList<>();
     }
 }
index f330e00714781494fe42de435275046a317951a9..4ddc01c42e16a37401dc526701e13c6c0857af47 100644 (file)
@@ -7,18 +7,16 @@
  */
 package org.opendaylight.netvirt.vpnmanager.api;
 
-import com.google.common.base.Optional;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
@@ -58,7 +56,7 @@ public final class VpnHelper {
 
     public static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
                                                           InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = broker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
index 24adfd12e50ab6abfcd8cf26c0eb751873649c02..3293d305e9e0c5433a77aedbddeed438262359bc 100644 (file)
@@ -7,8 +7,8 @@
  */
 package org.opendaylight.netvirt.vpnmanager.api.intervpnlink;
 
-import com.google.common.base.Optional;
 import java.util.List;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
index e7aa7209828a886288ad8c4f62e1fb9e2cb92d6c..3ec633f6b6d2b9976a5c43afee804962d6fd1632 100755 (executable)
@@ -10,10 +10,10 @@ package org.opendaylight.netvirt.vpnmanager.api.intervpnlink;
 
 import static java.util.Collections.emptyList;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
@@ -69,8 +69,8 @@ public class InterVpnLinkDataComposite {
     }
 
     public Optional<InterVpnLinkState.State> getState() {
-        return this.interVpnLinkState == null ? Optional.absent()
-                                              : Optional.fromNullable(this.interVpnLinkState.getState());
+        return this.interVpnLinkState == null ? Optional.empty()
+                                              : Optional.ofNullable(this.interVpnLinkState.getState());
     }
 
     public boolean isActive() {
@@ -119,10 +119,10 @@ public class InterVpnLinkDataComposite {
     }
 
     public boolean isIpAddrTheOtherVpnEndpoint(String ipAddr, String vpnUuid) {
-        return (vpnUuid.equals(getFirstEndpointVpnUuid().orNull())
-                    && ipAddr.equals(getSecondEndpointIpAddr().orNull()))
-               || (vpnUuid.equals(getSecondEndpointVpnUuid().orNull())
-                     && ipAddr.equals(getFirstEndpointIpAddr().orNull()));
+        return (vpnUuid.equals(getFirstEndpointVpnUuid().orElse(null))
+                    && ipAddr.equals(getSecondEndpointIpAddr().orElse(null)))
+               || (vpnUuid.equals(getSecondEndpointVpnUuid().orElse(null))
+                     && ipAddr.equals(getFirstEndpointIpAddr().orElse(null)));
     }
 
     @Nullable
@@ -132,21 +132,21 @@ public class InterVpnLinkDataComposite {
 
     public Optional<String> getFirstEndpointVpnUuid() {
         if (this.interVpnLinkCfg == null) {
-            return Optional.absent();
+            return Optional.empty();
         }
         return Optional.of(this.interVpnLinkCfg.getFirstEndpoint().getVpnUuid().getValue());
     }
 
     public Optional<String> getFirstEndpointIpAddr() {
         if (this.interVpnLinkCfg == null) {
-            return Optional.absent();
+            return Optional.empty();
         }
         return Optional.of(this.interVpnLinkCfg.getFirstEndpoint().getIpAddress().getValue());
     }
 
     public Optional<Uint32> getFirstEndpointLportTag() {
         return (!isComplete() || this.interVpnLinkState.getFirstEndpointState().getLportTag() == null)
-                   ? Optional.absent()
+                   ? Optional.empty()
                    : Optional.of(this.interVpnLinkState.getFirstEndpointState().getLportTag());
     }
 
@@ -158,21 +158,21 @@ public class InterVpnLinkDataComposite {
 
     public Optional<String> getSecondEndpointVpnUuid() {
         if (!isComplete()) {
-            return Optional.absent();
+            return Optional.empty();
         }
         return Optional.of(this.interVpnLinkCfg.getSecondEndpoint().getVpnUuid().getValue());
     }
 
     public Optional<String> getSecondEndpointIpAddr() {
         if (!isComplete()) {
-            return Optional.absent();
+            return Optional.empty();
         }
         return Optional.of(this.interVpnLinkCfg.getSecondEndpoint().getIpAddress().getValue());
     }
 
     public Optional<Uint32> getSecondEndpointLportTag() {
         return (!isComplete() || this.interVpnLinkState.getSecondEndpointState().getLportTag() == null)
-            ? Optional.absent()
+            ? Optional.empty()
             : Optional.of(this.interVpnLinkState.getSecondEndpointState().getLportTag());
     }
 
@@ -189,8 +189,8 @@ public class InterVpnLinkDataComposite {
                       endpointIpAddr, getInterVpnLinkName());
             return null;
         }
-        return isFirstEndpointIpAddr(endpointIpAddr) ? getFirstEndpointVpnUuid().orNull()
-                                                     : getSecondEndpointVpnUuid().orNull();
+        return isFirstEndpointIpAddr(endpointIpAddr) ? getFirstEndpointVpnUuid().orElse(null)
+                                                     : getSecondEndpointVpnUuid().orElse(null);
     }
 
     @Nullable
@@ -200,8 +200,8 @@ public class InterVpnLinkDataComposite {
             return null;
         }
 
-        return isFirstEndpointVpnName(vpnUuid) ? getSecondEndpointIpAddr().orNull()
-                                               : getFirstEndpointIpAddr().orNull();
+        return isFirstEndpointVpnName(vpnUuid) ? getSecondEndpointIpAddr().orElse(null)
+                                               : getFirstEndpointIpAddr().orElse(null);
     }
 
     @Nullable
@@ -211,13 +211,13 @@ public class InterVpnLinkDataComposite {
                       endpointIpAddr, getInterVpnLinkName());
             return null;
         }
-        return isFirstEndpointIpAddr(endpointIpAddr) ? getSecondEndpointVpnUuid().orNull()
-                                                     : getFirstEndpointVpnUuid().orNull();
+        return isFirstEndpointIpAddr(endpointIpAddr) ? getSecondEndpointVpnUuid().orElse(null)
+                                                     : getFirstEndpointVpnUuid().orElse(null);
     }
 
     public Optional<Uint32> getEndpointLportTagByVpnName(String vpnName) {
         if (!isComplete()) {
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return isFirstEndpointVpnName(vpnName) ? Optional.of(interVpnLinkState.getFirstEndpointState().getLportTag())
@@ -226,17 +226,17 @@ public class InterVpnLinkDataComposite {
 
     public Optional<Uint32> getEndpointLportTagByIpAddr(String endpointIp) {
         if (!isComplete()) {
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return isFirstEndpointIpAddr(endpointIp)
-                    ? Optional.fromNullable(interVpnLinkState.getFirstEndpointState().getLportTag())
-                    : Optional.fromNullable(interVpnLinkState.getSecondEndpointState().getLportTag());
+                    ? Optional.ofNullable(interVpnLinkState.getFirstEndpointState().getLportTag())
+                    : Optional.ofNullable(interVpnLinkState.getSecondEndpointState().getLportTag());
     }
 
     public Optional<Uint32> getOtherEndpointLportTagByVpnName(String vpnName) {
         if (!isComplete()) {
-            return Optional.absent();
+            return Optional.empty();
         }
 
         return isFirstEndpointVpnName(vpnName) ? Optional.of(interVpnLinkState.getSecondEndpointState().getLportTag())
@@ -250,8 +250,8 @@ public class InterVpnLinkDataComposite {
             return null;
         }
 
-        return isFirstEndpointVpnName(vpnName) ? getSecondEndpointVpnUuid().orNull()
-                                               : getFirstEndpointVpnUuid().orNull();
+        return isFirstEndpointVpnName(vpnName) ? getSecondEndpointVpnUuid().orElse(null)
+                                               : getFirstEndpointVpnUuid().orElse(null);
     }
 
     @Nullable
@@ -261,8 +261,8 @@ public class InterVpnLinkDataComposite {
             return null;
         }
 
-        return isFirstEndpointVpnName(vpnUuid) ? getSecondEndpointIpAddr().orNull()
-                                               : getFirstEndpointIpAddr().orNull();
+        return isFirstEndpointVpnName(vpnUuid) ? getSecondEndpointIpAddr().orElse(null)
+                                               : getFirstEndpointIpAddr().orElse(null);
     }
 
     @Nullable
@@ -272,8 +272,8 @@ public class InterVpnLinkDataComposite {
             return null;
         }
 
-        return isFirstEndpointVpnName(vpnUuid) ? getFirstEndpointIpAddr().orNull()
-                                               : getSecondEndpointIpAddr().orNull();
+        return isFirstEndpointVpnName(vpnUuid) ? getFirstEndpointIpAddr().orElse(null)
+                                               : getSecondEndpointIpAddr().orElse(null);
     }
 
     public List<Uint64> getEndpointDpnsByVpnName(String vpnUuid) {
@@ -321,10 +321,10 @@ public class InterVpnLinkDataComposite {
     @Override
     public String toString() {
         final String ns = "Not specified";
-        return "InterVpnLink " + getInterVpnLinkName() + " 1stEndpoint=[vpn=" + getFirstEndpointVpnUuid().or(ns)
-            + " ipAddr=" + getFirstEndpointIpAddr().or(ns) + " dpn=" + getFirstEndpointDpns() + "]  2ndEndpoint=[vpn="
-            + getSecondEndpointVpnUuid().or(ns) + " ipAddr=" + getSecondEndpointIpAddr().or(ns) + " dpn="
-            + getSecondEndpointDpns() + "]";
+        return "InterVpnLink " + getInterVpnLinkName() + " 1stEndpoint=[vpn=" + getFirstEndpointVpnUuid().orElse(ns)
+            + " ipAddr=" + getFirstEndpointIpAddr().orElse(ns) + " dpn=" + getFirstEndpointDpns() + "]  "
+            + "2ndEndpoint=[vpn=" + getSecondEndpointVpnUuid().orElse(ns) + " ipAddr="
+            + getSecondEndpointIpAddr().orElse(ns) + " dpn=" + getSecondEndpointDpns() + "]";
     }
 
     @Override
@@ -341,8 +341,8 @@ public class InterVpnLinkDataComposite {
         InterVpnLinkDataComposite other = (InterVpnLinkDataComposite) obj;
         String none = "";
         return getInterVpnLinkName().equals(other.getInterVpnLinkName())
-            && getFirstEndpointVpnUuid().or(none).equals(other.getFirstEndpointVpnUuid().or(none))
-            && getFirstEndpointIpAddr().or(none).equals(other.getFirstEndpointIpAddr().or(none));
+            && getFirstEndpointVpnUuid().orElse(none).equals(other.getFirstEndpointVpnUuid().orElse(none))
+            && getFirstEndpointIpAddr().orElse(none).equals(other.getFirstEndpointIpAddr().orElse(none));
     }
 
     @Override
index b51661fef3196c0da8ffd44f9b5f8059c1567814..80e0481c43ba3ce8b5673cae9e6d3c02d76f1692 100644 (file)
@@ -22,9 +22,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <modelVersion>4.0.0</modelVersion>
 
     <dependencies>
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.genius</groupId>
@@ -107,11 +111,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
         </dependency>
 
         <!-- Testing dependencies -->
-        <dependency>
+<!--        <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-broker-impl</artifactId>
             <scope>test</scope>
             <type>test-jar</type>
+        </dependency>-->
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-adapter</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
         </dependency>
     </dependencies>
 
index b3236a56e2e4c99650ca419b7f055f7d0cbb9886..80da10c4b88102cfa72da5ec7fd9f73183302d06 100644 (file)
@@ -13,19 +13,20 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
@@ -47,7 +48,7 @@ import org.slf4j.LoggerFactory;
  */
 @Singleton
 public class CentralizedSwitchChangeListener
-        extends AsyncDataTreeChangeListenerBase<RouterToNaptSwitch, CentralizedSwitchChangeListener> {
+        extends AbstractAsyncDataTreeChangeListener<RouterToNaptSwitch> {
 
     private static final Logger LOG = LoggerFactory.getLogger(CentralizedSwitchChangeListener.class);
 
@@ -60,7 +61,9 @@ public class CentralizedSwitchChangeListener
     @Inject
     public CentralizedSwitchChangeListener(final DataBroker dataBroker, final IVpnManager vpnManager,
             final ExternalRouterDataUtil externalRouterDataUtil, final VpnUtil vpnUtil) {
-        super(RouterToNaptSwitch.class, CentralizedSwitchChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(NaptSwitches.class).child(RouterToNaptSwitch.class),
+                Executors.newListeningSingleThreadExecutor("CentralizedSwitchChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.vpnManager = vpnManager;
@@ -68,20 +71,19 @@ public class CentralizedSwitchChangeListener
         this.vpnUtil = vpnUtil;
     }
 
-    @Override
-    @PostConstruct
-    public void init() {
-        LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<RouterToNaptSwitch> getWildCardPath() {
-        return InstanceIdentifier.create(NaptSwitches.class).child(RouterToNaptSwitch.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
+    public void remove(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Removing {}", routerToNaptSwitch);
         ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx ->
                                             setupRouterGwFlows(routerToNaptSwitch, tx, NwConstants.DEL_FLOW)), LOG,
@@ -89,7 +91,7 @@ public class CentralizedSwitchChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch origRouterToNaptSwitch,
+    public void update(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch origRouterToNaptSwitch,
             RouterToNaptSwitch updatedRouterToNaptSwitch) {
         LOG.debug("Updating old {} new {}", origRouterToNaptSwitch, updatedRouterToNaptSwitch);
         if (!Objects.equals(updatedRouterToNaptSwitch.getPrimarySwitchId(),
@@ -102,18 +104,13 @@ public class CentralizedSwitchChangeListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
+    public void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Adding {}", routerToNaptSwitch);
         ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx ->
                         setupRouterGwFlows(routerToNaptSwitch, tx, NwConstants.ADD_FLOW)), LOG,
                 "Error processing switch addition for {}", routerToNaptSwitch);
     }
 
-    @Override
-    protected CentralizedSwitchChangeListener getDataTreeChangeListener() {
-        return this;
-    }
-
     private void setupRouterGwFlows(RouterToNaptSwitch routerToNaptSwitch,
             TypedReadWriteTransaction<Configuration> confTx, int addOrRemove)
                                     throws ExecutionException, InterruptedException {
index 2bad35cb12b16547c08fdebe08badef7f80bd98e..6b1d3fa13c8b6c2ef0a9f3a6c59e74d0cf3811d1 100644 (file)
@@ -9,23 +9,22 @@ package org.opendaylight.netvirt.vpnmanager;
 
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddInterfaceToDpnOnVpnEvent;
@@ -92,7 +91,7 @@ public class DpnInVpnChangeListener implements OdlL3vpnListener {
                     }
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("onRemoveDpnEvent: Failed to read data store for rd {} vpn {} dpn {}", rd, vpnName, dpnId);
         } finally {
             lock.unlock();
index 1164671f87140fabc39b648769975574b0fd363b..c358c89c3ac4655cf8bcf96d904e81d491405b31 100644 (file)
@@ -12,15 +12,16 @@ import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
@@ -34,7 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class FibEntriesListener extends AsyncDataTreeChangeListenerBase<VrfEntry, FibEntriesListener> {
+public class FibEntriesListener extends AbstractAsyncDataTreeChangeListener<VrfEntry> {
     private static final Logger LOG = LoggerFactory.getLogger(FibEntriesListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -42,31 +43,28 @@ public class FibEntriesListener extends AsyncDataTreeChangeListenerBase<VrfEntry
 
     @Inject
     public FibEntriesListener(final DataBroker dataBroker, final VpnInstanceListener vpnInstanceListener) {
-        super(VrfEntry.class, FibEntriesListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class),
+                Executors.newListeningSingleThreadExecutor("FibEntriesListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.vpnInstanceListener = vpnInstanceListener;
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VrfEntry> getWildCardPath() {
-        return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class);
-    }
-
-    @Override
-    protected FibEntriesListener getDataTreeChangeListener() {
-        return FibEntriesListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
 
     @Override
-    protected void remove(InstanceIdentifier<VrfEntry> identifier,
+    public void remove(InstanceIdentifier<VrfEntry> identifier,
         VrfEntry del) {
         LOG.trace("Remove Fib event - Key : {}, value : {} ", identifier, del);
         final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class);
@@ -76,7 +74,7 @@ public class FibEntriesListener extends AsyncDataTreeChangeListenerBase<VrfEntry
     }
 
     @Override
-    protected void update(InstanceIdentifier<VrfEntry> identifier,
+    public void update(InstanceIdentifier<VrfEntry> identifier,
         VrfEntry original, VrfEntry update) {
         final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class);
         String rd = key.getRouteDistinguisher();
@@ -92,7 +90,7 @@ public class FibEntriesListener extends AsyncDataTreeChangeListenerBase<VrfEntry
     }
 
     @Override
-    protected void add(InstanceIdentifier<VrfEntry> identifier,
+    public void add(InstanceIdentifier<VrfEntry> identifier,
         VrfEntry add) {
         LOG.trace("Add Vrf Entry event - Key : {}, value : {}", identifier, add);
         final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class);
index 1c017946d6cac4609608f068efb2aae54beab5e2..9211bfcf865c4a717a0dfa9472ba6ca539981810 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netvirt.vpnmanager;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
 import com.google.common.util.concurrent.FutureCallback;
@@ -22,18 +21,20 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -50,8 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class InterfaceStateChangeListener
-    extends AsyncDataTreeChangeListenerBase<Interface, InterfaceStateChangeListener> {
+public class InterfaceStateChangeListener extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateChangeListener.class);
     private static final short DJC_MAX_RETRIES = 3;
@@ -87,7 +87,9 @@ public class InterfaceStateChangeListener
     @Inject
     public InterfaceStateChangeListener(final DataBroker dataBroker, final VpnInterfaceManager vpnInterfaceManager,
             final VpnUtil vpnUtil, final JobCoordinator jobCoordinator, final IFibManager fibManager) {
-        super(Interface.class, InterfaceStateChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("InterfaceStateChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.vpnInterfaceManager = vpnInterfaceManager;
@@ -97,28 +99,22 @@ public class InterfaceStateChangeListener
         initialize();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
-    }
-
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
     }
 
     @Override
-    protected InterfaceStateChangeListener getDataTreeChangeListener() {
-        return InterfaceStateChangeListener.this;
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         try {
             if (L2vlan.class.equals(intrf.getType())) {
                 LOG.info("VPN Interface add event - intfName {} from InterfaceStateChangeListener",
@@ -199,7 +195,7 @@ public class InterfaceStateChangeListener
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         final String ifName = intrf.getName();
         Uint64 dpId = Uint64.ZERO;
         try {
@@ -265,7 +261,7 @@ public class InterfaceStateChangeListener
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier,
+    public void update(InstanceIdentifier<Interface> identifier,
                     Interface original, Interface update) {
         final String ifName = update.getName();
         try {
index 3ecad5b9f919e04d3664b9d479fb2ce54dc22a51..6196a8b8e5b4c6bf67d7edb217f6a3e2485eee2c 100644 (file)
@@ -7,17 +7,17 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.PortOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.SubnetOpData;
@@ -75,7 +75,7 @@ public class SubnetOpDpnManager {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("addDpnToSubnet: Creation of SubnetToDpn for subnet {} with DpnId {} failed",
                     subnetId.getValue(), dpnId, ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("addDpnToSubnet: Failed to read data store for subnet {} dpn {}", subnetId.getValue(),
                     dpnId);
         }
@@ -103,7 +103,7 @@ public class SubnetOpDpnManager {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("removeDpnFromSubnet: Deletion of SubnetToDpn for subnet {} with DPN {} failed",
                     subnetId.getValue(), dpnId, ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("removeDpnFromSubnet: Failed to read data store for subnet {} dpn {}", subnetId, dpnId);
         }
     }
@@ -143,7 +143,7 @@ public class SubnetOpDpnManager {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("addInterfaceToDpn: Addition of Interface {} for SubnetToDpn on subnet {} with DPN {} failed",
                     intfName, subnetId.getValue(), dpnId, ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("addInterfaceToDpn: Failed to read data store for interface {} subnet {} dpn {}", intfName,
                     subnetId, dpnId);
         }
@@ -192,7 +192,7 @@ public class SubnetOpDpnManager {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("addPortOpDataEntry: Addition of Interface {} for SubnetToDpn on subnet {} with DPN {} failed",
                     intfName, subnetId.getValue(), dpnId, ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("addPortOpDataEntry: Failed to read from data store for interface {} subnet {} dpn {}",
                     intfName, subnetId, dpnId);
         }
@@ -235,7 +235,7 @@ public class SubnetOpDpnManager {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("removeInterfaceFromDpn: Deletion of Interface {} for SubnetToDpn on subnet {}"
                     + " with DPN {} failed", intfName, subnetId.getValue(), dpnId, ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("removeInterfaceFromDpn: Failed to read data store for interface {} subnet {} dpn {}",
                     intfName, subnetId, dpnId);
         }
@@ -280,7 +280,7 @@ public class SubnetOpDpnManager {
                     portOpEntry = null;
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("removePortOpDataEntry: Failed to read data store for interface {} subnet {}", intfName,
                     subnetId);
         } catch (TransactionCommitFailedException e) {
@@ -302,7 +302,7 @@ public class SubnetOpDpnManager {
             if (optionalPortOp.isPresent()) {
                 portOpDataEntry = optionalPortOp.get();
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getPortOpDataEntry: Failed to read data store for interface {}", intfName);
         }
         return portOpDataEntry;
index 472d5d12cb477bab590e227431098f05c561a0d4..db124d831af50f7f3f87642404a2989ed53de088 100644 (file)
@@ -7,23 +7,24 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -40,8 +41,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChangeListenerBase<Interface,
-    SubnetRouteInterfaceStateChangeListener> {
+public class SubnetRouteInterfaceStateChangeListener extends AbstractAsyncDataTreeChangeListener<Interface> {
     private static final Logger LOG = LoggerFactory.getLogger(SubnetRouteInterfaceStateChangeListener.class);
     private static final String LOGGING_PREFIX = "SUBNETROUTE:";
     private final DataBroker dataBroker;
@@ -54,32 +54,31 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     public SubnetRouteInterfaceStateChangeListener(final DataBroker dataBroker,
             final VpnSubnetRouteHandler vpnSubnetRouteHandler, final SubnetOpDpnManager subnetOpDpnManager,
             final INeutronVpnManager neutronVpnService, final JobCoordinator jobCoordinator) {
-        super(Interface.class, SubnetRouteInterfaceStateChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(InterfacesState.class).child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("SubnetRouteInterfaceStateChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
         this.subOpDpnManager = subnetOpDpnManager;
         this.neutronVpnManager = neutronVpnService;
         this.jobCoordinator = jobCoordinator;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-    @Override
-    protected SubnetRouteInterfaceStateChangeListener getDataTreeChangeListener() {
-        return SubnetRouteInterfaceStateChangeListener.this;
-    }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("{} add: Received interface {} up event", LOGGING_PREFIX, intrf);
         if (L2vlan.class.equals(intrf.getType())) {
             LOG.trace("SubnetRouteInterfaceListener add: Received interface {} up event", intrf);
@@ -114,7 +113,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
                                 }
                                 vpnSubnetRouteHandler.onInterfaceUp(dpnId, intrf.getName(), subnetId);
                                 LOG.info("{} add: Processed interface {} up event", LOGGING_PREFIX, intrf.getName());
-                            } catch (ReadFailedException e) {
+                            } catch (InterruptedException | ExecutionException e) {
                                 LOG.error("add: Failed to read data store for interface {} dpn {}", interfaceName,
                                         dpnId);
                             }
@@ -128,7 +127,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         if (L2vlan.class.equals(intrf.getType())) {
             LOG.trace("SubnetRouteInterfaceListener remove: Received interface {} down event", intrf);
             List<Uuid> subnetIdList = getSubnetId(intrf);
@@ -185,7 +184,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
                             }
                             LOG.info("{} remove: Processed interface {} down event in ", LOGGING_PREFIX,
                                     intrf.getName());
-                        } catch (ReadFailedException e) {
+                        } catch (InterruptedException | ExecutionException e) {
                             LOG.error("{} remove: Failed to read data store for {}", LOGGING_PREFIX, intrf.getName());
                         }
                         return futures;
@@ -195,7 +194,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier,
+    public void update(InstanceIdentifier<Interface> identifier,
         Interface original, Interface update) {
         String interfaceName = update.getName();
         if (L2vlan.class.equals(update.getType())) {
@@ -263,7 +262,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
                                     vpnSubnetRouteHandler.onInterfaceDown(dpnId, update.getName(), subnetId);
                                 }
                             }
-                        } catch (ReadFailedException e) {
+                        } catch (InterruptedException | ExecutionException e) {
                             LOG.error("update: Failed to read data store for interface {} dpn {}", interfaceName,
                                     dpnId);
                         }
index 1dd4aeac75ea452dbe0eb5854f7bc283292c79b1..f30a102b5a1da4911f8c679af379159e46593049 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.Optional;
 import com.google.common.primitives.Ints;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
@@ -31,6 +28,8 @@ import org.opendaylight.infrautils.metrics.Labeled;
 import org.opendaylight.infrautils.metrics.MetricDescriptor;
 import org.opendaylight.infrautils.metrics.MetricProvider;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.ICentralizedSwitchProvider;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
 import org.opendaylight.netvirt.vpnmanager.iplearn.ipv4.ArpUtils;
@@ -167,12 +166,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                         .label(NWUtil.toStringIpAddress(srcIpBytes) + "." + NWUtil.toStringIpAddress(srcIpBytes));
                 counter.increment();
                 LOG.error("{} onPacketReceived: Failed to handle subnetroute packet.", LOGGING_PREFIX, ex);
-            } catch (ReadFailedException e) {
-                Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
-                        .label(NWUtil.toStringIpAddress(srcIpBytes) + "." + NWUtil.toStringIpAddress(srcIpBytes));
-                counter.increment();
-                LOG.error("{} onPacketReceived: Failed to read data-store.", LOGGING_PREFIX, e);
-            }  catch (UnknownHostException e) {
+            } catch (UnknownHostException e) {
                 Counter counter = packetInCounter.label(CounterUtility.subnet_route_packet_failed.toString())
                         .label(CounterUtility.getSubnetRouteInvalidPacket());
                 counter.increment();
@@ -187,7 +181,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
 
     private void handleIpPackets(byte[] srcIp, byte[] dstIp, String srcIpStr, String dstIpStr, String srcMac,
             Uint64 metadata)
-            throws UnknownHostException, InterruptedException, ExecutionException, ReadFailedException {
+            throws UnknownHostException, InterruptedException, ExecutionException {
         Uint32 vpnId = Uint32.valueOf(MetaDataUtil.getVpnIdFromMetadata(metadata));
 
         LOG.info("{} onPacketReceived: Processing IP Packet received with Source IP {} and Target IP {}"
@@ -376,7 +370,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
 
             transmitArpOrNsPacket(targetSubnetForPacketOut.getNhDpnId(),
                                         sourceIp, sourceMac, dstIp, dstIpStr, elanTag);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("handlePacketToInternalNetwork: Failed to read data store for destIp {} elanTag {}", dstIpStr,
                     elanTag);
         }
@@ -493,7 +487,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                     }
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} getTargetDpnForPacketOut: Failed to read data store for elan {}", LOGGING_PREFIX,
                     elanInfo.getName());
         }
index 00a250dd62d692a47fbbe4fd8bec9eb704dbb3b0..e2d1c7e663922e2746111a32b91d8ab1387499b7 100644 (file)
@@ -13,17 +13,18 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -38,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Subnetmap, SubnetmapChangeListener> {
+public class SubnetmapChangeListener extends AbstractAsyncDataTreeChangeListener<Subnetmap> {
     private static final Logger LOG = LoggerFactory.getLogger(SubnetmapChangeListener.class);
     private final DataBroker dataBroker;
     private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
@@ -49,38 +50,31 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
     @Inject
     public SubnetmapChangeListener(final DataBroker dataBroker, final VpnSubnetRouteHandler vpnSubnetRouteHandler,
                                    VpnUtil vpnUtil, IVpnManager vpnManager) {
-        super(Subnetmap.class, SubnetmapChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(Subnetmaps.class).child(Subnetmap.class),
+                Executors.newListeningSingleThreadExecutor("SubnetmapChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
         this.vpnUtil = vpnUtil;
         this.vpnManager = vpnManager;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Subnetmap> getWildCardPath() {
-        return InstanceIdentifier.create(Subnetmaps.class).child(Subnetmap.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-    // TODO Clean up the exception handling
-    @SuppressWarnings("checkstyle:IllegalCatch")
-    private void registerListener(final DataBroker db) {
-        try {
-            registerListener(LogicalDatastoreType.CONFIGURATION, db);
-        } catch (final Exception e) {
-            LOG.error("VPNManager subnetMap config DataChange listener registration fail!", e);
-            throw new IllegalStateException("VPNManager subnetMap config DataChange listener registration failed.", e);
-        }
-    }
 
     @Override
-    protected void add(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
+    public void add(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.debug("add: subnetmap method - key: {}, value: {}", identifier, subnetmap);
         Uuid subnetId = subnetmap.getId();
         Network network = vpnUtil.getNeutronNetwork(subnetmap.getNetworkId());
@@ -129,14 +123,14 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
+    public void remove(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.trace("remove: subnetmap method - key: {}, value: {}", identifier, subnetmap);
     }
 
     @Override
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void update(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmapOriginal, Subnetmap
+    public void update(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmapOriginal, Subnetmap
             subnetmapUpdate) {
         LOG.debug("update: method - key {}, original {}, update {}", identifier,
                   subnetmapOriginal, subnetmapUpdate);
@@ -241,11 +235,6 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
         }
     }
 
-    @Override
-    protected SubnetmapChangeListener getDataTreeChangeListener() {
-        return this;
-    }
-
     @SuppressWarnings("all")
     protected long getElanTag(String elanInstanceName) {
         final long[] elanTag = {0L};
@@ -254,7 +243,7 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
             InstanceIdentifier<ElanInstance> elanIdentifierId = InstanceIdentifier.builder(ElanInstances.class)
                     .child(ElanInstance.class, new ElanInstanceKey(elanInstanceName)).build();
             ElanInstance elanInstance = tx.read(LogicalDatastoreType.CONFIGURATION, elanIdentifierId)
-                    .checkedGet().orNull();
+                    .get().orElse(null);
             if (elanInstance != null) {
                 if (elanInstance.getElanTag() != null) {
                     elanTag[0] =elanInstance.getElanTag().longValue();
index dbc0e934d364cf20e83374bfaa6b2126a9a1e292..6c21cc1cad71ef5ddb7a958018c29ae589b8c694 100644 (file)
@@ -20,18 +20,19 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
@@ -45,7 +46,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class TunnelEndPointChangeListener
-    extends AsyncDataTreeChangeListenerBase<TunnelEndPoints, TunnelEndPointChangeListener> {
+    extends AbstractAsyncDataTreeChangeListener<TunnelEndPoints> {
     private static final Logger LOG = LoggerFactory.getLogger(TunnelEndPointChangeListener.class);
 
     private final DataBroker broker;
@@ -58,38 +59,41 @@ public class TunnelEndPointChangeListener
     @Inject
     public TunnelEndPointChangeListener(final DataBroker broker, final VpnInterfaceManager vpnInterfaceManager,
             final JobCoordinator jobCoordinator, VpnUtil vpnUtil, final IFibManager fibManager) {
-        super(TunnelEndPoints.class, TunnelEndPointChangeListener.class);
+        super(broker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(DpnEndpoints.class).child(DPNTEPsInfo.class).child(TunnelEndPoints.class),
+                Executors.newListeningSingleThreadExecutor("TunnelEndPointChangeListener", LOG));
         this.broker = broker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.vpnInterfaceManager = vpnInterfaceManager;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
         this.fibManager = fibManager;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
 
     @Override
-    protected InstanceIdentifier<TunnelEndPoints> getWildCardPath() {
-        return InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class).child(TunnelEndPoints.class)
-            .build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
+
     @Override
-    protected void remove(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints tep) {
+    public void remove(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints tep) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints origTep,
+    public void update(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints origTep,
         TunnelEndPoints updatedTep) {
     }
 
     @Override
-    protected void add(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints tep) {
+    public void add(InstanceIdentifier<TunnelEndPoints> key, TunnelEndPoints tep) {
         Uint64 dpnId = key.firstIdentifierOf(DPNTEPsInfo.class).firstKeyOf(DPNTEPsInfo.class).getDPNID();
         if (Uint64.ZERO.equals(dpnId)) {
             LOG.warn("add: Invalid DPN id for TEP {}", tep.getInterfaceName());
@@ -166,8 +170,4 @@ public class TunnelEndPointChangeListener
         }
     }
 
-    @Override
-    protected TunnelEndPointChangeListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 1a8e46fb6f8ade2478bc4a40ee5ceb0893aaf779..85d3dc0af934035d128bd329cacdfbd4408e4209 100644 (file)
@@ -11,10 +11,8 @@ import static java.util.Collections.emptyList;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.util.concurrent.ListenableFuture;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -22,29 +20,30 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
 import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
 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.interfaces.rev140508.interfaces.Interface;
@@ -83,8 +82,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBase<StateTunnelList,
-        TunnelInterfaceStateListener> {
+public class TunnelInterfaceStateListener extends AbstractAsyncDataTreeChangeListener<StateTunnelList> {
 
     private static final Logger LOG = LoggerFactory.getLogger(TunnelInterfaceStateListener.class);
 
@@ -126,7 +124,9 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
                                         final VpnSubnetRouteHandler vpnSubnetRouteHandler,
                                         final JobCoordinator jobCoordinator,
                                         VpnUtil vpnUtil) {
-        super(StateTunnelList.class, TunnelInterfaceStateListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class),
+                Executors.newListeningSingleThreadExecutor("TunnelInterfaceStateListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.fibManager = fibManager;
@@ -135,26 +135,23 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
         this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<StateTunnelList> getWildCardPath() {
-        return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-    @Override
-    protected TunnelInterfaceStateListener getDataTreeChangeListener() {
-        return TunnelInterfaceStateListener.this;
-    }
 
     @Override
-    protected void remove(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList del) {
+    public void remove(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList del) {
         LOG.trace("remove: Tunnel deletion---- {}", del);
         if (isGreTunnel(del)) {
             programDcGwLoadBalancingGroup(del, NwConstants.MOD_FLOW, false);
@@ -163,7 +160,7 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
     }
 
     @Override
-    protected void update(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList original,
+    public void update(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList original,
                           StateTunnelList update) {
         LOG.trace("update: Tunnel updation---- {}", update);
         LOG.info("update: ITM Tunnel {} of type {} state event changed from :{} to :{}",
@@ -223,7 +220,7 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
     }
 
     @Override
-    protected void add(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList add) {
+    public void add(InstanceIdentifier<StateTunnelList> identifier, StateTunnelList add) {
         LOG.trace("add: Tunnel addition---- {}", add);
         TunnelOperStatus tunOpStatus = add.getOperState();
         if (tunOpStatus != TunnelOperStatus.Down && tunOpStatus != TunnelOperStatus.Up) {
@@ -539,7 +536,7 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
                     }
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("handleTunnelEventForDPN: Failed to read data store for interface {} srcDpn {} srcTep {} "
                     + "dstTep {}", intfName, srcDpnId, srcTepIp, destTepIp);
         }
index 784da0cc69b086f3714b86682f6265b46130f5d6..c4a04c34c805d97d648a06c48330b0bb5f6672d0 100644 (file)
@@ -12,19 +12,18 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import java.util.ArrayList;
 import java.util.List;
-
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
@@ -38,8 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnElanInterfaceChangeListener
-    extends AsyncDataTreeChangeListenerBase<ElanInterface, VpnElanInterfaceChangeListener> {
+public class VpnElanInterfaceChangeListener extends AbstractAsyncDataTreeChangeListener<ElanInterface> {
     private static final Logger LOG = LoggerFactory.getLogger(VpnElanInterfaceChangeListener.class);
 
     private final DataBroker broker;
@@ -50,26 +48,30 @@ public class VpnElanInterfaceChangeListener
     @Inject
     public VpnElanInterfaceChangeListener(final DataBroker broker, final IElanService elanService,
                                           final VpnUtil vpnUtil) {
-        super(ElanInterface.class, VpnElanInterfaceChangeListener.class);
+        super(broker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class),
+                Executors.newListeningSingleThreadExecutor("VpnElanInterfaceChangeListener", LOG));
         this.broker = broker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.elanService = elanService;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
 
     @Override
-    protected InstanceIdentifier<ElanInterface> getWildCardPath() {
-        return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
+
     @Override
-    protected void remove(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
+    public void remove(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
         String interfaceName = elanInterface.getName();
         if (!elanService.isExternalInterface(interfaceName)) {
             LOG.debug("remove: Interface {} is not external. Ignoring interface removal", interfaceName);
@@ -88,13 +90,13 @@ public class VpnElanInterfaceChangeListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<ElanInterface> key, ElanInterface origElanInterface,
+    public void update(InstanceIdentifier<ElanInterface> key, ElanInterface origElanInterface,
         ElanInterface updatedElanInterface) {
 
     }
 
     @Override
-    protected void add(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
+    public void add(InstanceIdentifier<ElanInterface> key, ElanInterface elanInterface) {
         String interfaceName = elanInterface.getName();
         if (!elanService.isExternalInterface(interfaceName)) {
             LOG.debug("add: Interface {} is not external. Ignoring", interfaceName);
@@ -129,8 +131,4 @@ public class VpnElanInterfaceChangeListener
                 elanInterface.getElanInstanceName());
     }
 
-    @Override
-    protected VpnElanInterfaceChangeListener getDataTreeChangeListener() {
-        return this;
-    }
 }
index 34e26c20074c1f4436e9aa3024ee842ac77a43b6..756d0c1b7be5467090f43a9bf837c8186ccc957a 100644 (file)
@@ -8,10 +8,9 @@
 
 package org.opendaylight.netvirt.vpnmanager;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -19,6 +18,7 @@ import com.google.common.util.concurrent.MoreExecutors;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReentrantLock;
@@ -26,12 +26,12 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
index 84ceaf7dce235877d5b63f7c5b2b6dc6cc1a6f59..229d5568e1deba029fbf920d6a2a114c5a9b3306 100644 (file)
@@ -7,11 +7,10 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -21,16 +20,14 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
@@ -51,8 +48,12 @@ import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.ExternalTunnelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel;
@@ -75,7 +76,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInstance, VpnInstanceListener> {
+public class VpnInstanceListener extends AbstractAsyncDataTreeChangeListener<VpnInstance> {
     private static final Logger LOG = LoggerFactory.getLogger(VpnInstanceListener.class);
     private static final String LOGGING_PREFIX_ADD = "VPN-ADD:";
     private static final String LOGGING_PREFIX_UPDATE = "VPN-UPDATE:";
@@ -95,7 +96,9 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
             final VpnInterfaceManager vpnInterfaceManager, final IFibManager fibManager,
             final VpnOpDataSyncer vpnOpDataSyncer, final IMdsalApiManager mdsalManager,
             final JobCoordinator jobCoordinator, VpnUtil vpnUtil) {
-        super(VpnInstance.class, VpnInstanceListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class),
+                Executors.newListeningSingleThreadExecutor("VpnInstanceListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.idManager = idManager;
@@ -105,26 +108,23 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
         this.mdsalManager = mdsalManager;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VpnInstance> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-    @Override
-    protected VpnInstanceListener getDataTreeChangeListener() {
-        return VpnInstanceListener.this;
-    }
 
     @Override
-    protected void remove(InstanceIdentifier<VpnInstance> identifier, VpnInstance del) {
+    public void remove(InstanceIdentifier<VpnInstance> identifier, VpnInstance del) {
         LOG.trace("{} : VPN event key: {}, value: {}", LOGGING_PREFIX_DELETE, identifier, del);
         final String vpnName = del.getVpnInstanceName();
         Optional<VpnInstanceOpDataEntry> vpnOpValue;
@@ -138,7 +138,7 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
         try {
             vpnOpValue = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     VpnUtil.getVpnInstanceOpDataIdentifier(primaryRd));
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{}, failed to remove VPN: Exception while retrieving VpnInstanceOpDataEntry for VPN {}. ",
                     LOGGING_PREFIX_DELETE,  vpnName, e);
             return;
@@ -171,7 +171,7 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
     }
 
     @Override
-    protected void update(InstanceIdentifier<VpnInstance> identifier,
+    public void update(InstanceIdentifier<VpnInstance> identifier,
         VpnInstance original, VpnInstance update) {
         LOG.trace("VPN-UPDATE: update: VPN event key: {}, value: {}.", identifier, update);
         String vpnName = update.getVpnInstanceName();
@@ -188,14 +188,14 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
     }
 
     @Override
-    protected void add(final InstanceIdentifier<VpnInstance> identifier, final VpnInstance value) {
+    public void add(final InstanceIdentifier<VpnInstance> identifier, final VpnInstance value) {
         LOG.trace("{} add: Add VPN event key: {}, value: {}", LOGGING_PREFIX_ADD, identifier, value);
         final String vpnName = value.getVpnInstanceName();
         jobCoordinator.enqueueJob("VPN-" + vpnName, new AddVpnInstanceWorker(dataBroker, value),
                 SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries());
     }
 
-    private class AddVpnInstanceWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class AddVpnInstanceWorker implements Callable<List<? extends ListenableFuture<?>>> {
         private final Logger log = LoggerFactory.getLogger(AddVpnInstanceWorker.class);
         VpnInstance vpnInstance;
         DataBroker broker;
@@ -366,15 +366,19 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
                         Arrays.asList(new InstructionWriteMetadata(MetaDataUtil.getVpnIdMetadata(vpnInstanceOpDataEntry
                                 .getVpnId().toJava()), MetaDataUtil.METADATA_MASK_VRFID),
                                 new InstructionGotoTable(NwConstants.L3_GW_MAC_TABLE));
-
-                for (Uint64 dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
-                    String flowRef = getFibFlowRef(dpnId, NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
-                            vpnName, VpnConstants.DEFAULT_FLOW_PRIORITY);
-                    FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId,
-                            NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, flowRef, VpnConstants.DEFAULT_FLOW_PRIORITY,
-                            "VxLAN VPN Tunnel Bind Service", 0, 0, NwConstants.COOKIE_VM_FIB_TABLE,
-                            mkMatches, instructions);
-                    mdsalManager.installFlow(dpnId, flowEntity);
+                try {
+                    for (Uint64 dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
+                        String flowRef = getFibFlowRef(dpnId, NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
+                                vpnName, VpnConstants.DEFAULT_FLOW_PRIORITY);
+                        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId,
+                                NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, flowRef,
+                                VpnConstants.DEFAULT_FLOW_PRIORITY, "VxLAN VPN Tunnel Bind Service",
+                                0, 0, NwConstants.COOKIE_VM_FIB_TABLE, mkMatches, instructions);
+                        mdsalManager.installFlow(dpnId, flowEntity);
+                    }
+                } catch (ExecutionException | InterruptedException e) {
+                    LOG.error("PostAddVpnInstanceWorker: Exception while getting the list of Operative DPNs for Vpn {}",
+                            vpnName, e);
                 }
 
                 ///////////////////////
@@ -429,8 +433,8 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
         InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(rd);
         try {
             return SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                    id).orNull();
-        } catch (ReadFailedException e) {
+                    id).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException("Error reading VPN instance data for " + rd, e);
         }
     }
@@ -481,7 +485,7 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
                 }
 
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getDcGatewayTunnelInterfaceNameList: Failed to read data store");
         }
         return tunnelInterfaceNameList;
index 50466d2697fbbcc43b227fe463a873aeff4ca84f..53792d2c0086a3789e7d31a95e6415911767711a 100755 (executable)
@@ -8,11 +8,10 @@
 package org.opendaylight.netvirt.vpnmanager;
 
 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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterators;
 import com.google.common.util.concurrent.FutureCallback;
@@ -26,6 +25,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
@@ -34,22 +34,15 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.infra.TransactionAdapter;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -60,7 +53,11 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.caches.CacheProvider;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -72,6 +69,7 @@ import org.opendaylight.netvirt.vpnmanager.arp.responder.ArpResponderHandler;
 import org.opendaylight.netvirt.vpnmanager.populator.input.L3vpnInput;
 import org.opendaylight.netvirt.vpnmanager.populator.intfc.VpnPopulator;
 import org.opendaylight.netvirt.vpnmanager.populator.registry.L3vpnRegistry;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
@@ -125,7 +123,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInterface, VpnInterfaceManager> {
+public class VpnInterfaceManager extends AbstractAsyncDataTreeChangeListener<VpnInterface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class);
     private static final short DJC_MAX_RETRIES = 3;
@@ -165,7 +163,9 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                final JobCoordinator jobCoordinator,
                                final CacheProvider cacheProvider,
                                final VpnUtil vpnUtil) {
-        super(VpnInterface.class, VpnInterfaceManager.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class),
+                Executors.newListeningSingleThreadExecutor("VpnInterfaceManager", LOG));
 
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
@@ -184,16 +184,15 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
         vpnInstanceOpDataEntryCache = new InstanceIdDataObjectCache<>(VpnInstanceOpDataEntry.class, dataBroker,
                 LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(
                         VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class).build(), cacheProvider);
+        start();
     }
 
     public Runnable isNotifyTaskQueued(String intfName) {
         return vpnIntfMap.remove(intfName);
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
@@ -201,16 +200,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
     public void close() {
         super.close();
         vpnInstanceOpDataEntryCache.close();
-    }
-
-    @Override
-    protected InstanceIdentifier<VpnInterface> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
-    }
-
-    @Override
-    protected VpnInterfaceManager getDataTreeChangeListener() {
-        return VpnInterfaceManager.this;
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
@@ -534,7 +524,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                     addNewAdjToVpnInterface(vpnInterfaceOpIdentifier, primaryRd, adjacency,
                             dpId, writeOperTxn, writeConfigTxn, writeInvTxn, prefixListForRefreshFib);
                 }
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("processVpnInterfaceUp: Failed to read data store for interface {} vpn {} rd {} dpn {}",
                         interfaceName, vpnName, primaryRd, dpId);
             }
@@ -659,7 +649,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                     }
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("advertiseAdjacenciesForVpnToBgp: Failed to read data store for interface {} dpn {} nexthop {}"
                     + "vpn {} rd {}", interfaceName, dpnId, nextHopIp, vpnName, rd);
         }
@@ -687,11 +677,11 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
         }
         LOG.info("withdrawAdjacenciesForVpnFromBgp: For interface {} in vpn {} with rd {}", interfaceName,
                vpnName, rd);
-        Optional<AdjacenciesOp> adjacencies = Optional.absent();
+        Optional<AdjacenciesOp> adjacencies = Optional.empty();
         try {
             adjacencies = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
                     path);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("withdrawAdjacenciesForVpnFromBgp: Failed to read data store for interface {} vpn {}",
                     interfaceName, vpnName);
         }
@@ -739,11 +729,11 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
             throws ExecutionException, InterruptedException {
         InstanceIdentifier<VpnInterface> identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
         // Read NextHops
-        Optional<VpnInterface> vpnInteface = Optional.absent();
+        Optional<VpnInterface> vpnInteface = Optional.empty();
         try {
             vpnInteface = SingleTransactionDataBroker.syncReadOptional(dataBroker,
             LogicalDatastoreType.CONFIGURATION, identifier);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("processVpnInterfaceAdjacencies: Failed to read data store for interface {} vpn {} rd {}"
                     + "dpn {}", interfaceName, vpnName, primaryRd, dpnId);
         }
@@ -777,7 +767,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
             LOG.debug("processVpnInterfaceAdjacencies: NextHop for interface {} on dpn {} in vpn {} is {}",
                     interfaceName, dpnId, vpnName, nhList);
         }
-        Optional<String> gwMac = Optional.absent();
+        Optional<String> gwMac = Optional.empty();
         String vpnInterfaceSubnetGwMacAddress = null;
         VpnInstanceOpDataEntry vpnInstanceOpData = vpnUtil.getVpnInstanceOpData(primaryRd);
         Uint32 l3vni = vpnInstanceOpData.getL3vni() != null ? vpnInstanceOpData.getL3vni() : Uint32.ZERO;
@@ -910,7 +900,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                 gwMac.isPresent() ? gwMac.get() : null, gatewayIp, writeOperTxn);
 
         L3vpnInput input = new L3vpnInput().setNextHopIp(nextHopIp).setL3vni(l3vni.longValue()).setPrimaryRd(primaryRd)
-                .setGatewayMac(gwMac.orNull()).setInterfaceName(interfaceName)
+                .setGatewayMac(gwMac.orElse(null)).setInterfaceName(interfaceName)
                 .setVpnName(vpnName).setDpnId(dpnId).setEncapType(encapType);
 
         for (Adjacency nextHop : aug.getAdjacency()) {
@@ -996,8 +986,8 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                         + " vpn {} vpnid {} rd {} interface {}", label, srcDpnId , prefix, nhList,
                         vpnInterface.getVpnInstanceName(), vpnId, rd, vpnInterface.getName());
                 // Update the VRF entry with nextHop
-                fibManager.updateRoutePathForFibEntry(primaryRd, prefix, srcTepIp,
-                        label, true, TransactionAdapter.toWriteTransaction(writeConfigTxn));
+                fibManager.updateRoutePathForFibEntry(primaryRd, prefix, srcTepIp, label, true,
+                        writeConfigTxn);
 
                 //Get the list of VPN's importing this route(prefix) .
                 // Then update the VRF entry with nhList
@@ -1005,8 +995,8 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                 for (VpnInstanceOpDataEntry vpn : vpnsToImportRoute) {
                     String vpnRd = vpn.getVrfId();
                     if (vpnRd != null) {
-                        fibManager.updateRoutePathForFibEntry(vpnRd, prefix,
-                            srcTepIp, label, true, TransactionAdapter.toWriteTransaction(writeConfigTxn));
+                        fibManager.updateRoutePathForFibEntry(vpnRd, prefix, srcTepIp, label, true,
+                                writeConfigTxn);
                         LOG.info("updateVpnInterfaceOnTepAdd: Exported route with rd {} prefix {} nhList {} label {}"
                                 + " interface {} dpn {} from vpn {} to VPN {} vpnRd {}", rd, prefix, nhList, label,
                             vpnInterface.getName(), srcDpnId, vpnName,
@@ -1098,8 +1088,8 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                             prefix, nhList, vpnName,
                             vpnId, rd, vpnInterface.getName());
                     // Update the VRF entry with removed nextHop
-                    fibManager.updateRoutePathForFibEntry(primaryRd, prefix, srcTepIp,
-                            label, false, TransactionAdapter.toWriteTransaction(writeConfigTxn));
+                    fibManager.updateRoutePathForFibEntry(primaryRd, prefix, srcTepIp, label, false,
+                            writeConfigTxn);
 
                     //Get the list of VPN's importing this route(prefix) .
                     // Then update the VRF entry with nhList
@@ -1107,8 +1097,8 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                     for (VpnInstanceOpDataEntry vpn : vpnsToImportRoute) {
                         String vpnRd = vpn.getVrfId();
                         if (vpnRd != null) {
-                            fibManager.updateRoutePathForFibEntry(vpnRd, prefix,
-                                srcTepIp, label, false, TransactionAdapter.toWriteTransaction(writeConfigTxn));
+                            fibManager.updateRoutePathForFibEntry(vpnRd, prefix, srcTepIp, label, false,
+                                    writeConfigTxn);
                             LOG.info("updateVpnInterfaceOnTepDelete: Exported route with rd {} prefix {} nhList {}"
                                     + " label {} interface {} dpn {} from vpn {} to VPN {} vpnRd {}", rd, prefix,
                                     nhList, label, vpnInterface.getName(), srcDpnId,
@@ -1297,7 +1287,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                 try {
                                     optVpnInterface = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                             LogicalDatastoreType.OPERATIONAL, interfaceId);
-                                } catch (ReadFailedException e) {
+                                } catch (InterruptedException | ExecutionException e) {
                                     LOG.error("remove: Failed to read data store for interface {} vpn {}",
                                             interfaceName, vpnName);
                                     return;
@@ -1485,7 +1475,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                         + " Removing it.", interfaceName, vpnName, dpnId);
                 writeOperTxn.delete(identifier);
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("removeAdjacenciesFromVpn: Failed to read data store for interface {} dpn {} vpn {}",
                     interfaceName, dpnId, vpnName);
         }
@@ -1612,11 +1602,11 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                     gwPort.getMacAddress(), ipAddress, ifName, vpnName);
             return Optional.of(gwPort.getMacAddress());
         }
-        return Optional.absent();
+        return Optional.empty();
     }
 
     @Override
-    protected void update(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface original,
+    public void update(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface original,
         final VpnInterface update) {
         LOG.trace("Received VpnInterface update event: original={}, update={}", original, update);
         LOG.info("update: VPN Interface update event - intfName {} on dpn {} oldVpn {} newVpn {}", update.getName(),
@@ -1928,7 +1918,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
             }
             LOG.info("updateLabelMapper: Updated label rotue info for label {} with nextHopList {}", label,
                     nextHopIpList);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("updateLabelMapper: Failed to read data store for label {} nexthopList {}", label,
                     nextHopIpList);
         } catch (TransactionCommitFailedException e) {
@@ -2094,7 +2084,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                 currVpnIntf.getGatewayMacAddress(), currVpnIntf.getGatewayIpAddress());
                 writeOperTxn.merge(identifier, newVpnIntf, CREATE_MISSING_PARENTS);
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("addNewAdjToVpnInterface: Failed to read data store for interface {} dpn {} vpn {} rd {} ip "
                     + "{}", interfaceName, dpnId, configVpnName, primaryRd, adj.getIpAddress());
         }
@@ -2151,7 +2141,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                             + "unavailable dpnId {} adjIP {} rd {}", dpnId, adj.getIpAddress(), adj.getVrfId());
                 }
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("delAdjFromVpnInterface: Failed to read data store for ip {} interface {} dpn {} vpn {}",
                     adj.getIpAddress(), interfaceName, dpnId, vpnName);
         }
@@ -2457,7 +2447,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                     }
                                 });
                         });
-                } catch (ReadFailedException e) {
+                } catch (InterruptedException | ExecutionException e) {
                     LOG.error("updateVpnInterfacesForUnProcessAdjancencies: Failed to read data store for vpn {} rd {}",
                             vpnName, primaryRd);
                 }
index 5647c4a9cd15b46038a13ced943c099d681c9238..e32fce00caa82bdcf9962e1c2d0b57ab0e5fb101 100644 (file)
@@ -10,20 +10,17 @@ package org.opendaylight.netvirt.vpnmanager;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.Datastore.Operational;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -32,6 +29,9 @@ import org.opendaylight.genius.infra.TypedReadTransaction;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AdjacenciesOp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInterfaceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
@@ -45,8 +45,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnInterfaceOpListener extends AsyncDataTreeChangeListenerBase<VpnInterfaceOpDataEntry,
-                                                                     VpnInterfaceOpListener> {
+public class VpnInterfaceOpListener extends AbstractAsyncDataTreeChangeListener<VpnInterfaceOpDataEntry> {
     private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceOpListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -65,36 +64,32 @@ public class VpnInterfaceOpListener extends AsyncDataTreeChangeListenerBase<VpnI
     public VpnInterfaceOpListener(final DataBroker dataBroker, final VpnInterfaceManager vpnInterfaceManager,
         final VpnFootprintService vpnFootprintService, final JobCoordinator jobCoordinator,
                                   final VpnUtil vpnUtil) {
-        super(VpnInterfaceOpDataEntry.class, VpnInterfaceOpListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(VpnInterfaceOpData.class)
+                        .child(VpnInterfaceOpDataEntry.class),
+                org.opendaylight.infrautils.utils.concurrent.Executors
+                        .newListeningSingleThreadExecutor("VpnInterfaceOpListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.vpnInterfaceManager = vpnInterfaceManager;
         this.vpnFootprintService = vpnFootprintService;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VpnInterfaceOpDataEntry> getWildCardPath() {
-        InstanceIdentifier<VpnInterfaceOpDataEntry> id = InstanceIdentifier.create(VpnInterfaceOpData.class
-                ).child(VpnInterfaceOpDataEntry.class);
-        return id;
+    @PreDestroy
+    public void close() {
+        super.close();
+        org.opendaylight.infrautils.utils.concurrent.Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected VpnInterfaceOpListener getDataTreeChangeListener() {
-        return VpnInterfaceOpListener.this;
-    }
-
-
-    @Override
-    protected void remove(final InstanceIdentifier<VpnInterfaceOpDataEntry> identifier,
+    public void remove(final InstanceIdentifier<VpnInterfaceOpDataEntry> identifier,
             final VpnInterfaceOpDataEntry del) {
         final VpnInterfaceOpDataEntryKey key = identifier.firstKeyOf(VpnInterfaceOpDataEntry.class);
         final String interfaceName = key.getName();
@@ -222,13 +217,13 @@ public class VpnInterfaceOpListener extends AsyncDataTreeChangeListenerBase<VpnI
     }
 
     @Override
-    protected void update(final InstanceIdentifier<VpnInterfaceOpDataEntry> identifier,
+    public void update(final InstanceIdentifier<VpnInterfaceOpDataEntry> identifier,
             final VpnInterfaceOpDataEntry original, final VpnInterfaceOpDataEntry update) {
         LOG.info("update: interface {} vpn {}", original.getName(), original.getVpnInstanceName());
     }
 
     @Override
-    protected void add(InstanceIdentifier<VpnInterfaceOpDataEntry> identifier, VpnInterfaceOpDataEntry add) {
+    public void add(InstanceIdentifier<VpnInterfaceOpDataEntry> identifier, VpnInterfaceOpDataEntry add) {
         LOG.info("add: interface {} vpn {}. Ignoring", add.getName(), add.getVpnInstanceName());
     }
 }
index 4dfde8026d09fcad47104a9c303562e81846c0df..150d62405c7863d80182012b2689df5a482aa839 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -18,6 +17,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -27,9 +27,6 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.infra.Datastore.Configuration;
@@ -48,6 +45,8 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
 import org.opendaylight.infrautils.utils.function.InterruptibleCheckedConsumer;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput.ArpReponderInputBuilder;
@@ -337,7 +336,7 @@ public class VpnManagerImpl implements IVpnManager {
                 LOG.trace("isVPNConfigured: No VPNs configured.");
                 return false;
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException("Error reading VPN " + vpnsIdentifier, e);
         }
         LOG.trace("isVPNConfigured: VPNs are configured on the system.");
@@ -801,7 +800,7 @@ public class VpnManagerImpl implements IVpnManager {
                                 }
                             }
                         }
-                    } catch (ReadFailedException e) {
+                    } catch (InterruptedException | ExecutionException e) {
                         LOG.error("doesExistingVpnsHaveConflictingSubnet: Failed to read route targets to subnet"
                                 + "association for rt {} type {} subnet-cidr {}", routerTarget.getRt(),
                                 RouteTarget.RtType.ERT, subnetCidr);
index 440dac2875241a5422cbf6b8ffbf5b9ebe8a6f32..6ca92ed3e60379fd430c562dbff1c0860c12e0d7 100644 (file)
@@ -15,12 +15,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
@@ -43,7 +40,11 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchArpOp;
 import org.opendaylight.genius.mdsalutil.matches.MatchEthernetType;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.config.rev161130.VpnConfig;
@@ -53,7 +54,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnNodeListener extends AsyncClusteredDataTreeChangeListenerBase<Node, VpnNodeListener> {
+public class VpnNodeListener extends AbstractAsyncDataTreeChangeListener<Node> {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnNodeListener.class);
     private static final String FLOWID_PREFIX = "L3.";
@@ -68,32 +69,30 @@ public class VpnNodeListener extends AsyncClusteredDataTreeChangeListenerBase<No
     @Inject
     public VpnNodeListener(DataBroker dataBroker, IMdsalApiManager mdsalManager, JobCoordinator jobCoordinator,
                            VpnConfig vpnConfig) {
-        super(Node.class, VpnNodeListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class),
+                Executors.newListeningSingleThreadExecutor("VpnNodeListener", LOG));
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.mdsalManager = mdsalManager;
         this.jobCoordinator = jobCoordinator;
         this.connectedDpnIds = new CopyOnWriteArrayList<>();
         this.vpnConfig = vpnConfig;
+        start();
     }
 
-    @PostConstruct
     public void start() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(Nodes.class).child(Node.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected VpnNodeListener getDataTreeChangeListener() {
-        return VpnNodeListener.this;
-    }
-
-    @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node add) {
+    public void add(InstanceIdentifier<Node> identifier, Node add) {
         Uint64 dpId = MDSALUtil.getDpnIdFromNodeName(add.getId());
         if (!connectedDpnIds.contains(dpId)) {
             connectedDpnIds.add(dpId);
@@ -102,13 +101,13 @@ public class VpnNodeListener extends AsyncClusteredDataTreeChangeListenerBase<No
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node del) {
+    public void remove(InstanceIdentifier<Node> identifier, Node del) {
         Uint64 dpId = MDSALUtil.getDpnIdFromNodeName(del.getId());
         connectedDpnIds.remove(dpId);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
     }
 
     public boolean isConnectedNode(Uint64 nodeId) {
index bb8f13ef9ab6f5bee7115eb7e3e0c9436b89eabc..502d2308a44258bb9b324cad493ebcddb9955287 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.netvirt.vpnmanager;
 
 import static java.util.Collections.emptyList;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -17,14 +16,12 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -33,9 +30,13 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3nexthop.rev150409.L3nexthop;
@@ -52,7 +53,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInstanceOpDataEntry, VpnOpStatusListener> {
+public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener<VpnInstanceOpDataEntry> {
     private static final Logger LOG = LoggerFactory.getLogger(VpnOpStatusListener.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -69,7 +70,9 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
                                final IdManagerService idManager, final IFibManager fibManager,
                                final IMdsalApiManager mdsalManager, final VpnFootprintService vpnFootprintService,
                                final JobCoordinator jobCoordinator, VpnUtil vpnUtil) {
-        super(VpnInstanceOpDataEntry.class, VpnOpStatusListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(VpnInstanceOpData.class)
+                .child(VpnInstanceOpDataEntry.class), Executors
+                .newListeningSingleThreadExecutor("VpnOpStatusListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.bgpManager = bgpManager;
@@ -79,32 +82,29 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
         this.vpnFootprintService = vpnFootprintService;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<VpnInstanceOpDataEntry> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
-    @Override
-    protected VpnOpStatusListener getDataTreeChangeListener() {
-        return VpnOpStatusListener.this;
-    }
 
     @Override
-    protected void remove(InstanceIdentifier<VpnInstanceOpDataEntry> identifier, VpnInstanceOpDataEntry value) {
+    public void remove(InstanceIdentifier<VpnInstanceOpDataEntry> identifier, VpnInstanceOpDataEntry value) {
         LOG.info("remove: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId());
     }
 
     @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
-    protected void update(InstanceIdentifier<VpnInstanceOpDataEntry> identifier,
+    public void update(InstanceIdentifier<VpnInstanceOpDataEntry> identifier,
                           VpnInstanceOpDataEntry original, VpnInstanceOpDataEntry update) {
         LOG.info("update: Processing update for vpn {} with rd {}", update.getVpnInstanceName(), update.getVrfId());
         if (update.getVpnState() == VpnInstanceOpDataEntry.VpnState.PendingDelete
@@ -147,11 +147,11 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
                         }
                         InstanceIdentifier<Vpn> vpnToExtraroute =
                                 VpnExtraRouteHelper.getVpnToExtrarouteVpnIdentifier(vpnName);
-                        Optional<Vpn> optVpnToExtraroute = Optional.absent();
+                        Optional<Vpn> optVpnToExtraroute = Optional.empty();
                         try {
                             optVpnToExtraroute = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                     LogicalDatastoreType.OPERATIONAL, vpnToExtraroute);
-                        } catch (ReadFailedException e) {
+                        } catch (InterruptedException | ExecutionException e) {
                             LOG.error("update: Failed to read VpnToExtraRoute for vpn {}", vpnName);
                         }
                         if (optVpnToExtraroute.isPresent()) {
@@ -161,11 +161,11 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
                             vpnUtil.removeExternalTunnelDemuxFlows(vpnName);
                         }
                         // Clean up PrefixToInterface Operational DS
-                        Optional<VpnIds> optPrefixToIntf = Optional.absent();
+                        Optional<VpnIds> optPrefixToIntf = Optional.empty();
                         try {
                             optPrefixToIntf = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                     LogicalDatastoreType.OPERATIONAL, VpnUtil.getPrefixToInterfaceIdentifier(vpnId));
-                        } catch (ReadFailedException e) {
+                        } catch (InterruptedException | ExecutionException e) {
                             LOG.error("update: Failed to read PrefixToInterface for vpn {}", vpnName);
                         }
                         if (optPrefixToIntf.isPresent()) {
@@ -174,11 +174,11 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
                         // Clean up L3NextHop Operational DS
                         InstanceIdentifier<VpnNexthops> vpnNextHops = InstanceIdentifier.builder(L3nexthop.class).child(
                                 VpnNexthops.class, new VpnNexthopsKey(vpnId)).build();
-                        Optional<VpnNexthops> optL3nexthopForVpnId = Optional.absent();
+                        Optional<VpnNexthops> optL3nexthopForVpnId = Optional.empty();
                         try {
                             optL3nexthopForVpnId = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                                     LogicalDatastoreType.OPERATIONAL, vpnNextHops);
-                        } catch (ReadFailedException e) {
+                        } catch (InterruptedException | ExecutionException e) {
                             LOG.error("update: Failed to read VpnNextHops for vpn {}", vpnName);
                         }
                         if (optL3nexthopForVpnId.isPresent()) {
@@ -318,7 +318,7 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase<VpnInst
     }
 
     @Override
-    protected void add(final InstanceIdentifier<VpnInstanceOpDataEntry> identifier,
+    public void add(final InstanceIdentifier<VpnInstanceOpDataEntry> identifier,
                        final VpnInstanceOpDataEntry value) {
         LOG.debug("add: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId());
     }
index 0994ddb216d3c6ad28b45d8f076b8c503ea75d98..2488cbe2cb39ca5f93bc1129f8012341dc443508 100644 (file)
@@ -9,19 +9,19 @@ package org.opendaylight.netvirt.vpnmanager;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
index 7fb640f5ed14b46d1d17776f6212f0aa0181b361..f17a7cd16c2bb672a7014b47328d023497384d57 100644 (file)
@@ -8,40 +8,36 @@
 
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.Optional;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class VpnServiceElanDpnInterfacesListener
-        extends AsyncDataTreeChangeListenerBase<DpnInterfaces, VpnServiceElanDpnInterfacesListener> {
+public class VpnServiceElanDpnInterfacesListener extends AbstractAsyncDataTreeChangeListener<DpnInterfaces> {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnServiceElanDpnInterfacesListener.class);
     private final DataBroker dataBroker;
@@ -53,31 +49,36 @@ public class VpnServiceElanDpnInterfacesListener
     @Inject
     public VpnServiceElanDpnInterfacesListener(final DataBroker dataBroker, final IInterfaceManager interfaceManager,
             final IFibManager fibManager,final JobCoordinator jobCoordinator, VpnUtil vpnUtil) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(ElanDpnInterfaces.class)
+                        .child(ElanDpnInterfacesList.class).child(DpnInterfaces.class),
+                Executors.newListeningSingleThreadExecutor("VpnServiceElanDpnInterfacesListener", LOG));
         this.dataBroker = dataBroker;
         this.interfaceManager = interfaceManager;
         this.fibManager = fibManager;
         this.jobCoordinator = jobCoordinator;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    public InstanceIdentifier<DpnInterfaces> getWildCardPath() {
-        return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class)
-                .child(DpnInterfaces.class).build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
+
     @Override
-    protected void remove(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
+    public void remove(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
 
     }
 
     @Override
-    protected void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
+    public void update(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces original,
             DpnInterfaces update) {
         LOG.info("received Dpninterfaces update event for dpn {}", update.getDpId());
         Uint64 dpnId = update.getDpId();
@@ -123,7 +124,7 @@ public class VpnServiceElanDpnInterfacesListener
     }
 
     @Override
-    protected void add(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
+    public void add(InstanceIdentifier<DpnInterfaces> identifier, DpnInterfaces dpnInterfaces) {
         Uint64 dpnId = dpnInterfaces.getDpId();
         String elanInstanceName = identifier.firstKeyOf(ElanDpnInterfacesList.class).getElanInstanceName();
         ElanInstance elanInstance = vpnUtil.getElanInstanceByName(elanInstanceName);
@@ -137,12 +138,6 @@ public class VpnServiceElanDpnInterfacesListener
         vpnUtil.addRouterPortToElanForVlanInDpn(vpnName, dpnId);
     }
 
-    @Override
-    protected VpnServiceElanDpnInterfacesListener getDataTreeChangeListener() {
-        return VpnServiceElanDpnInterfacesListener.this;
-    }
-
-
     public static List<String> getUpdatedInterfaceList(List<String> updatedInterfaceList,
             List<String> currentInterfaceList) {
         if (updatedInterfaceList == null) {
index 2b16bbd9ecec0f664756edafdbba4d764f27022e..941610a12c54d096dd2ec280fa86f47b0fbc05cb 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -16,15 +15,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -198,7 +198,7 @@ public class VpnSubnetRouteHandler {
             LOG.error("{} onSubnetAddedToVpn: Unable to handle subnet {} with ip {} added to vpn {}", LOGGING_PREFIX,
                     subnetId.getValue(), subnetIp, vpnName, e);
             return;
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onSubnetAddedToVpn: Failed to read data store for subnet {} ip {} vpn {}", LOGGING_PREFIX,
                     subnetId, subnetIp, vpnName);
             return;
@@ -268,7 +268,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) {
             LOG.error("{} onSubnetAddedToVpn: Unable to handle subnet {} with ip {} added to vpn {}", LOGGING_PREFIX,
                     subnetId.getValue(), subnetIp, vpnName, e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onSubnetAddedToVpn: Failed to read data store for subnet {} ip {} vpn {}", LOGGING_PREFIX,
                     subnetId, subnetIp, vpnName);
         } catch (TransactionCommitFailedException ex) {
@@ -378,7 +378,7 @@ public class VpnSubnetRouteHandler {
             LOG.error("{} onSubnetDeletedFromVpn: Removal of SubnetOpDataEntry for subnet {} subnetIp {}"
                             + " vpnId {} failed", LOGGING_PREFIX, subnetId.getValue(), subnetmap.getSubnetIp(),
                     subnetmap.getVpnId(), ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onSubnetDeletedFromVpn: Failed to read data store for subnet {} ip {} vpn {}",
                     LOGGING_PREFIX, subnetId, subnetmap.getSubnetIp(), subnetmap.getVpnId());
         } finally {
@@ -411,7 +411,7 @@ public class VpnSubnetRouteHandler {
             }
             LOG.info("{} onSubnetUpdatedInVpn: subnet {} with Ip {} updated successfully for vpn {}", LOGGING_PREFIX,
                     subnetId.getValue(), subnetIp, vpnName);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("onSubnetUpdatedInVpn: Failed to read data store for subnet{} ip {} elanTag {} vpn {}",subnetId,
                     subnetIp, elanTag, vpnName);
         }
@@ -505,7 +505,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) { //TODO: Avoid this
             LOG.error("{} onPortAddedToSubnet: Unable to handle port {} added to subnet {}", LOGGING_PREFIX,
                     portId.getValue(), subnetId.getValue(), e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onPortAddedToSubnet: Failed to read data store for port {} subnet {}", LOGGING_PREFIX,
                     portId, subnetId);
         } catch (TransactionCommitFailedException e) {
@@ -574,7 +574,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) {
             LOG.error("{} onPortRemovedFromSubnet: Unable to handle port {} removed from subnet {}", LOGGING_PREFIX,
                     portId.getValue(), subnetId.getValue(), e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onPortRemovedFromSubnet: Failed to read data store for port {} subnet {}", LOGGING_PREFIX,
                     portId, subnetId);
         } catch (TransactionCommitFailedException e) {
@@ -641,7 +641,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) {
             LOG.error("{} onInterfaceUp: Unable to handle interface up event for port {} in subnet {}",
                     LOGGING_PREFIX, intfName, subnetId.getValue(), e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onInterfaceUp: Failed to read data store for interface {} dpn {} subnet {}", LOGGING_PREFIX,
                     intfName, dpnId, subnetId);
         } catch (TransactionCommitFailedException e) {
@@ -702,7 +702,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) { //TODO: Remove RuntimeException
             LOG.error("{} onInterfaceDown: Unable to handle interface down event for port {} in subnet {}",
                     LOGGING_PREFIX, interfaceName, subnetId.getValue(), e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} onInterfaceDown: Failed to read data store for interface {} dpn {} subnet {}",
                     LOGGING_PREFIX, interfaceName, dpnId, subnetId.getValue(), e);
         } catch (TransactionCommitFailedException ex) {
@@ -762,7 +762,7 @@ public class VpnSubnetRouteHandler {
         } catch (TransactionCommitFailedException ex) {
             LOG.error("{} updateSubnetRouteOnTunnelUpEvent: Failed to update subnetRoute for subnet {} on dpn {}",
                     LOGGING_PREFIX, subnetId.getValue(), dpnId.toString(), ex);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} updateSubnetRouteOnTunnelUpEvent: Failed to read data store for subnet {} on dpn {}",
                     LOGGING_PREFIX, subnetId.getValue(), dpnId.toString(), e);
         }
@@ -810,7 +810,7 @@ public class VpnSubnetRouteHandler {
         } catch (RuntimeException e) {
             LOG.error("{} updateSubnetRouteOnTunnelDownEvent: Unable to handle tunnel down event for subnetId {}"
                     + " dpnId {}", LOGGING_PREFIX, subnetId.getValue(), dpnId.toString(), e);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("{} Failed to read data store for subnet {} dpn {}", LOGGING_PREFIX, subnetId, dpnId);
         } catch (TransactionCommitFailedException e) {
             LOG.error("{} updateSubnetRouteOnTunnelDownEvent: Updation of SubnetOpDataEntry for subnet {}"
index 2c47b7e560a68590faf3917f92e92e380dcc6937..bc8eee60fc53fa32ff633b7c2f102bb729b352d4 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.netvirt.vpnmanager;
 import static java.util.Collections.emptyList;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Iterators;
 import com.google.common.net.InetAddresses;
 import com.google.common.util.concurrent.FutureCallback;
@@ -33,6 +32,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -42,11 +42,6 @@ import java.util.stream.Collectors;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.Datastore.Configuration;
@@ -77,6 +72,10 @@ import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.genius.utils.SystemPropertyReader;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -585,7 +584,7 @@ public final class VpnUtil {
         }
 
         return read(LogicalDatastoreType.CONFIGURATION, VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnName))
-                .toJavaUtil().map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
+                .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911
                         .vpn.instance.to.vpn.id.VpnInstance::getVpnId)
                         .orElse(VpnConstants.INVALID_ID);
     }
@@ -609,7 +608,7 @@ public final class VpnUtil {
 
     public static String getVpnRd(TypedReadTransaction<Configuration> confTx, String vpnName) {
         try {
-            return confTx.read(VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnName)).get().toJavaUtil().map(
+            return confTx.read(VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnName)).get().map(
                 vpnInstance -> vpnInstance.getVrfId()).orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
@@ -770,7 +769,7 @@ public final class VpnUtil {
 
     @Nullable
     public VpnInstanceOpDataEntry getVpnInstanceOpData(String rd) {
-        return read(LogicalDatastoreType.OPERATIONAL, getVpnInstanceOpDataIdentifier(rd)).orNull();
+        return read(LogicalDatastoreType.OPERATIONAL, getVpnInstanceOpDataIdentifier(rd)).orElse(null);
     }
 
     @Nullable
@@ -790,7 +789,7 @@ public final class VpnUtil {
 
     public Optional<List<String>> getVpnHandlingIpv4AssociatedWithInterface(String interfaceName) {
         InstanceIdentifier<VpnInterface> interfaceId = getVpnInterfaceIdentifier(interfaceName);
-        Optional<List<String>> vpnOptional = Optional.absent();
+        Optional<List<String>> vpnOptional = Optional.empty();
         Optional<VpnInterface> optConfiguredVpnInterface = read(LogicalDatastoreType.CONFIGURATION, interfaceId);
         if (optConfiguredVpnInterface.isPresent()) {
             VpnInterface cfgVpnInterface = optConfiguredVpnInterface.get();
@@ -829,7 +828,7 @@ public final class VpnUtil {
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
         try {
             return SingleTransactionDataBroker.syncReadOptional(dataBroker, datastoreType, path);
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
         }
     }
@@ -1133,7 +1132,7 @@ public final class VpnUtil {
             String vpnName, String fixedIp) {
         InstanceIdentifier<VpnPortipToPort> id = buildVpnPortipToPortIdentifier(vpnName, fixedIp);
         try {
-            return confTx.read(id).get().orNull();
+            return confTx.read(id).get().orElse(null);
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
         }
@@ -1289,7 +1288,7 @@ public final class VpnUtil {
             throws ExecutionException, InterruptedException {
         InstanceIdentifier<Routers> id = InstanceIdentifier.builder(ExtRouters.class).child(Routers.class,
             new RoutersKey(routerId)).build();
-        return tx.read(id).get().orNull();
+        return tx.read(id).get().orElse(null);
     }
 
     static InstanceIdentifier<Subnetmaps> buildSubnetMapsWildCardPath() {
@@ -1370,7 +1369,7 @@ public final class VpnUtil {
     }
 
     public Optional<IpAddress> getGatewayIpAddressFromInterface(MacEntry macEntry) {
-        Optional<IpAddress> gatewayIp = Optional.absent();
+        Optional<IpAddress> gatewayIp = Optional.empty();
         String srcInterface = macEntry.getInterfaceName();
         InetAddress hiddenIp = macEntry.getIpAddress();
         if (neutronVpnService != null) {
@@ -1398,7 +1397,7 @@ public final class VpnUtil {
     }
 
     public Optional<String> getGWMacAddressFromInterface(MacEntry macEntry, IpAddress gatewayIp) {
-        Optional<String> gatewayMac = Optional.absent();
+        Optional<String> gatewayMac = Optional.empty();
         Uint32 vpnId = getVpnId(macEntry.getVpnName());
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn
             .instance.VpnIds>
@@ -1446,7 +1445,7 @@ public final class VpnUtil {
     }
 
     public Optional<String> getVpnSubnetGatewayIp(final Uuid subnetUuid) {
-        Optional<String> gwIpAddress = Optional.absent();
+        Optional<String> gwIpAddress = Optional.empty();
         final SubnetKey subnetkey = new SubnetKey(subnetUuid);
         final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
                 .child(Subnets.class)
@@ -1730,7 +1729,7 @@ public final class VpnUtil {
         InstanceIdentifier<Network> inst = InstanceIdentifier.create(Neutron.class).child(
                 org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks.class).child(
                 Network.class, new NetworkKey(networkId));
-        return read(LogicalDatastoreType.CONFIGURATION, inst).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, inst).orElse(null);
     }
 
     public static boolean isEligibleForBgp(@Nullable String rd, @Nullable String vpnName, @Nullable Uint64 dpnId,
@@ -1757,13 +1756,18 @@ public final class VpnUtil {
 
     void removeExternalTunnelDemuxFlows(String vpnName) {
         LOG.info("Removing external tunnel flows for vpn {}", vpnName);
-        for (Uint64 dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
-            LOG.debug("Removing external tunnel flows for vpn {} from dpn {}", vpnName, dpnId);
-            String flowRef = getFibFlowRef(dpnId, NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
-                    vpnName, VpnConstants.DEFAULT_FLOW_PRIORITY);
-            FlowEntity flowEntity = VpnUtil.buildFlowEntity(dpnId,
-                    NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, flowRef);
-            mdsalManager.removeFlow(flowEntity);
+        try {
+            for (Uint64 dpnId: NWUtil.getOperativeDPNs(dataBroker)) {
+                LOG.debug("Removing external tunnel flows for vpn {} from dpn {}", vpnName, dpnId);
+                String flowRef = getFibFlowRef(dpnId, NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE,
+                        vpnName, VpnConstants.DEFAULT_FLOW_PRIORITY);
+                FlowEntity flowEntity = VpnUtil.buildFlowEntity(dpnId,
+                        NwConstants.L3VNI_EXTERNAL_TUNNEL_DEMUX_TABLE, flowRef);
+                mdsalManager.removeFlow(flowEntity);
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("removeExternalTunnelDemuxFlows: Exception while removing external tunnel flows for vpn {}",
+                    vpnName, e);
         }
     }
 
@@ -1861,7 +1865,7 @@ public final class VpnUtil {
     @Nullable
     public Subnetmap getSubnetmapFromItsUuid(Uuid subnetUuid) {
         InstanceIdentifier<Subnetmap> id = buildSubnetmapIdentifier(subnetUuid);
-        return read(LogicalDatastoreType.CONFIGURATION, id).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, id).orElse(null);
     }
 
     boolean isAdjacencyEligibleToVpnInternet(Adjacency adjacency) {
@@ -2102,7 +2106,7 @@ public final class VpnUtil {
     @Nullable
     ElanInterface getElanInterfaceByElanInterfaceName(String elanInterfaceName) {
         InstanceIdentifier<ElanInterface> elanInterfaceId = getElanInterfaceConfigurationDataPathId(elanInterfaceName);
-        return read(LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, elanInterfaceId).orElse(null);
     }
 
     static InstanceIdentifier<ElanInterface> getElanInterfaceConfigurationDataPathId(String interfaceName) {
@@ -2114,7 +2118,7 @@ public final class VpnUtil {
     DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, Uint64 dpId) {
         InstanceIdentifier<DpnInterfaces> elanDpnInterfacesId = getElanDpnInterfaceOperationalDataPath(elanInstanceName,
                 dpId);
-        return read(LogicalDatastoreType.OPERATIONAL, elanDpnInterfacesId).orNull();
+        return read(LogicalDatastoreType.OPERATIONAL, elanDpnInterfacesId).orElse(null);
     }
 
     @Nullable
@@ -2152,7 +2156,7 @@ public final class VpnUtil {
     ElanInstance getElanInstanceByName(String elanInstanceName) {
         InstanceIdentifier<ElanInstance> elanIdentifierId =
                 ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName);
-        return read(LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orNull();
+        return read(LogicalDatastoreType.CONFIGURATION, elanIdentifierId).orElse(null);
     }
 
     @Nullable
@@ -2301,7 +2305,7 @@ public final class VpnUtil {
             } else {
                 LOG.error("getRtListForVpn: Vpn Instance {} not present in config DS", vpnName);
             }
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getRtListForVpn: Read failed for Vpn Instance {}", vpnName);
         }
         return rtList;
index 81ecb31f034f8acc1573e4ed5b01fb2345b89a53..283c37363e8e97e6496036a8640d6e53bbddb46f 100644 (file)
@@ -7,12 +7,12 @@
  */
 package org.opendaylight.netvirt.vpnmanager.arp.responder;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.NWUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderInput.ArpReponderInputBuilder;
 import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
index a412914ee1354a567c95389d8c86d355d8bd2cc7..4e981989be914664f92547b93bd6c482da527977 100755 (executable)
@@ -9,7 +9,6 @@ package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -17,19 +16,20 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -90,7 +90,6 @@ public class IVpnLinkServiceImpl implements IVpnLinkService, AutoCloseable {
         this.interVpnLinkUtil = interVpnLinkUtil;
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
     }
@@ -351,8 +350,13 @@ public class IVpnLinkServiceImpl implements IVpnLinkService, AutoCloseable {
 
     private Map<String, String> buildRouterXL3VPNMap() {
         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
-        Optional<VpnMaps> optVpnMaps =
-            MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
+        Optional<VpnMaps> optVpnMaps = Optional.empty();
+        try {
+            optVpnMaps = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    vpnMapsIdentifier);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("buildRouterXL3VPNMap: Exception while reading VpnMaps DS", e);
+        }
         if (!optVpnMaps.isPresent()) {
             LOG.info("Could not retrieve VpnMaps object from Configurational DS");
             return new HashMap<>();
@@ -389,9 +393,14 @@ public class IVpnLinkServiceImpl implements IVpnLinkService, AutoCloseable {
         // Retrieving all Routers
         InstanceIdentifier<Routers> routersIid = InstanceIdentifier.builder(Neutron.class)
                 .child(Routers.class).build();
-        Optional<Routers> routerOpData = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, routersIid);
+        Optional<Routers> routerOpData = Optional.empty();
+        try {
+            routerOpData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, routersIid);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("handleStaticRoutes: Exception while reading routers DS", e);
+        }
         if (!routerOpData.isPresent()) {
-
             return;
         }
         List<Router> routers = routerOpData.get().nonnullRouter();
index 808205caf64b970f5f23ac754bbe7ce8d78c0fa0..dc18957e358aebcd2753b169a78dab4a48100fae 100644 (file)
@@ -8,13 +8,14 @@
 
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -26,8 +27,7 @@ import org.slf4j.LoggerFactory;
  * caches updated.
  */
 @Singleton
-public class InterVpnLinkCacheFeeder
-    extends AsyncClusteredDataTreeChangeListenerBase<InterVpnLink, InterVpnLinkCacheFeeder> {
+public class InterVpnLinkCacheFeeder extends AbstractClusteredAsyncDataTreeChangeListener<InterVpnLink> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkCacheFeeder.class);
 
@@ -36,40 +36,39 @@ public class InterVpnLinkCacheFeeder
 
     @Inject
     public InterVpnLinkCacheFeeder(final DataBroker dataBroker, final InterVpnLinkCache interVpnLinkCache) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinks.class)
+                .child(InterVpnLink.class), Executors
+                .newListeningSingleThreadExecutor("InterVpnLinkCacheFeeder", LOG));
         this.dataBroker = dataBroker;
         this.interVpnLinkCache = interVpnLinkCache;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink del) {
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
+    @Override
+    public void remove(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink del) {
         interVpnLinkCache.removeInterVpnLinkFromCache(del);
     }
 
     @Override
-    protected void update(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink original, InterVpnLink update) {
+    public void update(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink original, InterVpnLink update) {
         // TODO Auto-generated method stub
     }
 
     @Override
-    protected void add(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink add) {
+    public void add(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink add) {
         LOG.debug("Added interVpnLink {}  with vpn1={} and vpn2={}", add.getName(),
             add.getFirstEndpoint().getVpnUuid(), add.getSecondEndpoint().getVpnUuid());
         interVpnLinkCache.addInterVpnLinkToCaches(add);
     }
 
-    @Override
-    protected InstanceIdentifier<InterVpnLink> getWildCardPath() {
-        return InstanceIdentifier.create(InterVpnLinks.class).child(InterVpnLink.class);
-    }
-
-    @Override
-    protected InterVpnLinkCacheFeeder getDataTreeChangeListener() {
-        return this;
-    }
-
 }
index c0a14260b2fddcfe55c6256821ed5bbe7556047c..4d75774863d5ae50820cb23eb097df86555d3385 100644 (file)
@@ -8,18 +8,19 @@
 
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
@@ -60,30 +61,33 @@ public class InterVpnLinkCacheImpl implements InterVpnLinkCache {
     public void initialFeed() {
         // Read all InterVpnLinks and InterVpnLinkStates from MD-SAL.
         InstanceIdentifier<InterVpnLinks> interVpnLinksIid = InstanceIdentifier.builder(InterVpnLinks.class).build();
-
-        Optional<InterVpnLinks> optIVpnLinksOpData =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, interVpnLinksIid);
-
-        if (!optIVpnLinksOpData.isPresent()) {
-            return; // Nothing to be added to cache
-        }
-        InterVpnLinks interVpnLinks = optIVpnLinksOpData.get();
-        for (InterVpnLink interVpnLink : interVpnLinks.nonnullInterVpnLink()) {
-            addInterVpnLinkToCaches(interVpnLink);
-        }
-
-        // Now the States
-        InstanceIdentifier<InterVpnLinkStates> interVpnLinkStateIid =
-                InstanceIdentifier.builder(InterVpnLinkStates.class).build();
-
-        Optional<InterVpnLinkStates> optIVpnLinkStateOpData =
-                MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, interVpnLinkStateIid);
-        if (!optIVpnLinkStateOpData.isPresent()) {
-            return;
-        }
-        InterVpnLinkStates interVpnLinkStates = optIVpnLinkStateOpData.get();
-        for (InterVpnLinkState interVpnLinkState : interVpnLinkStates.nonnullInterVpnLinkState()) {
-            addInterVpnLinkStateToCaches(interVpnLinkState);
+        try {
+            Optional<InterVpnLinks> optIVpnLinksOpData = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, interVpnLinksIid);
+            if (!optIVpnLinksOpData.isPresent()) {
+                return; // Nothing to be added to cache
+            }
+            InterVpnLinks interVpnLinks = optIVpnLinksOpData.get();
+            for (InterVpnLink interVpnLink : interVpnLinks.nonnullInterVpnLink()) {
+                addInterVpnLinkToCaches(interVpnLink);
+            }
+
+            // Now the States
+            InstanceIdentifier<InterVpnLinkStates> interVpnLinkStateIid =
+                    InstanceIdentifier.builder(InterVpnLinkStates.class).build();
+
+            Optional<InterVpnLinkStates> optIVpnLinkStateOpData =
+                    SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                            interVpnLinkStateIid);
+            if (!optIVpnLinkStateOpData.isPresent()) {
+                return;
+            }
+            InterVpnLinkStates interVpnLinkStates = optIVpnLinkStateOpData.get();
+            for (InterVpnLinkState interVpnLinkState : interVpnLinkStates.nonnullInterVpnLinkState()) {
+                addInterVpnLinkStateToCaches(interVpnLinkState);
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("initialFeed: Exception while reading interVpnLink DS", e);
         }
     }
 
@@ -96,7 +100,7 @@ public class InterVpnLinkCacheImpl implements InterVpnLinkCache {
                 interVpnLink.getFirstEndpoint().getIpAddress(), interVpnLink.getSecondEndpoint().getVpnUuid(),
                 interVpnLink.getSecondEndpoint().getIpAddress());
 
-        InterVpnLinkDataComposite interVpnLinkDataComposite = getInterVpnLinkByName(ivlName).orNull();
+        InterVpnLinkDataComposite interVpnLinkDataComposite = getInterVpnLinkByName(ivlName).orElse(null);
         if (interVpnLinkDataComposite != null) {
             interVpnLinkDataComposite.setInterVpnLinkConfig(interVpnLink);
         } else {
@@ -115,7 +119,7 @@ public class InterVpnLinkCacheImpl implements InterVpnLinkCache {
         LOG.debug("Adding InterVpnLinkState {} with vpn1=[{}]  and vpn2=[{}]",
                   ivlName, interVpnLinkState.getFirstEndpointState(), interVpnLinkState.getSecondEndpointState());
 
-        InterVpnLinkDataComposite ivl = getInterVpnLinkByName(ivlName).orNull();
+        InterVpnLinkDataComposite ivl = getInterVpnLinkByName(ivlName).orElse(null);
         if (ivl != null) {
             ivl.setInterVpnLinkState(interVpnLinkState);
         } else {
@@ -128,13 +132,13 @@ public class InterVpnLinkCacheImpl implements InterVpnLinkCache {
     }
 
     private void addToEndpointCache(InterVpnLinkDataComposite interVpnLink) {
-        safePut(endpointToInterVpnLinkCache, interVpnLink.getFirstEndpointIpAddr().orNull(), interVpnLink);
-        safePut(endpointToInterVpnLinkCache, interVpnLink.getSecondEndpointIpAddr().orNull(), interVpnLink);
+        safePut(endpointToInterVpnLinkCache, interVpnLink.getFirstEndpointIpAddr().orElse(null), interVpnLink);
+        safePut(endpointToInterVpnLinkCache, interVpnLink.getSecondEndpointIpAddr().orElse(null), interVpnLink);
     }
 
     private void addToVpnUuidCache(InterVpnLinkDataComposite interVpnLink) {
-        safePut(uuidToInterVpnLinkCache, interVpnLink.getFirstEndpointVpnUuid().orNull(), interVpnLink);
-        safePut(uuidToInterVpnLinkCache, interVpnLink.getSecondEndpointVpnUuid().orNull(), interVpnLink);
+        safePut(uuidToInterVpnLinkCache, interVpnLink.getFirstEndpointVpnUuid().orElse(null), interVpnLink);
+        safePut(uuidToInterVpnLinkCache, interVpnLink.getSecondEndpointVpnUuid().orElse(null), interVpnLink);
     }
 
     private void addToIVpnLinkNameCache(InterVpnLinkDataComposite interVpnLink) {
@@ -170,30 +174,30 @@ public class InterVpnLinkCacheImpl implements InterVpnLinkCache {
 
 
     private void removeFromVpnUuidCache(InterVpnLinkDataComposite interVpnLinkComposite) {
-        safeRemove(uuidToInterVpnLinkCache, interVpnLinkComposite.getFirstEndpointVpnUuid().orNull());
-        safeRemove(uuidToInterVpnLinkCache, interVpnLinkComposite.getSecondEndpointVpnUuid().orNull());
+        safeRemove(uuidToInterVpnLinkCache, interVpnLinkComposite.getFirstEndpointVpnUuid().orElse(null));
+        safeRemove(uuidToInterVpnLinkCache, interVpnLinkComposite.getSecondEndpointVpnUuid().orElse(null));
     }
 
 
     private void removeFromEndpointIpAddressCache(InterVpnLinkDataComposite interVpnLinkComposite) {
-        safeRemove(endpointToInterVpnLinkCache, interVpnLinkComposite.getFirstEndpointIpAddr().orNull());
-        safeRemove(endpointToInterVpnLinkCache, interVpnLinkComposite.getSecondEndpointIpAddr().orNull());
+        safeRemove(endpointToInterVpnLinkCache, interVpnLinkComposite.getFirstEndpointIpAddr().orElse(null));
+        safeRemove(endpointToInterVpnLinkCache, interVpnLinkComposite.getSecondEndpointIpAddr().orElse(null));
     }
 
     @Override
     public Optional<InterVpnLinkDataComposite> getInterVpnLinkByName(String interVpnLinkName) {
-        return Optional.fromNullable(safeGet(nameToInterVpnLinkCache, interVpnLinkName));
+        return Optional.ofNullable(safeGet(nameToInterVpnLinkCache, interVpnLinkName));
     }
 
     @Override
     public Optional<InterVpnLinkDataComposite> getInterVpnLinkByEndpoint(String endpointIp) {
         LOG.trace("Checking if {} is configured as an InterVpnLink endpoint", endpointIp);
-        return Optional.fromNullable(safeGet(endpointToInterVpnLinkCache, endpointIp));
+        return Optional.ofNullable(safeGet(endpointToInterVpnLinkCache, endpointIp));
     }
 
     @Override
     public Optional<InterVpnLinkDataComposite> getInterVpnLinkByVpnId(String vpnId) {
-        return Optional.fromNullable(safeGet(uuidToInterVpnLinkCache, vpnId));
+        return Optional.ofNullable(safeGet(uuidToInterVpnLinkCache, vpnId));
     }
 
     @Override
index 114cff1ca30159ae2bdca27738f55bbde40d2bce..7fa501a28736f8ed730210afdebbf0ff609472cf 100755 (executable)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -18,23 +17,24 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -48,6 +48,7 @@ import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComp
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCleanedCheckerTask;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCreatorTask;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkRemoverTask;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
@@ -81,7 +82,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterVpnLink, InterVpnLinkListener> {
+public class InterVpnLinkListener extends AbstractAsyncDataTreeChangeListener<InterVpnLink> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkListener.class);
 
@@ -114,6 +115,9 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
                                 final JobCoordinator jobCoordinator,
                                 final InterVpnLinkCache interVpnLinkCache, final VpnUtil vpnUtil,
                                 final InterVpnLinkUtil interVpnLinkUtil) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinks.class)
+                .child(InterVpnLink.class),
+                Executors.newListeningSingleThreadExecutor("InterVpnLinkListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.idManager = idManager;
@@ -131,24 +135,19 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
         this.interVpnLinkUtil = interVpnLinkUtil;
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<InterVpnLink> getWildCardPath() {
-        return InstanceIdentifier.create(InterVpnLinks.class).child(InterVpnLink.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InterVpnLinkListener getDataTreeChangeListener() {
-        return InterVpnLinkListener.this;
-    }
-
-    @Override
-    protected void add(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink add) {
+    public void add(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink add) {
 
         String ivpnLinkName = add.getName();
         LOG.debug("Reacting to IVpnLink {} creation. Vpn1=[name={}  EndpointIp={}]  Vpn2=[name={} endpointIP={}]",
@@ -294,7 +293,7 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
     }
 
     @Override
-    protected void remove(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink del) {
+    public void remove(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink del) {
 
         LOG.debug("Reacting to InterVpnLink {} removal", del.getName());
 
@@ -419,7 +418,7 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
     }
 
     @Override
-    protected void update(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink original, InterVpnLink update) {
+    public void update(InstanceIdentifier<InterVpnLink> identifier, InterVpnLink original, InterVpnLink update) {
 
         LOG.debug("Update InterVpnLink {}. "
                 + " original=[1stEndpoint=[vpn=<{}> ipAddr=<{}>] 2ndEndpoint=[vpn=<{}> ipAddr=<{}>]]"
index 190fb2150aacee6185f7fcc1186d46dd9e56f9cd..1296ffa2a473920a4df895cd15a2ac4f872211de 100644 (file)
@@ -13,13 +13,14 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.mdsalutil.NWUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
@@ -64,9 +65,12 @@ public class InterVpnLinkLocator {
      */
     public List<Uint64> selectSuitableDpns(InterVpnLink interVpnLink) {
         int numberOfDpns = Integer.getInteger(NBR_OF_DPNS_PROPERTY_NAME, 1);
-        List<Uint64> dpnIdPool = NWUtil.getOperativeDPNs(dataBroker).stream()
-                                                                        .map(dpn -> dpn)
-                                                                        .collect(Collectors.toList());
+        List<Uint64> dpnIdPool = new ArrayList<>();
+        try {
+            dpnIdPool = NWUtil.getOperativeDPNs(dataBroker).stream().map(dpn -> dpn).collect(Collectors.toList());
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("selectSuitableDpns: Exception while reading Operative DPNs", e);
+        }
         LOG.trace("selectSuitableDpns for {} with numberOfDpns={} and availableDpns={}",
                   interVpnLink.getName(), numberOfDpns, dpnIdPool);
         int poolSize = dpnIdPool.size();
@@ -204,8 +208,8 @@ public class InterVpnLinkLocator {
             if (ivl.getInterVpnLinkName().equals(ivpnLinkToMatch.getName())) {
                 return false; // ivl and ivpnLinlToMatch are the same InterVpnLink
             }
-            String vpn1Name = ivl.getFirstEndpointVpnUuid().orNull();
-            String vpn2Name = ivl.getSecondEndpointVpnUuid().orNull();
+            String vpn1Name = ivl.getFirstEndpointVpnUuid().orElse(null);
+            String vpn2Name = ivl.getSecondEndpointVpnUuid().orElse(null);
             if (vpn1Name == null) {
                 return false;
             }
index 47c9d4269b77d00b2fbeb95fb96e6f275209dd24..bd555d9346b2305c1277235436c14f0f8224249c 100755 (executable)
@@ -7,20 +7,20 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.VpnFootprintService;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
  * there are no DPNs connected to controller by the time the InterVpnLink is
  * created.
  */
-public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<Void>>> {
+public class InterVpnLinkNodeAddTask implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeAddTask.class);
     private static final String NBR_OF_DPNS_PROPERTY_NAME = "vpnservice.intervpnlink.number.dpns";
 
index e7c68e724f80d342422d0c92613d47b04152b6d5..907ea6232b269430715fce12026bfd10fdd1a542 100644 (file)
@@ -9,14 +9,14 @@ package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
 import java.math.BigInteger;
 import java.util.List;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.VpnFootprintService;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
@@ -24,6 +24,7 @@ import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComp
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCleanedCheckerTask;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkCreatorTask;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks.InterVpnLinkRemoverTask;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -41,7 +42,7 @@ import org.slf4j.LoggerFactory;
  * moved to some other DPN.
  */
 @Singleton
-public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<Node, InterVpnLinkNodeListener> {
+public class InterVpnLinkNodeListener extends AbstractAsyncDataTreeChangeListener<Node> {
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeListener.class);
 
     public static final TopologyId FLOW_TOPOLOGY_ID = new TopologyId(new Uri("flow:1"));
@@ -59,6 +60,10 @@ public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<No
                                     final VpnFootprintService vpnFootprintService,
                                     final JobCoordinator jobCoordinator, final InterVpnLinkCache interVpnLinkCache,
                                     VpnUtil vpnUtil, InterVpnLinkUtil interVpnLinkUtil) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(FLOW_TOPOLOGY_ID))
+                .child(Node.class), Executors.newListeningSingleThreadExecutor("InterVpnLinkNodeListener",
+                LOG));
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalMgr;
         this.vpnFootprintService = vpnFootprintService;
@@ -68,26 +73,19 @@ public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<No
         this.interVpnLinkUtil = interVpnLinkUtil;
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<Node> getWildCardPath() {
-        return InstanceIdentifier.create(NetworkTopology.class)
-            .child(Topology.class, new TopologyKey(FLOW_TOPOLOGY_ID))
-            .child(Node.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InterVpnLinkNodeListener getDataTreeChangeListener() {
-        return InterVpnLinkNodeListener.this;
-    }
-
-    @Override
-    protected void add(InstanceIdentifier<Node> identifier, Node add) {
+    public void add(InstanceIdentifier<Node> identifier, Node add) {
         NodeId nodeId = add.getNodeId();
         String[] node = nodeId.getValue().split(":");
         if (node.length < 2) {
@@ -101,7 +99,7 @@ public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<No
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Node> identifier, Node del) {
+    public void remove(InstanceIdentifier<Node> identifier, Node del) {
         LOG.trace("Node {} has been deleted", identifier.firstKeyOf(Node.class).toString());
         NodeId nodeId = del.getNodeId();
         String[] node = nodeId.getValue().split(":");
@@ -130,6 +128,6 @@ public class InterVpnLinkNodeListener extends AsyncDataTreeChangeListenerBase<No
     }
 
     @Override
-    protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
+    public void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
     }
 }
index 9b65983f90d7827845ab2ff95c9e189ed10f20d4..7f2a494520df45ff484b0549f7a9a6d8d98b0c06 100644 (file)
@@ -8,13 +8,14 @@
 
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -27,8 +28,7 @@ import org.slf4j.LoggerFactory;
  * InterVpnLinkState changes.
  */
 @Singleton
-public class InterVpnLinkStateCacheFeeder
-    extends AsyncClusteredDataTreeChangeListenerBase<InterVpnLinkState, InterVpnLinkStateCacheFeeder> {
+public class InterVpnLinkStateCacheFeeder extends AbstractClusteredAsyncDataTreeChangeListener<InterVpnLinkState> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkStateCacheFeeder.class);
 
@@ -37,42 +37,41 @@ public class InterVpnLinkStateCacheFeeder
 
     @Inject
     public InterVpnLinkStateCacheFeeder(final DataBroker dataBroker, final InterVpnLinkCache interVpnLinkCache) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinkStates.class)
+                .child(InterVpnLinkState.class),
+                Executors.newListeningSingleThreadExecutor("InterVpnLinkStateCacheFeeder", LOG));
         this.dataBroker = dataBroker;
         this.interVpnLinkCache = interVpnLinkCache;
     }
 
-    @PostConstruct
     public void init() {
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
+        LOG.info("{} start", getClass().getSimpleName());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState del) {
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
+    }
+
+    @Override
+    public void remove(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState del) {
         LOG.debug("InterVpnLinkState {} has been removed", del.getInterVpnLinkName());
         interVpnLinkCache.removeInterVpnLinkStateFromCache(del);
     }
 
     @Override
-    protected void update(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState original,
+    public void update(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState original,
         InterVpnLinkState update) {
         LOG.debug("InterVpnLinkState {} has been updated", update.getInterVpnLinkName());
         interVpnLinkCache.addInterVpnLinkStateToCaches(update);
     }
 
     @Override
-    protected void add(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState add) {
+    public void add(InstanceIdentifier<InterVpnLinkState> identifier, InterVpnLinkState add) {
         LOG.debug("InterVpnLinkState {} has been added", add.getInterVpnLinkName());
         interVpnLinkCache.addInterVpnLinkStateToCaches(add);
     }
 
-    @Override
-    protected InstanceIdentifier<InterVpnLinkState> getWildCardPath() {
-        return InstanceIdentifier.create(InterVpnLinkStates.class).child(InterVpnLinkState.class);
-    }
-
-    @Override
-    protected InterVpnLinkStateCacheFeeder getDataTreeChangeListener() {
-        return this;
-    }
-
 }
index 759bc8f38fdf286c9bdc0bad7ad99ae152d858e7..dfac97b24bdd955581cc91a9ad825da2f335e96b 100644 (file)
@@ -7,16 +7,17 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import com.google.common.base.Optional;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.IVpnLinkService;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -28,8 +29,7 @@ import org.slf4j.LoggerFactory;
  * specially for when the InterVpnLink becomes active.
  */
 @Singleton
-public class InterVpnLinkStateListener
-    extends AsyncDataTreeChangeListenerBase<InterVpnLinkState, InterVpnLinkStateListener> {
+public class InterVpnLinkStateListener extends AbstractAsyncDataTreeChangeListener<InterVpnLinkState> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkStateListener.class);
 
@@ -40,34 +40,31 @@ public class InterVpnLinkStateListener
     @Inject
     public InterVpnLinkStateListener(final DataBroker dataBroker, final IVpnLinkService interVpnLinkService,
             final InterVpnLinkCache interVpnLinkCache) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinkStates.class)
+                .child(InterVpnLinkState.class),
+                Executors.newListeningSingleThreadExecutor("InterVpnLinkStateListener", LOG));
         this.dataBroker = dataBroker;
         this.ivpnLinkService = interVpnLinkService;
         this.interVpnLinkCache = interVpnLinkCache;
     }
 
-    @PostConstruct
     public void start() {
         LOG.info("{} start", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<InterVpnLinkState> getWildCardPath() {
-        return InstanceIdentifier.create(InterVpnLinkStates.class).child(InterVpnLinkState.class);
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected InterVpnLinkStateListener getDataTreeChangeListener() {
-        return InterVpnLinkStateListener.this;
-    }
-
-
-    @Override
-    protected void remove(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
+    public void remove(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
     }
 
     @Override
-    protected void update(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState before,
+    public void update(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState before,
                           InterVpnLinkState after) {
         if (before.getState() == InterVpnLinkState.State.Error && after.getState() == InterVpnLinkState.State.Active) {
             Optional<InterVpnLinkDataComposite> optIVpnLink =
@@ -84,6 +81,6 @@ public class InterVpnLinkStateListener
 
 
     @Override
-    protected void add(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
+    public void add(InstanceIdentifier<InterVpnLinkState> key, InterVpnLinkState dataObjectModification) {
     }
 }
index fc33980287c275a83d57042eb4a63831e25c8681..61e7cd4f9d0eeb0ce1af5ce035b7236cc035e1e3 100755 (executable)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.MatchInfo;
@@ -26,6 +24,8 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.utils.ServiceIndex;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@@ -317,14 +317,14 @@ public final class InterVpnLinkUtil {
      * Retrieves the State of an InterVpnLink.
      *
      * @param interVpnLinkName The name of the InterVpnLink
-     * @return the object that contains the State of the specified InterVpnLink or Optional.absent() if it doesnt exist
+     * @return the object that contains the State of the specified InterVpnLink or Optional.empty() if it doesnt exist
      */
     public Optional<InterVpnLinkState> getInterVpnLinkState(String interVpnLinkName) {
-        Optional<InterVpnLinkState> interVpnLinkStateOptional = Optional.absent();
+        Optional<InterVpnLinkState> interVpnLinkStateOptional = Optional.empty();
         try {
             interVpnLinkStateOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
                     LogicalDatastoreType.CONFIGURATION, getInterVpnLinkStateIid(interVpnLinkName));
-        } catch (ReadFailedException e) {
+        } catch (InterruptedException | ExecutionException e) {
             LOG.error("getInterVpnLinkState: Failed to read intervpn link state for {}", interVpnLinkName);
         }
         return interVpnLinkStateOptional;
index 3d639dd4076f87bbc3c15e7d7ac65468ba32e743..8bba2d547d16d5993a71a05462c3450f43311d23 100755 (executable)
@@ -7,14 +7,14 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeoutException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkUtil;
@@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory;
  * InterVpnLink has been removed, like the stateful information, leaked
  * vrfEntries, etc.
  */
-public class InterVpnLinkCleanedCheckerTask implements Callable<List<ListenableFuture<Void>>> {
+public class InterVpnLinkCleanedCheckerTask implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkCleanedCheckerTask.class);
     private static final long MAX_WAIT_FOR_REMOVAL = 10000; // 10 seconds
index 2a4e67175ba06fac9d13f76d1cd2dc2822b0e705..692da5de01478df3c3734f63bfe317aa2c8dd740 100644 (file)
@@ -7,22 +7,22 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink.tasks;
 
-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.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterVpnLinkCreatorTask implements Callable<List<ListenableFuture<Void>>> {
+public class InterVpnLinkCreatorTask implements Callable<List<? extends ListenableFuture<?>>> {
 
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkCreatorTask.class);
 
index e4034527821c1d0f595eefd64d0d6e2de0be8651..94cf21a8bf2779ef582c8eca5c2b3b77e887cd13 100644 (file)
@@ -13,15 +13,15 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterVpnLinkRemoverTask implements Callable<List<ListenableFuture<Void>>> {
+public class InterVpnLinkRemoverTask implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkRemoverTask.class);
 
     private final InstanceIdentifier<InterVpnLink> interVpnLinkIid;
index 1d60921e78d89ba1105e308d8e858f3c101002da..f99916407a9e3483be82e36325c72a238a37ba68 100644 (file)
@@ -8,11 +8,11 @@
 
 package org.opendaylight.netvirt.vpnmanager.iplearn;
 
-import com.google.common.base.Optional;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 import org.apache.commons.lang3.tuple.ImmutablePair;
index e084f657c75d0f7b0dd101fc9eedbbf274fa51ff..e4b2985a2cc55395c1b4c406a023b6dc9c8b42dc 100644 (file)
@@ -7,19 +7,19 @@
  */
 package org.opendaylight.netvirt.vpnmanager.iplearn;
 
-import com.google.common.base.Optional;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.arputil.api.ArpConstants;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.infrautils.utils.concurrent.JdkFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
@@ -156,7 +156,7 @@ public final class AlivenessMonitorUtils {
     }
 
     private Optional<Uint32> allocateIpMonitorProfile(IpAddress targetIp) {
-        Optional<Uint32> profileIdOptional = Optional.absent();
+        Optional<Uint32> profileIdOptional = Optional.empty();
         if (targetIp.getIpv4Address() != null) {
             profileIdOptional = allocateArpMonitorProfile();
         } else if (targetIp.getIpv6Address() != null) {
@@ -218,7 +218,7 @@ public final class AlivenessMonitorUtils {
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Exception when allocating profile Id", e);
         }
-        return Optional.absent();
+        return Optional.empty();
     }
 
     private MonitorProfileGetInput buildMonitorGetProfile(long monitorInterval, long monitorWindow,
@@ -250,8 +250,15 @@ public final class AlivenessMonitorUtils {
     public java.util.Optional<Uint32> getMonitorIdFromInterface(MacEntry macEntry) {
         String interfaceName = macEntry.getInterfaceName();
         java.util.Optional<Uint32> monitorId = java.util.Optional.empty();
-        Optional<InterfaceMonitorEntry> interfaceMonitorEntryOptional = MDSALUtil.read(dataBroker,
-                LogicalDatastoreType.OPERATIONAL, getInterfaceMonitorMapId(interfaceName));
+        Optional<InterfaceMonitorEntry> interfaceMonitorEntryOptional = Optional.empty();
+        try {
+            interfaceMonitorEntryOptional = SingleTransactionDataBroker
+                    .syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                            getInterfaceMonitorMapId(interfaceName));
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("getMonitorIdFromInterface: Exception while reading Interface Monitor MapId for the "
+                    + "interface {} ", interfaceName, e);
+        }
         if (interfaceMonitorEntryOptional.isPresent()) {
             return java.util.Optional.of(interfaceMonitorEntryOptional.get().getMonitorIds().get(0));
         }
index 0769bdd7f9b4aa3138d4b87299f362cb9c6355e9..b041d31f5d17b9535fe3f8d82a1d60f6549aaa47 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.netvirt.vpnmanager.iplearn;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorListener;
index e60d1a98a3e4726700a7bdabd3059ca5d26f5cc5..a1273ce70a216c209213b2052696563eb900aa0f 100644 (file)
@@ -13,7 +13,7 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
 
-public class IpMonitorStartTask implements Callable<List<ListenableFuture<Void>>> {
+public class IpMonitorStartTask implements Callable<List<? extends ListenableFuture<?>>> {
     private final MacEntry macEntry;
     private final Long arpMonitorProfileId;
     private final AlivenessMonitorUtils alivenessMonitorUtils;
index 10f8ac882fbf76e71c782c630a33f19631397121..023bc0dd41819652ee43a72bc87e4f16aff4805f 100644 (file)
@@ -12,12 +12,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Callable;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort;
@@ -25,7 +24,7 @@ import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class IpMonitorStopTask implements Callable<List<ListenableFuture<Void>>> {
+public class IpMonitorStopTask implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(IpMonitorStopTask.class);
     private MacEntry macEntry;
     private DataBroker dataBroker;
index 525152889498e005afc8814dcd09707d4c9b42c5..afd80169b78332cd7ab0b9e0e8ecb9dde467f121 100644 (file)
@@ -7,20 +7,19 @@
  */
 package org.opendaylight.netvirt.vpnmanager.iplearn;
 
-import com.google.common.base.Optional;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.NWUtil;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
@@ -29,6 +28,7 @@ import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.netvirt.vpnmanager.VpnConstants;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.iplearn.model.MacEntry;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortData;
@@ -39,8 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class IpMonitoringHandler
-        extends AsyncClusteredDataTreeChangeListenerBase<LearntVpnVipToPort, IpMonitoringHandler> {
+public class IpMonitoringHandler extends AbstractClusteredAsyncDataTreeChangeListener<LearntVpnVipToPort> {
     private static final Logger LOG = LoggerFactory.getLogger(IpMonitoringHandler.class);
     private final DataBroker dataBroker;
     private final AlivenessMonitorService alivenessManager;
@@ -51,8 +50,8 @@ public class IpMonitoringHandler
     private final JobCoordinator jobCoordinator;
     private final VpnUtil vpnUtil;
 
-    private Optional<Uint32> arpMonitorProfileId = Optional.absent();
-    private Optional<Uint32> ipv6NdMonitorProfileId = Optional.absent();
+    private Optional<Uint32> arpMonitorProfileId = Optional.empty();
+    private Optional<Uint32> ipv6NdMonitorProfileId = Optional.empty();
     private EntityOwnershipCandidateRegistration candidateRegistration;
 
     @Inject
@@ -60,7 +59,9 @@ public class IpMonitoringHandler
             INeutronVpnManager neutronVpnService, IInterfaceManager interfaceManager,
             EntityOwnershipService entityOwnershipService, JobCoordinator jobCoordinator,
             AlivenessMonitorUtils alivenessMonitorUtils, VpnUtil vpnUtil) {
-        super(LearntVpnVipToPort.class, IpMonitoringHandler.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(LearntVpnVipToPortData.class)
+                .child(LearntVpnVipToPort.class),
+                Executors.newListeningSingleThreadExecutor("IpMonitoringHandler", LOG));
         this.dataBroker = dataBroker;
         this.alivenessManager = alivenessManager;
         this.neutronVpnService = neutronVpnService;
@@ -69,17 +70,17 @@ public class IpMonitoringHandler
         this.jobCoordinator = jobCoordinator;
         this.alivenessMonitorUtils = alivenessMonitorUtils;
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
         this.arpMonitorProfileId = alivenessMonitorUtils.allocateArpMonitorProfile();
         this.ipv6NdMonitorProfileId = alivenessMonitorUtils.allocateIpv6NaMonitorProfile();
         if (this.arpMonitorProfileId == null || this.ipv6NdMonitorProfileId == null) {
             LOG.error("Error while allocating ARP and IPv6 ND Profile Ids: ARP={}, IPv6ND={}", arpMonitorProfileId,
                     ipv6NdMonitorProfileId);
         }
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
 
         try {
             candidateRegistration = entityOwnershipUtils.getEntityOwnershipService().registerCandidate(
@@ -97,22 +98,13 @@ public class IpMonitoringHandler
         if (candidateRegistration != null) {
             candidateRegistration.close();
         }
-    }
-
-    @Override
-    protected InstanceIdentifier<LearntVpnVipToPort> getWildCardPath() {
-        return InstanceIdentifier.create(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class);
-    }
-
-    @Override
-    protected IpMonitoringHandler getDataTreeChangeListener() {
-        return this;
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
-    protected void update(InstanceIdentifier<LearntVpnVipToPort> id, LearntVpnVipToPort value,
+    public void update(InstanceIdentifier<LearntVpnVipToPort> id, LearntVpnVipToPort value,
             LearntVpnVipToPort dataObjectModificationAfter) {
         runOnlyInOwnerNode("IpMonitoringHandler: update event", () -> {
             try {
@@ -131,7 +123,7 @@ public class IpMonitoringHandler
     }
 
     @Override
-    protected void add(InstanceIdentifier<LearntVpnVipToPort> identifier, LearntVpnVipToPort value) {
+    public void add(InstanceIdentifier<LearntVpnVipToPort> identifier, LearntVpnVipToPort value) {
         runOnlyInOwnerNode("IpMonitoringHandler: add event", () -> {
             try {
                 InetAddress srcInetAddr = InetAddress.getByName(value.getPortFixedip());
@@ -156,7 +148,7 @@ public class IpMonitoringHandler
     }
 
     @Override
-    protected void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort value) {
+    public void remove(InstanceIdentifier<LearntVpnVipToPort> key, LearntVpnVipToPort value) {
         runOnlyInOwnerNode("IpMonitoringHandler: remove event", () -> {
             try {
                 InetAddress srcInetAddr = InetAddress.getByName(value.getPortFixedip());
index fa559057a201835770bfecaa3f6113349526f038..18a7b56e988d76e7d04b3c13a5182ce61af1bfc3 100644 (file)
@@ -7,23 +7,18 @@
  */
 package org.opendaylight.netvirt.vpnmanager.iplearn;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
@@ -33,12 +28,17 @@ import org.opendaylight.genius.mdsalutil.NWUtil;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
 import org.opendaylight.netvirt.vpnmanager.VpnConstants;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
+import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortEventAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortEventData;
@@ -58,7 +58,7 @@ import org.slf4j.LoggerFactory;
 
 @Singleton
 public class LearntVpnVipToPortEventProcessor
-        extends AsyncClusteredDataTreeChangeListenerBase<LearntVpnVipToPortEvent, LearntVpnVipToPortEventProcessor> {
+        extends AbstractClusteredAsyncDataTreeChangeListener<LearntVpnVipToPortEvent> {
     private static final Logger LOG = LoggerFactory.getLogger(LearntVpnVipToPortEventProcessor.class);
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -72,18 +72,20 @@ public class LearntVpnVipToPortEventProcessor
     @Inject
     public LearntVpnVipToPortEventProcessor(final DataBroker dataBroker, IInterfaceManager interfaceManager,
             EntityOwnershipService entityOwnershipService, final JobCoordinator jobCoordinator, VpnUtil vpnUtil) {
-        super(LearntVpnVipToPortEvent.class, LearntVpnVipToPortEventProcessor.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
+                .create(LearntVpnVipToPortEventData.class).child(LearntVpnVipToPortEvent.class),
+                Executors.newListeningSingleThreadExecutor("LearntVpnVipToPortEventProcessor", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.interfaceManager = interfaceManager;
         this.jobCoordinator = jobCoordinator;
         this.entityOwnershipUtils = new EntityOwnershipUtils(entityOwnershipService);
         this.vpnUtil = vpnUtil;
+        start();
     }
 
-    @PostConstruct
     public void start() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        LOG.info("{} start", getClass().getSimpleName());
         try {
             candidateRegistration = entityOwnershipUtils.getEntityOwnershipService()
                     .registerCandidate(new Entity(VpnConstants.IP_MONITORING_ENTITY,
@@ -103,24 +105,14 @@ public class LearntVpnVipToPortEventProcessor
     }
 
     @Override
-    protected InstanceIdentifier<LearntVpnVipToPortEvent> getWildCardPath() {
-        return InstanceIdentifier.create(LearntVpnVipToPortEventData.class).child(LearntVpnVipToPortEvent.class);
-    }
-
-    @Override
-    protected LearntVpnVipToPortEventProcessor getDataTreeChangeListener() {
-        return this;
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<LearntVpnVipToPortEvent> id, LearntVpnVipToPortEvent value,
+    public void update(InstanceIdentifier<LearntVpnVipToPortEvent> id, LearntVpnVipToPortEvent value,
             LearntVpnVipToPortEvent dataObjectModificationAfter) {
         // Updates does not make sense on an event queue .
         // NOTE: DONOT ADD ANY CODE HERE AND MAKE A CIRCUS
     }
 
     @Override
-    protected void add(InstanceIdentifier<LearntVpnVipToPortEvent> identifier, LearntVpnVipToPortEvent value) {
+    public void add(InstanceIdentifier<LearntVpnVipToPortEvent> identifier, LearntVpnVipToPortEvent value) {
         // AFTER PROCESSING THE EVENT, REMOVE THE EVENT FROM THE QUEUE
         entityOwnershipUtils.runOnlyInOwnerNode(VpnConstants.IP_MONITORING_ENTITY, VpnConstants.IP_MONITORING_ENTITY,
             jobCoordinator, "LearntVpnVipToPortEvent-Handler", () -> {
@@ -143,12 +135,12 @@ public class LearntVpnVipToPortEventProcessor
     }
 
     @Override
-    protected void remove(InstanceIdentifier<LearntVpnVipToPortEvent> key, LearntVpnVipToPortEvent value) {
+    public void remove(InstanceIdentifier<LearntVpnVipToPortEvent> key, LearntVpnVipToPortEvent value) {
         // Removals are triggered by add handling.
         // NOTE: DONOT ADD ANY CODE HERE AND MAKE A CIRCUS
     }
 
-    private class AddMipAdjacencyWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class AddMipAdjacencyWorker implements Callable<List<? extends ListenableFuture<?>>> {
         String vpnName;
         String interfaceName;
         String srcIpAddress;
@@ -249,7 +241,7 @@ public class LearntVpnVipToPortEventProcessor
                 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIfId,
                     newVpnIntf, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY);
                 LOG.debug(" Successfully stored subnetroute Adjacency into VpnInterface {}", vpnInterface);
-            } catch (ReadFailedException e) {
+            } catch (InterruptedException | ExecutionException e) {
                 LOG.error("addMipAdjacency: Failed to read data store for interface {} vpn {} ip {} mac {}",
                         vpnInterface, vpnInstName, srcPrefix, mipMacAddress);
             } catch (TransactionCommitFailedException e) {
@@ -297,7 +289,7 @@ public class LearntVpnVipToPortEventProcessor
         }
     }
 
-    private class DeleteMipAdjacencyWorker implements Callable<List<ListenableFuture<Void>>> {
+    private class DeleteMipAdjacencyWorker implements Callable<List<? extends ListenableFuture<?>>> {
         String vpnName;
         String interfaceName;
         String ipAddress;
index c15f7a56f8b47f364f9265d1a9fdd08eb85fab97..3ea3838ee5af028ee1fcd0d81cda98bbdeea9510 100644 (file)
@@ -17,9 +17,9 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
index ebd9878829ed236dd7e1e8267e27bdfd7db2805a..53b0011e188ad92d03cd1f1100de9e8413f9561b 100644 (file)
@@ -14,9 +14,9 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
index 27b41eb97a9cd291d3137e8bb330572ab377d6b5..d7c899eae7dd4b1d3496cd09d4e5788fb0db6e75 100644 (file)
@@ -7,24 +7,25 @@
  */
 package org.opendaylight.netvirt.vpnmanager.populator.impl;
 
-import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
 import static org.opendaylight.infrautils.utils.concurrent.ListenableFutures.addErrorLogging;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.ReentrantLock;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -97,8 +98,14 @@ public abstract class L3vpnPopulator implements VpnPopulator {
                 InstanceIdentifier.builder(FibEntries.class)
                         .child(VrfTables.class, new VrfTablesKey(rd))
                         .child(VrfEntry.class, new VrfEntryKey(prefix)).build();
-        Optional<VrfEntry> entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
-
+        Optional<VrfEntry> entry = Optional.empty();
+        try {
+            entry = SingleTransactionDataBroker.syncReadOptional(broker,
+                    LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("addSubnetRouteFibEntry: Exception while reading vrfEntry for the prefix {} rd {}", prefix,
+                    rd, e);
+        }
         if (!entry.isPresent()) {
             List<VrfEntry> vrfEntryList = Collections.singletonList(vrfEntry);
 
index bda4ffa0e0d3ed8646eff475e8df9b5ffd14c61d..59f6e1f742b49367f10bc29447af75ed5cabc826 100644 (file)
@@ -4,14 +4,14 @@
            odl:use-default-for-reference-types="true">
 
   <reference id="dataBroker"
-             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             interface="org.opendaylight.mdsal.binding.api.DataBroker"
              odl:type="default" />
   <reference id="iMdsalApiManager"
              interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
   <reference id="iInterfaceManager"
              interface="org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager" />
   <reference id="notificationPublishService"
-             interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService" />
+             interface="org.opendaylight.mdsal.binding.api.NotificationPublishService" />
   <reference id="iBgpManager"
              interface="org.opendaylight.netvirt.bgpmanager.api.IBgpManager" />
   <reference id="iElanService"
index 8c09208071c0edfb8912bb5b8f19bbab1e5c46c8..c78286281840158f953a08564c835c628c6e59b9 100644 (file)
@@ -16,17 +16,18 @@ import static org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkTestC
 
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.binding.test.ConstantSchemaAbstractDataBrokerTest;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
@@ -53,7 +54,7 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTest {
+public class InterVpnLinkLocatorTest extends AbstractConcurrentDataBrokerTest {
 
     static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkLocatorTest.class);
 
@@ -94,11 +95,11 @@ public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTes
 
         // Creating both empty containers: InterVpnLinks and InterVpnLinkStates
         WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
-        writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(InterVpnLinks.class).build(),
-                      new InterVpnLinksBuilder().setInterVpnLink(Collections.emptyList()).build(), true);
-        writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(InterVpnLinkStates.class).build(),
-                      new InterVpnLinkStatesBuilder().setInterVpnLinkState(Collections.emptyList()).build(), true);
-        writeTx.submit().checkedGet();
+        writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinks.class),
+                      new InterVpnLinksBuilder().setInterVpnLink(Collections.emptyList()).build());
+        writeTx.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(InterVpnLinkStates.class),
+                      new InterVpnLinkStatesBuilder().setInterVpnLinkState(Collections.emptyList()).build());
+        writeTx.commit().get();
 
         interVpnLinkCache = new InterVpnLinkCacheImpl(dataBroker);
         interVpnLinkCache.initialFeed();
@@ -163,7 +164,7 @@ public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTes
     //////////////
 
     public void populateL3Vpns(DataBroker broker, List<L3VpnComposite> vpns)
-        throws TransactionCommitFailedException {
+        throws ExecutionException, InterruptedException {
         for (L3VpnComposite vpn : vpns) {
             VpnInstance vpnInstance = new VpnInstanceBuilder().setVpnId(vpn.vpnOpData.getVpnId())
                 .setVpnInstanceName(vpn.vpnOpData.getVpnInstanceName())
@@ -173,26 +174,26 @@ public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTes
             writeTx1.merge(LogicalDatastoreType.CONFIGURATION,
                           VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()),
                           vpnInstance, true);
-            writeTx1.submit().checkedGet();
+            writeTx1.commit().get();
             WriteTransaction writeTx2 = broker.newWriteOnlyTransaction();
             writeTx2.merge(LogicalDatastoreType.OPERATIONAL,
                           VpnUtil.getVpnInstanceOpDataIdentifier(vpn.vpnOpData.getVrfId()), vpn.vpnOpData, true);
-            writeTx2.submit().checkedGet();
+            writeTx2.commit().get();
         }
     }
 
     public void cleanL3Vpns(DataBroker broker, List<L3VpnComposite> vpns)
-        throws TransactionCommitFailedException {
+            throws ExecutionException, InterruptedException {
         for (L3VpnComposite vpn : vpns) {
             WriteTransaction writeTx1 = broker.newWriteOnlyTransaction();
             writeTx1.delete(LogicalDatastoreType.OPERATIONAL,
                            VpnUtil.getVpnInstanceOpDataIdentifier(vpn.vpnOpData.getVrfId()));
-            writeTx1.submit().checkedGet();
+            writeTx1.commit().get();
 
             WriteTransaction writeTx2 = broker.newWriteOnlyTransaction();
             writeTx2.delete(LogicalDatastoreType.CONFIGURATION,
                            VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpn.vpnCfgData.getVpnInstanceName()));
-            writeTx2.submit().checkedGet();
+            writeTx2.commit().get();
         }
     }
 
@@ -204,7 +205,6 @@ public class InterVpnLinkLocatorTest extends ConstantSchemaAbstractDataBrokerTes
             writeTx1.merge(LogicalDatastoreType.OPERATIONAL,
                           InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId)).build(), node);
         }
-        writeTx1.submit().checkedGet();
+        writeTx1.commit().get();
     }
-
 }
index 394e51df30582ce7eb0cb6c36f640e0324bc7813..ff0dac7a0cab6555ba1c2b2d91c061d91b804212 100644 (file)
@@ -7,14 +7,14 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -65,7 +65,7 @@ public final class InterVpnLinkTestCatalog {
                                             .setDpId(vpn2Dpns).build();
         InterVpnLinkState ivpnLinkState =
             new InterVpnLinkStateBuilder().setInterVpnLinkName(ivpnLinkName).setState(state)
-                                          .setErrorDescription(errMsg.or(""))
+                                          .setErrorDescription(errMsg.orElse(""))
                                           .setFirstEndpointState(firstEndpointState)
                                           .setSecondEndpointState(secondEndpointState).build();
         return new InterVpnLinkDataComposite(ivpnLinkCfg, ivpnLinkState);
@@ -74,15 +74,15 @@ public final class InterVpnLinkTestCatalog {
     static void updateEndpointDpns(InterVpnLinkDataComposite ivl, boolean is1stEndpoint, List<Uint64> newDpns) {
         Optional<FirstEndpointState> new1stEpState = (is1stEndpoint)
             ? Optional.of(InterVpnLinkUtil.buildFirstEndpointState(ivl.getInterVpnLinkState().getFirstEndpointState(),
-                                                                   Optional.of(newDpns), Optional.absent()))
-            : Optional.absent();
+                                                                   Optional.of(newDpns), Optional.empty()))
+            : Optional.empty();
         Optional<SecondEndpointState> new2ndEpState = (is1stEndpoint)
-            ? Optional.absent()
+            ? Optional.empty()
             : Optional.of(InterVpnLinkUtil.buildSecondEndpointState(ivl.getInterVpnLinkState().getSecondEndpointState(),
-                                                                    Optional.of(newDpns), Optional.absent()));
+                                                                    Optional.of(newDpns), Optional.empty()));
         InterVpnLinkState newIvlState =
             InterVpnLinkUtil.buildIvlStateFromOriginal(ivl.getInterVpnLinkState(), new1stEpState, new2ndEpState,
-                                                          /*errMsg*/ Optional.absent());
+                                                          /*errMsg*/ Optional.empty());
         ivl.setInterVpnLinkState(newIvlState);
     }
 
@@ -93,7 +93,7 @@ public final class InterVpnLinkTestCatalog {
               L3VpnTestCatalog.VPN_2.vpnCfgData.getVpnInstanceName(), "2.2.2.2", false, false, false,
               Arrays.asList(Uint64.valueOf(BigInteger.ONE)), 100001,
               Arrays.asList(Uint64.valueOf(BigInteger.ONE)), 100002,
-              InterVpnLinkState.State.Active, Optional.absent());
+              InterVpnLinkState.State.Active, Optional.empty());
 
     // InterVpnLink linking VPN_1 and VPN_2. Erroneous.
     static InterVpnLinkDataComposite I_VPN_LINK_12_ERR =
@@ -101,14 +101,14 @@ public final class InterVpnLinkTestCatalog {
               L3VpnTestCatalog.VPN_2.vpnCfgData.getVpnInstanceName(), "2.2.2.2", false, false, false,
               Arrays.asList(Uint64.valueOf(BigInteger.ONE)), 100001,
               Arrays.asList(Uint64.valueOf(BigInteger.ONE)), 100002,
-              InterVpnLinkState.State.Error, Optional.absent());
+              InterVpnLinkState.State.Error, Optional.empty());
 
     // InterVpnLink linking VPN_3 and VPN_4. Active. No automatic route leaking at all. Installed on DPN BigInteger.ONE
     static InterVpnLinkDataComposite I_VPN_LINK_34 =
         build("InterVpnLink VPN3-VPN4", L3VpnTestCatalog.VPN_3.vpnCfgData.getVpnInstanceName(), "3.3.3.3",
               L3VpnTestCatalog.VPN_4.vpnCfgData.getVpnInstanceName(), "4.4.4.4", false, false, false,
               Arrays.asList(Uint64.valueOf(2L)), 100003, Arrays.asList(Uint64.valueOf(2L)), 100004,
-              InterVpnLinkState.State.Active, Optional.absent());
+              InterVpnLinkState.State.Active, Optional.empty());
 
     // InterVpnLink linking VPN_5 and VPN_6. Active. No automatic route leaking at all. Installed on DPN 2
     // Note that VPN5 has same iRTs than VPN1 and VPN6 has same iRTs thant VPN2. This means that this InterVpnLink
@@ -117,42 +117,42 @@ public final class InterVpnLinkTestCatalog {
         build("InterVpnLink VPN5-VPN6", L3VpnTestCatalog.VPN_5.vpnCfgData.getVpnInstanceName(), "5.5.5.5",
               L3VpnTestCatalog.VPN_6.vpnCfgData.getVpnInstanceName(), "6.6.6.6", false, false, false,
               Arrays.asList(Uint64.valueOf(2L)), 100005, Arrays.asList(Uint64.valueOf(2L)), 100006,
-              InterVpnLinkState.State.Active, Optional.absent());
+              InterVpnLinkState.State.Active, Optional.empty());
 
     static List<InterVpnLinkDataComposite> ALL_IVPN_LINKS =
         Arrays.asList(I_VPN_LINK_12, I_VPN_LINK_12_ERR, I_VPN_LINK_34, I_VPN_LINK_56);
 
 
     public static void populateIvpnLinks(DataBroker broker2, List<InterVpnLinkDataComposite> ivpnLinks)
-        throws TransactionCommitFailedException {
+        throws ExecutionException, InterruptedException {
 
         for (InterVpnLinkDataComposite ivpnLink : ivpnLinks) {
             WriteTransaction writeTx1 = broker2.newWriteOnlyTransaction();
             writeTx1.merge(LogicalDatastoreType.CONFIGURATION,
                           InterVpnLinkUtil.getInterVpnLinkPath(ivpnLink.getInterVpnLinkName()),
                           ivpnLink.getInterVpnLinkConfig());
-            writeTx1.submit().checkedGet();
+            writeTx1.commit().get();
             WriteTransaction writeTx2 = broker2.newWriteOnlyTransaction();
             writeTx2.merge(LogicalDatastoreType.OPERATIONAL,
                            InterVpnLinkUtil.getInterVpnLinkStateIid(ivpnLink.getInterVpnLinkName()),
                            ivpnLink.getInterVpnLinkState());
-            writeTx2.submit().checkedGet();
+            writeTx2.commit().get();
         }
     }
 
     public static void cleanIvpnLinks(DataBroker broker2, InterVpnLinkDataComposite... ivpnLinks)
-        throws TransactionCommitFailedException {
+            throws ExecutionException, InterruptedException {
 
         for (InterVpnLinkDataComposite ivpnLink : ivpnLinks) {
             WriteTransaction writeTx1 = broker2.newWriteOnlyTransaction();
             writeTx1.delete(LogicalDatastoreType.OPERATIONAL,
                             InterVpnLinkUtil.getInterVpnLinkStateIid(ivpnLink.getInterVpnLinkName()));
-            writeTx1.submit().checkedGet();
+            writeTx1.commit().get();
 
             WriteTransaction writeTx2 = broker2.newWriteOnlyTransaction();
             writeTx2.delete(LogicalDatastoreType.CONFIGURATION,
                             InterVpnLinkUtil.getInterVpnLinkPath(ivpnLink.getInterVpnLinkName()));
-            writeTx2.submit().checkedGet();
+            writeTx2.commit().get();
 
         }
     }
index 1c516a15a66afcce2ae912caad8c694b4c066639..a41a058439a4963a82dc449b6b017cc2aa1204c7 100644 (file)
@@ -11,19 +11,18 @@ package org.opendaylight.netvirt.vpnmanager.test;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.Futures;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.SubnetOpDpnManager;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.PortOpData;
@@ -39,10 +38,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.sub
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.subnet.op.data.entry.subnet.to.dpn.VpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.subnet.op.data.entry.subnet.to.dpn.VpnInterfacesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.subnet.op.data.entry.subnet.to.dpn.VpnInterfacesKey;
+import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint64;
 
-
 @RunWith(MockitoJUnitRunner.class)
 public class SubnetOpDpnManagerTest {
 
@@ -64,7 +63,7 @@ public class SubnetOpDpnManagerTest {
     @Mock
     DataBroker dataBroker;
     @Mock
-    ReadOnlyTransaction mockReadTx;
+    ReadTransaction mockReadTx;
     @Mock
     WriteTransaction mockWriteTx;
 
@@ -82,9 +81,9 @@ public class SubnetOpDpnManagerTest {
         optionalSubDpn = Optional.of(subnetToDpn);
         optionalPortOp = Optional.of(portOp);
 
-        doReturn(Futures.immediateCheckedFuture(optionalPortOp)).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(FluentFutures.immediateFluentFuture(optionalPortOp)).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, portOpIdentifier);
-        doReturn(Futures.immediateCheckedFuture(optionalSubDpn)).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(FluentFutures.immediateFluentFuture(optionalSubDpn)).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, dpnOpId);
 
     }
@@ -129,7 +128,7 @@ public class SubnetOpDpnManagerTest {
     @Test
     public void testAddPortOpDataEntryPortOpAbsent() {
 
-        doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(FluentFutures.immediateFluentFuture(Optional.empty())).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, portOpIdentifier);
 
         subOpDpnManager.addPortOpDataEntry(infName, subnetId, dpId);
@@ -157,7 +156,7 @@ public class SubnetOpDpnManagerTest {
     @Test
     public void testRemovePortOpDataEntryPortOpAbsent() {
 
-        doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(FluentFutures.immediateFluentFuture(Optional.empty())).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, portOpIdentifier);
 
         subOpDpnManager.removePortOpDataEntry(infName, null);
@@ -178,7 +177,7 @@ public class SubnetOpDpnManagerTest {
     @Test
     public void testGetPortOpDataEntryPortOpAbsent() {
 
-        doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(FluentFutures.immediateFluentFuture(Optional.empty())).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, portOpIdentifier);
 
         subOpDpnManager.getPortOpDataEntry(infName);
index 0eaeef9c36220e9c5db12504e055ae48d0f9fcda..ab26652bbf46bc1048f236e561a05918c566c7ef 100644 (file)
@@ -15,7 +15,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.VpnInstance;
index 1a9cfeed2190f201fb42b6439ee07ed8adaf1645..e6c6e08c4e858ae5e8ed72225dab33f191ebbd87 100644 (file)
@@ -13,11 +13,11 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import com.google.common.base.Optional;
 import com.google.common.util.concurrent.Futures;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Future;
 import javax.inject.Inject;
 import org.junit.Before;
@@ -26,11 +26,11 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.SubnetOpDpnManager;
@@ -161,7 +161,7 @@ public class VpnSubnetRouteHandlerTest {
     @Mock
     DataBroker dataBroker;
     @Mock
-    ReadOnlyTransaction mockReadTx;
+    ReadTransaction mockReadTx;
     @Mock
     WriteTransaction mockWriteTx;
     @Mock
@@ -242,7 +242,7 @@ public class VpnSubnetRouteHandlerTest {
             .CONFIGURATION, instVpnInstance);
         doReturn(Futures.immediateCheckedFuture(vpnInstanceOptional)).when(mockReadTx).read(LogicalDatastoreType
             .CONFIGURATION, vpnInstanceIdentifier);
-        doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(Futures.immediateCheckedFuture(Optional.empty())).when(mockReadTx).read(LogicalDatastoreType
             .CONFIGURATION, netsIdentifier);
         doReturn(idOutputOptional).when(idManager).allocateId(allocateIdInput);
 
@@ -309,7 +309,7 @@ public class VpnSubnetRouteHandlerTest {
         networks = new NetworksBuilder().setId(portId).withKey(new NetworksKey(portId)).build();
         doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
         doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction();
-        doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit();
+        doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).commit();
     }
 
     @Ignore
@@ -371,7 +371,7 @@ public class VpnSubnetRouteHandlerTest {
     @Test
     public void testOnSubnetAddedToVpn() {
 
-        doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(LogicalDatastoreType
+        doReturn(Futures.immediateCheckedFuture(Optional.empty())).when(mockReadTx).read(LogicalDatastoreType
             .OPERATIONAL, subOpIdentifier);
 
         vpnSubnetRouteHandler.onSubnetAddedToVpn(subnetmap, true, elanTag);
index f8dc27ca0bec839fea3f0ebc6384aeac4071a701..8ea5ecea34f6dedd6c7ec84e0fe9e58373ee22aa 100644 (file)
@@ -7,22 +7,22 @@
  */
 package org.opendaylight.netvirt.vpnmanager.shell;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInterfaceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn._interface.op.data.VpnInterfaceOpDataEntry;
@@ -143,7 +143,7 @@ public class ShowVpn extends OsgiCommandSupport {
 
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
             InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
index f95908c9c1d87a3d289c67911ba6852005641d21..bc19af33493254085e55d2d3fae802e80d102133 100644 (file)
@@ -7,19 +7,19 @@
  */
 package org.opendaylight.netvirt.vpnmanager.shell;
 
-import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
@@ -124,7 +124,7 @@ public class ShowVpnInstanceOpData extends OsgiCommandSupport {
 
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
             InstanceIdentifier<T> path) {
-        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction tx = dataBroker.newReadOnlyTransaction()) {
             return tx.read(datastoreType, path).get();
         } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
index c390981dc1aa7d46d2f6ea2e842f8610da834ad4..7d00f712ee6405773116b798c001e6c49d2a10e9 100644 (file)
@@ -9,7 +9,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
 
-    <reference id="dataBrokerRef" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+    <reference id="dataBrokerRef" interface="org.opendaylight.mdsal.binding.api.DataBroker"
                availability="optional"/>
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">